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
ouAccounts
est du tout grand). Ce contrôle doit également être en arrière-plan.