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 1 of 2 (19 items)   1 2 Next >
Sort Posts: Previous Next
  •  05-29-2007, 12:34 AM 1970

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

    Salut, vreau sa fac un mic program pt uz intern care sa genereze Jurnalul de cumparari , de vanzari si Reg de casa. Nefiind un profesionist in ale programarii si cu atit mai putin in ale sql-ului, am rezolvat problema intr-un mod taranesc si neoptim, zic eu... Sa intru putin in detalii: Am un server sql (MSDE 2000) in care am o tabela NOTE_CONTABILE care contine campurile: ID (unic), NRDOC, TIPDOC, DATADOC, CONTDB, CONTCR, LEI. Pe baza inregistrarilor din acesta tabela am generat cele 3 rapoarte. Sa discutam cazul JC de exemplu. Am facut un select dupa nrdoc, datadoc cu group pe cele 2 campuri iar rezultatul l-am salvat intr-un DataTable DT(am obtinut lista unica a documentelor din luna respectiva, urmanid sa o afisez la final intr-un grid). Apoi, am facut o procedura care pt fiecare element (NRDOC,DATADOC) al DT imi genereaza 21 de stringuri care contin sintaxa sql pt fiecare coloana a formularului Jurnal de Cumparari. De ce am ales varianta asta: egalitatile de conturi care au drept rezultat valoarea din fiecare coloana a jurnalului trebuie sa poata sa fie modificata de user. Astfel am o noua tabela SCHEME (ID,JURNAL,COLOANA,CONTDB,CONTCR) in care am salvat toate egalitatile pt diferitele coloane. Deci, fac 21 de selecturi cite unul pt fiecare coloana din row-ul curent. Apoi trec la row-ul urmator, si tot asa pina le parcurg pe toate. Fenomenul dureaza destul de mult si ma supara mai mult ca idee! As vrea sa fie mai destept facut! Ce as vrea sa stiu: se poate optimiza in sensul ca sa nu mai fac 21 de selecturi ci sa fac unul singur care sa contina toate cele 21 de valori necesare? Acest select se va genera folosind constringerile din tabela SCHEME. Sau daca exista o alta metoda si mai buna pt obtinerea aceluiasi rezultat sint gata sa invat! Sper ca ati inteles ce am vrut sa zic....si mie mi se pare acum destul de incilcit ce am scris pina acum! Va multumesc anticipat!

    Puiu

  •  05-29-2007, 8:20 AM 1972 in reply to 1970

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

    Să luăm un exemplu (simplificat) pentru schemă şi note contabile:

    CREATE TABLE NOTE_CONTABILE (
        ID int IDENTITY PRIMARY KEY,
        NRDOC varchar(10) NULL,
        TIPDOC varchar(5) NULL,
        DATADOC smalldatetime NOT NULL,
        CONTDB varchar(20) NOT NULL,
        CONTCR varchar(20) NOT NULL,
        LEI money NOT NULL
    )

    INSERT INTO NOTE_CONTABILE (TIPDOC, NRDOC, DATADOC, CONTDB, CONTCR, LEI)
    SELECT 'FACT' TIPDOC, '1' NRDOC, '20070101' DATADOC, '371.1' CONTDB, '401' CONTCR, 100 LEI
    UNION ALL SELECT 'FACT', '1', '20070101', '4426.2', '401', 19
    UNION ALL SELECT 'FACT', '2', '20070102', '214', '404', 2000
    UNION ALL SELECT 'FACT', '2', '20070102', '4426.1', '404', 380
    UNION ALL SELECT 'FACT', '2', '20070102', '303', '401', 200
    UNION ALL SELECT 'FACT', '2', '20070102', '4426.3', '401', 38
    UNION ALL SELECT 'FACT', '3', '20070103', '628', '401', 1000
    UNION ALL SELECT 'FACT', '3', '20070103', '4426.3', '401', 190
    UNION ALL SELECT 'FACT', '3', '20070103', '303', '401', 200
    UNION ALL SELECT 'FACT', '3', '20070103', '4426.3', '401', 38


    CREATE TABLE SCHEME (
        ID int IDENTITY PRIMARY KEY,
        JURNAL char(2) NOT NULL,
        COLOANA smallint NOT NULL,
        CONTDB varchar(20) NOT NULL,
        CONTCR varchar(20) NOT NULL
    )

    INSERT INTO SCHEME (JURNAL, COLOANA, CONTDB, CONTCR)
    SELECT 'JC' AS JURNAL, 1 AS COLOANA, '21' as CONTDB, '404' as CONTCR
    UNION ALL SELECT 'JC', 2, '4426.1', '404'
    UNION ALL SELECT 'JC', 3, '371', '401'
    UNION ALL SELECT 'JC', 4, '4426.2', '401'
    UNION ALL SELECT 'JC', 5, '6', '401'
    UNION ALL SELECT 'JC', 5, '30', '401'
    UNION ALL SELECT 'JC', 6, '4426.3', '401'

    În aceste condiţii, următorul query face un rezultat asemănător cu jurnalul de cumpărări, printr-un singur select (fără a folosi tabele temporare sau cursoare):

    SELECT DATADOC, NRDOC, SUM(VALOARE) as TOTAL,
        SUM(CASE WHEN COLOANA=1 THEN VALOARE ELSE 0 END) AS COLOANA1,
        SUM(CASE WHEN COLOANA=2 THEN VALOARE ELSE 0 END) AS COLOANA2,
        SUM(CASE WHEN COLOANA=3 THEN VALOARE ELSE 0 END) AS COLOANA3,
        SUM(CASE WHEN COLOANA=4 THEN VALOARE ELSE 0 END) AS COLOANA4,
        SUM(CASE WHEN COLOANA=5 THEN VALOARE ELSE 0 END) AS COLOANA5,
        SUM(CASE WHEN COLOANA=6 THEN VALOARE ELSE 0 END) AS COLOANA6
    FROM (
        SELECT DATADOC, NRDOC, COLOANA, SUM(LEI) as VALOARE
        FROM NOTE_CONTABILE N INNER JOIN SCHEME S
        ON N.CONTDB LIKE S.CONTDB+'%' AND N.CONTCR LIKE S.CONTCR+'%'
        WHERE JURNAL='JC'
        GROUP BY DATADOC, NRDOC, COLOANA
    ) X GROUP BY DATADOC, NRDOC
    ORDER BY DATADOC, NRDOC

    Răzvan

    PS. Dacă am dat o soluţie care pare să funcţioneze cât de cât şi probabil poate fi extinsă să rezolve întreaga problemă, asta nu înseamnă că susţin acest design. Personal, sunt de părere că într-un program de contabilitate nu conturile sunt cheia problemei, ci documentele. Consider că fiecare tip de document trebuie tratat în parte (în una sau mai multe tabele separate) şi că regulile de construire a diverselor rapoarte trebuie să se bazeze pe coloane din aceaste tabele (de exemplu Valoare, TVA, TipOperatiune, ProcentTVA, etc).

  •  05-29-2007, 12:33 PM 1974 in reply to 1972

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

    Absolut super!!! Ma gindeam eu ca sint departe de adevar....!
    Acum, am omis o chestie, pt ca nu eram sigur de raspuns: am nevoie de inca 2 coloane: Numele partenerului si codul fiscal. Astea le am intr-o tabela PARTENERI cu (ID, NUME, CF, etc). Eu ma foloseam de CONTCR care este analitic si dupa eliminarea prefixului inclusiv punctul, ramine numele firmei. Poti te rog sa-mi spui cum as putea introduce in select si identificarea firmei si a CF-ului (din PARTENERI)?

    In alta ordine de idei, poti sa dezvolti putin PS-ul tau? Desi nu vreau sa fac o cariera din soft, ma intereseaza orice idee care poate duce la optimizarea unor operatii!

    Multumesc inca o data pt amabilitate.
    Puiu

  •  06-03-2007, 8:26 PM 2007 in reply to 1974

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

    În primul rând, scuze de întârziere: de vreo 3-4 zile stau cu fereastra asta deschisă în Firefox şi am tot amânat răspunsul pentru o zi în care am mai mult timp (mai ales din cauza celei de-a doua întrebări).

    Pentru prima întrebare, răspunsul e destul de simplu. Presupunând că avem tabela PARTENERI, cu următoarele date:

    CREATE TABLE PARTENERI (
        ID varchar(10) PRIMARY KEY,
        NUME varchar(50) NOT NULL UNIQUE,
        CF varchar(15) NULL
    )

    INSERT INTO PARTENERI VALUES ('01', 'BUCUR OBOR SA', 'RO19')
    INSERT INTO PARTENERI VALUES ('02', 'ELPROF SA', 'RO27')

    Iar datele din tabela NOTE_CONTABILE sunt următoarele:

    INSERT INTO NOTE_CONTABILE (TIPDOC, NRDOC, DATADOC, CONTDB, CONTCR, LEI)
    SELECT 'FACT' TIPDOC, '1' NRDOC, '20070101' DATADOC, '371.1' CONTDB, '401.01' CONTCR, 100 LEI
    UNION ALL SELECT 'FACT', '1', '20070101', '4426.2', '401.01', 19
    UNION ALL SELECT 'FACT', '2', '20070102', '214', '404.01', 2000
    UNION ALL SELECT 'FACT', '2', '20070102', '4426.1', '404.01', 380
    UNION ALL SELECT 'FACT', '2', '20070102', '303', '401.01', 200
    UNION ALL SELECT 'FACT', '2', '20070102', '4426.3', '401.01', 38
    UNION ALL SELECT 'FACT', '3', '20070103', '628', '401.02', 1000
    UNION ALL SELECT 'FACT', '3', '20070103', '4426.3', '401.02', 190
    UNION ALL SELECT 'FACT', '3', '20070103', '303', '401.02', 200
    UNION ALL SELECT 'FACT', '3', '20070103', '4426.3', '401.02', 38
    UNION ALL SELECT 'FACT', '4', '20070104', '628', '401.03', 1000
    UNION ALL SELECT 'FACT', '4', '20070104', '4426.3', '401.03', 190
    UNION ALL SELECT 'FACT', '5', '20070105', '628', '401', 1000
    UNION ALL SELECT 'FACT', '5', '20070105', '4426.3', '401', 190

    atunci putem obţine rezultatul dorit cu următorul query:

    SELECT DATADOC, NRDOC, NUME AS FURNIZOR, CF, SUM(VALOARE) as TOTAL,
        SUM(CASE WHEN COLOANA=1 THEN VALOARE ELSE 0 END) AS COLOANA1,
        SUM(CASE WHEN COLOANA=2 THEN VALOARE ELSE 0 END) AS COLOANA2,
        SUM(CASE WHEN COLOANA=3 THEN VALOARE ELSE 0 END) AS COLOANA3,
        SUM(CASE WHEN COLOANA=4 THEN VALOARE ELSE 0 END) AS COLOANA4,
        SUM(CASE WHEN COLOANA=5 THEN VALOARE ELSE 0 END) AS COLOANA5,
        SUM(CASE WHEN COLOANA=6 THEN VALOARE ELSE 0 END) AS COLOANA6
    FROM (
        SELECT DATADOC, NRDOC, COLOANA,
            SUBSTRING(N.CONTCR,NULLIF(CHARINDEX('.',N.CONTCR),0)+1,20) AS CODFURNIZOR,
            SUM(LEI) as VALOARE
        FROM NOTE_CONTABILE N INNER JOIN SCHEME S
        ON N.CONTDB LIKE S.CONTDB+'%' AND N.CONTCR LIKE S.CONTCR+'%'
        WHERE JURNAL='JC'
        GROUP BY DATADOC, NRDOC, COLOANA,
            SUBSTRING(N.CONTCR,NULLIF(CHARINDEX('.',N.CONTCR),0)+1,20)
    ) X LEFT JOIN PARTENERI P ON X.CODFURNIZOR=P.ID
    GROUP BY DATADOC, NRDOC, NUME, CF
    ORDER BY DATADOC, NRDOC

    Ar fi de observat că dacă nu există un partener cu codul respectiv (sau dacă nu a fost precizat niciun analitic la contul de furnizori) atunci documentul respectiv apare în jurnalul de cumpărări, dar fără niciun nume. 

    Referitor la opinia mea despre cum ar trebui să fie construit un program de contabilitate, sunt de părere că tabelele şi view-urile care stau la baza rapoartelor ar putea arăta cam aşa (am simplificat mult, bineînţeles):

    CREATE TABLE Furnizori (
        ID_Furnizor int IDENTITY PRIMARY KEY,
        Nume nvarchar(50) NOT NULL UNIQUE,
        CUI varchar(15) NULL
    )

    CREATE TABLE Facturi (
        ID_Factura int IDENTITY PRIMARY KEY,
        Data smalldatetime NOT NULL,
        Numar varchar(10) NOT NULL,
        ID_Furnizor int NOT NULL REFERENCES Furnizori
    )

    CREATE TABLE TipuriOperatiuniCumparari (
        TipOperatiune char(1) PRIMARY KEY,
        DenumireOperatiune nvarchar(50) NOT NULL UNIQUE
    )

    INSERT INTO TipuriOperatiuniCumparari VALUES ('R',N'Bunuri destinate revânzării')
    INSERT INTO TipuriOperatiuniCumparari VALUES ('C',N'Bunuri de capital')
    INSERT INTO TipuriOperatiuniCumparari VALUES ('P',N'Bunuri şi servicii pt nevoi proprii')
    -- şi alte tipuri, după necesităţi...

    CREATE TABLE DetaliiFacturi (
        ID_DetaliuFactura int IDENTITY PRIMARY KEY,
        ID_Factura int NOT NULL
            REFERENCES Facturi ON DELETE CASCADE,
        Explicatii nvarchar(50) NULL,
        ContDebitor varchar(20) NOT NULL,
        ContTVA varchar(20) NOT NULL,
        ContFurnizori varchar(20) NOT NULL,
        TipOperatiune char(1) NOT NULL -- completat cu valori implicite în funcţie de ContDebitor
            REFERENCES TipuriOperatiuniCumparari ON UPDATE CASCADE,
        Valoare money NOT NULL,
        ProcentTVA tinyint NOT NULL DEFAULT (19),
        TVA money NOT NULL,
        Total money NOT NULL,
        CHECK (Valoare+TVA=Total),
        -- ar mai trebui şi un constraint "TVA=Valoare*ProcentTVA/100", dar să permită mici diferenţe
    )

    GO
    CREATE VIEW InregistrariContabileFacturi
    AS
    SELECT f.Data, f.Numar as NumarDocument, 'Factura' as TipDocument,
        f.ID_Factura as ID_Document, 'V' as TipDetaliu, d.ID_DetaliuFactura as ID_DetaliuDocument,
        d.ContDebitor AS CD, d.ContFurnizori as CC, d.Valoare,
        ISNULL(d.Explicatii+' ','')+n.Nume as Explicatii
    FROM DetaliiFacturi d
    INNER JOIN Facturi f ON f.ID_Factura=d.ID_Factura
    INNER JOIN Furnizori n ON f.ID_Furnizor=n.ID_Furnizor

    UNION ALL

    SELECT f.Data, f.Numar as NumarDocument, 'Factura' as TipDocument,
        f.ID_Factura as ID_Document, 'T' as TipDetaliu, d.ID_DetaliuFactura as ID_DetaliuDocument,
        d.ContTVA AS CD, d.ContFurnizori as CC, d.TVA,
        'TVA '+ISNULL(d.Explicatii+' ','')+n.Nume as Explicatii
    FROM DetaliiFacturi d
    INNER JOIN Facturi f ON f.ID_Factura=d.ID_Factura
    INNER JOIN Furnizori n ON f.ID_Furnizor=n.ID_Furnizor
    WHERE d.TVA<>0

    GO
    CREATE VIEW InregistrariContabile
    AS
    SELECT Data, NumarDocument, TipDocument, ID_Document, TipDetaliu, ID_DetaliuDocument, CD, CC, Valoare, Explicatii
    FROM InregistrariContabileFacturi
    --UNION ALL alte view-uri pt celelalte tabele cu documente

    GO
    CREATE VIEW JurnalDeCumparari
    AS
    SELECT Data, Numar, Nume as Furnizor, CUI, x.*
    FROM (
        SELECT ID_Factura, SUM(Total) as Total,
            SUM(CASE WHEN TipOperatiune='C' AND ProcentTVA=19 THEN Valoare ELSE 0 END) AS BazaCapital19,
            SUM(CASE WHEN TipOperatiune='C' AND ProcentTVA=19 THEN TVA ELSE 0 END) AS TVACapital19,
            SUM(CASE WHEN TipOperatiune='R' AND ProcentTVA=19 THEN Valoare ELSE 0 END) AS BazaMarfuri19,
            SUM(CASE WHEN TipOperatiune='R' AND ProcentTVA=19 THEN Valoare ELSE 0 END) AS TVAMarfuri19,
            SUM(CASE WHEN TipOperatiune='P' AND ProcentTVA=19 THEN Valoare ELSE 0 END) AS BazaDiverse19,
            SUM(CASE WHEN TipOperatiune='P' AND ProcentTVA=19 THEN Valoare ELSE 0 END) AS TVADiverse19
            -- şi aşa mai departe...
        FROM DetaliiFacturi GROUP BY ID_Factura
    ) x INNER JOIN Facturi f ON x.ID_Factura=f.ID_Factura
    INNER JOIN Furnizori n ON f.ID_Furnizor=n.ID_Furnizor
    -- ORDER BY Data, Numar

    Bineînţeles, pentru fiecare tip de document ar trebui să existe o tabelă separată, deci am putea să mai avem nişte tabele pentru chitanţe, pentru detaliile de factură care intră în gestiune (care sunt legate totuşi de acelaşi antet de factură), pentru facturile de vânzare şi detaliile lor, pentru bonuri (care sunt un fel de facturi care sunt şi chitanţe simultan, deci trebuie să apară şi în jurnalul de cumpărări, dar şi în registrul de casă), etc. În plus, am putea să mai avem o altă tabelă în care se vor introduce note contabile care nu sunt prevăzute într-un alt document (nota cu impozitul pe profit, de exemplu).

    Răzvan

  •  06-04-2007, 1:48 AM 2015 in reply to 2007

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

    Multumesc de raspuns! Este exact ce vroiam!
    O alta rugaminte ar fi daca poti sa-mi recomanzi o carte pe care sa o gasesc undeva pe net sau in librarii si din care sa pot sa invat si mai mult decit cuvintele cheie din sql....pt ca se pare ca nu ajunge. Nu vreau sa tot deranjez in stinga si in dreapta cu intrebari stupid de simple... Deja imi trec idei marete prin cap! Daca tot am ajuns aici cu 'programelul' de ce sa nu incerc sa-l mai dezvolt si sa imi genereze si un fel de balanta care sa ma ajute sa urmaresc mai bine clientii si furnizorii....si uite asa povestea nu se mai termina! O sa iasa un ERP pina la urma Wink

  •  06-04-2007, 8:52 AM 2016 in reply to 2015

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

    Apropos de cărţi... nu ştiu ce să zic: eu n-am citit prea multe cărţi de SQL, sunt mai mult genul "citeşte documentaţia şi încearcă singur". Dar am răsfoit într-o librărie cartea lui Ken Henderson "The Guru's Guide to Transact-SQL" şi mi s-au părut interesante multe chestii, de genul celor pe care nu le găseşti în documentaţie. A apărut şi în limba română, la Editura Teora, dar trebuie să ţii cont că e totuşi o carte destul de veche (din anul 2000), deci nu tratează noutăţile din SQL Server 2005, de exemplu. Pe de altă parte, e o carte de nivel avansat şi nu ştiu dacă ai ajuns acolo, dar poate mai au şi alţii alte recomandări. Până atunci, oricum, întreabă cu încredere pe aici, că încercăm să te ajutăm.

    Răzvan

  •  06-04-2007, 9:46 AM 2017 in reply to 2016

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

    Eu ti-as recomanda si articolele lui Itzic Ben Gan din SQL Server Magazine, si "Inside Microsoft SQL Server 2005: T-SQL Programming" (a aceluiasi autor). Din pacate nu am "apucat" inca sa citesc cartea, dar articolele sunt super...
  •  06-04-2007, 11:11 PM 2018 in reply to 2017

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

    Of,of...nu stiam in ce ma bag.... Am vorbit cu contabila si mi-a spus ca programul de conta pe care il foloseste la firma mea (si pe care vreau sa-l schimb, desi contabila se impotriveste!) nu face balanta bine, si face balarii daca se incearca o generare de balanta pe o luna din anii trecuti.... Atunci mi-am zis ca hai sa incerc sa fac eu balanta. Deci am pus mina pe o balanta listata si am incercat sa-i dau de cap...si cu ajutor, am reusit sa inteleg ce este pe acolo. Problema e cum naiba sa generez balanta pornind de la tabela NOTE_CONTABILE de mai sus! Se poate concepe o interogare complexa care sa genereze 'in bloc' balanta? Sau trebuie sa folosesc ceva tabele temporare? Ma ajuta si pe mine cineva cu ceva idei in directia asta? Multumesc anticipat!

    Later edit: de fapt, nu am idee cum ar fi mai bine: sa fac o tabela in care sa salvez rezultatul fiscal la sfirsitul fiecarui an si la generarea unei balante sa pornesc de la rezultatul anterior la care adaug rulajul curent sau de fiecare data sa incerc sa generez pornind de la intregul pachet de note contabile? Desi, cred ca e o prostie, asa cred (varianta 2) ca functioneaza actualul program de conta... Voi ce ziceti? Multam inca o data!

    Later-later edit: as vrea sa fac un select care sa-mi faca o suma dupa un cimp din tabela NOTE si la aceasta suma sa adauge o valoare citita dintr-o alta tabela (soldurile la 1 ianuarie)... Nu imi dau seama insa daca se poate... eu am incercat ceva de genul:
    select sum(lei) + planconturi.[2006] as lei from NOTE join planconturi on note.condb=planconturi.cont where condb='401.agora' and datadoc between '2007-01-01' and '2007-02-28' si nu vrea.... Cum pot sa fac asta?

  •  06-06-2007, 9:23 PM 2038 in reply to 2018

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

    Î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

  •  06-07-2007, 12:43 AM 2040 in reply to 2038

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

    Da, este bestial! Intre timp, am reusit sa generez toate cele 8 coloane ale balantei, dar mai 'babeste'! Evident, cind am vazut simplitatea si rapiditatea solutiei date de tine am hotarit sa fac asa! Problema e ca am facut asa:
    SELECT COALESCE(S.CONT, D.CONT, A.CONT, B.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,
        ISNULL(A.RULAJ_CURENT_DEBITOR,0) AS RULAJ_CURENT_DEBITOR,
        ISNULL(B.RULAJ_CURENT_CREDITOR,0) AS RULAJ_CURENT_CREDITOR,
        ISNULL(S.SOLD_DEBITOR,0)+ISNULL(D.RULAJ_DEBITOR,0)+ISNULL(A.RULAJ_CURENT_DEBITOR,0) AS TOTAL_DEBITOR,
        ISNULL(S.SOLD_CREDITOR,0)+ISNULL(C.RULAJ_CREDITOR,0)+ISNULL(B.RULAJ_CURENT_CREDITOR,0) AS TOTAL_CREDITOR
    FROM SOLDURI_INITIALE S

    FULL OUTER JOIN (
        SELECT CONTDB AS CONT, SUM(LEI) AS RULAJ_DEBITOR
        FROM NOTE WHERE DATADOC BETWEEN '20070101' AND '20070131' GROUP BY CONTDB
    ) D ON S.CONT=D.CONT

    FULL OUTER JOIN (
        SELECT CONTCR AS CONT, SUM(LEI) AS RULAJ_CREDITOR
        FROM NOTE WHERE DATADOC BETWEEN '20070101' AND '20070131' GROUP BY CONTCR
    ) C ON C.CONT=ISNULL(S.CONT,D.CONT)

    FULL OUTER JOIN (
        SELECT CONTDB AS CONT, SUM(LEI) AS RULAJ_CURENT_DEBITOR
        FROM NOTE WHERE DATADOC BETWEEN '20070201' AND '20070228' GROUP BY CONTDB
    ) A ON A.CONT=ISNULL(S.CONT,D.CONT)

    FULL OUTER JOIN (
        SELECT CONTCR AS CONT, SUM(LEI) AS RULAJ_CURENT_CREDITOR
        FROM NOTE WHERE DATADOC BETWEEN '20070201' AND '20070228' GROUP BY CONTCR
    ) B ON B.CONT=ISNULL(S.CONT,C.CONT)
    ORDER BY CONT

    dar imi dubleaza unele inregistrari, adica imi apar de 2 ori conturile care au rulaj curent si pe debit si pe credit...cele care au numai debit sau numai credit ies bine... O alta nelamurire ar fi: cum pot sa atribui un alias cirnatului de operatii (cum este de ex TOTAL_CREDITOR) pt a putea sa fac mai usor operatiile de verificare si scadere necesare generarii coloanelor de sold final debitor/creditor?

    Multam pt timpul pierdut cu mine!

  •  06-07-2007, 8:14 AM 2041 in reply to 2040

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

    Erai destul de aproape:

    SELECT CONT, RULAJ_INITIAL_DEBITOR, RULAJ_INITIAL_CREDITOR,
        RULAJ_CURENT_DEBITOR, RULAJ_CURENT_CREDITOR,
        RULAJ_TOTAL_DEBITOR, RULAJ_TOTAL_CREDITOR,
        CASE WHEN RULAJ_TOTAL_DEBITOR>RULAJ_TOTAL_CREDITOR
            THEN RULAJ_TOTAL_DEBITOR-RULAJ_TOTAL_CREDITOR
            ELSE 0
        END AS SOLD_DEBITOR,
        CASE WHEN RULAJ_TOTAL_CREDITOR>RULAJ_TOTAL_DEBITOR
            THEN RULAJ_TOTAL_CREDITOR-RULAJ_TOTAL_DEBITOR
            ELSE 0
        END AS SOLD_CREDITOR

    FROM (
        SELECT COALESCE(S.CONT, D.CONT, C.CONT, A.CONT, B.CONT) AS CONT,
            ISNULL(S.SOLD_DEBITOR,0)+ISNULL(D.RULAJ_INITIAL_DEBITOR,0) AS RULAJ_INITIAL_DEBITOR,
            ISNULL(S.SOLD_CREDITOR,0)+ISNULL(C.RULAJ_INITIAL_CREDITOR,0) AS RULAJ_INITIAL_CREDITOR,
            ISNULL(A.RULAJ_CURENT_DEBITOR,0) AS RULAJ_CURENT_DEBITOR,
            ISNULL(B.RULAJ_CURENT_CREDITOR,0) AS RULAJ_CURENT_CREDITOR,
            ISNULL(S.SOLD_DEBITOR,0)+ISNULL(D.RULAJ_INITIAL_DEBITOR,0)
                +ISNULL(A.RULAJ_CURENT_DEBITOR,0) AS RULAJ_TOTAL_DEBITOR,
            ISNULL(S.SOLD_CREDITOR,0)+ISNULL(C.RULAJ_INITIAL_CREDITOR,0)
                +ISNULL(B.RULAJ_CURENT_CREDITOR,0) AS RULAJ_TOTAL_CREDITOR
        FROM SOLDURI_INITIALE S

        FULL OUTER JOIN (
            SELECT CONTDB AS CONT, SUM(LEI) AS RULAJ_INITIAL_DEBITOR
            FROM NOTE_CONTABILE WHERE DATADOC BETWEEN '20070101' AND '20070131' GROUP BY CONTDB
        ) D ON S.CONT=D.CONT

        FULL OUTER JOIN (
            SELECT CONTCR AS CONT, SUM(LEI) AS RULAJ_INITIAL_CREDITOR
            FROM NOTE_CONTABILE WHERE DATADOC BETWEEN '20070101' AND '20070131' GROUP BY CONTCR
        ) C ON C.CONT=ISNULL(S.CONT,D.CONT)

        FULL OUTER JOIN (
            SELECT CONTDB AS CONT, SUM(LEI) AS RULAJ_CURENT_DEBITOR
            FROM NOTE_CONTABILE WHERE DATADOC BETWEEN '20070201' AND '20070228' GROUP BY CONTDB
        ) A ON A.CONT=COALESCE(S.CONT,D.CONT,C.CONT)

        FULL OUTER JOIN (
            SELECT CONTCR AS CONT, SUM(LEI) AS RULAJ_CURENT_CREDITOR
            FROM NOTE_CONTABILE WHERE DATADOC BETWEEN '20070201' AND '20070228' GROUP BY CONTCR
        ) B ON B.CONT=COALESCE(S.CONT,D.CONT,C.CONT,A.CONT)
    ) X
    ORDER BY CONT

    Răzvan 

  •  06-08-2007, 10:37 PM 2059 in reply to 2041

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

    este ok acum! am mai bagat un JOIN cu tabela PLAN_CONTURI pt ca imi trebuia si explicatia aferenta fiecarui cont din balanta. Acum arata asa cum vreau! Dar am descoperit o chestie.... Daca am adaugat "where an=2006" inainte de ")X" (pt a putea specifica anul) am observat ca e necesar ca in tabela SOLDURI_INITIALE sa existe anterior toate conturile din planul de conturi care au miscare in acel an....altfel, normal dealtfel!, conturile respective lipsesc din balanta... Exista o alta posibilitate de a alege soldurile de pornire ale unui an si altfel decit am facut eu dar totusi, sa apara toata conturile in balanta chiar daca ele nu se regasesc si in SOLDURI_INITIALE? Sper ca am explicat cit de cit 'citet' ce vreau.....
  •  06-08-2007, 10:59 PM 2060 in reply to 2059

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

    Oops... ai dreptate, mi-a scăpat. În loc de:

    [...]
         FROM SOLDURI_INITIALE S
    [...]

    ar fi trebuit să fie:

    [...]
         FROM (
             SELECT CONT, SOLD_DEBITOR, SOLD_CREDITOR
             FROM SOLDURI_INITIALE WHERE AN=2006
         ) S
    [...]

    Răzvan 

  •  06-09-2007, 8:08 PM 2063 in reply to 2060

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

    da, e ok acum! Multumesc! Deci avem acum descris pas cu pas, de la A la Z cum se poate intocmi o balanta! Poate mai sint si altii interesati!
  •  06-10-2007, 1:24 PM 2064 in reply to 2063

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

    BELEA!!! acum am constatat ca de fapt tot nu e bine.....nu se ia in considerare la calculul soldurilor finale daca contul este pasiv, activ sau bi.... Eu am in tabela PLAN_CONTURI si o coloana TIP in care am aceasta informatie, mai ramine sa vad daca ma descurc singur sa o folosesc!

Page 1 of 2 (19 items)   1 2 Next >
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems