これがあなたが求めているものであることを願って、これで十分です:
- 単に
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
まったく大きいです)。そのコントロールも、バックエンドにある必要があります。