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
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user