Friday, July 27, 2007

ACCOUNTING PROGRAMMING Bag. 2 : JURNAL UMUM

Setelah kita membuat tabel2 untuk master yang dibutuhkan di akuntansi, maka kita dapat mencoba melakukan transaksi akuntansi. Menurut saya transaksi akuntansi sebenarnya cukup dengan 1 ( satu ) form yaitu form JURNAL UMUM. Sebelum kita masuk ke pembuatan desain table jurnal umum, kita memerlukan beberapa hal, yaitu :
  • Tabel HISTORY AKUN. Tabel ini sebenarnya juga tidak mutlak diperlukan dalam pemrograman akuntansi, namun untuk mempercepat proses query pada waktu menampilkan laporan – laporan akuntansi, saya sangat menyarankan anda membuat table ini, anjuran desain table :
Nama Tabel : HAkun

Field, Tipe Data, Not Null, Primary Key, Identity, Default Value, Description

AkunID, int, Yes, No, No, [EMPTY], Menyimpan data AkunID
ThnBuku, int, Yes, No, No, datepart(year,getdate()), Menyimpan Tahun Buku dari nilai akun
MataUangID, int, Yes, No, No, [EMPTY], Menyimpan ID Mata Uang
RealSa, money, Yes, No, No, 0, Menyimpan nilai Saldo Awal pada tahun buku yang bersangkutan
Real01, money, Yes, No, No, 0, Menyimpan nilai Saldo bulan Januari pada tahun buku yang bersangkutan
Real02, money, Yes, No, No, 0, Menyimpan nilai Saldo bulan Februari pada tahun buku yang bersangkutan
Real03, money, Yes, No, No, 0, Menyimpan nilai Saldo bulan Maret pada tahun buku yang bersangkutan
Real04, money, Yes, No, No, 0, Menyimpan nilai Saldo bulan April pada tahun buku yang bersangkutan
Real05, money, Yes, No, No, 0, Menyimpan nilai Saldo bulan Mei pada tahun buku yang bersangkutan
Real06, money, Yes, No, No, 0, Menyimpan nilai Saldo bulan Juni pada tahun buku yang bersangkutan
Real07, money, Yes, No, No, 0, Menyimpan nilai Saldo bulan Juli pada tahun buku yang bersangkutan
Real08, money, Yes, No, No, 0, Menyimpan nilai Saldo bulan Agustus pada tahun buku yang bersangkutan
Real09, money, Yes, No, No, 0, Menyimpan nilai Saldo bulan September pada tahun buku yang bersangkutan
Real10, money, Yes, No, No, 0, Menyimpan nilai Saldo bulan Oktober pada tahun buku yang bersangkutan
Real11, money, Yes, No, No, 0, Menyimpan nilai Saldo bulan November pada tahun buku yang bersangkutan
Real12, money, Yes, No, No, 0, Menyimpan nilai Saldo bulan Desember pada tahun buku yang bersangkutan
dtCreated, datetime, Yes, No, No, getdate(), tanggal dibuat
dtModified, datetime, Yes, No, No, getdate(), tanggal dimodifikasi
UpdatedBy, varchar( 25 ), Yes, No, No, ‘PRGMR’, User yang menambahkan / mengganti data

Catatan : mungkin anda sudah mengetahui apa maksud dari pembuatan table ini. Tabel ini adalah table yang diakses pada saat kita akan mencetak laporan akuntansi dan bukannya dari perhitungan langsung dari table transaksi yang kemungkinan ada beribu – ribu atau bahkan sampai ratusan ribu atau jutaan record di dalamnya.

Saya rasa user pasti akan lebih senang jika dia bisa melihat Laporan Laba Rugi dalam 5 detik daripada harus menunggu selama 5 menit hanya untuk menampilkannya. Berikut ini adalah contoh isi dari table HAkun :

AkunID, ThnBuku, MataUangID, RealSa, Real01, Real02, Real03, Real04, Real05, Real06, Real07, Real08, Real09, Real10, Real11, Real12, dtCreated, dtModified, UpdatedBy
1, 2007, 0, 0, 0, 0, 0, 0, 2500000, -1000000, 0, 0, 0, 0, 0, [automatic], [automatic], ‘PRGMR’
2, 2007, 1, 0, 0, 0, 0, 0, 125, -100, 0, 0, 0, 0, 0, [automatic], [automatic], ‘PRGMR’
17, 2007, 0, 0, 0, 0, 0, 0, 1000000, 0, 0, 0, 0, 0, 0, [automatic], [automatic], ‘PRGMR’
18, 2007, 1, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, [automatic], [automatic], ‘PRGMR’
21, 2007, 0, 0, 0, 0, 0, 0, -2500000, 0, 0, 0, 0, 0, 0, [automatic], [automatic], ‘PRGMR’
22, 2007, 1, 0, 0, 0, 0, 0, -125, 0, 0, 0, 0, 0, 0, [automatic], [automatic], ‘PRGMR'
29, 2007, 0, 0, 0, 0, 0, 0, -1000000, 1000000, 0, 0, 0, 0, 0, [automatic], [automatic], ‘PRGMR’
30, 2007, 1, 0, 0, 0, 0, 0, -100, 100, 0, 0, 0, 0, 0, [automatic], [automatic], ‘PRGMR’

Angka – angka tersebut didapat darimana ??!? Ikuti penjelasan dibawah ini …

Asumsi :
- AkunID 1 = Kas IDR
- AkunID 2 = Kas USD
- AkunID 17 = Persediaan Barang IDR
- AkunID 18 = Persediaan Barang USD
- AkunID 21 = Laba Ditahan IDR
- AkunID 22 = Laba Ditahan USD
- AkunID 29 = Pembelian IDR
- AkunID 30 = Pembelian USD

Data yang ada pada table HAkun tersebut diatas terjadi karena : ( contoh kasus )

  • Pada tanggal 10 Juni 2007 program mulai digunakan, maka kita harus set Saldo Awal untuk Kas IDR & Kas USD dengan cara membuat jurnal sbb. :
