Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Relatório da Contabilidade de Partida Dupla


Na esperança de que é isso que você está procurando, que isso seja suficiente:
  • apenas INSERT LedgerTransaction ... para cada transação real do Razão

Se você está procurando mais do que isso, significa que precisa de noções básicas de contabilidade, que não podem ser respondidas aqui. Verifique os tutoriais gratuitos disponíveis na web.

SQL • Visualização


Atualizei a visualização da pergunta vinculada para obter TotalCredit &TotalDebit colunas, para todas as transações desde o 1º dia do mês anterior.
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 • Fim do mês • Inserir AccountStatement


No 1º dia do novo mês, a ideia é fechar o mês anterior, datado do 1º do novo mês. Usamos a View acima para obter o TotalCredit &TotalDebit colunas para todas as transações desde o 1º dia do mês anterior.

Esta é apenas uma Tarefa no trabalho de Fim de Mês, no 1º dia do mês. Normalmente, seria executado na fila de lotes, para todas as Accounts ,com limites de controle de transação adequados (por exemplo, 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"

É o mesmo para atualizar o LedgerStatement .

Não. Enquanto a interface GUI está online, um aplicativo de qualquer complexidade razoável precisa executar tarefas no servidor back-end. Por exemplo. Fim do mês; Backups diários; Roll-ups de log de transações; etc. Geralmente existe uma configuração no servidor para fazer isso, senão você tem que escrever uma.

Haverá muitas Tarefas que compõem o Fim do Mês. Esta é apenas uma dessas Tarefas. Há um limite para o que você pode fazer em PHP, e eu nem sonharia em fazer isso em PHP. Por motivos técnicos e de modularidade, eu colocaria o código para essa tarefa e todas as outras tarefas de fim de mês em um proc armazenado Account_MonthEnd_btr .

Você não pode fazer isso a partir de um botão porque:

  • ele irá desligar a GUI até que a Tarefa Final do Mês seja concluída, o que pode levar mais do que alguns minutos (depende do número de Accounts , LedgerAccounts , etc).

  • ele irá explodir o log de transações (se o número de Ledgers ou Accounts é grande). Esse controle também tem que estar no back-end.