sync SVN r18089

This commit is contained in:
2026-09-10 01:25:39 +03:00
parent 3e2cbf882f
commit 1adf2d5405

View File

@@ -79,6 +79,49 @@ Marius ce nu e aplicat. Exportul sursei de referinta: `oracle_export.md`.
rapoartele din `docs/`, fara justificarea alegerilor si fara istoricul modificarii. Regula completa rapoartele din `docs/`, fara justificarea alegerilor si fara istoricul modificarii. Regula completa
si lista de interdictii: `reguli_lucru.md`, punctul 2. si lista de interdictii: `reguli_lucru.md`, punctul 2.
## Optiuni de meniu si drepturi (`co_..._OBIECTE.sql`)
O optiune noua de meniu inseamna un rand in `DEF_OBIECTE` (catalogul de obiecte al programului,
arbore prin `ID_TATA`, cu `COD` de doua cifre pe fiecare nivel) plus cate un rand in
`DEF_GRUP_DREPT_OBIECTE` pentru fiecare grup care primeste dreptul. Ambele stau in
`CONTAFIN_ORACLE`, deci scriptul are prefix `co_`.
**ID_OBIECT se aloca in dezvoltare si se trece ca literal in script.** Se insereaza intai obiectul
pe `CONTAFIN_ORACLE@ROA_CENTRAL`, unde trigger-ul `TRG_DEF_OBIECTE_BEFOINS` ii da un ID din
`SEQ_DEF_OBIECTE`; ID-ul obtinut se scrie apoi in script si ajunge identic la toti clientii, cu
`merge ... on (a.id_obiect = <literal>)`. Catalogul ramane astfel acelasi peste tot, iar `ID_TATA`
poate fi si el literal.
**Niciodata insert fara `ID_OBIECT`.** Trigger-ul completeaza din secventa doar cand coloana e
`NULL` sau `0`, iar la client `SEQ_DEF_OBIECTE` e mult in urma fata de `MAX(ID_OBIECT)` (nu avanseaza
la insert-urile cu ID explicit): `NEXTVAL` intoarce un ID deja folosit si scriptul pica pe `PK_DO`
cu `ORA-00001`. Secventa nu se resincronizeaza — pe schemele de client e inerta prin design.
**Grupurile nu se dau niciodata ca ID-uri fixe.** Fiecare client isi defineste propriile grupuri,
deci acelasi `ID_GRUP` inseamna altceva la fiecare (`42` e `VIZUALIZARE` pe dev si
`ROMFAST - CONTRACTE` in productie). Drepturile se copiaza de la o optiune sora din acelasi nod:
```sql
merge into def_grup_drept_obiecte a using
(select distinct <id_obiect_nou> as id_obiect, g.id_grup, -3 as id_utilop, sysdate as dataora, 0 as sters
from def_obiecte s
join def_grup_drept_obiecte g on g.id_obiect = s.id_obiect and g.sters = 0
where s.id_tata = <id_nod> and s.id_obiect <> <id_obiect_nou> and nvl(s.sters, 0) = 0) b
on (a.id_obiect = b.id_obiect and a.id_grup = b.id_grup)
when not matched then
insert (id_obiect, id_grup, id_utilop, dataora, sters) values (b.id_obiect, b.id_grup, b.id_utilop, b.dataora, b.sters);
```
`DEF_OBIECTE.STERS` accepta `NULL`, deci filtrul pe el se scrie `nvl(s.sters, 0) = 0` — `s.sters = 0`
sare tacut peste randurile cu `NULL`, fara nicio eroare. In `DEF_GRUP_DREPT_OBIECTE` si `DEF_GRUP`
coloana e `NOT NULL`.
`ID_UTILOP = -3` e utilizatorul de migrare, folosit de toate scripturile `co_..._OBIECTE.sql`.
Optiunea devine vizibila prin `COMUN\programe\acces_meniu.prg`, care citeste
`contafin_oracle.vdef_util_obiecte` pentru utilizatorul si programul curent si activeaza obiectele
de clasa `cw` a caror cheie (literele nodurilor + `COD`) se regaseste acolo.
## Compatibilitate cu serverele clientilor ## Compatibilitate cu serverele clientilor
Serverul de dezvoltare e mai nou decat serverele clientilor, deci un script care trece local poate Serverul de dezvoltare e mai nou decat serverele clientilor, deci un script care trece local poate