From 1adf2d5405b6ab67ab37c0b6b5daa7773880b70e Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Thu, 10 Sep 2026 01:25:39 +0300 Subject: [PATCH] sync SVN r18089 --- docs/scripturi-migrare-db.md | 43 ++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/docs/scripturi-migrare-db.md b/docs/scripturi-migrare-db.md index 906abdb..b2dc753 100644 --- a/docs/scripturi-migrare-db.md +++ b/docs/scripturi-migrare-db.md @@ -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 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 = )`. 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 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 = and s.id_obiect <> 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 Serverul de dezvoltare e mai nou decat serverele clientilor, deci un script care trece local poate