Với hy vọng rằng đây là những gì bạn đang tìm kiếm, chỉ cần điều này là đủ:
- chỉ
INSERT LedgerTransaction ...
cho mỗi Giao dịch sổ cái trong thế giới thực
Nếu bạn đang tìm kiếm nhiều hơn thế, điều đó có nghĩa là bạn cần những kiến thức cơ bản về kế toán, điều này không thể trả lời ở đây. Kiểm tra các Hướng dẫn miễn phí có sẵn trên web.
SQL • Xem
Tôi đã nâng cấp Chế độ xem từ câu hỏi được liên kết, để lấy TotalCredit
&TotalDebit
cho tất cả các Giao dịch kể từ ngày đầu tiên của tháng trước.
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 • Chèn báo cáo tài khoản
Vào ngày 1 của tháng mới, ý chỉ là đóng cửa của tháng trước, tức là ngày 1 của tháng mới. Chúng tôi sử dụng Chế độ xem ở trên để lấy TotalCredit
&TotalDebit
cho tất cả các Giao dịch kể từ ngày đầu tiên của tháng trước.
Đây chỉ là một Nhiệm vụ trong Công việc Cuối tháng, vào ngày đầu tiên của tháng. Nó thường sẽ được chạy trên hàng đợi hàng loạt, cho tất cả Accounts
, với giới hạn kiểm soát giao dịch thích hợp (ví dụ:SET ROWCOUNT 500
), v.v.
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"
Việc cập nhật LedgerStatement
cũng vậy .
Không. Trong khi giao diện GUI là trực tuyến, một ứng dụng có độ phức tạp hợp lý cần chạy các công việc trên máy chủ back end. Ví dụ. Cuối tháng; Sao lưu hàng ngày; Cuộn lên Nhật ký giao dịch; v.v ... Nói chung có một thiết lập trên máy chủ để làm điều đó, nếu không bạn phải viết một.
Sẽ có nhiều Nhiệm vụ bao gồm Cuối tháng. Đây chỉ là một trong những Nhiệm vụ đó. Có một giới hạn cho những gì bạn có thể làm trong PHP và tôi sẽ không mơ làm được điều này trong PHP. Vì lý do kỹ thuật và mô-đun, tôi sẽ đặt mã cho Nhiệm vụ đó và tất cả các Nhiệm vụ cuối tháng khác, trong một proc được lưu trữ Account_MonthEnd_btr
.
Bạn không thể làm điều đó từ một nút vì:
-
nó sẽ treo GUI cho đến khi Nhiệm vụ Cuối tháng hoàn thành, có thể lâu hơn một vài phút (tùy thuộc vào số lượng
Accounts
,LedgerAccounts
, v.v.). -
nó sẽ thổi Nhật ký giao dịch (nếu số lượng
Ledgers
hoặcAccounts
là lớn). Việc kiểm soát đó cũng phải ở phần cuối.