sql >> Databáze >  >> RDS >> Mysql

Výkaz z podvojného účetnictví

V naději, že to je to, co hledáte, že to bude stačit:

  • pouze INSERT LedgerTransaction ... pro každou transakci v reálném světě Ledger

Pokud hledáte více než to, znamená to, že potřebujete základy účetnictví, které zde nelze zodpovědět. Podívejte se na bezplatné návody dostupné na webu.

SQL • Zobrazení

Upgradoval jsem zobrazení z propojené otázky, abych získal TotalCredit &TotalDebit sloupce pro všechny transakce od 1. dne předchozího měsíce.

CREATE VIEW Account_Current_V 
AS
    SELECT 
        AccountNo,
        Date = DATEADD( DD, -1, GETDATE() ), -- show previous day
        ClosingBalance,
        TotalCredit = (
            -- TotalCredit_Subquery
            SELECT SUM( Amount )
                FROM AccountTransaction
                WHERE AccountNo = @AccountNo
                    AND XactTypeCode_Ext IN ( "AC", "Dp" )
                        -- this month
                    AND DateTime >= CONVERT( CHAR(6), GETDATE(), 2 ) + "01"
                ),
        TotalDebit = (
            -- TotalDebit_Subquery
            SELECT SUM( Amount )
                FROM AccountTransaction
                WHERE AccountNo = @AccountNo
                    AND XactTypeCode_Ext NOT IN ( "AC", "Dp" )
                    AND DateTime >= CONVERT( CHAR(6), GETDATE(), 2 ) + "01"
                ),
        CurrentBalance = ClosingBalance + 
            <TotalCredit_Subquery> - 
            <TotalDebit_Subquery>
        FROM AccountStatement                -- 1st day of this month
        WHERE Date = CONVERT( CHAR(6), GETDATE(), 2 ) + "01"

SQL • Konec měsíce • Vložit výpis účtu

K 1. dni nového měsíce je záměrem uzavřít předchozí měsíc s datem 1. nového měsíce. K získání TotalCredit používáme výše uvedený pohled &TotalDebit sloupce pro všechny transakce od 1. dne předchozího měsíce.

Toto je pouze jeden úkol v úloze Konec měsíce, 1. den v měsíci. Normálně by se spouštěl ve frontě dávek pro všechny Accounts ,se správnými limity kontroly transakcí (např. SET ROWCOUNT 500 ), atd.

INSERT AccountStatement 
    SELECT  AccountNo,
            -- Date: 1st day of this month
            CONVERT( CHAR(6), GETDATE(), 2 ) + "01",
            ACV.CurrentBalance,
            ACV.TotalCredit,
            ACV.TotalDebit
        FROM Account_Current_V    ACV
            JOIN AccountStatement ASS
                ON ACV.AccountNo = ASS.AccountNo
        -- AccountStatements that are not yet MonthEnd-ed
        -- get single row that is newest
        WHERE ASS.Date = (
            SELECT MAX( Date )
                FROM AccountStatement
                WHERE AccountNo = ASS.AccountNo
                )
                -- that is not 1st day of this month
            AND ASS.Date != CONVERT( CHAR(6), GETDATE(), 2 ) + "01"

Totéž platí pro aktualizaci LedgerStatement .

Ne. Zatímco rozhraní GUI je online, aplikace jakékoli rozumné složitosti musí spouštět úlohy na serveru back-end. Např. Konec měsíce; Denní zálohy; Souhrny protokolu transakcí; atd. Obecně je na serveru k tomu nastaveno nastavení, jinak ho musíte napsat.

Konec měsíce bude obsahovat mnoho úkolů. To je jen jeden z těch Úkolů. Existuje omezení toho, co můžete v PHP dělat, a ani ve snu by mě nenapadlo, že bych to dělal v PHP. Z technických důvodů a důvodů modularity bych kód pro tento úkol a všechny ostatní úkoly na konci měsíce umístil do uloženého procesu Account_MonthEnd_btr .

Nemůžete to udělat pomocí tlačítka, protože:

  • zavěsí GUI, dokud nebude dokončena úloha na konci měsíce, což může trvat déle než několik minut (závisí na počtu Accounts , LedgerAccounts , atd.).

  • dojde k poškození protokolu transakcí (pokud počet Ledgers nebo Accounts je vůbec velký). I toto ovládání musí být na zadní straně.




  1. Zápis SQL dotazu na položku SELECT z následující tabulky

  2. Kde získám zdroj libpq?

  3. SQLException:Porušení protokolu. Problém s ovladačem Oracle JDBC

  4. Chyba exportu MySQL DO OUTFILE --secure-file-priv při použití nastaveného adresáře