sql >> データベース >  >> RDS >> Mysql

複式簿記からの報告

    これがあなたが求めているものであることを願って、これで十分です:

    • 単にINSERT LedgerTransaction ... 実世界の元帳トランザクションごとに

    それ以上のものを求めているのなら、それはあなたが会計の基本を必要としていることを意味します、それはここで答えることができません。 Webで利用できる無料のチュートリアルを確認してください。

    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•InsertAccountStatement

    新しい月の1日に、新しい月の1日付けの前月を閉じるというアイデアがあります。 TotalCreditを取得するために上記のビューを使用します &TotalDebit 前月の1日以降のすべてのトランザクションの列。

    これは、月末のジョブの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インターフェースはオンラインですが、適度に複雑なアプリは、バックエンドサーバーでジョブを実行する必要があります。例えば。月末;毎日のバックアップ;トランザクションログのロールアップ。など。通常、サーバーにはそれを行うための設定があります。それ以外の場合は、作成する必要があります。

    月末を構成する多くのタスクがあります。これはそれらのタスクの1つにすぎません。 PHPでできることには限界があり、PHPでこれを行うことは夢にも思いません。技術的およびモジュール性の理由から、そのタスクと他のすべての月末タスクのコードをストアドプロシージャAccount_MonthEnd_btrに配置します。 。

    次の理由により、ボタンからそれを行うことはできません:

    • 月末タスクが終了するまでGUIがハングアップします。これは、数分以上かかる場合があります(Accountsの数によって異なります)。 、LedgerAccounts など)。

    • トランザクションログを吹き飛ばします(Ledgersの数の場合 またはAccounts まったく大きいです)。そのコントロールも、バックエンドにある必要があります。




    1. ORACLE SQL*Plusチュートリアル

    2. yiiフレームワークphpの基準の条件

    3. 未定義のメソッドIlluminate\\Database \\ Schema \\ Blueprint ::increments()の呼び出し

    4. 1行にデータを表示(複数行から)