Mysql
 sql >> Base de données >  >> RDS >> Mysql

Rapport de la comptabilité en partie double

En espérant que c'est ce que vous recherchez, que cela suffira :

  • simplement INSERT LedgerTransaction ... pour chaque transaction du grand livre dans le monde réel

Si vous recherchez plus que cela, cela signifie que vous avez besoin de bases comptables, auxquelles il est impossible de répondre ici. Recherchez les didacticiels gratuits disponibles sur le Web.

SQL • Afficher

J'ai mis à jour la vue à partir de la question liée, pour obtenir TotalCredit &TotalDebit colonnes, pour toutes les Transactions depuis le 1er jour du mois précédent.

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 • Fin du mois • Insérer l'état de compte

Le 1er jour du nouveau mois, l'idée est de clôturer le mois précédent, daté du 1er du nouveau mois. Nous utilisons la vue ci-dessus pour obtenir le TotalCredit &TotalDebit colonnes pour toutes les transactions depuis le 1er jour du mois précédent.

Il s'agit d'une seule tâche dans le travail de fin de mois, le 1er jour du mois. Il serait normalement exécuté sur la file d'attente batch, pour tous les Accounts , avec des limites de contrôle de transaction appropriées (par exemple, SET ROWCOUNT 500 ), etc.

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"

Il en est de même pour la mise à jour du LedgerStatement .

Non. Alors que l'interface graphique est en ligne, une application d'une complexité raisonnable doit exécuter des tâches sur le serveur principal. Par exemple. La fin du mois; Sauvegardes quotidiennes ; Rollups du journal des transactions ; etc. Généralement, il y a une configuration sur le serveur pour faire cela, sinon vous devez en écrire une.

De nombreuses tâches comprendront la fin du mois. Ce n'est qu'une de ces tâches. Il y a une limite à ce que vous pouvez faire en PHP, et je ne rêverais pas de le faire en PHP. Pour des raisons techniques et de modularité, je placerais le code de cette tâche et de toutes les autres tâches de fin de mois dans une procédure stockée Account_MonthEnd_btr .

Vous ne pouvez pas le faire à partir d'un bouton car :

  • il raccrochera l'interface graphique jusqu'à ce que la tâche de fin de mois soit terminée, ce qui peut prendre plus de quelques minutes (selon le nombre de Accounts , LedgerAccounts , etc.).

  • cela fera exploser le journal des transactions (si le nombre de Ledgers ou Accounts est du tout grand). Ce contrôle doit également être en arrière-plan.