Transaksi IDR :
Kas IDR ( Debet ) = Rp. 2.500.000,-
Laba Ditahan IDR ( Kredit ) = Rp. 2.500.000,-

Transaksi USD :
Kas USD ( Debet ) = $ 125.00
Laba Ditahan USD ( Kredit ) = $ 125.00
  • Pada tanggal 15 Juni 2007 melakukan transaksi penerimaan barang, maka jurnalnya adalah sbb. :
Transaksi IDR :
Persediaan Barang IDR ( Debet ) = Rp. 1.000.000,-
Pembelian IDR ( Kredit ) = Rp. 1.000.000,-

Transaksi USD :
Persediaan Barang USD ( Debet ) = $ 100.00
Pembelian USD ( Kredit ) = $ 100.00
  • Transaksi pembelian barang diatas dibayar pada tanggal 5 Juli 2007, maka jurnalnya adalah sbb. :
Transaksi IDR :
Pembelian IDR ( Debet ) = Rp. 1.000.000,-
Kas IDR ( Kredit ) = Rp. 1.000.000,-

Transaksi USD :
Pembelian USD ( Debet ) = $ 100.00
Kas USD ( Kredit ) = $ 100.00

Nah, karena sekarang anda semua sudah tahu darimana asal angka – angka tersebut, bisa dibayangkan kecepatan pembacaan data dari 1 ( satu ) record dibandingkan dengan jika kita menjumlahkan secara manual dari data – data transaksi yang ada. Pertanyaan selanjutnya adalah bagaimana cara ngisinya ? Go to the next step.

  • Untuk melakukan transaksi akuntansi, kita memerlukan 2 ( dua ) buah table MASTER & DETAIL dari Jurnal Umum, berikut ini adalah anjuran untuk pembuatan masing-2 tabel tersebut :
  • MASTER JURNAL UMUM, anjuran desain tabel :
Nama Tabel : TJUHdr

Field, Tipe Data, Not Null, Primary Key, Identity, Default Value, Description
JUHdrID, int, Yes, Yes, Yes, [EMPTY], Menyimpan data Jurnal Umum Master ID
BKKHdrID, int, No, No, No, [EMPTY], Menyimpan data Bukti Kas Keluar ID ( akan saya jelaskan pada bag. selanjutnya )
BKMHdrID, int, No, No, No, [EMPTY], Menyimpan data Bukti Kas Masuk ID ( akan saya jelaskan pada bag.selanjutnya )
CekGiroOutID, int, No, No, No, [EMPTY], Menyimpan data Rekonsiliasi Giro ID ( akan saya jelaskan pada bag.selanjutnya )
JenisJurnal, varchar( 3 ), Yes, No, No, [EMPTY], Menyimpan Jenis Jurnal dari transaksi Jurnal Umum
TglJurnal, datetime, Yes, No, No, [EMPTY], Menyimpan data Tanggal Transaksi
MataUangID, int, Yes, No, No, [EMPTY], Menyimpan ID Mata Uang
StsPosting, varchar( 1 ), Yes, No, No, B, Menyimpan Status Posting dari Transaksi
StsRef, bit, Yes, No, No, 1, Menyimpan Status Referensi dari Transaksi
Referensi, varchar( 100 ), No, No, No, [EMPTY], Menyimpan Kode Referensi dari Transaksi
dtCreated, datetime, Yes, No, No, getdate(), tanggal dibuat
dtModified, datetime, Yes, No, No, getdate(), tanggal dimodifikasi
UpdatedBy, varchar( 25 ), Yes, No, No, ‘PRGMR’, User yang menambahkan / mengganti data

Catatan :
- Desain tabel diatas adalah desain tabel untuk transaksi per mata uang, artinya dalam satu transaksi tidak dapat mengandung 2 ( dua ) atau lebih mata uang yang berlainan.
- Apaan sih StsPosting itu ? StsPosting ini digunakan untuk status transaksi tersebut apakah sudah diposting untuk dihitung pada proses Akhir Tahun ( akan saya jelaskan pada bag. selanjutnya )
- Apa itu StsRef & Referensi ? StsRef adalah field untuk menampung apakah transaksi tersebut dibuat secara otomatis oleh transaksi lain, contoh : Penerimaan Barang, Retur, Pembayaran, dll. Jika transaksi dibuat oleh proses otomatis, maka system akan membuat nomor referensi sendiri. Jadi perlu diingat, jika user memasukkan transaksi jurnal umum secara manual, jangan lupa set StsRef = 0 ( Nol ). Hal ini diperlukan untuk memudahkan user dalam pembuatan laporan akuntansi. Dalam tabel diatas saya beri trigger untuk membuat nomor referensinya, triggernya adalah sebagai berikut :


CREATE TRIGGER [dbo].[trg_TJUHdr_Referensi] ON [dbo].[TJUHdr]
FOR INSERT AS

set nocount on

declare
@JUHdrID int, @JenJur varchar( 5 ), @Tahun varchar( 4 ), @Bulan varchar( 2 ),
@StsRef bit declare @RefBaru varchar( 50 )

select @JUHdrID = JUHdrID, @JenJur = JenisJurnal, @Tahun = isnull( cast( year( TglJurnal ) as varchar( 4 )), '' ), @Bulan = isnull( cast( month( TglJurnal ) as varchar( 2 )), '' ), @StsRef = StsRef
from inserted -- Hanya merubah Referensi jika dimasukkan secara otomatis melalui proses lainnya

if @StsRef = 1
begin
set @RefBaru = rtrim( @JenJur ) + '/' + @Tahun + '/' + @Bulan + '/' +
cast( @JUHdrID as varchar( 20 ))

update TJUHdr
set Referensi = @RefBaru
where JUHdrID = @JUHdrID
end

Untuk contoh2 kasus diatas, maka jika masuk tabel adalah sebagai berikut :

