Hai să vedem, care-i problema: tu vrei o "chestie" (query/procedură/funcţie) care să-ţi dea soldul unui cont la o anumită dată (să zicem că e vorba de o singură valoare, dacă e debitor cu +, dacă e creditor cu -), deci:
CREATE FUNCTION SoldCont(@Cont varchar(20), @Data smalldatetime)
RETURNS money AS BEGIN
...
şi ne interesează să luăm soldul iniţial:
...
DECLARE @Sold money
SELECT @Sold=SoldDebitor-SoldCreditor FROM SolduriInitiale
WHERE An=YEAR(@Data) AND Cont=@Cont
...
(atenţie: dacă nu găseşte contul respectiv în soldurile iniţiale, atunci în variabila @Sold rămâne NULL)
apoi vrem să adunăm rulajul debitor, adică valoarea înregistrărilor contabile care au contul respectiv pe debit, de la începutul anului până la data respectivă, inclusiv:
...
SET @Sold=ISNULL(@Sold,0) + ISNULL((
SELECT SUM(Valoare) FROM NoteContabile
WHERE ContDebitor=@Cont AND Data<=@Data AND YEAR(Data)=YEAR(@Data)
),0)
...
iar apoi să scădem rulajul creditor (nu mai scriu cum, că e evident). La sfârşit, returnăm valoarea obţinută:
...
RETURN @Sold
END
Dacă vrem să folosim un singur query, funcţia noastră ar arăta aşa:
CREATE FUNCTION SoldCont(@Cont varchar(20), @Data smalldatetime)
RETURNS money AS BEGIN
RETURN ISNULL((
SELECT SoldDebitor-SoldCreditor FROM SolduriInitiale
WHERE An=YEAR(@Data) AND Cont=@Cont
),0)+ISNULL((
SELECT SUM(Valoare) FROM NoteContabile
WHERE ContDebitor=@Cont AND Data<=@Data AND YEAR(Data)=YEAR(@Data)
),0)-ISNULL((
SELECT SUM(Valoare) FROM NoteContabile
WHERE ContCreditor=@Cont AND Data<=@Data AND YEAR(Data)=YEAR(@Data)
),0)
END
Această funcţie ar putea fi apelată astfel:
SELECT dbo.SoldCont('5311', '20070515')
Dacă-ţi vine cumva ideea să apelezi această funcţie aşa:
SELECT dbo.SoldCont(Cont, '20070630') FROM PlanulDeConturi
să ştii că nu e o idee bună, pentru că se apelează funcţia respectivă în mod repetat şi face mult mai multe citiri ale tabelei NoteContabile decât e necesar. Dacă ai nevoie de soldurile tuturor conturilor, cel mai bine e să faci cu GROUP BY şi OUTER JOIN-uri, aşa cum am făcut mai demult.
Răzvan
PS: n-am testat nimic... te las pe tine să verifici dacă e vreo greşeală de sintaxă sau de altă natură...