- ooperatii_comune: verific_partener nu mai construieste SQL NULL cand contul primit e NULL (EMPTY(.NULL.) e .F. in VFP) - utile\context_watch.ps1 si utile\docs_revizie_check.ps1: masurarea contextului sesiunii si cadenta reviziei de documentatie, prin hook-uri Claude Code (instalare in docs\monitorizare-context.md) - reguli_lucru: delegare la subagenti, modificari minime si scoped, scrierea si revizuirea documentatiei, changelog strictul necesar (regulile 3, 6, 9, 11, 12) - scripturi-migrare-db: continutul unui script (scoped, fara select, idempotent) - teste noi pentru cele doua erori din achizitia de import - restul documentatiei compactata, fara pierdere de reguli Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RYbiinqXxdEqXi53x4Ro7K
6.6 KiB
Căutare în codul din librăriile/formele VFP (.vcx/.vct, .scx/.sct, ...)
Partajat între proiectele ROA* (companion narativ la PROMPT_cautare_vfp.md din acest folder —
varianta "prompt de copiat" — acest fișier e ghidul de referință complet, cu exemple).
Căutare de cod-sursă (proceduri, metode, parametri) care nu stă în .prg, ci în interiorul
binarelor VFP: librării de clase (.vcx+.vct), forme (.scx+.sct), rapoarte (.frx+.frt),
meniuri (.mnx+.mnt), baze de date (.dbc+.dct).
De ce e nevoie de asta
Un .vcx e o tabelă DBF: codul metodelor stă în câmpuri memo în .vct. grep direct pe
.vct găsește textul dar ca binar (octeți \0 între linii), fără numere de linie și greu de
citit. Soluția: convertim binarul în reprezentarea lui TEXT (.vc2, .sc2, …) — PRG-style
lizibil, metode sortate alfabetic — și căutăm în text cu grep/Grep.
Regula de aur: textul generat e doar pentru citire/căutare, CU O EXCEPȚIE: pentru
.vcx/.scxse poate și edita pe text, cu write-back în binar (txt2vcx.ps1) — veziPROMPT_cautare_vfp.mdpasul 3 (ordine obligatorie, encoding, fidelity check). Pentru.frx/.mnx/.dbcnu există write-back — modificările se fac tot în IDE-ul VFP.
Unelte disponibile (verificate)
| Unealtă | Cale | Rol | Recomandare |
|---|---|---|---|
| FoxBin2Prg | D:\ROA\UTIL\foxbin2prg\FoxBin2Prg.EXE |
Binar VFP ⇄ text bidirecțional (.vc2/.sc2/.fr2/.mn2/.dc2/.lb2) |
De folosit. Fidel, include corpul metodelor, parametri, comentarii |
| vcx2prg | D:\ROA\UTIL\vcx2prg\x2prg.prg |
Doar .vcx → .prg compilabil |
Alternativă mai veche, doar clase, necesită IDE VFP deschis |
| prgtovcx | D:\ROA\UTIL\prgtovcx\prgtovcx.PRG |
Invers: .prg → .vcx |
Nu pentru căutare (direcție opusă) |
FoxBin2Prg e prima alegere: rulează din linia de comandă fără IDE deschis (EXE compilat), acoperă toate tipurile de container, text mai fidel decât vcx2prg.
Dacă
FoxBin2Prg.EXElipsește: deschideD:\ROA\UTIL\foxbin2prg\foxbin2prg.pj2în VFP 9 și Build > Build Executable. Lângă EXE trebuie să existefilename_caps.exeșiprops*.txt(deja în folder).
Mod recomandat: scriptul vcx2txt.ps1
D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 copiază binarul + memo-ul într-un cache care oglindește
structura proiectului (nu murdărește arborele SVN), rulează FoxBin2Prg, păstrează doar textul.
Incremental (sare peste ce e deja la zi).
# DOAR fișierele proiectului curent (recomandat, rapid) -> cache text propriu
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 `
-Project '<RADACINA_PROIECT>\<proiect>.pjx' -ProjectRoot '<RADACINA_PROIECT>' `
-CacheRoot 'D:\ROA\UTIL\foxbin2prg\_textcache_<nume_proiect>'
# include și rapoartele (.frx) și meniurile (.mnx)
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 `
-Project '<RADACINA_PROIECT>\<proiect>.pjx' -ProjectRoot '<RADACINA_PROIECT>' `
-CacheRoot 'D:\ROA\UTIL\foxbin2prg\_textcache_<nume_proiect>' -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 '<RADACINA_PROIECT>\COMUN\clase\caut.vcx'
# rebuild curat (șterge cache-ul întâi) / forțează reconversia
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 `
-Project '<RADACINA_PROIECT>\<proiect>.pjx' -ProjectRoot '<RADACINA_PROIECT>' `
-CacheRoot 'D:\ROA\UTIL\foxbin2prg\_textcache_<nume_proiect>' -Clean
Exemplu (ROAAUTO):
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
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:
grep -rn "PROCEDURE do_calcul_tarife" "D:\ROA\UTIL\foxbin2prg\_textcache_<nume_proiect>"
grep -rln "factura_salvare" "D:\ROA\UTIL\foxbin2prg\_textcache_<nume_proiect>" # 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.
Alternativă manuală (fără script)
FoxBin2Prg scrie textul lângă sursă. Ca să nu murdărești folderul de clase al proiectului, copiază perechea binar+memo într-un folder temporar și convertește acolo:
# .vcx -> .vc2 (cType gol = extensia decide direcția BIN2PRG)
Copy-Item D:\ROA\<proiect>\Clase\odevize.vcx, D:\ROA\<proiect>\Clase\odevize.vct D:\tmp\
& 'D:\ROA\UTIL\foxbin2prg\FoxBin2Prg.EXE' 'D:\tmp\odevize.vcx' '' '' '' '1' '0' '1'
# => D:\tmp\odevize.vc2
Poziții parametri: fișier, cType, cTextName, lGenText, cDontShowErrors=1, cDebug=0, cDontShowProgress=1. Lasă cType gol — extensia (.vcx) determină direcția. (Nu da explicit
"BIN2PRG" pentru un singur fișier: în acel mod EXE-ul așteaptă un director.)
Detalii complete de parametri: D:\ROA\UTIL\foxbin2prg\docs\FoxBin2Prg_Run.md.
Soluție rapidă „murdară" (un singur fișier, fără conversie)
Pentru „există metoda X undeva în librărie?", grep merge direct pe .vct (îl vede ca binar, dar
găsește potrivirile):
grep -c "PROCEDURE" "D:\ROA\<proiect>\Clase\odevize.VCT"
grep -a -o "PROCEDURE [a-zA-Z0-9_]*" "D:\ROA\<proiect>\Clase\odevize.VCT"
Bun pentru „da/nu" și nume de metode; pentru corp/context, folosește conversia în text.
Corespondență extensii binar → text
| Container | Binar (+memo) | Text |
|---|---|---|
| Librărie clase | .vcx + .vct |
.vc2 |
| Formă | .scx + .sct |
.sc2 |
| Raport | .frx + .frt |
.fr2 |
| Etichetă | .lbx + .lbt |
.lb2 |
| Meniu | .mnx + .mnt |
.mn2 |
| Bază de date | .dbc + .dct |
.dc2 |
Note
- Codul aplicației stă mai ales în
Clase\*.vcx; multe.vcx-uri sunt înCOMUN\(framework partajat între toate aplicațiile ROA — veziCLAUDE.mdper proiect). - Cache-ul text e regenerabil, în afara arborelui SVN/git al proiectului — poate fi șters oricând.
- Conversia nu necesită IDE-ul VFP deschis (folosește EXE-ul compilat).
- Vezi și conventie_encoding_cp1252.md — capcană de encoding la
editarea
.sc2/.vc2(nu doar la căutare).