JUHdrID, BKKHdrID, BKMHdrID, CekGiroOutID, JenisJurnal, TglJurnal, MataUangID, StsPosting, StsRef, Referensi, dtCreated, dtModified, UpdatedBy
1, NULL, NULL, NULL, CS, 06/10/2007, 0, B, 0, NULL, [automatic], [automatic], ‘PRGMR’
2, NULL, NULL, NULL, CS, 06/10/2007, 1, B, 0, NULL, [automatic], [automatic], ‘PRGMR’
3, NULL, NULL, NULL, CS, 06/15/2007, 0, B, 0, NULL, [automatic], [automatic], ‘PRGMR’
4, NULL, NULL, NULL, CS, 06/15/2007, 1, B, 0, NULL, [automatic], [automatic], ‘PRGMR’
5, NULL, NULL, NULL, CS, 07/05/2007, 0, B, 0, NULL, [automatic], [automatic], ‘PRGMR’
6, NULL, NULL, NULL, CS, 07/05/2007, 1, B, 0, NULL, [automatic], [automatic], ‘PRGMR’

Harap diingat, data – data tanggal diatas ditulis dalam format English ( mm/dd/yyyy )
  • DETAIL JURNAL UMUM, anjuran desain tabel :
Nama Tabel : TJUDtl

Field, Tipe Data, Not Null, Primary Key, Identity, Default Value, Description
JUDtlID, int, Yes, Yes, Yes, [EMPTY], Menyimpan data Jurnal Umum Detail ID
JUHdrID, int, Yes, No, No, [EMPTY], Menyimpan data Jurnal Umum Master ID AkunID, int, Yes, No, No, [EMPTY], Menyimpan data
Akun ID NoVoucher, varchar( 100 ), Yes, No, No, [EMPTY], Menyimpan data Nomor Voucher ( no. nota, kwitansi, dll )
Transaksi, varchar( 255 ), No, No, No, [EMPTY], Menyimpan penjelasan transaksi
Debet, money, Yes, No, No, [EMPTY], Menyimpan nilai transaksi untuk kolom Debet
Kredit, money, Yes, No, No, [EMPTY], Menyimpan nilai transaksi untuk kolom Kredit
dtCreated, datetime, Yes, No, No, getdate(), tanggal dibuat
dtModified, datetime, Yes, No, No, getdate(), tanggal dimodifikasi
UpdatedBy, varchar( 25 ), Yes, No, No, ‘PRGMR’, User yang menambahkan / mengganti data


Catatan :
- Untuk memasukkan nilai kedalam tabel HAkun, maka kita perlu membuat trigger sbb :

CREATE TRIGGER [dbo].[trg_TJUDtl_Ins_HAkun] ON [dbo].[TJUDtl]
FOR INSERT AS

set nocount on

declare
@vAkunID int, @vBulan tinyint, @vTahun char(4), @vCur tinyint, @vupdatedDate datetime,
@vupdatedBy varchar(5), @vReal money, @vDebet decimal (15,2), @vKredit decimal (15,2),
@vOrgAkun decimal (15,2)

select top 1 @vAkunID = JUD.AkunID, @vCur = JUH.MataUangID, @vBulan = CAST( month( JUH.TglJurnal ) as tinyint ), @vTahun = CAST( year ( JUH.TglJurnal ) as char( 4 )), @vupdatedDate = JUD.dtModified, @vupdatedBy = JUD.updatedBy, @vDebet = isnull(JUD.Debet,0), @vKredit = isnull(JUD.Kredit,0)
from TJUHdr JUH
INNER JOIN inserted JUD ON JUH.JUHdrID = JUD.JUHdrID

set @vReal = 0

if @vDebet > 0
set @vReal = isnull( @vDebet, 0)
else if @vKredit > 0
set @vReal = isnull( @vKredit, 0) * -1

-- Cek apakah sudah ada akun tersebut pada HAkun
if Not Exists ( select top 1 AkunID -- Jika belum ada from HAkun where ( AkunID = @vAkunID ) and ( ThnBuku = @vTahun ) and ( MataUangID = @vCur ))
begin
if @vBulan = 1
insert into HAkun( AkunID, ThnBuku, MataUangID, Real01, updatedBy)
select JUD.AkunID, @vTahun, @vCur, isnull( @vReal, 0 ), JUD.UpdatedBy
from inserted JUD
INNER JOIN TJUHdr JUH ON JUD.JUHdrID = JUH.JUHdrID
where ( JUD.AkunID = @vAkunID ) and ( CAST( year( JUH.TglJurnal ) as char( 4 )) = @vTahun )
else if @vBulan = 2
insert into HAkun( AkunID, ThnBuku, MataUangID, Real02, updatedBy)
select JUD.AkunID, @vTahun, @vCur, isnull( @vReal, 0 ), JUD.UpdatedBy
from inserted JUD
INNER JOIN TJUHdr JUH ON JUD.JUHdrID = JUH.JUHdrID
where ( JUD.AkunID = @vAkunID ) and ( CAST( year( JUH.TglJurnal ) as char( 4 )) = @vTahun )
else if @vBulan = 3
insert into HAkun( AkunID, ThnBuku, MataUangID, Real03, updatedBy)
select JUD.AkunID, @vTahun, @vCur, isnull( @vReal, 0 ), JUD.UpdatedBy
from inserted JUD
INNER JOIN TJUHdr JUH ON JUD.JUHdrID = JUH.JUHdrID
where ( JUD.AkunID = @vAkunID ) and ( CAST( year( JUH.TglJurnal ) as char( 4 )) = @vTahun )
else if @vBulan = 4
insert into HAkun( AkunID, ThnBuku, MataUangID, Real04, updatedBy)
select JUD.AkunID, @vTahun, @vCur, isnull( @vReal, 0 ), JUD.UpdatedBy
from inserted JUD
INNER JOIN TJUHdr JUH ON JUD.JUHdrID = JUH.JUHdrID
where ( JUD.AkunID = @vAkunID ) and ( CAST( year( JUH.TglJurnal ) as char( 4 )) = @vTahun )
else if @vBulan = 5
insert into HAkun( AkunID, ThnBuku, MataUangID, Real05, updatedBy)
select JUD.AkunID, @vTahun, @vCur, isnull( @vReal, 0 ), JUD.UpdatedBy
from inserted JUD
INNER JOIN TJUHdr JUH ON JUD.JUHdrID = JUH.JUHdrID
where ( JUD.AkunID = @vAkunID ) and ( CAST( year( JUH.TglJurnal ) as char( 4 )) = @vTahun )
else if @vBulan = 6
insert into HAkun( AkunID, ThnBuku, MataUangID, Real06, updatedBy)
select JUD.AkunID, @vTahun, @vCur, isnull( @vReal, 0 ), JUD.UpdatedBy
from inserted JUD
INNER JOIN TJUHdr JUH ON JUD.JUHdrID = JUH.JUHdrID
where ( JUD.AkunID = @vAkunID ) and ( CAST( year( JUH.TglJurnal ) as char( 4 )) = @vTahun )
else if @vBulan = 7
insert into HAkun( AkunID, ThnBuku, MataUangID, Real07, updatedBy)
select JUD.AkunID, @vTahun, @vCur, isnull( @vReal, 0 ), JUD.UpdatedBy
from inserted JUD
INNER JOIN TJUHdr JUH ON JUD.JUHdrID = JUH.JUHdrID
where ( JUD.AkunID = @vAkunID ) and ( CAST( year( JUH.TglJurnal ) as char( 4 )) = @vTahun )
else if @vBulan = 8
insert into HAkun( AkunID, ThnBuku, MataUangID, Real08, updatedBy)
select JUD.AkunID, @vTahun, @vCur, isnull( @vReal, 0 ), JUD.UpdatedBy
from inserted JUD
INNER JOIN TJUHdr JUH ON JUD.JUHdrID = JUH.JUHdrID
where ( JUD.AkunID = @vAkunID ) and ( CAST( year( JUH.TglJurnal ) as char( 4 )) = @vTahun )
else if @vBulan = 9
insert into HAkun( AkunID, ThnBuku, MataUangID, Real09, updatedBy)
select JUD.AkunID, @vTahun, @vCur, isnull( @vReal, 0 ), JUD.UpdatedBy
from inserted JUD
INNER JOIN TJUHdr JUH ON JUD.JUHdrID = JUH.JUHdrID
where ( JUD.AkunID = @vAkunID ) and ( CAST( year( JUH.TglJurnal ) as char( 4 )) = @vTahun )
else if @vBulan = 10
insert into HAkun( AkunID, ThnBuku, MataUangID, Real10, updatedBy)
select JUD.AkunID, @vTahun, @vCur, isnull( @vReal, 0 ), JUD.UpdatedBy
from inserted JUD
INNER JOIN TJUHdr JUH ON JUD.JUHdrID = JUH.JUHdrID
where ( JUD.AkunID = @vAkunID ) and ( CAST( year( JUH.TglJurnal ) as char( 4 )) = @vTahun )
else if @vBulan = 11
insert into HAkun( AkunID, ThnBuku, MataUangID, Real11, updatedBy)
select JUD.AkunID, @vTahun, @vCur, isnull( @vReal, 0 ), JUD.UpdatedBy
from inserted JUD
INNER JOIN TJUHdr JUH ON JUD.JUHdrID = JUH.JUHdrID
where ( JUD.AkunID = @vAkunID ) and ( CAST( year( JUH.TglJurnal ) as char( 4 )) = @vTahun )
else if @vBulan = 12
insert into HAkun( AkunID, ThnBuku, MataUangID, Real12, updatedBy)
select JUD.AkunID, @vTahun, @vCur, isnull( @vReal, 0 ), JUD.UpdatedBy
from inserted JUD
INNER JOIN TJUHdr JUH ON JUD.JUHdrID = JUH.JUHdrID
where ( JUD.AkunID = @vAkunID ) and ( CAST( year( JUH.TglJurnal ) as char( 4 )) = @vTahun )
end
else -- Jalankan update perbulan
begin
if @vBulan = 1
update HAkun
set Real01 = isnull( Real01, 0 ) + isnull( @vReal, 0 ), updatedBy = @vupdatedBy
where ( AkunID = @vAkunID ) and ( ThnBuku = @vTahun ) and ( MataUangID = @vCur )
else if @vBulan = 2
update HAkun
set Real02 = isnull( Real02, 0 ) + isnull( @vReal, 0 ), updatedBy = @vupdatedBy
where ( AkunID = @vAkunID ) and ( ThnBuku = @vTahun ) and ( MataUangID = @vCur )
else if @vBulan = 3
update HAkun
set Real03 = isnull( Real03, 0 ) + isnull( @vReal, 0 ), updatedBy = @vupdatedBy
where ( AkunID = @vAkunID ) and ( ThnBuku = @vTahun ) and ( MataUangID = @vCur )
else if @vBulan = 4
update HAkun
set Real04 = isnull( Real04, 0 ) + isnull( @vReal, 0 ), updatedBy = @vupdatedBy
where ( AkunID = @vAkunID ) and ( ThnBuku = @vTahun ) and ( MataUangID = @vCur )
else if @vBulan = 5
update HAkun
set Real05 = isnull( Real05, 0 ) + isnull( @vReal, 0 ), updatedBy = @vupdatedBy
where ( AkunID = @vAkunID ) and ( ThnBuku = @vTahun ) and ( MataUangID = @vCur )
else if @vBulan = 6
update HAkun
set Real06 = isnull( Real06, 0 ) + isnull( @vReal, 0 ), updatedBy = @vupdatedBy
where ( AkunID = @vAkunID ) and ( ThnBuku = @vTahun ) and ( MataUangID = @vCur )
else if @vBulan = 7
update HAkun
set Real07 = isnull( Real07, 0 ) + isnull( @vReal, 0 ), updatedBy = @vupdatedBy
where ( AkunID = @vAkunID ) and ( ThnBuku = @vTahun ) and ( MataUangID = @vCur )
else if @vBulan = 8
update HAkun
set Real08 = isnull( Real08, 0 ) + isnull( @vReal, 0 ), updatedBy = @vupdatedBy
where ( AkunID = @vAkunID ) and ( ThnBuku = @vTahun ) and ( MataUangID = @vCur )
else if @vBulan = 9
update HAkun
set Real09 = isnull( Real09, 0 ) + isnull( @vReal, 0 ), updatedBy = @vupdatedBy
where ( AkunID = @vAkunID ) and ( ThnBuku = @vTahun ) and ( MataUangID = @vCur )
else if @vBulan = 10
update HAkun
set Real10 = isnull( Real10, 0 ) + isnull( @vReal, 0 ), updatedBy = @vupdatedBy
where ( AkunID = @vAkunID ) and ( ThnBuku = @vTahun ) and ( MataUangID = @vCur )
else if @vBulan = 11
update HAkun
set Real11 = isnull( Real11, 0 ) + isnull( @vReal, 0 ), updatedBy = @vupdatedBy
where ( AkunID = @vAkunID ) and ( ThnBuku = @vTahun ) and ( MataUangID = @vCur )
else if @vBulan = 12
update HAkun
set Real12 = isnull( Real12, 0 ) + isnull( @vReal, 0 ), updatedBy = @vupdatedBy
where ( AkunID = @vAkunID ) and ( ThnBuku = @vTahun ) and ( MataUangID = @vCur )
end
  • untuk contoh kasus diatas, maka isi dari tabel tersebut adalah sbb :
JUDtlID, JUHdrID, AkunID, NoVoucher, Transaksi, Debet, Kredit, dtCreated, dtModified, UpdatedBy
1, 1, 1, SA, Saldo Awal, 2500000, 0, [automatic], [automatic], ‘PRGMR’
2, 1, 21, SA, Saldo Awal, 0, 2500000, [automatic], [automatic], ‘PRGMR’
3, 2, 2, SB, Starting Balance, 125, 0, [automatic], [automatic], ‘PRGMR’
4, 2, 22, SB, Starting Balance, 0, 125, [automatic], [automatic], ‘PRGMR’
5, 3, 17, Faktur 0001, Penerimaan Barang A, 1000000, 0, [automatic], [automatic], ‘PRGMR’
6, 3, 29, Faktur 0001, Penerimaan Barang A, 0, 1000000, [automatic], [automatic], ‘PRGMR’
7, 4, 18, Invoice 0001, Receiving article B, 100, 0, [automatic], [automatic], ‘PRGMR’
8, 4, 30, Invoice 0001, Receiving article B, 0, 100, [automatic], [automatic], ‘PRGMR’
9, 5, 29, Kwitansi 1111, Pembayaran Faktur 0001, 1000000, 0, [automatic], [automatic], ‘PRGMR’
10, 5, 1, Kwitansi 1111, Pembayaran Faktur 0001, 0, 1000000, [automatic], [automatic], ‘PRGMR’
11, 6, 30, Check 2222, Pay Invoice 0001, 100, 0, [automatic], [automatic], ‘PRGMR’
12, 6, 2, Check 2222, Pay Invoice 0001, 0, 100, [automatic], [automatic], ‘PRGMR’

Nah, dari penjelasan pada bagian sebelumnya dan diatas, anda sudah dapat membuat desain database untuk program akuntansi.

Thursday, June 21, 2007

Gradient Form In VB

Mungkin anda pernah lihat ada form yang warna backgroundnya berwarna dengan tipe gradient. Jika program tersebut dibuat melalui VB, maka hanya ada 2 (dua) cara untuk membuat hal tersebut, yaitu :

  1. Buat gambar gradient melalui software Adobe Photoshop, Macromedia Fireworks, dll. kemudian taruh gambar tersebut sebagai background picture dari form.
  2. Ketikkan kode ini di form :
Private Sub Form_Paint()
ON ERROR RESUME NEXT
ScaleMode = vbPixels
DrawStyle = 5
DrawWidth = 1
For I = 0 To ScaleHeight Step ScaleHeight \ 64

Line (-1, I - 1)-(ScaleWidth, I + ScaleHeight \ 64),
RGB(0, 255 - I * 255 \ ScaleHeight, 200), BF

DoEvents
Next I
End Sub

Sudah dicoba code diatas ? Nah sekarang anda tahu kan gradient itu sebenarnya terbuat dari apa. Tipuan mata saja kok, sebenarnya gradient itu hanya terdiri dari garis - garis yang dibuat dengan warna yang berlainan untuk.

Anda bisa lihat penggunaan sintax "Line" di MSDN, untuk pemilihan warna terletak pada code berikut :

RGB(0, 255 - I * 255 \ ScaleHeight, 200)

Perintah diatas menentukan pilihan warna pada garis yang akan digambar. Karena perintah Line terdapat di dalam looping For, maka warnanya juga berubah seiring dengan lokasi penggambaran garis.

Tuesday, June 19, 2007

Set Tanggal Update secara Otomatis

Kebiasaan aku nih, kalo bikin tabel selalu menambahkan field "dtModified" yang bertipe datetime. Untuk mengisi tanggal update dari suatu record, kita bisa menambahkan trigger sbb :

CREATE TRIGGER [dbo].[trg_MAkun_dtModified] ON [dbo].[MAkun]
FOR UPDATE
AS

if not update( dtModified )
update MAkun
set dtModified = getdate()
from MAkun R, Inserted I
where R.AkunID = I.AkunID

Keterangan : pada contoh diatas, nama tabelnya MAkun, dengan demikian jika ada perubahan nilai pada field apapun ( kecuali field "dtModified") tanpa harus mengisikan nilainya dari program.

Kenapa kok tidak semua field ???

Karena kalau tidak kita filter

if not update( dtModified )

Maka trigger ini akan dijalankan terus menerus oleh SQL Server. Selain itu filter ini juga berguna jika kita ingin merubah field "dtModified"-nya. Trust me, kadang-2 hal itu perlu juga ... :)

ACCOUNTING PROGRAMMING Bag. 1 : MASTER

Accounting, kalo di-Bahasa Indonesia-kan artinya “meng-akun-kan” ( berdasarkan kamus boso Inggris Jowo by Dhani …:) ) sebenarnya adalah proses pemilahan pos-pos penampungan nilai ( yang biasanya dinilai dengan uang ) dari suatu badan usaha. Selanjutnya akan saya sebut akuntansi.

