Welcome to Sign in | Help

Re: Modalitate de generare a "Jurnalului de cumparari"...

  •  06-14-2007, 11:26 AM

    Re: Modalitate de generare a "Jurnalului de cumparari"...

    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ă...

View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems