Mysql
 sql >> Database >  >> RDS >> Mysql

Rapporto dalla contabilità in partita doppia

Nella speranza che questo sia ciò che cerchi, che questo basti:

  • semplicemente INSERT LedgerTransaction ... per ogni transazione contabile nel mondo reale

Se stai cercando di più, significa che hai bisogno di basi contabili, a cui non è possibile rispondere qui. Controlla i tutorial gratuiti disponibili sul web.

SQL • Visualizza

Ho aggiornato la vista dalla domanda collegata, per ottenere TotalCredit &TotalDebit colonne, per tutte le Transazioni dal 1° giorno del mese precedente.

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 • MonthEnd • Inserisci AccountStatement

Il 1° giorno del nuovo mese, l'idea è di chiudere il mese precedente, datato 1° del nuovo mese. Utilizziamo la vista sopra per ottenere il TotalCredit &TotalDebit colonne per tutte le Transazioni dal 1° giorno del mese precedente.

Questo è solo un compito nel lavoro di fine mese, il 1° giorno del mese. Normalmente verrebbe eseguito sulla coda batch, per tutti gli Accounts , con adeguati limiti di controllo delle transazioni (es. SET ROWCOUNT 500 ), ecc.

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"

È lo stesso per l'aggiornamento di LedgerStatement .

No. Mentre l'interfaccia GUI è online, un'app di qualsiasi complessità ragionevole deve eseguire lavori sul server back-end. Per esempio. Fine del mese; backup giornalieri; Roll-up del registro delle transazioni; ecc. Generalmente c'è una configurazione sul server per farlo, altrimenti devi scriverne una.

Ci saranno molte attività che comprendono la fine del mese. Questo è solo uno di quei compiti. C'è un limite a ciò che puoi fare in PHP e non mi sognerei di farlo in PHP. Per motivi tecnici e di modularità, collocherei il codice per quell'attività, e tutte le altre attività di fine mese, in un proc memorizzato Account_MonthEnd_btr .

Non puoi farlo da un pulsante perché:

  • bloccherà la GUI fino al termine dell'attività di fine mese, che potrebbe durare più di qualche minuto (dipende dal numero di Accounts , LedgerAccounts , ecc).

  • cancellerà il registro delle transazioni (se il numero di Ledgers o Accounts è affatto grande). Anche quel controllo deve essere nel back-end.