Disini saya akan menjelaskan bagaimana desain database untuk pembuatan master data bagi database untuk accounting. Anda dapat menggunakan database engine apapun, namun penjelasan saya dibawah ini memakai bahasa2 dalam Microsoft SQL Server 2000.

Hubungannya dengan programming dapat dihubungkan sebagai berikut :

  • Karena dalam akuntansi ( di dunia pada umumnya dan terutama di Indonesia ) dikenal 5 grup akun yaitu AKTIVA ( Asset ), KEWAJIBAN ( Liability ), MODAL ( Equity ), PENDAPATAN ( Revenue ), dan BIAYA ( Expense ). Maka anda harus membuat 1 ( satu ) table yang menyimpan data2 tersebut, anjuran desain table :
Nama Tabel : MGrupAkun

Field, Tipe Data, Not Null, Primary Key, Identity, Default Value, Description
GrupAkunID, int, Yes, Yes, Yes, [EMPTY], Menyimpan ID Grup Akun
GrupAkun, varchar( 25 ), Yes, No, No, [EMPTY], Menyimpan Nama Grup Akun dalam Bahasa Indonesia
GrupAkunEng, varchar( 25 ), Yes, No, No, [EMPTY] , Menyimpan Nama Grup Akun dalam Bahasa Inggris
dtCreated, datetime, Yes, No, No, getdate(), tanggal dibuat
dtModified, datetime, Yes, No, No, getdate(), tanggal dimodifikasi
UpdatedBy, varchar( 25 ), Yes, No, No, ‘PRGMR’, User yang menambahkan / mengganti data

