Sabtu, 20 November 2010

Cursor for SQL Server

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: