Friday, February 22, 2008

Mengakses Query dengan Stored Procedure Microsoft SQL Server dari Borland Delphi


Kenapa menggunakan Stored procedure untuk mengakses query?Jawabannya adalah : Lebih fleksibel jika ada perubahan-perubahan pada kombinasi SQL, memiliki waktu proses lebih cepat dibanding jika kita menggunakan AdoQuery karena Stored Procedure dijalankan pada sisi back end database bukan di frond endnya aplikasi yang kita buat. Waktu Proses yang lama ini akan terasa jika SQL yang jalankan lumayan rumit dan data lumayan banyak.

Disini akan diberikan contoh sederhana bagaimana mengakses Query melalui stored procedure Microsoft SQL Server dari borland delphi. Langkah pertama akan dibuat suatu stored procedure bernama stp_area. Memasukkan Code stored procedure ini dapat dilakukan melalui Enterprise Manager atau dieksekusi melalui query analyzer. Stored procedure ini berfungsi menambahkan data ke tabel
dbArea. Tabel dbarea Area sendiri mempunyai 4 field yaitu : KodeArea yang bertipe Varchar(5), NamaArea yang bertipe
Varchar(50), @Nonaktif yang bertipe bit, dan @UserID yang bertipe varchar(20)

------------------------------------------------------------------------------------

CREATE PROCEDURE [dbo].[stp_Area]
@KodeArea Varchar(5),
@NamaArea Varchar(50),
@Nonaktif bit,
@UserID varchar(20)

AS


begin tran

SET NOCOUNT ON


insert into dbArea (KodeArea, NamaArea,nonaktif, UserID, DateCreated, DateModified)
values (@KodeArea, @NamaArea, @nonaktif, @UserID, GetDate(), null)

if @@error <> 0 goto Gagal


SET NOCOUNT OFF


commit tran
return

Gagal:
rollback tran
raiserror('Proses Input Data Gagal',16,1)
return


GO

------------------------------------------------------------------------------------

Selanjutnya disisi borland delphinya, dibuat project baru dan ambil component ADOStoredProc set property 'connectionstring' nya sesuai dengan database yang digunakan dan Property 'procedurename' diisi dengan nama stored procedure yang telah dibuat yaitu stp_Area. dan 2 buah Tedit untuk mengisi 'kode area' yang dinamai kodearea dan untuk mengisi 'nama area' dinamai namaarea dan satu buah TCheckbox untuk mengisi status 'Non Aktif' ang dinamai NonAktif dan sebuah TButton yang berisi kode dibawah ini :

procedure TForm1.Button1Click(Sender: TObject);
var
mymessage : array [0..255] of char;
begin
With ADOStoredProc1 do
begin
Parameters[1].Value := kodearea.Text;
Parameters[2].Value := NamaArea.Text;
Parameters[3].Value := NonAktif.Checked;
Parameters[4].Value := 'iis';
try
ExecProc;
except
on E: Exception do
begin
Application.MessageBox(StrPCopy(mymessage,E.Message),'Warning',MB_OK or MB_ICONWARNING);
end;
end;
end;

end;

Thursday, February 14, 2008

Ketika SET NOCOUNT diset ON dan ketika SET NOCOUNT diset OFF di Microsoft SQL Server

Ketika kita mengeksekusi perintah SQL 'Select', 'Insert','Update', dan 'Delete'
maka Microsoft SQL Server akan mengembalikan jumlah baris yang terpengaruh oleh perintah-perintah tersebut.

Contoh :


select * from TbPOdet


Hasil Eksekusi perintah select dari tabel 'TbPOdet' diatas :


NOBUKTI URUT KODEBRG QNT
-------------------- ----------- -------------------- ---------
000001/PO-AA/02/2008 1 A001090001 1.0000
000001/PO-AA/02/2008 2 A001090003 1.0000
000002/PO-AA/02/2008 1 A006300001 1.0000
000003/PO-AA/02/2008 1 A001090001 1.0000
000001/PO-AA/03/2008 1 A005290001 1.0000
000002/PO-AB/03/2008 1 A010010005 1.0000
000001/PO-AA/02/2009 1 A001090001 1.0000
000002/PO-AA/02/2009 1 A009340001 1.0000
000002/PO-AA/02/2009 2 A009310001 1.0000
000003/PO-AC/02/2009 1 A001090011 1.0000

(10 row(s) affected)


