С надеждата, че това е, което търсите, че това ще бъде достатъчно:
- просто
INSERT LedgerTransaction ...
за всяка реална транзакция в главната книга
Ако търсите повече от това, това означава, че имате нужда от основи на счетоводството, на които не може да се отговори тук. Проверете за безплатните уроци, налични в мрежата.
SQL • Преглед
Надстроих изгледа от свързания въпрос, за да получа TotalCredit
&TotalDebit
колони за всички транзакции от 1-во число на предходния месец.
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 • Insert AccountStatement
На 1-ви ден от новия месец идеята е да се затвори предходният месец с дата 1-во число на новия месец. Използваме горния изглед, който получава TotalCredit
&TotalDebit
колони за всички транзакции от 1-во число на предходния месец.
Това е само една задача в края на месеца, на 1-ви ден от месеца. Обикновено се изпълнява на пакетната опашка за всички Accounts
,с правилни ограничения за контрол на транзакциите (напр. SET ROWCOUNT 500
) и др.
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"
Същото е и за актуализиране на LedgerStatement
.
Не. Докато GUI интерфейсът е онлайн, приложение с всякаква разумна сложност трябва да изпълнява задачи на задния сървър. напр. Край на месеца; Ежедневно архивиране; Сборни дневници на транзакциите; и т.н. По принцип има настройка на сървъра за това, в противен случай трябва да напишете такава.
Ще има много задачи, които включват края на месеца. Това е само една от тези задачи. Има ограничение за това, което можете да правите в PHP и не бих мечтал да правя това в PHP. Поради технически и модулни причини, бих поставил кода за тази задача и всички останали задачи в края на месеца в съхранена процедура Account_MonthEnd_btr
.
Не можете да го направите от бутон, защото:
-
той ще затвори графичния интерфейс, докато приключи задачата в края на месеца, което може да отнеме повече от няколко минути (в зависимост от броя на
Accounts
,LedgerAccounts
и др.). -
той ще издуха дневника на транзакциите (ако броят на
Ledgers
илиAccounts
изобщо е голяма). Този контрол също трябва да е в задния край.