Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Báo cáo từ Double Entry Accounting

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ặc Accounts là lớn). Việc kiểm soát đó cũng phải ở phần cuối.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL động là gì?

  2. Các thủ tục được lưu trữ trong MySQL không hoạt động với SELECT (câu hỏi cơ bản)

  3. Cách tạo và xóa cơ sở dữ liệu và bảng trong MySQL

  4. Laravel &nhiều truy vấn đếm bằng Eloquent

  5. Chọn tất cả các hàng trùng lặp dựa trên một hoặc hai cột?