Pada akhir Eksekusi perintah diatas ditampilkan jumlah baris yang terpengaruh oleh sql tersebut yaitu '10 row(s) affected'
kalo perintah ini di eksekusi di query analyzer memang tidak mempunyai dampak yang tidak baik, Namun Stored Procedure
yang berisi seperti perintah diatas apabila diakses dari sebuah aplikasi seperti PowerBuilder maka aplikasi akan tertutup.
Masalah diatas dapat dengan perintah SET NOCOUNT di set ON. dengan menggunakan perintah ini maka Microsoft SQL Server tidak
akan menghasilkan '(10 row(s) affected)' pada akhir eksekusi query tapi hanya mengembalikan baris datanya saja.

Contoh :

SET NOCOUNT ON

select * from TbPOdet

SET NOCOUNT OFF

Hasil Eksekusi perintah select dari tabel 'TbPOdet' diatas :


NOBUKTI URUT KODEBRG QNT
-------------------- ----------- -------------------- ---------
000001/PO-AA/02/2008 1 A001090001 1.0000
000001/PO-AA/02/2008 2 A001090003 1.0000
000002/PO-AA/02/2008 1 A006300001 1.0000
000003/PO-AA/02/2008 1 A001090001 1.0000
000001/PO-AA/03/2008 1 A005290001 1.0000
000002/PO-AB/03/2008 1 A010010005 1.0000
000001/PO-AA/02/2009 1 A001090001 1.0000
000002/PO-AA/02/2009 1 A009340001 1.0000
000002/PO-AA/02/2009 2 A009310001 1.0000
000003/PO-AC/02/2009 1 A001090011 1.0000


Meskipun SET NOCOUNT diset ON tidak mengembalikan jumlah baris yang terpengaruh tapi fungsi @@ROWCOUNT tetap diupdate.
Hal ini bisa dilihat dari contoh dibawah ini.

Contoh :

SET NOCOUNT ON

select * from TbPOdet
print @@Rowcount
print 'Adalah Jumlah Record Pada Eksekusi Terakhir'

SET NOCOUNT OFF

Hasil Eksekusi perintah select dari tabel 'TbPOdet' diatas :


NOBUKTI URUT KODEBRG QNT
-------------------- ----------- -------------------- ---------
000001/PO-AA/02/2008 1 A001090001 1.0000
000001/PO-AA/02/2008 2 A001090003 1.0000
000002/PO-AA/02/2008 1 A006300001 1.0000
000003/PO-AA/02/2008 1 A001090001 1.0000
000001/PO-AA/03/2008 1 A005290001 1.0000
000002/PO-AB/03/2008 1 A010010005 1.0000
000001/PO-AA/02/2009 1 A001090001 1.0000
000002/PO-AA/02/2009 1 A009340001 1.0000
000002/PO-AA/02/2009 2 A009310001 1.0000
000003/PO-AC/02/2009 1 A001090011 1.0000


10
Adalah Jumlah Record Pada Eksekusi Terakhir
Membuat Tabel dengan Nama Tabel sebagai Parameter Input di Microsoft SQL Server


Kadang kita memerlukan untuk membuat suatu tabel yang nama tabel sebagai suatu parameter inputnya.
Pembuatan tabel dinamis seperti ini bisa digunakan untuk menampung data yang dapat disesuaikan, misalnya data stock barang untuk
tahun 2001, Data stock barang untuk tahun 2002 dst. Dengan menggunakan cara ini diharapkan table stock barang tidak
memuat data yang terlalu banyak sehingga saat digunakan untuk transaksi tidak memerlukan proses yang terlalu lama karena
query kita hanya beroperasi di table sesuai tahun yang bersangkutan.
Disini qta akan membuat tabel sederhana dengan menggunakan Microsoft SQL Server yang memasukkan nama tabel sebagai
parameter input.


Declare @TableNm varchar(30), @Year varchar(4), @MyQuery varchar(8000)

Set @TableNm='TBBarang'
Set @Year='2001'

Set @MyQuery='Create Table ' + @TableNM +@Year
+'( '
+'[KodeBrg] [varchar] (20) NOT NULL , '
+'[NamaBrg] [varchar] (50) NOT NULL , '
+'[NonAktif] [bit] NOT NULL, '
+'[DateCreated] [datetime] NULL , '
+'[DateModified] [datetime] NULL , '
+'[UserID] [varchar](20) NOT NULL '
+' ) ON [PRIMARY] '

exec(@MyQuery)

Friday, February 01, 2008

test tulis2 di blog lama tp lupa ga pernah di ditulis