In de hoop dat dit is wat u zoekt, dat dit zal volstaan:
- slechts
INSERT LedgerTransaction ...
voor elke echte grootboektransactie
Als u meer zoekt dan dat, betekent dit dat u basiskennis van boekhouding nodig heeft, die hier niet kan worden beantwoord. Kijk voor de gratis zelfstudies die beschikbaar zijn op internet.
SQL • Bekijken
Ik heb de weergave van de gekoppelde vraag geüpgraded om TotalCredit
te verkrijgen &TotalDebit
kolommen, voor alle transacties sinds de 1e dag van de vorige maand.
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 • AccountStatement invoegen
Op de 1e van de nieuwe maand is het de bedoeling om de vorige maand af te sluiten, namelijk de 1e van de nieuwe maand. We gebruiken de bovenstaande weergave om de TotalCredit
. te verkrijgen &TotalDebit
kolommen voor alle transacties sinds de 1e dag van de vorige maand.
Dit is slechts één taak in de taak van het einde van de maand, op de 1e dag van de maand. Het zou normaal gesproken worden uitgevoerd in de batch-wachtrij, voor alle Accounts
,met de juiste transactiecontrolelimieten (bijv. SET ROWCOUNT 500
), enz.
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"
Hetzelfde geldt voor het bijwerken van de LedgerStatement
.
Nee. Terwijl de GUI-interface online is, moet een app van enige redelijke complexiteit taken uitvoeren op de back-endserver. bijv. Einde van de maand; Dagelijkse back-ups; Transactielogboekoverzichten; enz. Over het algemeen is er een instelling op de server om dat te doen, anders moet je er een schrijven.
Er zullen veel taken zijn die het einde van de maand omvatten. Dit is slechts een van die taken. Er is een limiet aan wat je kunt doen in PHP, en ik zou er niet aan denken om dit in PHP te doen. Om technische en modulariteitsredenen zou ik de code voor die taak en alle andere maandeindtaken in een opgeslagen proces plaatsen Account_MonthEnd_btr
.
Je kunt het niet met een knop doen omdat:
-
het zal de GUI ophangen totdat de taak voor het einde van de maand is voltooid, wat meer dan een paar minuten kan duren (afhankelijk van het aantal
Accounts
,LedgerAccounts
, enz.). -
het zal het transactielogboek opblazen (als het aantal
Ledgers
ofAccounts
helemaal niet groot is). Die controle moet ook aan de achterkant zitten.