Sesuai dengan judulnya diatas, penulis ingin berbagi sedikit pengetahuan dalam pembuatann Cursor yang banyak dipergunakan untuk mempermudah pemrosesan data dalam SQL Server database.
Sebagaimana layaknya bahasa pemrograman seperti C#, Delphi, Visual Basic atau lainnya tentunya tidak lepas dari proses perulangan, entah itu dengan menggunakan for, while atau apalah yang tujuan utamanya adalah untuk melakukan suatu proses perulangan dalam aplikasi yang kita buat.
tidak terlepas pula dengan Sql Server juga memiliki fasilitas ini yang salah satunya bisa pula diterapkan dalam storeprocedure yang biasa penulis lakukan tentunya hehehe.
untuk contoh sederhana mungkin akan penulis buatkan contoh sebagai berikut:
kita memiliki 2 buah tabel yaitu tabel master dan tabel detail, yang didalam tabel detail memiliki file perhitungan yang jumlah perhitungan dalam masing-masing recordnya akan diakumulasikan dan diupdate kedalam tabel master .
Sebelumnya kita coba untuk membuat 2 buah tabel sederhana berikut:
CREATE TABLE [dbo].[tbmaster](
[NOBUKTI] [char](20) NOT NULL,
[JUMLAH] [numeric](18, 2) NULL DEFAULT (0))
CONSTRAINT [PK_tbmaster] PRIMARY KEY CLUSTERED
([NOBUKTI] ASC)ON [PRIMARY])
CREATE TABLE [dbo].[tbdetail](
[ID] [numeric](18, 0) IDENTITY(1,1) NOT NULL, [kdbarang] [char](20) NOT DEFAULT(''),
[QTY] [uang] [numeric](18, 2) NULL DEFAULT (0),
[HARGA] [uang] [numeric](18, 2) NULL DEFAULT (0))
CONSTRAINT [PK_tbdetail] PRIMARY KEY CLUSTERED
([ID] ASC)ON [PRIMARY])
Untuk mempermudah pemrosesan data silahkan isikan terlebih dahulu data-data untuk kedua buah tabel tersebut sebanyak-banyaknya, akan tetapi saya anjurkan agar membuat data-data didalam 2 buah tabel ini saling berhubungan dengan dihubungkan dari NoBukti.
Selanjutnya sesuai dengan topik bahasan diatas yaitu cursor, penulis ingin mencoba memberikan contoh sederhana , mengikuti tabel diatas penulis menginginkan bahwa field jumlah di tabel tbMaster akan terupdate dari nilai perkalian dari field Qty dan field Harga yang ada ditabel tbdetail. untuk itu kita coba membuat store procedure sederhana berikut :
create procedure [dbo].[spUpdateJumlah]
as
begin tran
declare @nobuk varchar(20),@J numeric(18,0)
declare CurHitung cursor for select nobukti from tbmaster order
by nobukti
open CurHitung
fetch next from CurHitung into @nobuk
while @@fetch_status = 0
begin
select @J = sum(qty*harga) from tbdetai where
nobukti=@nobuk
update tbmaster set jumlah=isNull(@J,0)
where nobukti=@nobuk
fetch next from CurHitung into @nobuk
end
close CurHitung
Deallocate CurHitung
if @@error<>0 goto salah
commit tran
return
Salah:
rollback tran
raiserror('Ada Kesalahan ',16,1)
return
Untuk menjalankannya kita cukup ketikkan spUpdateJumlah dan silahkan dieksekusi
dan untuk melihat hasil dr proses store procedure ini kita cukup ketikkan:
select * from tbmaster order by nobukti
Namun penulis anjurkan apabila tidak sangat diperlukan hasil perhitungan disimpan sebaiknya kita tidak menambahkan field didalam tabel karena akan membuat kinerja database kita menjadi tidak efektif, bandingkan apabila kita hanya memerlukan nilai jumlah hanya untuk ditampilkan saja dan bukan untuk proses lebih lanjut maka kita tidak memerlukan media simpan/field tambahan seperti diatas, coba kita bandingkan dengan hasil berikut (dalam kasus bahwa data penjumlahan hanya untuk ditampilkan):
select a.nobukti,sum(b.qty * b.harga) as jumlah from tbmaster a, tbdetail b where a.nobukti=b.nobukti group by nobukti
hasilnya sama bukan?, kiranya ini yang dapat penulis contohkan melalui contoh sederhana ini untuk penggunaan "Cursor", dan penulis mohon maaf apabila tulisan ini masih jauh dari sempurna,
Salam..
Tidak ada komentar:
Posting Komentar