Problem : Terkadang banyak programer yang susah untuk memasukkan banyak baris kedalam stored procedure, hal ini dikarenakan kita harus mengimplementasikan banyak baris kedalam satu kontrol "begin transaction" dan 'Commit Transaction"
Skenario : Memasukkan banyak baris dalam basket penjualan kedalam stored procedure, proses yang kita inginkan dilakukan hanya sekali, bukan berulang2 berdasarkan banyak baris.
Anggap kita punya tabel penjualan dan tabel penjualan detail dengan field-field berikut :
declare @mERROR_NO int declare @mLOOP int, @mTOTAL_LOOP int declare @mALBUM_ID nchar(6), @mSD_QUANTITY int, @mtSD_PRICE nchar(10), @mSD_PRICE money
if @mPROCESS = ADD begin begin transaction Insert sale(sale_id, sale_date, cus_id, sale_status, sale_amount, sale_payment) values (@sale_id, @sale_date, @cus_id, OPEN, @sale_amount, @sale_payment) set @mERROR_NO = @@ERROR if @mERROR_NO <> 0 begin Rollback transaction set @mERROR_MESSAGE = > SP 1 < Error pada insert SALE return (1) End
satu baris mengalokasi 30 karakter (3 * 10) set @mLOOP = 0 set @mTOTAL_LOOP = ceiling(len(@mDETAIL_ITEM)/30)
while @mLOOP <= @mTOTAL_LOOP begin set @mALBUM_ID = substring(@mDETAIL_ITEM, @mLOOP * 30 + 1, 10) set @mSD_QUANTITY = substring(@mDETAIL_ITEM, @mLOOP * 30 + 11,10) set @mtSD_PRICE = substring(@mDETAIL_ITEM, @mLOOP * 30 + 21,10) set @mSD_PRICE = convert(money,@mtSD_PRICE) set @mLOOP = @mLOOP + 1 Insert sale_detail(sale_id, album_id, sd_quantity, sd_price) values (@sale_id, @mALBUM_ID, @mSD_QUANTITY, @mSD_PRICE)
set @mERROR_NO = @@ERROR if @mERROR_NO <> 0 begin Rollback transaction set @mERROR_MESSAGE = > SP 2 < Error pada insert SALE_DETAIL return (2) End
Update albumlist set album_stock_qty = album_stock_qty - @mSD_QUANTITY where album_ID = @mALBUM_ID set @mERROR_NO = @@ERROR if @mERROR_NO <> 0 begin Rollback transaction set @mERROR_MESSAGE = > SP 3 < Error pada update ALBUMLIST return (3) End End commit transaction return (0) End
Dari stored diatas kita bisa lihat teknik sederhana yang membuat banyak baris record menjadi satu baris record yang akan dikirim dari program ke stored procedure.
satu baris mengalokasi 30 karakter (3 * 10) set @mLOOP = 0 set @mTOTAL_LOOP = ceiling(len(@mDETAIL_ITEM)/30)
Dan dibaris berikutnya baris2 yg digabung tadi akan dipecah menjadi beberapa baris sesuai dengan data aslinya.
while @mLOOP <= @mTOTAL_LOOP begin set @mALBUM_ID = substring(@mDETAIL_ITEM, @mLOOP * 30 + 1, 10) set @mSD_QUANTITY = substring(@mDETAIL_ITEM, @mLOOP * 30 + 11,10) set @mtSD_PRICE = substring(@mDETAIL_ITEM, @mLOOP * 30 + 21,10) set @mSD_PRICE = convert(money,@mtSD_PRICE) set @mLOOP = @mLOOP + 1
Sekarang kita akan masuk ke core programingnya.. VBCODe Buat aplikasi dengan command_button_click event dan isi kode dibawah ini Dim mParameter As New ADODB.Parameter Dim mCOMM As New ADODB.Command Dim mERROR_NO As Integer Dim mITEM As String * 10 Dim mDETAIL_ITEM As String
mengubah format sale_date ke format date mtSALE_DATE = CDate(txt_sale_date.Text) Set mParameter = mCOMM.CreateParameter mParameter.Name = @sale_date mParameter.Type = adDate mParameter.Direction = adParamInput mParameter.Value = mtSALE_DATE mCOMM.Parameters.Append mParameter
mERROR_NO = mCOMM.Parameters(0).Value Select Case mERROR_NO Case 1 To 25 MsgBox Gagal TAMBAH record & vbCrLf & _ mCOMM(@mERROR_MESSAGE).Value Case 26 To 50 MsgBox Gagal GANTI record Case 51 To 75 MsgBox Gagal DELETE record & vbCrLf & _ mCOMM(@mERROR_MESSAGE).Value End Select
For mLOOP = 0 To mCOMM.Parameters.Count - 1 mCOMM.Parameters.Delete (0) Next Set mCOMM = Nothing Exit Sub
Error_process_SP: MsgBox Proses GAGAL & vbCrLf & Err.Description Set mCOMM = Nothing
Dari kode diatas bisa kita lihat proses yang menggabungkan beberapa baris menjadi satu baris yang akan dikirim lewat parameter ke stored procedure yang ada diserver ms-sql. Tehnik bisa anda terapkan dalam berbagai masalah, misalnya 'data detail pegawai' , 'data detail billing dirumah sakit' , dll untuk jelasnya kode looping yg membuat banyak baris menjadi satu baris seperti yang dibawah ini :
'go to first record mRS_ADODC_mGrid_Penjualan.Recordset.MoveFirst
'loop sebanyak record yang ada While Not mRS_ADODC_mGrid_Penjualan.Recordset.EOF
Yah akhirnya proses pengiriman data banyak record bisa dilakukan hanya dalam sekali klick... Sederhana tapi sangat berguna... :) buka www.indovb.com untuk tutor lainnya.