sync SVN r18089
This commit is contained in:
@@ -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 = <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
|
||||
|
||||
Serverul de dezvoltare e mai nou decat serverele clientilor, deci un script care trece local poate
|
||||
|
||||
Reference in New Issue
Block a user