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

8.3 KiB

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).