In der Hoffnung, dass dies das ist, was Sie suchen, dass dies ausreicht:
- nur
INSERT LedgerTransaction ...
für jede reale Ledger-Transaktion
Wenn Sie mehr suchen, brauchen Sie Buchhaltungsgrundlagen, die hier nicht beantwortet werden können. Suchen Sie nach den kostenlosen Tutorials, die im Internet verfügbar sind.
SQL • Anzeigen
Ich habe die Ansicht der verknüpften Frage aktualisiert, um TotalCredit
zu erhalten &TotalDebit
Spalten, für alle Transaktionen seit dem 1. Tag des Vormonats.
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 • Monatsende • Kontoauszug einfügen
Am 1. Tag des neuen Monats soll der vorherige Monat mit dem Datum 1. des neuen Monats abgeschlossen werden. Wir verwenden die obige Ansicht, um den TotalCredit
zu erhalten &TotalDebit
Spalten für alle Transaktionen seit dem 1. Tag des Vormonats.
Dies ist nur eine Aufgabe im Monatsende-Job am 1. Tag des Monats. Es würde normalerweise für alle Accounts
in der Stapelwarteschlange ausgeführt , mit angemessenen Transaktionskontrolllimits (z. B. SET ROWCOUNT 500
) usw.
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"
Das Gleiche gilt für die Aktualisierung des LedgerStatement
.
Nein. Während die GUI-Schnittstelle online ist, muss eine App mit angemessener Komplexität Jobs auf dem Back-End-Server ausführen. Z.B. Monatsende; Tägliche Backups; Transaktionsprotokoll-Rollups; usw. Im Allgemeinen gibt es dafür eine Einrichtung auf dem Server, ansonsten müssen Sie eine schreiben.
Es wird viele Aufgaben geben, die das Monatsende umfassen. Dies ist nur eine dieser Aufgaben. Es gibt eine Grenze für das, was Sie in PHP tun können, und ich würde nicht im Traum daran denken, dies in PHP zu tun. Aus technischen und modularen Gründen würde ich den Code für diese Aufgabe und alle anderen Aufgaben zum Monatsende in einer gespeicherten Prozedur Account_MonthEnd_btr
platzieren .
Sie können dies nicht über eine Schaltfläche tun, weil:
-
Es wird die GUI auflegen, bis die Monatsende-Aufgabe abgeschlossen ist, was mehr als ein paar Minuten dauern kann (abhängig von der Anzahl der
Accounts
,LedgerAccounts
usw.). -
es wird das Transaktionsprotokoll löschen (wenn die Anzahl der
Ledgers
oderAccounts
überhaupt groß ist). Auch diese Kontrolle muss sich im Backend befinden.