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