Files
roaregistratura/docs/analiza_registratura_adaugare_editare.md
Marius Mutu 6769eb61d1 Registratura: adaugare/editare fara erori la partener NULL, lista doar ultimul document, fonturi Arial 10 (M1-M5)
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
2026-07-23 18:53:12 +03:00

9.6 KiB
Raw Blame History

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 cursorul cRegistratura, incarcat de viz_registratura din Programe\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 separate podg_dg, podg_referinte, podg_obs, podg_link).
  • Starea editarii este ct_part_nr_data.llock (.T. = blocat). Butonul Command2 comuta: la deblocare afiseaza "Toate modificarile au efect imediat!", la a doua apasare ("Salveaza") apeleaza modifica_reg_dg.
  • Salvarea reala e modifica_reg_dg (oproceduri_roaregistratura.prg:100) -> apel PL/SQL pack_registratura.modifica_registratura.
  • Adaugarea (ct_registratura.do_adauga, ferestre_registratura.vc2:1206): aloca numar intern (oGeneratorNumere, seria 10), insereaza un rand GOL prin pack_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, ruleaza modifica_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.Valid scrie 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: goRegistratura ramane cu valorile editate (afisare inselatoare pana la refresh).

P4. Lista documentelor: incarcare integrala + pozitionare pe primul

  • viz_registratura incarca TOATE inregistrarile cu sters=0 din vregistratura (fara filtru initial pe ultimul document), apoi Go Top -> se vede inceputul bazei.
  • Page2.Activate apeleaza do_cauta() la fiecare activare; fara bife, filtrul devine STERS=0 -> reincarcare integrala la fiecare revenire pe lista.

P5. Fonturi

  • Clasele COMUN de baza (_baza.vcx: _textbox, _label, _checkbox, _grid etc.) au deja Arial 10 — controalele derivate din ele sunt OK.
  • In proiect insa:
    • ferestre_registratura.vc2: 75 aparitii FontName = "Arial Narrow" (gridul grid_registratura + toate coloanele/headerele/text-urile, checkbox-urile de filtru);
    • onom_clienti.vc2: 79 aparitii;
    • ct_part_nr_data, ct_date_generale si mare parte din frm_dg_date_generale folosesc 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_tipdoc e 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!') si Return .F..
  • lcId_part/lcNr_pag cu Nvl(...); 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) si Page3.Deactivate: daca llock=.F. si id_part NULL -> mesaj "Alegeti partenerul!" si fara apel modifica_reg_dg (raman in editare in cazul barei laterale; la Deactivate se renunta explicit).
  • In Command2.Click (Salveaza): validarea partenerului INAINTE de blocheaza_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_registratura primeste 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 de STERS=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 (toate OF "..\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 gridului grid_registratura.
  • Se ELIMINA suprascrierile explicite FontName = "Arial Narrow" (75 in ferestre_registratura.vc2, 79 in onom_clienti.vc2), astfel incat controalele sa mosteneasca Arial 10 din clasele de baza; gridul (_grdrow din _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 (schimbarea AS <clasa> + ClassLib in markerul END 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 M1M5: 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 din Programe\roaregistratura.prg).
  • test_registratura_form.prg — incarca cursorul listei (viz_registratura), verifica existenta cursorului, numarul de inregistrari si pozitionarea pe ultimul document; instantiaza containerul ct_registratura pe un form ascuns.
  • test_registratura_adaugare.prg — fluxul de adaugare SI editare: alocare numar intern, adauga_registratura, apoi modifica_reg_dg cu 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.