From 71f661092dedf41b1a27c73b25312dcfbcfc5879 Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Mon, 3 Aug 2026 02:50:05 +0300 Subject: [PATCH] sync SVN r17952 --- docs/PROMPT_cautare_vfp.md | 11 +++++++ docs/cautare_vcx_vct.md | 66 ++++++++++++++++++++++++++++++++++---- programe/ocautare.prg | 19 ++++++++++- 3 files changed, 88 insertions(+), 8 deletions(-) diff --git a/docs/PROMPT_cautare_vfp.md b/docs/PROMPT_cautare_vfp.md index 631f060..79c5692 100644 --- a/docs/PROMPT_cautare_vfp.md +++ b/docs/PROMPT_cautare_vfp.md @@ -58,6 +58,17 @@ PAS 2 — caută în cache cu unealta Grep (NU în binarele originale): Grep pe folderul 'D:\ROA\_vfp_textcache\<>' pentru numele de metodă/procedură/variabilă căutat. Ex.: caută "PROCEDURE do_salvare" sau numele tabelei/cursorului implicat. +PAS 2b — atribuie rezultatele clasei/metodei care le conține. Grep dă doar fișier:linie, iar +într-un .vc2 antetul clasei poate fi cu mii de linii mai sus și ~2/3 din fișier e metadata: + + & 'D:\ROA\UTIL\foxbin2prg\vfp_symbols.ps1' -CacheRoot 'D:\ROA\_vfp_textcache\<>' -ProjectRoot '<>' -Grep 'expresie' -CodeOnly + + Alte moduri: -Where 'fisier.vc2:1234' (cine deține linia), -Find 'nume' (unde e DEFINIT, nu și + apelurile), -Class 'nume_clasa' (lanț de moștenire + metode cu intervalele de linii). + Indexul se reconstruiește singur din cache; rulează PAS 1 înainte. + OBLIGATORIU înainte de PAS 3: intervalul exact al metodei. Într-un .vc2 cu multe clase, Init, + Show, do_adauga există în aproape fiecare — fără interval editezi metoda din altă clasă. + CONVERSIE PUNCTUALĂ (un fișier sau folder care NU e în proiect, ex. o librărie din COMUN): & 'D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1' -Source 'CALE\catre\librarie.vcx' -CacheRoot 'D:\ROA\_vfp_textcache\<>' diff --git a/docs/cautare_vcx_vct.md b/docs/cautare_vcx_vct.md index 4da5cb6..245deaf 100644 --- a/docs/cautare_vcx_vct.md +++ b/docs/cautare_vcx_vct.md @@ -44,12 +44,12 @@ structura proiectului (nu murdărește arborele SVN), rulează FoxBin2Prg, păst # DOAR fișierele proiectului curent (recomandat, rapid) -> cache text propriu powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 ` -Project '\.pjx' -ProjectRoot '' ` - -CacheRoot 'D:\ROA\UTIL\foxbin2prg\_textcache_' + -CacheRoot 'D:\ROA\_vfp_textcache\' # include și rapoartele (.frx) și meniurile (.mnx) powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 ` -Project '\.pjx' -ProjectRoot '' ` - -CacheRoot 'D:\ROA\UTIL\foxbin2prg\_textcache_' -Types vcx,scx,frx,mnx + -CacheRoot 'D:\ROA\_vfp_textcache\' -Types vcx,scx,frx,mnx # conversie punctuală a unui fișier/folder (chiar dacă NU e în proiect, ex. o clasă din COMUN) powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -Source '\COMUN\clase\caut.vcx' @@ -57,7 +57,7 @@ powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -Sou # rebuild curat (șterge cache-ul întâi) / forțează reconversia powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 ` -Project '\.pjx' -ProjectRoot '' ` - -CacheRoot 'D:\ROA\UTIL\foxbin2prg\_textcache_' -Clean + -CacheRoot 'D:\ROA\_vfp_textcache\' -Clean ``` Exemplu (ROAAUTO): @@ -65,21 +65,73 @@ Exemplu (ROAAUTO): ```powershell powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 ` -Project D:\ROA\ROAAUTO\roaauto.pjx -ProjectRoot D:\ROA\ROAAUTO ` - -CacheRoot D:\ROA\UTIL\foxbin2prg\_textcache_roaauto + -CacheRoot D:\ROA\_vfp_textcache\roaauto ``` +> Cache-ul trebuie să stea **în afara** folderului `D:\ROA\UTIL\foxbin2prg`: `ReCreate_FoxBin2Prg.prg` +> face `Prg2Bin` recursiv pe tot folderul uneltei și ar reconverti `.??2`-urile din cache în binare +> rătăcite. + Rezultatul ajunge în cache, cu aceeași structură de directoare ca proiectul (ex.: -`_textcache_roaauto\Clase\odevize.vc2`, `_textcache_roaauto\comun\clase\_frm_base.vc2`). Apoi: +`roaauto\Clase\odevize.vc2`, `roaauto\comun\clase\_frm_base.vc2`). Apoi: ```bash -grep -rn "PROCEDURE do_calcul_tarife" "D:\ROA\UTIL\foxbin2prg\_textcache_" -grep -rln "factura_salvare" "D:\ROA\UTIL\foxbin2prg\_textcache_" # ce clase ating subiectul +grep -rn "PROCEDURE do_calcul_tarife" "D:\ROA\_vfp_textcache\" +grep -rln "factura_salvare" "D:\ROA\_vfp_textcache\" # ce clase ating subiectul ``` Flux tipic: rulează scriptul o dată (populează cache-ul), apoi caută cu `Grep` în cache. La sesiuni următoare rescrie doar ce s-a schimbat (incremental). Pentru o librărie din `COMUN\` care nu e în proiect, convertește-o punctual cu `-Source`. +## Indexul de simboluri: `vfp_symbols.ps1` + +`grep` spune *unde* e textul, nu *în ce metodă*. Într-un `.vc2` asta contează: fișierele au uzual +zeci de mii de linii, din care ~2/3 sunt proprietăți și metadata (nu cod), iar antetul clasei poate +fi cu mii de linii deasupra potrivirii. `D:\ROA\UTIL\foxbin2prg\vfp_symbols.ps1` reține intervalul +de linii al fiecărei clase/metode/proceduri — din cache-ul text **și** din `.prg`-urile proiectului +— și etichetează rezultatele. + +```powershell +$s = 'D:\ROA\UTIL\foxbin2prg\vfp_symbols.ps1' +$c = @('-CacheRoot', 'D:\ROA\_vfp_textcache\', '-ProjectRoot', '') + +# căutare etichetată cu clasa.metoda; -CodeOnly taie potrivirile din metadata/proprietăți +powershell -ExecutionPolicy Bypass -File $s @c -Grep '' -CodeOnly +powershell -ExecutionPolicy Bypass -File $s @c -Where '.vc2:' # cine deține linia +powershell -ExecutionPolicy Bypass -File $s @c -Find '' # unde e DEFINIT +powershell -ExecutionPolicy Bypass -File $s @c -Class '' # moștenire + metode +``` + +Exemplu (ROAACNPRO — parametrii impliciți ai scriptului țintesc deja acest proiect): + +``` +> vfp_symbols.ps1 -Grep 'calcul_cheiaj' -CodeOnly +clase\oacnpro.vc2:14937: [frm_tranzit.do_executa] llSucces = calcul_cheiaj(m.lcVyeIds) +> vfp_symbols.ps1 -Class oApp +oApp (roaacnpro.prg:88) -> RoaApp (roa.prg:1) -> Custom (clasă de bază VFP) +``` + +Când merită în locul unui `grep` direct: + +- **înainte de o editare cu `txt2vcx.ps1`** — `-Where`/`-Class` dau intervalul exact al metodei. + Într-un `.vc2` cu 15 clase, `Init`, `Show`, `do_adauga`, `do_executa2` există în aproape fiecare; + fără interval e ușor să nimerești metoda cu același nume din altă clasă; +- **rezultate multe** — `-CodeOnly` arată doar codul (pe `goExecutor` în ROAACNPRO: 1401 potriviri + de cod din 1505, restul metadata); +- **„definit sau doar apelat?"** — `-Find` dă doar definiția, `grep` dă tot; +- **moștenire** — `-Class` arată lanțul cu fișier:linie, deci se vede dacă o metodă e suprascrisă + local sau vine din `COMUN`. + +Indexul (`_symbols.tsv`, în rădăcina cache-ului) se reconstruiește singur când cache-ul e mai nou +(~4 s pentru ~200 de fișiere); e regenerabil, se poate șterge oricând. Rulează întâi `vcx2txt.ps1`: +indexul e derivat din cache, deci nu poate ști de modificări făcute în IDE și neconvertite. + +Limite: nu rezolvă apelurile indirecte (`EVALUATE`, `SET CLASSLIB`) — dă candidații, nu +certitudinea. Clasele de bază VFP (`form`, `custom`) apar ca neindexate: normal, n-au sursă în +proiect. Copiile vechi de `.prg` din subfoldere (ex. `COMUN\programe\roa\`) sunt excluse implicit +prin `-ExcludePrg`; dă `-ExcludePrg ''` ca să vezi tot. + ## Alternativă manuală (fără script) FoxBin2Prg scrie textul **lângă sursă**. Ca să nu murdărești folderul de clase al proiectului, diff --git a/programe/ocautare.prg b/programe/ocautare.prg index 55956f9..855c9ff 100644 --- a/programe/ocautare.prg +++ b/programe/ocautare.prg @@ -4015,7 +4015,7 @@ ENDFUNC *********************************************************************************************************** Function caut_client_contract_activ - Lparameters tcCond, tnIdPart, tnIdCtr + Lparameters tcCond, tnIdPart, tnIdCtr, tlVerificaANAF, tdDataDoc *** tnIdCtr: daca dau id_ctr direct (facturile de penalitati) selectez numai acest contractul indiferent de iscontract_valid() Local lcSelect, lcFiltruInitial, lcFiltru, lcSchema, lcOrder, lcColoane, lcTitlu, lcTitluColoane, lcNumeProc, lcPrimaColoana @@ -4071,8 +4071,25 @@ select c.id_ctr, c.id_part, p.denumire, p.cod_fiscal, c.data, c.numar, c.data_in lcNumeProc = [] lcPrimaColoana = [denumire,numar] + Local lnNivelANAF + Private poVerifAlegere, poANAFInlocuire + poVerifAlegere = .Null. + poANAFInlocuire = .Null. + If m.tlVerificaANAF + lnNivelANAF = ANAF_NivelVerificare() + If m.lnNivelANAF > 0 + poVerifAlegere = Createobject('anaf_verif_cautare') + poVerifAlegere.dDataDoc = ANAF_CaData(m.tdDataDoc) + poVerifAlegere.nNivel = m.lnNivelANAF + Endif + Endif + loCauta = cauta_alfa(lcSelect, lcFiltru, lcSchema, lcOrder, lcColoane, lcTitlu, lcTitluColoane, lcNumeProc, , lcFiltruInitial, lcPrimaColoana) + If Type('gnbuton') = 'N' And gnbuton = 1 + AplicaInlocuirePartenerANAF(loCauta, poANAFInlocuire, pcSir_Id_tip_part) + Endif + Return loCauta ENDFUNC ***********************************************************************************************************