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
14 KiB
Handoff — S4 runda 1 (PAGE3 doar afisare), predare pe prag de context
Sesiune intrerupta la prag de context (monitorizare-context.md). Stare stabila si consistenta
(text = binar), dar cu schele de diagnostic inca in cod — de scos inainte de livrare.
1. Ce am modificat, unde, si write-back-ul
Toate in COMUN (cross-proiect).
-
COMUN\programe\ofacturare_editare.prg— write-back N/A (e.prg, nu.vcx, se ruleaza direct). Antet actualizat (linia cu*!* helpere...) + doua functii noi, adaugate la coada fisierului:IncarcaVanzareNota(tnCod, tnNract, tcSerieAct, tdDataAct)— gaseste randul dinVANZARIcorespunzator notei curente, in cursorultvanz.IncarcaArticoleFactura(tnIdVanzare)— incarca liniile active dinVANZARI_DETALII(+ denumire articol/gestiune/valuta) in cursorultvd. Fisier ASCII (fara diacritice), editat direct cu Edit tool — fara riscul de corupere cp1252.
-
COMUN\clase\omodificari.vc2(clasafrm_modific2024) — text si binar SINCRONIZATE, ambele includ inca cod de diagnostic care trebuie scos:- PAGE3 nou pe
pgfArticole(PageCount=3,PAGE3.Caption="Articole factura") — linia cuPageCount = 3, ;in bloculADD OBJECT 'pgfArticole'. - Grid nou
pgfArticole.PAGE3.grdArticoleFactura(13 coloane,RecordSource="tvd",ReadOnly=.T.la nivel de grid si pe fiecareText1), plus intrarileOBJECTDATAcorespunzatoare (cautabile dupagrdArticoleFactura). - Proprietati noi pe clasa:
lAreArticoleVanzari,nIdVanzare,nTipVanzare(in blocul*<PropValue>, cautabile dupalareaarticolevanzari/nidvanzare/ntipvanzare). Load(): placeholderCREATE CURSOR tvd (...)daca nu e deja deschis — necesar, altfel grid-ul incearcaUSE tvdla constructie si pica pe dialog nativ "Open" (vezi sectiunea 4).Show(): bloc nou (cautabil dupaThis.lAreArticoleVanzari) care apeleazaIncarcaVanzareNota/IncarcaArticoleFacturasi comutapgfArticole.PageCountintre 2 si 3.- DE SCOS inainte de livrare: 5 linii
STRTOFILE(...'diag_class.txt'...)inserate ca checkpoint-uri de depanare inInit()(3 linii: inceput, dupaDoDefault(), sfarsit) siLoad()(2 linii: inceput, sfarsit) — cautabile dupadiag_class. Nu au efect functional (doar scriu intr-un fisier de log), dar nu trebuie sa ramana in cod livrat. - Fidelity check txt2vcx: OK la ultimul write-back (cel CU liniile de diagnostic inca in el).
.vcx/.vctau mtime 12:10, exact dupa acel write-back — deci binarul reflecta exact.vc2-ul curent, inclusiv diagnosticul.
- PAGE3 nou pe
Backup-uri pe disc (COMUN\clase\)
| Fisier | Continut |
|---|---|
omodificari.vc2.pre_s4runda1.bak |
Originalul, dinaintea oricarei modificari S4 |
omodificari.vc2.pre_diag.bak |
Versiunea mea curata (fara cele 5 linii de diagnostic) — asta e sursa de folosit pentru versiunea finala |
omodificari.vc2.mine_s4_full.bak |
Identic cu pre_diag.bak (copie facuta in timpul unui test de izolare) |
omodificari.vcx.mine_s4.bak / omodificari.vct.mine_s4.bak |
Binarul corespunzator lui pre_diag.bak, copiat direct (fara compilare) — restaurare instantanee |
Pasul urmator recomandat: Copy-Item omodificari.vc2.pre_diag.bak -> omodificari.vc2,
Copy-Item omodificari.vcx.mine_s4.bak -> omodificari.vcx (+ .vct) — restaurare instantanee
(fara txt2vcx) la versiunea curata cu PAGE3 functional, fara schela de diagnostic. Verifica dupa
aceea cu un diff ca omodificari.vc2 chiar nu mai contine diag_class.
2. Ce mai ramane din runda 1
Din sectiunea E / runda 1 a planului (A.2 PageCount + A.3 detectie + B.1 incarcare + B.2 marcaje):
- A.2 (PageCount) — FACUT, testat static (fidelity OK), netestat live pe formular (vezi
sectiunea 3 — blocaj de mediu, nu s-a ajuns sa vad
PageCountpe formularul instantiat real). - A.3 (detectie) — FACUT, testat direct (fara UI) cu rezultate PASS pe date reale (sectiunea 3). Deviaza de la recomandarea planului (cauta si de ce, sectiunea 4).
- B.1 (incarcare cursoare) — FACUT, testat direct, PASS.
- B.2 (marcaje stare linii) — NU e in scope runda 1 (grid-ul e strict readonly, fara
editare — marcajele
_modificat/sters/id_vanzare_det=0sunt pentru runda 2). Nu e inceput.
Ce lipseste efectiv: verificarea end-to-end ca, pe formularul REAL (Createobject('frm_modific2024')
.Show()),PageCountchiar ajunge 3 pe o factura si 2 pe o nota faraVANZARI— blocata de problema de mediu din sectiunea 3. Codul e scris si compilat curat; ramane doar confirmarea live.
3. Ce am testat, cu ce rezultat
Suita: COMUN\utile\Teste\editare_factura\test_page3_articole.prg (headless, vfp9.exe -A -T,
conexiune reala MARIUSM_AUTO). Log: test_page3_articole_log.txt in acelasi folder.
PASS, pe date reale, testat direct (apel functie, fara formular):
cod=1140888→IncarcaVanzareNotagasesteid_vanzare=1050,tip=1;IncarcaArticoleFacturaincarca 4 linii — coincide exact cu baza de regresie dinprogres.md(TOTAL_CU_TVA=1924.59).cod=1140885→ gasesteid_vanzare=1047,tip=-12(nu e factura, e alt tip de document) — confirma ca detectia functioneaza pe orice tip dinVANZARI, nu doar facturi (decizia 19).cod=1125486(an=2008, luna=2, notă contabila fara nicio legatura cuVANZARI) → 0 randuri gasite — cazul negativ cerut de criteriul de "gata" al rundei.- Coliziune pe
cod=1139934(patru randuri active inVANZARI, acelasi cod): filtrul compus (cod+nract+serie_act+data_act) gaseste EXACT randul cerut (nract=375/SSS→id_vanzare=882) si NU gaseste nimic pentru unnractfara corespondent (nract=13) — vezi sectiunea 4, e important.
NETESTAT live (formular real): verifica_pagecount_form (in acelasi fisier de test) instantiaza
frm_modific2024 exact ca do_editare_factura (Createobject+Show) si verifica PageCount —
se blocheaza intr-un dialog nativ VFP "View Parameter" in timpul Createobject, inainte sa
apuce sa ruleze vreo linie din Show(). Vezi sectiunea 4 pentru diagnosticul facut si o pista noua,
neexplorata inca, primita de la team-lead.
test_baseline_isolation.prg (in acelasi folder) — fisier temporar de diagnostic, se poate
sterge dupa ce cineva confirma diagnosticul de mai jos independent; nu face parte din suita
finala (antetul lui o spune explicit). L-am folosit ca sa demonstrez ca binarul ORIGINAL (dinainte
de S4) NU are acest blocaj in acelasi mediu de test (PageCount=2, done, fara dialog) — deci
problema e din diff-ul meu, nu un gol preexistent de mediu.
4. Descoperiri care nu trebuie pierdute
VANZARI.COD NU e unic — dovedit pe date, nu presupus
Contrar recomandarii A.3 din plan ("SELECT ... FROM vanzari WHERE cod = tact.cod"), am verificat
direct pe MARIUSM_AUTO:
- Indexul
IDX_VANZARI_04e pe(STERS, COD)si e NONUNIQUE — schema insasi nu garanteaza unicitate. cod=1139934are 4 randuri active (STERS=0) inVANZARI, cuTIP/NUMAR_ACTdiferite (375/SSS, 24/PF, 25/PF, 26/PF).cod=1139555are 2 randuri cuTIPdiferit (43 si 1).- Filtrarea suplimentara pe
NUMAR_ACT+SERIE_ACT+DATA_ACT(toate disponibile pe cursorultactcanract/serie_act/dataact, dinvact_tot) rezolva ambiguitatea:(COD, NUMAR_ACT, SERIE_ACT, DATA_ACT)verificat fara nicio dublura pe toata tabelaVANZARI. ID_FACT(alternativa mentionata inprogres.md— "toate legaturile trec prin ID_FACT sau ID_VANZARE, niciodata prin cod") nu e utilizabil ca filtru unic aici: eNULLpe o fractie mare de randuri chiar si pentru facturi normale (tip=1: 58 din 183NULL;tip=51: 58 din 74NULL), deci n-ar gasi avizele/tipurile fara facturare clasica — ar incalca decizia 19.
Concluzie aplicata in cod: IncarcaVanzareNota filtreaza pe cele 4 coloane compuse, nu doar pe
cod. Aceasta e o corectie de fond fata de A.3 din plan, nu o improvizatie — sectiunea C.1 din
plan_06_s4_proiectare.md ar trebui sa mentioneze asta daca cineva o rescrie.
Blocaj "View Parameter" la Createobject('frm_modific2024') — cauza NECONFIRMATA
Simptom: procesul vfp9.exe ramane blocat (CPU~0, Responding=True) intr-un dialog nativ "View
Parameter" exact in timpul liniei Createobject([frm_modific2024], lnIdSet), inainte sa ajunga
la orice linie din Show() — confirmat cu checkpoint-uri STRTOFILE in Init()/Load() (niciunul
nu s-a scris, deci blocajul e chiar mai devreme decat Load(), sau checkpoint-urile nu s-au atins
din alt motiv neexplicat).
Exclus cu dovezi (nu pierde timp re-verificand):
- Nu e cursorul
tvdlipsa — am incercat atat placeholder inLoad(), cat si pre-creare in scriptul de test inainte deCreateobject; blocajul a persistat identic. - Nu e un gol de mediu preexistent — binarul ORIGINAL (
omodificari.vcx.mine_s4.bakrestaurat temporar) ruleaza curat in ACELASI mediu de test (test_baseline_isolation.prg,PageCount=2, fara dialog). Deci e ceva din diff-ul meu. - Un blocaj anterior, diferit (
File 'crsjtvatemp.dbf' does not exist, dialog "Open") era intr-adevar preexistent — cerut deColumn63dingrdRulaje(PAGE1, cod netusat de mine), rezolvat in scriptul de test cuupdate_jtva_coloane("", "crsJtvaTemp", 0)inainte deCreateobject(nu in clasa — e o lipsa de mediu de test, nu de productie: in productie,crsJtvaTempe populat pe alte cai inainte sa ajunga un utilizator la acest formular). - Am citit
_pageframe.Init()(_baza.vc2:514-523, itereazaFor i = 1 To PageCountsi cheamatradu(.Caption)) ca prim suspect —tradu()(oproceduri_comune.prg:1746) e confirmat inofensiv (doarSTRTRANpe diacritice, fara Oracle/View). Nu e cauza, dar ramane singurul cod DEPENDENT dePageCountgasit prin cautare in_baza.vc2/_frm_base.vc2/_grd_base.vc2. - Am cautat "CREATE SQL VIEW" /
USE ... VIAin toata ierarhia de clase (omodificari,_baza,_frm_base,_grd_base,gridextras) — zero rezultate. Niciun view local gasit static.
Pista noua, neexplorata (primita de la team-lead, nu verificata de mine inca): dialogul "View
Parameter" apare tipic cand o variabila referita prin ?variabila (SQL passthrough) sau intr-un
view parametrizat e declarata LOCAL in loc de PRIVATE intr-un harness de test — LOCAL nu e
vizibil in rutinele apelate. Exemplu citat: do_editare_factura declara
Private pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzare (ofacturare_comun.vc2:3742). Nu am apucat
sa verific daca test_page3_articole.prg foloseste LOCAL unde codul original ar cere PRIVATE
undeva in lantul IncarcaCursoareModificareNota/Createobject — e primul lucru de incercat inainte
de a relua sapatul cu EnumWindows/PrintWindow (costisitor, ~15 cicluri de test in aceasta
sesiune doar pentru asta).
5. Capcane de mediu platite in aceasta sesiune
- Sterge intotdeauna
.fxp-ul vechi inainte de fiecare rulare de test — m-a pacalit o data: am editat.prg-ul dar am uitat sa sterg.fxp, iar VFP a rulat tacut codul VECHI compilat, dand rezultate inconsistente intre rulari identice in aparenta. Simptom: log-ul arata alt comportament decat sursa curenta ar trebui sa produca. - FoxBin2Prg NU pastreaza ordinea textuala la scriere-citire (roundtrip) pentru ADD OBJECT
multiple si proprietati custom — le REGENEREAZA in ordine proprie (alfabetica pentru
coloane/obiecte fii, alta regula neclara pentru proprietati custom simple —
nidvanzarea iesit INAINTEA luinid_set, desi_<vin ASCII). Fidelity-check-ul compara text-sursa cu text-regenerat, deci orice ordine "naturala" (alfabetica presupusa de mine) poate pica fidelity. Solutie aplicata: dupa primul fidelity FAIL, am adoptat ca sursa noua textul regenerat din<staging>\verify\*.vc2(e deja in forma canonica), nu am incercat sa ghicesc ordinea corecta. Confirma exact indicatia dinflux-editare-vfp-text.md. InputMaskcu literal (nuget_mask(...)) trebuie ghilimeluit ("9.99"), nu bar (9.99) — altfel VFP il interpreteaza numeric, nu ca string de format. Prins abia la inspectia manuala a textului regenerat, fidelity-check-ul NU l-a semnalat separat (a picat impreuna cu reordonarea).- Grid nou cu
RecordSourcepe un cursor care nu exista inca la constructia formularului → VFP incearcaUSE <recordsource>ca fisier fizic si arata dialogul nativ "Open" daca nu-l gaseste pe disc — exact acelasi tipar deja documentat in clasa pentrusaft_taxtable/saft_mecanisme_plati(Load(), verificatIf !Used(...)inainte de orice altceva). Solutia e aceeasi: placeholder gol creat inLoad(), INAINTE ca framework-ul sa construiasca grid-urile. - Query-uri Oracle multiple rulate manual (sqlplus) au fost esentiale pentru validarea empirica
a filtrului compus pe
VANZARI— nu s-ar fi descoperit coliziunea pecoddoar din cod static.
6. Ce recomand pentru urmatorul agent
- Restaureaza versiunea curata (sectiunea 1, pasul recomandat) — 2 copieri de fisier, fara
compilare, verifica cu
grep diag_classca a disparut. - Incearca pista
LOCAL/PRIVATEdin sectiunea 4 petest_page3_articole.prginainte de orice alta depanare GUI. - Daca se rezolva: reruleaza
test_page3_articole.prgcomplet, confirma PASS pe toate cazurile (inclusivverifica_pagecount_form), stergetest_baseline_isolation.prg+.fxp+ log-ul lui, scrie diff-ul (docs\diff_s4_runda1_page3.patch,git diff --no-index <bak> <editat>) si raportul (docs\cercetare\rec_s4_runda1.md) cerute initial de team-lead. - Daca team-lead sau alt agent scrie capcana "View Parameter / LOCAL vs PRIVATE" in
testare-ui-vfp.md, nu o duplica — team-lead a intrebat explicit cine o scrie.