Komunitas Anak Mataram

Members Login
Username 
 
Password 
    Remember Me  
Post Info TOPIC: Insert Multiple record pada stored procedure di ms-sql server


Member

Status: Offline
Posts: 20
Date:
Insert Multiple record pada stored procedure di ms-sql server


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 :
"sale_id , sale_date , cus_id , sale_status , sale_amount , sale_payment"
dan tabel penjualan detail dengan field berikut :
"sale_id, album_id, sd_quantity, sd_price"
dimana field ini akan menjelaskan secara detail dari field-field pada tabel penjualan sebelumnya.

Solusi :
Buat Stored procedure seperti dibawah ini :

CREATE PROCEDURE AED_Penjualan
@mERROR_MESSAGE nchar(50) output, @mPROCESS nchar(6), @cus_id nchar(5),
@sale_id nchar(6), @sale_date datetime,
@sale_amount money, @sale_payment money , @mDETAIL_ITEM nvarchar(1000)
AS

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

Set mParameter = mCOMM.CreateParameter
mParameter.Name = RETURN_VALUE
mParameter.Type = adInteger
mParameter.Direction = adParamReturnValue
mCOMM.Parameters.Append mParameter

Set mParameter = mCOMM.CreateParameter
mParameter.Name = @mERROR_MESSAGE
mParameter.Type = adChar
mParameter.Size = 50
mParameter.Direction = adParamOutput
mCOMM.Parameters.Append mParameter

Set mParameter = mCOMM.CreateParameter
mParameter.Name = @mPROCESS
mParameter.Type = adChar
mParameter.Size = 6
mParameter.Direction = adParamInput
mParameter.Value = mPROCESS
mCOMM.Parameters.Append mParameter

Set mParameter = mCOMM.CreateParameter
mParameter.Name = @cus_id
mParameter.Type = adChar
mParameter.Size = 5
mParameter.Direction = adParamInput
mParameter.Value = txt_cus_id.Text
mCOMM.Parameters.Append mParameter

Set mParameter = mCOMM.CreateParameter
mParameter.Name = @sale_id
mParameter.Type = adChar
mParameter.Size = 6
mParameter.Direction = adParamInput
mParameter.Value = txt_sale_id.Text
mCOMM.Parameters.Append mParameter

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

Set mParameter = mCOMM.CreateParameter
mParameter.Name = @sale_amount
mParameter.Type = adCurrency
mParameter.Size = 11
mParameter.Direction = adParamInput
mParameter.Value = txt_sale_amount.Text
mCOMM.Parameters.Append mParameter

Set mParameter = mCOMM.CreateParameter
mParameter.Name = @sale_payment
mParameter.Type = adCurrency
mParameter.Size = 11
mParameter.Direction = adParamInput
mParameter.Value = txt_sale_payment.Text
mCOMM.Parameters.Append mParameter

mRS_ADODC_mGrid_Penjualan.Recordset.MoveFirst
While Not mRS_ADODC_mGrid_Penjualan.Recordset.EOF
LSet mITEM = mRS_ADODC_mGrid_Penjualan.Recordset.Fields(album_id)
mDETAIL_ITEM = mDETAIL_ITEM & mITEM
LSet mITEM = mRS_ADODC_mGrid_Penjualan.Recordset.Fields(qty_sold)
mDETAIL_ITEM = mDETAIL_ITEM & mITEM
LSet mITEM = mRS_ADODC_mGrid_Penjualan.Recordset.Fields(album_price)
mDETAIL_ITEM = mDETAIL_ITEM & mITEM
mRS_ADODC_mGrid_Penjualan.Recordset.MoveNext
Wend

Set mParameter = mCOMM.CreateParameter
mParameter.Name = @mDETAIL_ITEM
mParameter.Type = adVarChar
mParameter.Size = Len(mDETAIL_ITEM)
mParameter.Direction = adParamInput
mParameter.Value = mDETAIL_ITEM
mCOMM.Parameters.Append mParameter

mCOMM.ActiveConnection = mCN_eMusicCity
mCOMM.CommandText = AED_PENJUALAN
mCOMM.CommandType = adCmdStoredProc
On Error GoTo Error_process_SP
mCOMM.Execute

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

'satukan semua record menjadi satu baris

  LSet mITEM = mRS_ADODC_mGrid_Penjualan.Recordset.Fields(album_id)
  mDETAIL_ITEM = mDETAIL_ITEM & mITEM
  LSet mITEM = mRS_ADODC_mGrid_Penjualan.Recordset.Fields(qty_sold)
  mDETAIL_ITEM = mDETAIL_ITEM & mITEM
  LSet mITEM = mRS_ADODC_mGrid_Penjualan.Recordset.Fields(album_price)
  mDETAIL_ITEM = mDETAIL_ITEM & mITEM
  mRS_ADODC_mGrid_Penjualan.Recordset.MoveNext
Wend

'masukkan hasil penggabungan ke parameter dan kirim keserver

Set mParameter = mCOMM.CreateParameter
mParameter.Name = @mDETAIL_ITEM
mParameter.Type = adVarChar
mParameter.Size = Len(mDETAIL_ITEM)
mParameter.Direction = adParamInput
mParameter.Value = mDETAIL_ITEM
mCOMM.Parameters.Append mParameter



Yah akhirnya proses pengiriman data banyak record bisa dilakukan hanya dalam sekali klick... Sederhana tapi sangat berguna... :)
buka www.indovb.com untuk tutor lainnya.



-- Edited by SlackWare at 05:44, 2007-12-24

__________________
..:: Core Of The KerNel ::.


Member

Status: Offline
Posts: 23
Date:

heheheh.. Cool deh ..adhi gitu Loh !!!evileyeyawnbiggrinbleh

__________________


Member

Status: Offline
Posts: 20
Date:

cia kaka om jikustik kok jadi pasta yaaa kakaka sejak kejadian frozen eh berubah jadi pasta.. Kapan jalan2nya om.. :) kgn pengen ke yk lagi

__________________
..:: Core Of The KerNel ::.


Veteran Member

Status: Offline
Posts: 63
Date:

Sama gk caranya kalo pake MySQL5?

__________________
z e n d


Member

Status: Offline
Posts: 20
Date:

caranya sama.. tapi syntax store procedurenya yg berbeda... disesuaikan lah, btw stored procedure mysql.5 dikasih gratis? bukannya fitur itu dibayar?

__________________
..:: Core Of The KerNel ::.


Veteran Member

Status: Offline
Posts: 63
Date:

gratis kok..

__________________
z e n d
Page 1 of 1  sorted by
 
Quick Reply

Please log in to post quick replies.

Tweet this page Post to Digg Post to Del.icio.us


Create your own FREE Forum
Report Abuse
Powered by ActiveBoard