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..

Selasa, 16 November 2010

Insert and display the icon into the Delphi Grid

Lagi nggak bisa tidur, padahal nanti pagi - pagi mau sholat Idul Adha rencananya, hemmmm enaknya ngapain ya...., dari pada bengong coba melongok ke blog saya ini rasanya sudah lama sekali tidak mengisi blog ini.

Ah... mending bikin artikel ini siapa tahu suatu saat ada teman - teman yang membutuhkan sebagai referensi heheheehhe walaupun tidak seberapa bagus tapi cukuplah untuk bahan oprekan bagi teman-teman yang membutuhkan, sesuai dengan judul diatas sebelumnya penulis pernah mengalami kesulitan dalam menampilkan icon kedalam grid yang kebetulan penulis menggunakan database mysql, dari beberapa kali experimen (caile... kayak prof aja padahal kebetulan aja bisa) akhirnya penulis dapat menyelesaikan masalah tersebut seperti tampilan berikut :

kita langsung aja ya,
yang kita butuhkan tentunya VCL yang mendukung koneksi kedatabase, dalam hal ini penulis menggunakan komponennya Zeos yang bisa didownload dibeberapa situs internet, kemudian setelah koneksikan database melalui komponen zeos, tambahkan komponen ZQuery untuk memfilter data yang akan kita butuhkan untuk ditampilkan kedalam grid.
selanjutnya tambahkan komponen ImageList, komponen Image serta komponen DataGrid.
sebelumnya silahkan buat folder untuk menempatkan file-file icon yang akan kita load nantinya dan disini penulis untuk memudahkan link ke field yang akan ditampilkan digunakan kode yang bersifat primary sebagai contoh tabel berikut :
Nama Tabel tbKurs
Field : kdNgr char(3) Primari key
Rupiah numeric(18,2)
Dolar numeric(18,2)

nah untuk kebutuhan linknya nama file icon penulis samakan dengan nama isi dari field KdNgr.
selanjutnya kita buat procedure untuk mengenali dan menempatkan icon kedalam colom di grid

procedure TForm5.cekbendera;
var nm:string;
begin
       with qKurs do
       begin
           first;
               while not Eof do
                   begin    
                           nm:=trim(Fields[0].Value);
                           Try
                                   image1.Picture.LoadFromFile('D:\delphi\Delphi\Kurs Mandiri\bendera\ICON\'+nm+'.ICO');
                                     ImageList1.AddIcon(Image1.Picture.icon);
                           except
                     End;
                     next;
               end;
         end;
end;


selanjutnya letakkan even DrawColumnCell kedalam Grid dengan kode berikut:
procedure TForm5.Grid1DrawColumnCell(Sender: TObject; const Rect: TRect;
begin
            s:=0;
            with BGrid1 do
            begin
                  if DataCol=0 then
                  begin
                        ImageList1.Draw(Canvas,rect.Left+30, Rect.Top+1,qKurs.Fields[3].value);
                  end;
            end;

end;


Jadi deh... tinggal selanjutnya tinggal kita tentukan kapan nih procedure kita panggil;
bisa pula pada saat even form on Create dengan mengetikkan perintah berikut:

Procedure Form5.FormCreate(Sender: TObject);
begin
      ZQuery.active:=true;
      cekbendera;
end;