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
This commit is contained in:
124
docs/cercetare/rec_fix_grid_tvd_blank.md
Normal file
124
docs/cercetare/rec_fix_grid_tvd_blank.md
Normal file
@@ -0,0 +1,124 @@
|
||||
# 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).
|
||||
Reference in New Issue
Block a user