Welcome to Sign in | Help
in Search

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

Last post 06-14-2007, 12:10 PM by ThePuiu. 18 replies.
Page 2 of 2 (19 items)   < Previous 1 2
Sort Posts: Previous Next
  •  06-13-2007, 2:20 PM 2087 in reply to 2064

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

    Offf, dupa ce am terminat cu balanta, am reluat codul scris (ca tot m-ati obisnuit cu fineturi sql!) sa incerc sa-l mai optimizez putin. Asa am ajuns la o alta problema cu care ma lupt de 2 zile....cum sa obtin soldul pt un cont la o anumita data!
    Deci: trebuie sa gasesc soldul contului 5311 la data 15.05.2006. In tabela SOLDURI_INITIALE am la anul 2006 sold debitor la 1 ian pt 5311 =  53 RON. Apoi trebuie sa caut notele din tabela NOTE_CONTABILE care indeplinesc conditia de cont si sa adun/scad la rulaj valoarea initiala. Cum se poate face asta mai elegant? E drept ca abia am ajuns la jumatate cu cititul in 'Beginning SQL Server 2005 Programming', dar nu reusesc sa fac singur interogarea...

  •  06-14-2007, 10:48 AM 2098 in reply to 2087

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

    HEEELP!
  •  06-14-2007, 11:26 AM 2099 in reply to 2098

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

  •  06-14-2007, 12:10 PM 2100 in reply to 2099

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

    este perfect! multumesc mult!
Page 2 of 2 (19 items)   < Previous 1 2
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems