Files
roafacturare/docs/cercetare/rec_fix_grid_tvd_blank.md
Marius Mutu d9f5ca4226 docs: planurile, proiectarile si rapoartele de lucru intra in versionare
Folderul docs\ era pana acum in afara oricarui control de versiuni - nici git,
nici SVN - desi contine planurile pe puncte, proiectarile si rapoartele de
cercetare pe care se sprijina modificarile din cod. O stergere acolo era
definitiva.

Fisierele intermediare (handoff-uri intre sesiuni, diff-uri deja aplicate) au
fost sterse inainte, nu versionate: ce era durabil in ele a intrat in antetele
fisierelor de test la care se refereau.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
2026-08-11 22:17:17 +03:00

125 lines
8.3 KiB
Markdown

# 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 `docs\handoff_fix_grid_tvd_blank.md` - 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`):
`docs\diff_fix_grid_tvd_blank.patch`. 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).