Dengan harapan bahwa inilah yang Anda cari, bahwa ini akan cukup:
- hanya
INSERT LedgerTransaction ...
untuk setiap Transaksi Buku Besar dunia nyata
Jika Anda mencari lebih dari itu, berarti Anda membutuhkan dasar-dasar akuntansi, yang tidak dapat dijawab di sini. Periksa Tutorial gratis yang tersedia di web.
SQL • Lihat
Saya telah memutakhirkan Tampilan dari pertanyaan tertaut, untuk mendapatkan TotalCredit
&TotalDebit
kolom, untuk semua Transaksi sejak tanggal 1 bulan sebelumnya.
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 • Akhir Bulan • Sisipkan Pernyataan Akun
Pada tanggal 1 bulan baru, idenya adalah untuk menutup bulan sebelumnya, tanggal 1 bulan baru. Kami menggunakan Tampilan di atas untuk mendapatkan TotalCredit
&TotalDebit
kolom untuk semua Transaksi sejak tanggal 1 bulan sebelumnya.
Ini hanya satu Tugas dalam pekerjaan Akhir Bulan, pada hari pertama setiap bulan. Biasanya akan dijalankan pada antrian batch, untuk semua Accounts
, dengan batas kontrol transaksi yang tepat (mis. SET ROWCOUNT 500
), dll.
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"
Hal yang sama untuk memperbarui LedgerStatement
.
Tidak. Meskipun antarmuka GUI sedang online, aplikasi dengan kompleksitas yang wajar perlu menjalankan tugas di server ujung belakang. Misalnya. Akhir bulan; Cadangan harian; Roll-up Log Transaksi; dll. Umumnya ada pengaturan di server untuk melakukan itu, jika tidak, Anda harus menulisnya.
Akan ada banyak Tugas yang terdiri dari Akhir Bulan. Ini hanyalah salah satu dari Tugas itu. Ada batasan untuk apa yang dapat Anda lakukan di PHP, dan saya tidak akan bermimpi melakukan ini di PHP. Untuk alasan teknis dan modularitas, saya akan menempatkan kode untuk Tugas itu, dan semua Tugas Akhir Bulan lainnya, dalam Account_MonthEnd_btr
proc yang tersimpan .
Anda tidak dapat melakukannya dari tombol karena:
-
itu akan menutup GUI sampai Tugas Akhir Bulan selesai, yang mungkin lebih dari beberapa menit (tergantung pada jumlah
Accounts
,LedgerAccounts
, dll). -
itu akan meniup Log Transaksi (jika jumlah
Ledgers
atauAccounts
sama sekali besar). Kontrol itu juga, harus ada di belakang.