Nella speranza che questo sia ciò che cerchi, che questo basti:
- semplicemente
INSERT LedgerTransaction ...
per ogni transazione contabile nel mondo reale
Se stai cercando di più, significa che hai bisogno di basi contabili, a cui non è possibile rispondere qui. Controlla i tutorial gratuiti disponibili sul web.
SQL • Visualizza
Ho aggiornato la vista dalla domanda collegata, per ottenere TotalCredit
&TotalDebit
colonne, per tutte le Transazioni dal 1° giorno del mese precedente.
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 • Inserisci AccountStatement
Il 1° giorno del nuovo mese, l'idea è di chiudere il mese precedente, datato 1° del nuovo mese. Utilizziamo la vista sopra per ottenere il TotalCredit
&TotalDebit
colonne per tutte le Transazioni dal 1° giorno del mese precedente.
Questo è solo un compito nel lavoro di fine mese, il 1° giorno del mese. Normalmente verrebbe eseguito sulla coda batch, per tutti gli Accounts
, con adeguati limiti di controllo delle transazioni (es. SET ROWCOUNT 500
), ecc.
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"
È lo stesso per l'aggiornamento di LedgerStatement
.
No. Mentre l'interfaccia GUI è online, un'app di qualsiasi complessità ragionevole deve eseguire lavori sul server back-end. Per esempio. Fine del mese; backup giornalieri; Roll-up del registro delle transazioni; ecc. Generalmente c'è una configurazione sul server per farlo, altrimenti devi scriverne una.
Ci saranno molte attività che comprendono la fine del mese. Questo è solo uno di quei compiti. C'è un limite a ciò che puoi fare in PHP e non mi sognerei di farlo in PHP. Per motivi tecnici e di modularità, collocherei il codice per quell'attività, e tutte le altre attività di fine mese, in un proc memorizzato Account_MonthEnd_btr
.
Non puoi farlo da un pulsante perché:
-
bloccherà la GUI fino al termine dell'attività di fine mese, che potrebbe durare più di qualche minuto (dipende dal numero di
Accounts
,LedgerAccounts
, ecc). -
cancellerà il registro delle transazioni (se il numero di
Ledgers
oAccounts
è affatto grande). Anche quel controllo deve essere nel back-end.