Catatan : Sekiranya setelah table ini dibuat, segera isikan ke-lima grup akun yang sudah dibahas diatas. Karena kelima grup tersebut sebenarnya tidak akan pernah bisa ditambah atau diganti ( kecuali kalo memang akan ditemukan satu Grup Akun lagi yang diakui oleh orang2 accounting di seluruh dunia. Jadi isinya kurang lebih ( atau pasti ) sbb :

GrupAkunID, GrupAkun, GrupAkunEng, dtCreated, dtModified, UpdatedBy
1, Aktiva, Asset, [automatic], [automatic], ‘PRGMR’
2, Kewajiban, Liability, [automatic], [automatic], ‘PRGMR’
3, Modal, Equity, [automatic], [automatic], ‘PRGMR’
4, Pendapatan, Revenue, [automatic], [automatic], ‘PRGMR’
5, Biaya, Expense, [automatic], [automatic], ‘PRGMR’

  • Setelah kita membuat table untuk Master Grup Akun, untuk mempermudah pelaporan di akuntansi, saya sarankan anda membuat 1 ( satu ) table yang menyimpan data – data JENIS AKUN. Tabel ini sebenarnya bersifat sunnah ( tidak wajib ), namun akan sangat membantu kita dalam pelaporan akuntansi. Anjuran desain table :
Nama Tabel : MJenisAkun

Field, Tipe Data, Not Null, Primary Key, Identity, Default Value, Description
JenisAkunID, int, Yes, Yes, Yes, [EMPTY], Menyimpan ID Jenis Akun
GrupAkunID, int, Yes, No, No, [EMPTY], Menyimpan nilai Grup Akun dari Jenis Akun tersebut
KodeJenisAkun, varchar( 5 ), Yes, No, No, [EMPTY], Menyimpan kode Jenis Akun
JenisAkun, varchar( 50 ), Yes, No, No, [EMPTY], Menyimpan Nama Jenis Akun dalam Bahasa Indonesia
JenisAkunEng, varchar( 50 ), Yes, No, No, [EMPTY] , Menyimpan Nama Jenis Akun dalam Bahasa Inggris
dtCreated, datetime, Yes, No, No, getdate(), tanggal dibuat
dtModified, datetime, Yes, No, No, getdate(), tanggal dimodifikasi
UpdatedBy, varchar( 25 ), Yes, No, No, ‘PRGMR’, User yang menambahkan / mengganti data

Catatan : Jenis akun sangat bervariasi tergantung bagaimana perusahaan tersebut ingin mengelompokkan akun-akunnya. Berikut ini contoh Jenis Akun di dalam database yang dipakai untuk perusahaan retail / restoran / hotel :

JenisAkunID, GrupAkunID, KodeJenisAkun, JenisAkun, JenisAkunEng, dtCreated, dtModified, UpdatedBy
1, 1, 101, Kas, Cash, [automatic], [automatic], ‘PRGMR’
2, 1, 102, Bank, Bank, [automatic], [automatic], ‘PRGMR’
3, 1, 103, Aktiva Tetap, Fixed Asset, [automatic], [automatic], ‘PRGMR’
4, 1, 104, Aktiva Lain-Lain, Other Asset, [automatic], [automatic], ‘PRGMR’
5, 1, 105, Aktiva Lancar lain-lain, Other Current Asset, [automatic], [automatic], ‘PRGMR’
6, 1, 106, Akumulasi Penyusutan, Accumulated Depreciation, [automatic], [automatic], ‘PRGMR’
7, 1, 107, Piutang Giro, Note Receivables, [automatic], [automatic], ‘PRGMR’
8, 1, 108, Piutang Usaha, Account Receivables, [automatic], [automatic], ‘PRGMR’
9, 1, 109, Piutang Lain - Lain, Other Receivables, [automatic], [automatic], ‘PRGMR’
10, 1, 110, Persediaan Barang, Inventories, [automatic], [automatic], ‘PRGMR’
11, 2, 201, Hutang Jangka Pendek, Short - Term Loan, [automatic], [automatic], ‘PRGMR’
12, 2, 202, Hutang Pajak, Tax Payables, [automatic], [automatic], ‘PRGMR’
13, 2, 203, Hutang Usaha, Account Payables, [automatic], [automatic], ‘PRGMR’
14, 2, 204, Hutang Lain - Lain, Other Payables, [automatic], [automatic], ‘PRGMR’
15, 3, 301, Modal Dasar, Capital Stock, [automatic], [automatic], ‘PRGMR’
16, 3, 302, Laba Ditahan, Retained Earning, [automatic], [automatic], ‘PRGMR’
17, 3, 303, Laba Rugi Tahun Berjalan, Profit ( Loss) Current Year, [automatic], [automatic], ‘PRGMR’
18, 4, 401, Penjualan Tunai, Cash Sales, [automatic], [automatic], ‘PRGMR’
19, 4, 402, Penjualan Kredit, Credit Sales, [automatic], [automatic], ‘PRGMR’
20, 4, 403, Pendapatan Lain - Lain, Other Revenue, [automatic], [automatic], ‘PRGMR’
21, 5, 501, Harga Pokok Penjualan, Cost Of Goods Sold, [automatic], [automatic], ‘PRGMR’
22, 5, 502, Biaya Retur Pembelian, Purchasing Return, [automatic], [automatic], ‘PRGMR’
23, 5, 503, Biaya Penjualan, Sales Expenses, [automatic], [automatic], ‘PRGMR’
24, 5, 504, Biaya Umum dan Administrasi, General & Administrative Expenses, [automatic], [automatic], ‘PRGMR’
25, 5, 505, Biaya Lain - Lain, Other Expenses, [automatic], [automatic], ‘PRGMR’

  • Jika kita akan membuat program multi currency, maka sebaiknya kita membuat satu table untuk menyimpan data mata – uang apa saja yang dipakai, anjuran desain table :
Nama Tabel : MMataUang

Field, Tipe Data, Not Null, Primary Key, Identity, Default Value, Description
MataUangID, int, Yes, Yes, Yes, [EMPTY], Menyimpan ID MataUang
InisialMU, varchar(5), Yes, Yes, Yes, [EMPTY], Menyimpan inisial matauang
NamaMU, varchar(25), Yes, Yes, Yes, [EMPTY], Menyimpan Nama matauang
dtCreated, datetime, Yes, No, No, getdate(), tanggal dibuat
dtModified, datetime, Yes, No, No, getdate(), tanggal dimodifikasi
UpdatedBy, varchar( 25 ), Yes, No, No, ‘PRGMR’, User yang menambahkan / mengganti data

Contoh data mata uang :

MataUangID, InisialMU, NamaMU, dtCreated, dtModified, UpdatedBy
1, IDR, Indonesian Rupiah, [automatic], [automatic], ‘PRGMR’
2, USD, American Dollar, [automatic], [automatic], ‘PRGMR’
3, SGD, Singapore Dollar, [automatic], [automatic], ‘PRGMR’
4, EUR, Euro, [automatic], [automatic], ‘PRGMR’
5, JPY, Japan Yen, [automatic], [automatic], ‘PRGMR’

  • Di dalam accounting ada yang namanya Laporan Laba Rugi, nah di dalam laporan itu dikelompokkan menjadi beberapa bagian, sebaiknya anda juga membuat table untuk menyimpan keoompok2 Laba / Rugi tersebut. Anjuran desain table :
Nama Tabel : CGrupLR

Field, Tipe Data, Not Null, Primary Key, Identity, Default Value, Description
GrupLRID, int, Yes, Yes, Yes, [EMPTY], Menyimpan ID Grup Laba Rugi
GrupLR, varchar(50), Yes, Yes, Yes, [EMPTY], Menyimpan Nama Grup Laba / Rugi dalam Bahasa Indonesia
GrupLREng, varchar(50), Yes, Yes, Yes, [EMPTY], Menyimpan Nama Grup Laba / Rugi dalam Bahasa Inggris
dtCreated, datetime, Yes, No, No, getdate(), tanggal dibuat
dtModified, datetime, Yes, No, No, getdate(), tanggal dimodifikasi
UpdatedBy, varchar( 25 ), Yes, No, No, ‘PRGMR’, User yang menambahkan / mengganti data

Catatan : sepengetahuan saya, hanya ada 7 ( tujuh ) kelompok Laba / Rugi, di dalam database bisa anda isi sbb :

GrupLRID, GrupLR, GrupLREng, dtCreated, dtModified, UpdatedBy
1, Biaya Administrasi & Umum, General & Administrative Expenses, [automatic], [automatic], ‘PRGMR’
2, Biaya Lain – Lain, Non – Operating Expenses, [automatic], [automatic], ‘PRGMR’
3, Biaya Penjualan, Selling Expenses, [automatic], [automatic], ‘PRGMR’
4, Harga Pokok, Cost Of Goods Sold, [automatic], [automatic], ‘PRGMR’
5, Pajak Penghasilan, Tax Expense (Income), [automatic], [automatic], ‘PRGMR’
6, Pendapatan Lain – Lain, Non- Operating Income, [automatic], [automatic], ‘PRGMR’
7, Penjualan, Sales, [automatic], [automatic], ‘PRGMR’

  • Sekarang kita masuk ke bagian yang paling “mengasyikkan” di desain database master akuntansi, yaitu pembuatan akun – akun untuk transaksi yang terjadi di dalam suatu badan usaha. Anjuran desain table :
Nama Tabel : MAkun

Field, Tipe Data, Not Null, Primary Key, Identity, Default Value, Description
AkunID, int, Yes, Yes, Yes, [EMPTY], Menyimpan ID Akun
JenisAkunID, int, Yes, No, No, [EMPTY], Menyimpan nilai Jenis Akun dari Akun tersebut
KodeAkun, varchar( 10 ), Yes, No, No, [EMPTY], Menyimpan Kode Akun
NamaAkun, varchar( 50 ), Yes, No, No, [EMPTY], Menyimpan Nama Akun dalam Bahasa Indonesia
NamaAkunEng, varchar( 25 ), Yes, No, No, [EMPTY] , Menyimpan Nama Akun dalam Bahasa Inggris
MataUangID, int, Yes, No, No, [EMPTY], Menyimpan mata uang dari akun tersebut
GrupLRID, int, No, No, No, [EMPTY], Menyimpan grup Laba / Rugi dari akun
SaldoNormal, varchar( 1 ), Yes, No, No, [EMPTY], Menyimpan sifat akun ( hubungannya dengan debet / kredit )
StsAktif, bit, Yes, No, No, 1, Menyimpan status akun tersebut aktif / tidak ( 1 = aktif, 0 = tidak aktif )
dtCreated, datetime, Yes, No, No, getdate(), tanggal dibuat
dtModified, datetime, Yes, No, No, getdate(), tanggal dimodifikasi
UpdatedBy, varchar( 25 ), Yes, No, No, ‘PRGMR’, User yang menambahkan / mengganti data

Catatan : seperti yang saja uraikan diatas bahwa jenis akun dapat bervariasi antar satu perusahaan dengan yang lain, kalau akun malah lebih bervariasi lagi, berdasarkan pengalaman saya, ada 1 perusahaan yang mempunyai akun sebanyak 1500 akun, tapi ada juga yang hanya 100 – 200 akun. Berikut ini saya sertakan contoh akun, saya batasi hanya untuk 2 mata uang saja :

AkunID, JenisAkunID, KodeAkun, NamaAkun, NamaAkunEng, MataUangID, GrupLRID, SaldoNormal, StsAktif, dtCreated, dtModified, UpdatedBy
1, 1, 101001, Kas IDR, Cash IDR, 1, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
2, 1, 101002, Kas USD, Cash USD, 2, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
3, 2, 102003, Bank Mandiri IDR, Bank Mandiri IDR, 1, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
4, 2, 102004, Bank Mandiri USD, Bank Mandiri USD, 2, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
5, 7, 107005, Piutang Giro IDR, Note Receivables IDR, 1, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
6, 7, 107006, Piutang Giro USD, Note Receivables USD, 2, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
7, 8, 108007, Piutang Usaha IDR, Account Receivables IDR, 1, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
8, 8, 108008, Piutang Usaha USD, Account Receivables USD, 2, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
9, 8, 108009, Piutang Usaha IDR, Account Receivables IDR, 1, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
10, 8, 108010, Piutang Usaha USD, Account Receivables USD, 2, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
11, 8, 108011, Piutang Kartu Kredit IDR, Credit Card Receivables IDR, 1, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
12, 8, 108012, Piutang Kartu Kredit USD, Credit Card Receivables USD, 2, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
13, 9, 109013, Piutang Klaim IDR, Claim Receivables IDR, 1, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
14, 9, 109014, Piutang Klaim USD, Claim Receivables USD, 2, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
15, 9, 109015, Piutang Staff IDR, Staff Receivables IDR, 1, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
16, 9, 109016, Piutang Staff USD, Staff Receivables USD, 2, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
17, 10, 110017, Persediaan Barang Stock IDR, Stocked Inventories IDR, 1, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
18, 10, 110018, Persediaan Barang Stock USD, Stocked Inventories USD, 2, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
19, 10, 110019, Persediaan Barang UnStock IDR, UnStocked Inventories IDR, 1, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
20, 10, 110020, Persediaan Barang UnStock USD, UnStocked Inventories USD, 2, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
21, 16, 116021, Laba Ditahan IDR, Retained Earning IDR, 1, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
22, 16, 116022, Laba Ditahan USD, Retained Earning USD, 2, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
23, 17, 117023, Laba Rugi Tahun Berjalan IDR, Profit ( Loss) Current Year IDR, 1, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
24, 17, 117024, Laba Rugi Tahun Berjalan USD, Profit ( Loss) Current Year USD, 2, NULL, +, 1, [automatic], [automatic], ‘PRGMR’
25, 18, 118025, Penjualan Tunai IDR, Cash Sales IDR, 1, 7, -, 1, [automatic], [automatic], ‘PRGMR’
26, 18, 118026, Penjualan Tunai USD, Cash Sales USD, 2, 7, -, 1, [automatic], [automatic], ‘PRGMR’
27, 19, 119027, Penjualan Kredit IDR, Credit Sales IDR, 1, 7, -, 1, [automatic], [automatic], ‘PRGMR’
28, 19, 119028, Penjualan Kredit USD, Credit Sales USD, 2, 7, -, 1, [automatic], [automatic], ‘PRGMR’
29, 21, 121029, Pembelian IDR, Purchasing IDR, 1, 4, +, 1, [automatic], [automatic], ‘PRGMR’
30, 21, 121030, Pembelian USD, Purchasing USD, 2, 4, +, 1, [automatic], [automatic], ‘PRGMR’
31, 21, 121031, Harga Pokok Penjualan IDR, Cost Of Goods Sold IDR, 1, 4, +, 1, [automatic], [automatic], ‘PRGMR’
32, 21, 121032, Harga Pokok Penjualan USD, Cost Of Goods Sold USD, 2, 4, +, 1, [automatic], [automatic], ‘PRGMR’
33, 25, 125033, Selisih Kas IDR, Cash Difference IDR, 1, 2, +, 1, [automatic], [automatic], ‘PRGMR’
34, 25, 125034, Selisih Kas USD, Cash Difference USD, 2, 2, +, 1, [automatic], [automatic], ‘PRGMR’
35, 24, 124035, Biaya Gaji IDR, Salary Expenses IDR, 1, 1, +, 1, [automatic], [automatic], ‘PRGMR’
36, 24, 124036, Biaya Gaji USD, Salary Expenses USD, 2, 1, +, 1, [automatic], [automatic], ‘PRGMR’
37, 24, 124037, Biaya Lembur IDR, Overtime Expenses IDR, 1, 1, +, 1, [automatic], [automatic], ‘PRGMR’
38, 24, 124038, Biaya Lembur USD, Overtime Expenses USD, 2, 1, +, 1, [automatic], [automatic], ‘PRGMR’
39, 24, 124039, Biaya Kasir IDR, Cashier Expenses IDR, 1, 2, +, 1, [automatic], [automatic], ‘PRGMR’
40, 24, 124040, Biaya Kasir USD, Cashier Expenses USD, 2, 2, +, 1, [automatic], [automatic], ‘PRGMR’
41, 25, 125041, Biaya Barang Hilang IDR, Cost Of Goods Lost IDR, 1, 2, +, 1, [automatic], [automatic], ‘PRGMR’
42, 25, 125042, Biaya Barang Hilang USD, Cost Of Goods Lost USD, 2, 2, +, 1, [automatic], [automatic], ‘PRGMR’