I hopp om att detta är vad du söker, att detta kommer att räcka:
- bara
INSERT LedgerTransaction ...
för varje redovisningstransaktion i verkligheten
Om du söker mer än så betyder det att du behöver redovisningsgrunderna, som inte kan besvaras här. Kolla efter de kostnadsfria handledningarna som finns tillgängliga på webben.
SQL • Visa
Jag har uppgraderat vyn från den länkade frågan för att få TotalCredit
&TotalDebit
kolumner, för alla transaktioner sedan den 1:a dagen i föregående månad.
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 • Infoga kontoutdrag
Den 1:a dagen i den nya månaden är tanken att stänga föregående månad, daterad den 1:a i den nya månaden. Vi använder ovanstående vy för att erhålla TotalCredit
&TotalDebit
kolumner för alla transaktioner sedan den 1:a dagen i föregående månad.
Detta är bara en uppgift i månadsslutet, den första dagen i månaden. Det skulle normalt köras i batchkön för alla Accounts
, med korrekta transaktionskontrollgränser (t.ex. 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"
Det är samma sak för att uppdatera LedgerStatement
.
Nej. Medan det grafiska gränssnittet är online måste en app av rimlig komplexitet köra jobb på baksidans server. T.ex. Månadsslut; Dagliga säkerhetskopior; Transaktionsloggar roll-ups; etc. I allmänhet finns det en inställning på servern för att göra det, annars måste du skriva en.
Det kommer att finnas många uppgifter som omfattar månadsavslutning. Detta är bara en av dessa uppgifter. Det finns en gräns för vad du kan göra i PHP, och jag skulle inte drömma om att göra detta i PHP. Av tekniska och modulära skäl skulle jag placera koden för den uppgiften, och alla andra månadsslutuppgifter, i en lagrad proc Account_MonthEnd_btr
.
Du kan inte göra det från en knapp eftersom:
-
det kommer att lägga på GUI tills månadsslutsuppgiften är klar, vilket kan ta mer än några minuter (beror på antalet
Accounts
,LedgerAccounts
osv.). -
det kommer att blåsa transaktionsloggen (om antalet
Ledgers
). ellerAccounts
är överhuvudtaget stor). Den kontrollen måste också finnas i den bakre delen.