Într-adevăr, la calculul balanţei e recomandabil să existe într-o tabelă măcar soldurile din fiecare an, dacă nu chiar fiecare balanţă de pe lunile anterioare (ca să nu se recalculeze totdeauna de la începutul timpurilor). Aş recomanda ca tabela cu soldurile iniţiale la începutul fiecărui an să fie o tabelă separată (în loc să ai nişte coloane în planul de conturi, cum ai zis tu). Astfel, pornind de la tabela NOTE_CONTABILE definită mai sus, să considerăm că avem şi următoarea tabelă:
CREATE TABLE SOLDURI_INITIALE (
CONT varchar(20),
AN smallint,
SOLD_DEBITOR money NOT NULL,
SOLD_CREDITOR money NOT NULL,
PRIMARY KEY (CONT, AN),
CHECK (SOLD_DEBITOR=0 OR SOLD_CREDITOR=0)
)
INSERT INTO SOLDURI_INITIALE VALUES ('371', 2007, 5000, 0)
INSERT INTO SOLDURI_INITIALE VALUES ('401', 2007, 0, 5000)
Atunci o tentativă de balanţă poate fi calculată cu următoarea funcţie:
CREATE FUNCTION PSEUDO_BALANTA(@Data smalldatetime)
RETURNS TABLE AS RETURN
SELECT COALESCE(S.CONT, D.CONT, C.CONT) AS Cont,
ISNULL(S.SOLD_DEBITOR,0)+ISNULL(D.RULAJ_DEBITOR,0) AS RULAJ_TOTAL_DEBITOR,
ISNULL(S.SOLD_CREDITOR,0)+ISNULL(C.RULAJ_CREDITOR,0) AS RULAJ_TOTAL_CREDITOR
FROM SOLDURI_INITIALE S FULL OUTER JOIN (
SELECT CONTDB AS CONT, SUM(LEI) AS RULAJ_DEBITOR
FROM NOTE_CONTABILE WHERE DATADOC<=@Data GROUP BY CONTDB
) D ON S.CONT=D.CONT FULL OUTER JOIN (
SELECT CONTCR AS CONT, SUM(LEI) AS RULAJ_CREDITOR
FROM NOTE_CONTABILE WHERE DATADOC<=@Data GROUP BY CONTCR
) C ON C.CONT=ISNULL(S.CONT,D.CONT)
Caracteristica esenţială a unei balanţe este faptul că totalul sumelor debitoare este egal cu totalul sumelor creditoare, lucru care se poate verifica executând:
SELECT SUM(RULAJ_TOTAL_DEBITOR), SUM(RULAJ_TOTAL_CREDITOR)
FROM PSEUDO_BALANTA('20070131')
Am spus totuşi că e o pseudo-balanţă pentru că are doar o singură pereche de rulaje (o singură egalitate). În general, se foloseşte balanţa cu 4 egalităţi (dar există şi cu 3 sau cu 5). De obicei, în balanţa cu 4 egalităţi (pentru o lună oarecare, alta decât ianuarie) se regăsesc următoarele perechi de coloane:
-rulaje iniţiale (soldurile de la începutul anului plus cu rulajele înregistrate în lunile precedente)
-rulajele curente (suma operaţiunilor din cursul lunii respective)
-rulajele totale (rulajele iniţiale plus rulajele curente)
-soldurile finale (dacă rulajul total debitor e mai mare decât rulajul total creditor, atunci soldul debitor este rulajul total debitor minus rulajul total creditor, iar soldul creditor este zero; în caz contrar, invers)
Te las pe tine să faci funcţia care returnează o balanţă adevărată (pornind de la parametrii @DataInitiala şi @DataFinala), ca exerciţiu...
Răzvan