W nadziei, że tego właśnie szukasz, że to wystarczy:
- tylko
INSERT LedgerTransaction ...
dla każdej rzeczywistej transakcji księgi rachunkowej
Jeśli szukasz czegoś więcej, oznacza to, że potrzebujesz podstaw rachunkowości, na które nie ma odpowiedzi tutaj. Sprawdź bezpłatne samouczki dostępne w Internecie.
SQL • Widok
Zaktualizowałem widok z połączonego pytania, aby uzyskać TotalCredit
&TotalDebit
kolumny, dla wszystkich Transakcji od pierwszego dnia poprzedniego miesiąca.
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 • Koniec miesiąca • Wstaw AccountStatement
W pierwszym dniu nowego miesiąca pomysł polega na zamknięciu poprzedniego miesiąca, datowanego na 1 dzień nowego miesiąca. Używamy powyższego widoku, który uzyskuje TotalCredit
&TotalDebit
kolumny dla wszystkich Transakcji od pierwszego dnia poprzedniego miesiąca.
To tylko jedno zadanie w zadaniu Koniec miesiąca, pierwszego dnia miesiąca. Normalnie byłby uruchamiany w kolejce wsadowej, dla wszystkich Accounts
,z odpowiednimi limitami kontroli transakcji (np. SET ROWCOUNT 500
) itp.
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"
To samo dotyczy aktualizacji LedgerStatement
.
Nie. Podczas gdy interfejs GUI jest online, aplikacja o rozsądnej złożoności musi uruchamiać zadania na serwerze zaplecza. Np. Koniec miesiąca; Codzienne kopie zapasowe; Podsumowania dziennika transakcji; itp. Generalnie na serwerze jest skonfigurowana do tego konfiguracja, w przeciwnym razie musisz ją napisać.
Będzie wiele Zadań, które składają się na Koniec Miesiąca. To tylko jedno z tych zadań. Jest limit tego, co możesz zrobić w PHP i nie marzyłbym o robieniu tego w PHP. Ze względów technicznych i modularności umieściłbym kod dla tego zadania i wszystkich innych zadań na koniec miesiąca w przechowywanej procedurze Account_MonthEnd_btr
.
Nie możesz tego zrobić za pomocą przycisku, ponieważ:
-
rozłączy się z GUI do czasu zakończenia zadania na koniec miesiąca, co może trwać dłużej niż kilka minut (w zależności od liczby
Accounts
,LedgerAccounts
itp.). -
spowoduje to zniszczenie dziennika transakcji (jeśli liczba
Ledgers
) lubAccounts
jest w ogóle duży). Ta kontrola również musi znajdować się z tyłu.