sp for multirow with xml
kemarin saat ujicoba program SIMRS gw sempat pusing, bagaimana memasukkan banyak baris kedalam stored procedure, akhirnya saya mencoba terik penyatuan beberapa baris menjadi satu baris kemudian baru gw kirim dalam satu parameter kestored procedure. Logikanya seperti dibawah ini
'Loop for data barang
mDetailItemBarang = ""
mItemBarang = ""
If RsBarangUsg.RecordCount <> 0 Then
RsBarangUsg.MoveFirst
While Not RsBarangUsg.EOF
LSet mItemBarang = Trim(RsBarangUsg.Fields("Kode Barang").Value)
mDetailItemBarang = mDetailItemBarang & mItemBarang
LSet mItemBarang = Trim(RsBarangUsg.Fields("Qty").Value)
mDetailItemBarang = mDetailItemBarang & mItemBarang
LSet mItemBarang = Trim(RsBarangUsg.Fields("Harga Satuan").Value)
mDetailItemBarang = mDetailItemBarang & mItemBarang
LSet mItemBarang = Trim(RsBarangUsg.Fields("Kode Dokter").Value)
mDetailItemBarang = mDetailItemBarang & mItemBarang
RsBarangUsg.MoveNext
Wend
End If
If Len(mDetailItemBarang) <> 0 Then
Set mParameter = mCOMM.CreateParameter
mParameter.Name = "@mDetailItemBarang"
mParameter.Type = adVarChar
mParameter.Size = Len(mDetailItemBarang)
mParameter.Direction = adParamInput
mParameter.Value = mDetailItemBarang
mCOMM.Parameters.Append mParameter
Else
'Untuk situasi dimana tidak ada data pemakaian barang
mDetailItemBarang = " "
Set mParameter = mCOMM.CreateParameter
mParameter.Name = "@mDetailItemBarang"
mParameter.Type = adVarChar
mParameter.Size = Len(mDetailItemBarang)
mParameter.Direction = adParamInput
mParameter.Value = mDetailItemBarang
mCOMM.Parameters.Append mParameter
End If
Kode diatas untuk dalam aplikasi, kemudian untuk kode berikutnya kita buat dalam stored procedure seperti dibawah ini
-- untuk data pemakaian barang
if len(@mDetailItemBarang) > 1
begin
-- satu baris mengalokasi 30 karakter (3 * 10)
-- data pemakaian barang
set @mLOOP = 0
set @mTOTAL_LOOP = ceiling(len(@mDetailItemBarang)/30)
while @mLOOP <= @mTOTAL_LOOP
begin
set @Kode_Barang = substring(@mDetailItemBarang, @mLOOP * 30 + 1, 10)
set @Qty = substring(@mDetailItemBarang, @mLOOP * 30 + 11,10)
set @cHarga_Jual = substring(@mDetailItemBarang, @mLOOP * 30 + 21,10)
set @Harga_Jual = convert(money,@cHarga_Jual)
set @mLOOP = @mLOOP + 1
Insert Into Pemakaian_Barang ([Kode Data],[Register Kunjungan],
[Kode Barang],[Qty],[Harga Jual],[Kode Jenis],[Kode Unit])
values (@Nomor_Urut_Usg, @Register_Kunjungan, @Kode_Barang,
@Qty, @Harga_Jual, @Kode_Jenis, @Kode_Unit)
set @mERROR_NO = @@ERROR
if @mERROR_NO <> 0
begin
Rollback transaction
set @mERROR_MESSAGE = ' > SP 2 < Error pada pengisian data Pemakaian Barang'
return (2)
End
End
End
Tapi logika seperti diatas memiliki kelemahan untuk baris yang banyak, karena keterbatasan panjang parameter yang hanya 5000 karakter, tentu akan mengakibatkan overflow. Lantas solusi yang terbaik apa? Kita akan menggunakan xml untuk menyimpan banyak baris dalam stored procedure.Misalnya data yang ada seperti berikut ini
<items> <item id="1"></item> <item id="4"></item> <item id="12"></item> <item id="112"></item> <item id="234"></item> <item id="605"></item> </items>
Dalam kode program misalnya kita menggunakan chekboxlist untuk memasukkan item yang dipilih kedalam xml, buat kode diseperti dibawah ini
Public Class XMLItemList Private sb As System.Text.StringBuilder Public Sub New() sb = New System.Text.StringBuilder sb.Append("<items>" & vbCrLf) End Sub Public Sub AddItem(ByVal Item As String) sb.AppendFormat("<item id={0}{1}{2}></item>{3}", Chr(34), Item, Chr(34), vbCrLf) End Sub Public Overrides Function ToString() As String sb.Append("</items>" & vbCrLf) Return sb.ToString End Function End Class
Atau dengan kode berikut ini yang lebih sederhana, anda bisa menggunakan MyXMLItemList.ToString method untuk mengambil string refresentasi untuk memformatnya dalam bentuk xml. Kodenya seperti dibawah ini
Dim MyXMLItemList As New XMLItemList For i As Integer = 0 To MyCheckBoxList.Items.Count - 1 If MyCheckBoxList.Items(i).Selected = True Then MyXMLItemList.AddItem(MyCheckBoxList.Items(i).Value) End If Next
Kemudian pada sisi server anda bisa membuat stored procedure seperti dibawah ini
alter procedure usp_InsertManyRows
@XMLDOC varchar(8000)
AS
declare @xml_hndl int
--prepare the XML Document by executing a system stored procedure
exec sp_xml_preparedocument @xml_hndl OUTPUT, @XMLDOC
--insert into table
Insert Into testtable
(
InsertedID
)
Select
IDToInsert
From
OPENXML(@xml_hndl, '/items/item', 1)
With
(
IDToInsert int '@id'
)





stmikbg.com adalah web untuk komunitas bagi anak-anak stmik bumigora khususnya dan anak-anak IT umumnya, baek yang cupu maupun yang expert.
November 6th, 2008 at 11:03 pm
http://www.odesk.com/referrals/track/ekalp3i
Bugus Blognya, Nih ada sertifikasi online
dan freelance sesuai dengan hobi anda
The On Demand Global Workforce - oDesk