raport VENITURI SI CHELTUIELI: parteneri, explicatii si interval de luni
This commit is contained in:
@@ -51,6 +51,15 @@ Cuvinte rezervate, completate automat din globale (`orapoarte.vc2:1578-1586`):
|
||||
Acestea **trebuie declarate cu `tipcamp = 'E'`**, iar `campid` = numele parametrului; altfel valoarea
|
||||
nu se rezolvă și apare „Nu este completata valoarea parametrului X!".
|
||||
|
||||
Valoarea tastată de utilizator pentru un parametru rezervat este **ignorată** — se pune global. Deci
|
||||
un interval (ex. lunile 1..7) cere doi parametri `tipcamp = 'N'` cu **alt nume**, iar numele nu are
|
||||
voie să înceapă cu `AN`/`LUNA`/`SUCURSALA`: potrivirea din `do_instructiune_sql` e `=` VFP, iar cu
|
||||
`SET EXACT OFF` un `LUNA_DE_LA` s-ar potrivi cu `LUNA`. Ex. `DE_LA_LUNA` / `PANA_LA_LUNA`, folosite
|
||||
în SQL ca `luna between <%=DE_LA_LUNA%> and <%=PANA_LA_LUNA%>`.
|
||||
|
||||
Parametrul e citit din expresia de filtru spartă pe `AND` și apoi pe `=`, deci **merge doar operatorul
|
||||
„egal"** (implicit la `N`) și numele nu poate conține `AND`.
|
||||
|
||||
`CSQL_PARAMETRI` = XML `VFPData` (encoding `Windows-1252`), câte un nod `crsparametri` cu
|
||||
`parametru / titlu / camp / tipcamp / campid` (+ opțional `campcautare`); citit cu `XMLTOCURSOR` în
|
||||
`criterii_rapoarte_sql` și `parametri_rapoarte_sql` (`orapoarte_dinamice.prg:109-251`).
|
||||
@@ -61,8 +70,8 @@ nu se rezolvă și apare „Nu este completata valoarea parametrului X!".
|
||||
|
||||
Șablon de urmat: `D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\07\ff_2026_07_23_01_GESTIUNE_RAPOARTE.sql`
|
||||
(raportul `CHELTUIELI CUMULAT - REG JURNAL + RULAJE`, peste view-ul `VRUL_ACT_CHELTUIELI`) și
|
||||
`...\2026\08\ff_2026_08_21_01_GESTIUNE_RAPOARTE.sql` (`VENITURI SI CHELTUIELI - REG JURNAL +
|
||||
RULAJE`, view `VRUL_ACT_VEN_CHELT`). Structura:
|
||||
`...\2026\08\ff_2026_08_24_03_GESTIUNE_RAPOARTE.sql` (`VENITURI SI CHELTUIELI - REG JURNAL +
|
||||
RULAJE`, view-urile `VRUL_ACT_VEN_CHELT_DET` + `VRUL_ACT_VEN_CHELT_TOT`). Structura:
|
||||
|
||||
1. `CREATE OR REPLACE VIEW` cu logica raportului (SQL-ul din `CSQL` rămâne un `select` simplu peste
|
||||
view — mai ușor de depanat și de refolosit).
|
||||
@@ -79,6 +88,10 @@ RULAJE`, view `VRUL_ACT_VEN_CHELT`). Structura:
|
||||
ca o problemă de drepturi. Verificare rapidă: `SEQ_RAPOARTE.last_number` a avansat, dar
|
||||
`select * from rapoarte` nu are linia ⇒ lipsește `commit`.
|
||||
- Drepturile nu sunt opționale (vezi mai sus).
|
||||
- **`ACT.ID_PARTD` / `ACT.ID_PARTC` sunt `0` când nu există partener, niciodată `NULL`.** Un
|
||||
`MIN(ID_PARTD)` peste notele unui document întoarce `0` și numele partenerului iese gol; corect e
|
||||
`MIN(NULLIF(ID_PARTD, 0))`. Numele se iau din `NOM_PARTENERI.NUME` (în `VACT_TOT` sunt deja
|
||||
rezolvate ca `PARTD`/`PARTC`).
|
||||
- Ordinea coloanelor din `select`-ul din `CSQL` = ordinea coloanelor din grid.
|
||||
- `ORDER BY` se scrie în `CSQL`; coloanele tehnice de sortare pot fi selectate sau nu, dar trebuie să
|
||||
existe în view.
|
||||
@@ -88,7 +101,13 @@ RULAJE`, view `VRUL_ACT_VEN_CHELT`). Structura:
|
||||
Pentru totaluri la finalul listării (fără al doilea raport): `UNION ALL` cu rânduri sintetice care au
|
||||
coloana de grupare **`NULL`** (Oracle sortează `NULLS LAST` la `ASC`, deci ajung ultimele) și un
|
||||
`R_TIP` mai mare decât cele de detaliu; eticheta se pune într-o coloană text lată (`EXPLICATIA`),
|
||||
valoarea în coloana de sumă. Exemplu: `VRUL_ACT_VEN_CHELT`, `R_TIP` 9-15.
|
||||
valoarea în coloana de sumă. Exemplu: `VRUL_ACT_VEN_CHELT_TOT`, `R_TIP` 9-15.
|
||||
|
||||
Când raportul merge pe un **interval** de perioade, totalurile nu pot sta în view: view-ul le poate
|
||||
da doar pe perioadă (altfel rândul agregat are `an`/`luna` `NULL` și cade la filtrul exterior). Deci
|
||||
view-ul dă totalurile **pe lună**, iar `UNION ALL`-ul din `CSQL` le însumează pe intervalul cerut
|
||||
(`group by r_tip, tip, explicatia`) — toate liniile fiind sume, adunarea pe luni e validă. Ramura de
|
||||
totaluri pune `NULL` pe `an`/`luna`, deci blocul iese o singură dată, la finalul listării.
|
||||
|
||||
### Performanță: `WITH` materializat blochează filtrul de perioadă
|
||||
|
||||
@@ -101,8 +120,8 @@ se aplică `an = ... and luna = ...`. Pe date de producție asta a însemnat 7.4
|
||||
- `/*+ INLINE */` în CTE **nu** a rezolvat-o când CTE-ul e un `UNION ALL`.
|
||||
- Ce funcționează: **view-uri separate în loc de CTE-uri referite de mai multe ori** — view-urile se
|
||||
îmbină (view merging) și primesc predicatul. Vezi `VRUL_ACT_VEN_CHELT_DET` (detaliul) +
|
||||
`VRUL_ACT_VEN_CHELT` (detaliu `UNION ALL` totaluri, referă `_DET` de două ori) în
|
||||
`SCRIPTURI_CLAR\2026\08\ff_2026_08_21_01_GESTIUNE_RAPOARTE.sql`.
|
||||
`VRUL_ACT_VEN_CHELT_TOT` (totalurile pe lună, agregă `_DET`) în
|
||||
`SCRIPTURI_CLAR\2026\08\ff_2026_08_24_03_GESTIUNE_RAPOARTE.sql`.
|
||||
- Subinterogările auxiliare (ancore de dată, teste de existență, totaluri de control) citesc
|
||||
**tabelele de bază `ACT` / `RUL`**, nu `VACT_TOT` / `VRUL_TOT`: view-urile astea nu filtrează
|
||||
rânduri (doar left join-uri de nomenclator), dar `VRUL_TOT` are `FDOC`/`ID_FDOC` ca **subinterogări
|
||||
|
||||
Reference in New Issue
Block a user