V naději, že to je to, co hledáte, že to bude stačit:
- pouze
INSERT LedgerTransaction ...
pro každou transakci v reálném světě Ledger
Pokud hledáte více než to, znamená to, že potřebujete základy účetnictví, které zde nelze zodpovědět. Podívejte se na bezplatné návody dostupné na webu.
SQL • Zobrazení
Upgradoval jsem zobrazení z propojené otázky, abych získal TotalCredit
&TotalDebit
sloupce pro všechny transakce od 1. dne předchozího měsíce.
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 • Konec měsíce • Vložit výpis účtu
K 1. dni nového měsíce je záměrem uzavřít předchozí měsíc s datem 1. nového měsíce. K získání TotalCredit
používáme výše uvedený pohled &TotalDebit
sloupce pro všechny transakce od 1. dne předchozího měsíce.
Toto je pouze jeden úkol v úloze Konec měsíce, 1. den v měsíci. Normálně by se spouštěl ve frontě dávek pro všechny Accounts
,se správnými limity kontroly transakcí (např. SET ROWCOUNT 500
), atd.
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"
Totéž platí pro aktualizaci LedgerStatement
.
Ne. Zatímco rozhraní GUI je online, aplikace jakékoli rozumné složitosti musí spouštět úlohy na serveru back-end. Např. Konec měsíce; Denní zálohy; Souhrny protokolu transakcí; atd. Obecně je na serveru k tomu nastaveno nastavení, jinak ho musíte napsat.
Konec měsíce bude obsahovat mnoho úkolů. To je jen jeden z těch Úkolů. Existuje omezení toho, co můžete v PHP dělat, a ani ve snu by mě nenapadlo, že bych to dělal v PHP. Z technických důvodů a důvodů modularity bych kód pro tento úkol a všechny ostatní úkoly na konci měsíce umístil do uloženého procesu Account_MonthEnd_btr
.
Nemůžete to udělat pomocí tlačítka, protože:
-
zavěsí GUI, dokud nebude dokončena úloha na konci měsíce, což může trvat déle než několik minut (závisí na počtu
Accounts
,LedgerAccounts
, atd.). -
dojde k poškození protokolu transakcí (pokud počet
Ledgers
neboAccounts
je vůbec velký). I toto ovládání musí být na zadní straně.