Welcome to Sign in | Help

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

  •  05-29-2007, 8:20 AM

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

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