M1 modifica_reg_dg: garda id_part NULL/empty (mesaj + Return .F.), NVL pe id_part/nr_pag, functia intoarce succes. M2 validare partener in toate cele 3 puncte de salvare, INAINTE de blocarea campurilor (Command2.Click salveaza inainte sa blocheze; bara laterala si Page3.Deactivate nu mai salveaza/prompteaza cu partener NULL). M3 do_adauga: documentul nou intra direct in editare (llock=.F., focus cmdDenumire); eliminat mesajul fals "Toate modificarile au efect imediat!". M4 viz_registratura + do_cauta: filtru initial "doar ultimul document" (subquery max(id_reg)); fara criterii de cautare se pastreaza filtrul, nu se incarca toata baza. M5 fonturi: eliminate 154 suprascrieri "Arial Narrow" si rebazate 96 controale baseclass pe COMUN _baza.vcx (textbox/label/checkbox/commandbutton/optiongroup); Init de grid propaga fontul la coloane si headere (fara asta raman Arial 9 - verificat empiric). Teste: harness headless (init env dedicat, form, adaugare+editare cu verificare in baza) + test UI vizual cu screenshots pe fluxul real (19 PASS / 0 FAIL). Diff-uri de audit in docs/diff_runda1_*.patch. M6 (build EXE) BLOCAT headless: roaRegistratura.pjx refera 48 fisiere hardcodate pe "c:\program files\...\vfp 9" (masina 32-bit din 2021) + COMUN\utile\hpdf\ReportOutput\ctl32_progressbar.vcx redenumit _old; necesita repathing o data in VFP9 IDE. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018H9za5A9Tk6wcLFof6seds
9.6 KiB
Analiza: adaugare/editare document in registratura + lista documentelor + fonturi
Data: 23.07.2026. Analiza pe surse (fara modificari de cod). Referintele de linie sunt in
fisierele text FoxBin2Prg (.vc2), sincronizate cu binarele la data analizei.
1. Fluxul actual (cum functioneaza azi)
Fereastra principala (ofundal_registratura.vc2, clasa pg_meniu_princ):
- Page2 "Lista documentelor" =
ct_registratura(grid pe cursorulcRegistratura, incarcat deviz_registraturadinPrograme\oproceduri_roaregistratura.prg). - Page3 "Datele documentului" =
ct_part_nr_data(Partener / Nr. doc / Data doc + butonul Modifica/Salveaza cu lacat) +ct_date_generale(bara outlook cu butoanele Date generale / Referinte / Observatii / Documente atasate, care deschid formulare separatepodg_dg,podg_referinte,podg_obs,podg_link). - Starea editarii este
ct_part_nr_data.llock(.T.= blocat). ButonulCommand2comuta: la deblocare afiseaza "Toate modificarile au efect imediat!", la a doua apasare ("Salveaza") apeleazamodifica_reg_dg. - Salvarea reala e
modifica_reg_dg(oproceduri_roaregistratura.prg:100) -> apel PL/SQLpack_registratura.modifica_registratura. - Adaugarea (
ct_registratura.do_adauga,ferestre_registratura.vc2:1206): aloca numar intern (oGeneratorNumere, seria 10), insereaza un rand GOL prinpack_registratura.adauga_registratura, apoi sare pe Page3. Documentul nou are id_part NULL pana alege utilizatorul partenerul.
2. Problemele identificate (cauze exacte)
P1. Prompt "Doriti sa salvati modificarile facute?" aparut "din senin"
Doua locuri intreaba automat cand llock = .F.:
outlook2003bar.vc2:1009(do_arata_formular): orice click pe un buton din bara laterala (Date generale, Referinte, Observatii, Documente atasate) intreaba si, la Da, ruleazamodifica_reg_dg.ofundal_registratura.vc2:286(Page3.Deactivate): la parasirea paginii, la fel.
Deci scenariul raportat: utilizatorul apasa Modifica (deblocare), apoi navigheaza (ex. deschide sectiunea Date generale ca sa completeze campuri sau vrea partenerul) -> prompt de salvare -> Da -> eroare, pentru ca documentul nou are partener NULL.
P2. Eroarea la partener NULL
modifica_reg_dg, linia 111:
lcId_part = Alltrim(Str(loRegistratura.id_part)) && fara NVL!
Str(.NULL.) -> NULL, concatenarea in lcSql propaga NULL -> goExecutor.oExecute(NULL)
-> eroare. Aceeasi problema potentiala: lcNr_pag (linia 123, fara NVL) si Dtos() pe
date NULL (liniile 114/116 dau sir gol la NULL — tratat in IIF, ok).
Validarea de partener exista doar in Command2.Click (ramura Salveaza,
ferestre_registratura.vc2:332), dar:
- ruleaza DUPA ce campurile au fost deja blocate si caption-ul pus pe "Modifica" (stare inconsistenta: mesaj "Alegeti partenerul!", dar formularul ramane blocat si nesalvat);
- celelalte doua puncte de salvare (P1) NU au deloc validarea.
P3. Flux confuz Modifica/Salveaza
- Mesajul de la deblocare ("Toate modificarile au efect imediat!") e fals: modificarile de
date generale se salveaza doar la "Salveaza"/prompt; doar
ck_avizat.Validscrie imediat. - Dupa adaugare (
do_adauga) documentul nou apare pe Page3 blocat: utilizatorul mai trebuie sa apese Modifica inainte sa poata alege partenerul — pas inutil si sursa promptului din P1. - Raspunsul "Nu" la prompt arunca modificarile fara re-citirea datelor originale:
goRegistraturaramane cu valorile editate (afisare inselatoare pana la refresh).
P4. Lista documentelor: incarcare integrala + pozitionare pe primul
viz_registraturaincarca TOATE inregistrarile custers=0dinvregistratura(fara filtru initial pe ultimul document), apoiGo Top-> se vede inceputul bazei.Page2.Activateapeleazado_cauta()la fiecare activare; fara bife, filtrul devineSTERS=0-> reincarcare integrala la fiecare revenire pe lista.
P5. Fonturi
- Clasele COMUN de baza (
_baza.vcx:_textbox,_label,_checkbox,_gridetc.) au deja Arial 10 — controalele derivate din ele sunt OK. - In proiect insa:
ferestre_registratura.vc2: 75 aparitiiFontName = "Arial Narrow"(gridulgrid_registratura+ toate coloanele/headerele/text-urile, checkbox-urile de filtru);onom_clienti.vc2: 79 aparitii;ct_part_nr_data,ct_date_generalesi mare parte dinfrm_dg_date_generalefolosesc controale baseclass VFP (textbox/label/checkbox/commandbutton fara clasa COMUN) fara FontName -> mostenesc fontul formului sau raman pe default (Arial 9).
P6. Alte observatii (fragilitate, de semnalat)
Ck_tipdoce legat de classlib..\..\roacont\comun\clase\caut_ora.vcx(referinta cross-proiect catre ROACONT, nu COMUN-ul propriu) —ferestre_registratura.vc2:589.cmdFel_document/cmdNresp/etc. au Picture din..\..\roacontracte\grafice\find.bmp(alt proiect).- Proiectul nu a mai fost recompilat de mult cu COMUN-ul curent -> build necesar in VFP9 IDE dupa aplicarea modificarilor.
3. Modificari propuse (minime, in ordinea prioritatii)
M1. modifica_reg_dg — garda si NVL (oproceduri_roaregistratura.prg)
- La inceput: daca
Isnull(toRegistratura.id_part) Or Empty(toRegistratura.id_part)->AMESSAGEBOX('Alegeti partenerul inainte de salvare!')siReturn .F.. lcId_part/lcNr_pagcuNvl(...); functia sa intoarca.T./.F.(succes), ca apelantii sa poata reactiona.
M2. Punct unic de salvare + prompt doar cand exista partener
- In
do_arata_formular(outlook2003bar) siPage3.Deactivate: dacallock=.F.siid_partNULL -> mesaj "Alegeti partenerul!" si fara apelmodifica_reg_dg(raman in editare in cazul barei laterale; la Deactivate se renunta explicit). - In
Command2.Click(Salveaza): validarea partenerului INAINTE deblocheaza_campuri(); se blocheaza doar dupa salvarea reusita.
M3. Dupa adaugare, intra direct in editare
In do_adauga / la comutarea pe Page3 pentru document nou: llock=.F.,
deblocheaza_campuri() (inclusiv pe formularele podg_* deschise) si focus pe
cmdDenumire -> utilizatorul alege direct partenerul, fara pasul Modifica.
Se elimina si mesajul fals "Toate modificarile au efect imediat!" (sau se inlocuieste cu
"Apasati Salveaza pentru a pastra modificarile").
M4. Lista: initial doar ultimul document
viz_registraturaprimeste filtrul initial:sters=0 and id_reg = (select max(id_reg) from vregistratura where sters=0)(de validat sintaxa cu gencursor la implementare; alternativ ordonare desc +rownum=1).do_cauta: daca nicio bifa de filtru nu e activa, pastreaza filtrul "ultimul document" in loc deSTERS=0(incarcare integrala doar la cautare explicita).- Dupa incarcare: pozitionare pe ultimul (unicul) rand -> martor pentru ultimul numar de inregistrare.
M5. Fonturi Arial 10 — prin rebazare pe clasele din _baza.vcx (decizie Marius)
- Controalele baseclass VFP din proiect se rebazeaza pe clasele COMUN care au deja
Arial 10:
textbox->_textbox,label->_label,checkbox->_checkbox,commandbutton->_commandbutton,optiongroup->_optiongrup(toateOF "..\comun\clase\_baza.vcx"). Vizate:ct_part_nr_data(txtClient, txtNumar, txtData_ctr, cmdDenumire, Command2, Label3/4/9),frm_dg_date_generale(txt*, cmd*, Label*, ck_avizat, optIE) si textele/checkbox-urile din coloanele griduluigrid_registratura. - Se ELIMINA suprascrierile explicite
FontName = "Arial Narrow"(75 inferestre_registratura.vc2, 79 inonom_clienti.vc2), astfel incat controalele sa mosteneasca Arial 10 din clasele de baza; gridul (_grdrowdin_grd_base.vcx) ramane pe mostenirea lui odata scoase suprascrierile. - Controalele deja derivate din COMUN (
_lbbase,but_*,clb_tx_simplu,ck_filtru_*etc.) raman neatinse. - Atentie la latimi: Arial e mai lat ca Arial Narrow — de verificat vizual coloanele gridului si etichetele dupa schimbare (conventie_ux_formulare.md).
- Nota tehnica: rebazarea se face in textul
.vc2(schimbareaAS <clasa>+ClassLibin markerulEND OBJECT), cu fidelity-check la write-back; e o modificare mai invaziva decat schimbarea de font per control — de testat intai pe un singur control, apoi extins.
M6. Recompilare
Dupa aplicarea M1–M5: BUILD proiect in VFP9 IDE (recompilare cu COMUN-ul curent),
apoi git_sync si commit (dupa aprobarea diff-urilor).
4. Testare
Scripturi noi in Teste\ (rulare headless vfp9.exe -A -T, log in Teste\log_*.txt,
mediu CENTRAL / MARIUSM_AUTO conform reguli_lucru.md):
test_init_env_registratura.prg— init mediu neinteractiv pentru ROAREGISTRATURA (SET PATH/CLASSLIB/PROCEDURE preluate dinPrograme\roaregistratura.prg).test_registratura_form.prg— incarca cursorul listei (viz_registratura), verifica existenta cursorului, numarul de inregistrari si pozitionarea pe ultimul document; instantiaza containerulct_registraturape un form ascuns.test_registratura_adaugare.prg— fluxul de adaugare SI editare: alocare numar intern,adauga_registratura, apoimodifica_reg_dgcu partener NULL (se asteapta eroare/refuz — reproduce bugul P2), cu partener valid (se asteapta succes), apoi EDITAREA documentului (modificare descriere/nr_pag/data + re-salvare + verificare in baza — fluxul Modifica -> Salveaza).
NOTA: scripturile NU se ruleaza pe baza de productie (JCSSERVER/CONTAFIN_ORACLE).
Daca schema de test nu contine pack_registratura, testele de adaugare logheaza eroarea
si se opresc curat (fara scrieri partiale).
5. Ce urmeaza
Dupa aprobare, implementarea se livreaza ca diff-uri pe fisierele text
(docs\diff_runda1_*.patch), write-back cu txt2vcx.ps1 doar dupa OK.