# Grid articole (pagina 3, frm_modific2024) blank la editare factura ## Defect raportat La editarea unei facturi (`frm_modific2024`, pagina 3 "Articole factura"), pagina apare dar grid-ul `grdArticoleFactura` apare gol. ## Ipoteza initiala (infirmata) si ce s-a dovedit real Ipoteza initiala ("RecordSource-ul grid-ului se goleste la `Use In tvd`") a fost testata prima data la nivel de date (headless) si infirmata: `RecordSource` a ramas `"tvd"` neschimbat. Grid-ul insa NU se materializeaza deloc headless (`ColumnCount=0` e o datorie deja cunoscuta a mediului de test), deci masuratoarea a fost neconcludenta, nu o infirmare reala a mecanismului. Reprodus apoi cu un **test UI real** (formular vizibil, off-screen, `PrintWindow` - fara input real, cf. `testare-ui-vfp.md`): `COMUN\utile\Teste\editare_factura\test_ui_grid_articole.prg`, rulat cu `vfp_ui_harness.ps1`. Document folosit: cod=1139934/an=2021/luna=12 (id_vanzare=882) - ales pentru ca are SI rulaje (altfel `Show()` ascunde tot `pgfArticole`, cf. `omodificari.vc2:14254`, indiferent de articole). Screenshot **inainte de fix**: pagina 3 e vizibila, dar grid-ul nu are NICIO coloana (headere lipsa complet) - confirmat si prin masuratoare: `ColumnCount grid = 0`, desi `Reccount(tvd) = 2` si `RecordSource grid = [tvd]`. **Mecanismul real**: `IncarcaArticoleFactura` (`ofacturare_editare.prg:270-300`, apelat din `Show()`) facea `Use In tvd` urmat de `SELECT ... INTO CURSOR tvd READWRITE` - recreaza cursorul sub un grid deja legat pe el. Acesta e exact capcana deja documentata in `depanare_testare_vfp.md` sectiunea 6: "*un cursor legat la grid recreat de Init lasa grid-ul fara coloane*" - identica, doar declansata din `Show()` in loc de `Init()`. `RecordSource` (sir text) ramane `"tvd"`, dar `Columns` colapseaza la 0 - de aici simptomul "pagina apare, grid gol". ## Arhitectura FINALA (dupa o coliziune de editare intre agenti concurenti pe `Show()`, ## descrisa in handoff intermediar (sters) - rezolvata, verificata mai jos) Varianta livrata difera de iteratia descrisa initial mai sus (`ZAP`+`APPEND FROM` in `IncarcaArticoleFactura` + `Refresh()` in `Show()`). Arhitectura finala muta incarcarea articolelor INAINTE de `Createobject`, ca sa nu mai fie nevoie de nicio recreere/refresh dupa ce grid-ul s-a legat: 1. **`ofacturare_comun.vc2:3793` (`do_editare_factura`)** si testele UI echivalente: apelantul cheama `IncarcaArticoleFactura(id_vanzare, 'crsArticoleFactura')` INAINTE de `Createobject`, intr-un cursor separat, neatins de grid. 2. **`omodificari.vc2:14121-14148` (`Load()`)**: `tvd` se recreeaza mereu cu structura canonica (`CreeazaCursorTvdGol()` daca `ofacturare_editare.prg` e incarcat, altfel `CREATE CURSOR` inline pentru ROACONT/ROAGEST), apoi, daca apelantul a pregatit `crsArticoleFactura`, il `APPEND FROM` in `tvd` + `GO TOP` - **inainte** ca grid-ul sa se lege la constructia formularului, deci `ColumnCount` nu mai colapseaza niciodata dupa legare. 3. **`omodificari.vc2:14249-14254` (`Show()`)**: apelul vechi `IncarcaArticoleFactura(This.nIdVanzare)` ramane doar ca FALLBACK, pazit de `IF Reccount('tvd') = 0`, pentru apelantii care nu pre-incarca articolele (ex. teste vechi, alti apelanti neactualizati). 4. **`omodificari.vc2:14269` (`Show()`)**: conditia de colaps a pageframe-ului extinsa de la `RECCOUNT('trul')=0 AND RECCOUNT('trul_obinv')=0` la `... AND (!USED('tvd') OR RECCOUNT('tvd')=0)` - fara asta, un document cu articole dar zero rulaje isi ascundea complet pagina 3 (defect 2, independent de defectul 1). 5. **`ofacturare_editare.prg` (`CreeazaCursorArticoleGol`/`IncarcaArticoleFactura`)**: parametrizate cu alias destinatie (implicit `'tvd'`), ca sa poata scrie fie direct in `tvd` (ramurile fara pre-incarcare), fie in `crsArticoleFactura` (apelantii care pre-incarca). Coliziunea descrisa in handoff (editarea mea peste editarea altui agent pe `Show()`) e rezolvata - verificat direct in fisier (grep + citire linie cu linie) pe 08.08.2026, ~23:49: ambele fix-uri (fallback pe `Reccount('tvd')=0` si conditia extinsa cu `tvd` la pageframe) sunt prezente, iar mtime `.vc2`/`.vcx`/`.vct` sunt sincrone (text cu ~1s mai nou decat binarul, tiparul normal `txt2vcx.ps1`). ## Testare (verificare 08.08.2026, dupa rezolvarea coliziunii) - **Regresie `test_page3_articole.prg`** (watchdog, 0 dialoguri, exit code 0): rezultat identic cu rularea anterioara coliziunii - toate PASS-urile raman PASS (`cod=1140885`, `cod=1125486`, `cod=1137874`, `cod=1139934`/882, coliziunea pe cod cu 4 randuri VANZARI). Singurele FAIL sunt pe `cod=1140888` (4 blocuri de test), toate cu aceeasi cauza radacina: `gasit in vanzari = .F.` (documentul nu mai are rand in `VANZARI`) - degradare de date preexistenta, nelegata de acest fix, confirmata stabila (acelasi rezultat, byte cu byte, in ambele rulari). Log: `COMUN\utile\Teste\editare_factura\test_page3_articole_log.txt`. - **UI cu captura, `cod=1140885` (zero rulaje, defectul 2)**: `test_ui_pageframe_zero_rulaje.prg` + `vfp_ui_harness.ps1`. Rezultat: `PageCount=3`, `pgfArticole.Visible=.T.`, `lAreArticoleVanzari=.T.`, `Reccount(trul)=0`, `Reccount(trul_obinv)=0`, `Reccount(tvd)=2`, `ColumnCount grid=14`. Screenshot confirma vizual pagina "Articole factura" vizibila si selectata, grid populat cu 2 randuri (MATERIALE, MANOPERA) pe toate coloanele: `COMUN\utile\Teste\editare_factura\screenshots_after\step_0_cod_1140885_zero_rulaje.png`. PASS. - **UI cu captura, `cod=1139934`/an=2021/luna=12 (`id_vanzare=882`, 2 linii, are si rulaje)**: `test_ui_grid_articole.prg` + `vfp_ui_harness.ps1`. Rezultat: `PageCount=3`, `pgfArticole.Visible=.T.`, `lAreArticoleVanzari=.T.`, `Reccount(tvd)=2`, `RecordSource grid=[tvd]`, `ColumnCount grid=14`. Screenshot confirma vizual grid-ul populat cu 2 randuri (ACOPERIRE FAR VOLVO F..., MANOPERA) pe toate coloanele: `COMUN\utile\Teste\editare_factura\screenshots_after_1139934\step_0_cod_1139934_regresie_grid.png` (mutat intr-un folder separat dupa ce prima rulare cu `-ShotsDir screenshots_after` a golit accidental folderul si a sters captura de la `cod=1140885` de mai sus - regenerata separat, vezi mai jos). ## Incident de verificare: stergere accidentala de screenshot, recuperat In timpul acestei verificari, rularea testului UI pentru `cod=1139934` a folosit `-ShotsDir screenshots_after` (acelasi folder in care exista deja captura de la `cod=1140885` dintr-o rulare anterioara) - `vfp_ui_harness.ps1:142-143` goleste `ShotsDir` la fiecare lansare (`Clear-Dir`), deci captura veche a fost stearsa. Nu a fost o modificare de sursa, doar o coliziune de folder de output. Recuperat prin rerularea `test_ui_pageframe_zero_rulaje.prg` (acelasi test, acelasi document, acelasi rezultat de date - vezi mai sus) cu acelasi `-ShotsDir screenshots_after`, iar captura pentru `cod=1139934` a fost mutata separat in `screenshots_after_1139934\` inainte de rerulare, ca sa nu se piarda si ea. Ambele capturi finale sunt valide si confirmate vizual. ## Ce ramane de verificat pe ecran (Marius) Deschide o factura reala cu articole (si, ideal, cu rulaje - altfel pagina 3 poate fi complet ascunsa, comportament preexistent nelegat de acest fix) si confirma ca grid-ul "Articole factura" apare populat la prima deschidere a paginii, fara sa fie nevoie de navigare suplimentara. ## Descoperire separata (comunicata team-lead-ului) `ofacturare_editare.prg` **este** inregistrat in `roacont.prg:212` (`SET PROCEDURE TO ofacturare_editare.prg ADDITIVE`), nu doar in `roafacturare.prg`. E absent doar din `roagest.prg` (doar `ofacturare_comun.PRG` si `ofacturare_stoc.PRG` sunt inregistrate acolo). Garda pe `Set("Procedure")` din `Load()`/`Show()` tot trebuie sa ramana (ROAGEST are nevoie de ea), dar impactul in ROACONT pe `comun.vc2:2436` (registrul jurnal) ramane de verificat separat. ## Stare livrare Fara commit. Diff regenerat din starea curenta (git diff vs HEAD, in `COMUN`): diff aplicat (sters). Write-back facut in `COMUN\clase\omodificari.vcx`/`.vct` si `COMUN\clase\ofacturare_comun.vcx`/`.vct` (mtime text/binar sincrone, verificat 08.08.2026 23:49). `ofacturare_editare.prg` e ASCII pur, editat direct, fara risc de encoding. Punctul 3 din mesajul team-lead (extinderea gardei la cei 4 apelanti / ROACONT/ROAGEST) - neinceput in aceasta verificare, in afara scopului ei (doar rulare de teste, fara editare de sursa).