Pages

Thursday, November 14, 2013

Manipulasi data XML menggunakan VBA di dalam Microsoft Access

Penggunaan data XML semakin popular di kalangan pembangun sistem aplikasi yang menggunakan web sebagai tapak penyimpan. Sifatnya yang mudah dan serasi dengan apa jua model pembangun aplikasi menyebabkan ia mula mendapat tempat dalam dunia aplikasi. Kewujudan "Cloud Computing" telah menjadikan penggunakan kaedah ini semakin popular.

Bagaimanakah data XML ini boleh digunakan di dalam perisan Microsoft Access. Apa yang saya akan lakukan di dalam artikel ini ialah;
  1. Membaca jadual data daripada SQL Server yang mengandungi data XML yang di simpan dalam bentuk XML Document atau String.
  2. Tukarkan data XML kepada bentuk DAO.Recordset.
  3. Paparkan Recordset dalam bentuk Jadual di dalam Form @ Report.

1. Membaca Jadual data daripada SQL Server
    Set xmlDoc_ = CreateObject("Microsoft.xmldom")
    xmlDoc_.async = False
 
    Dim db As Database
    Dim tbl As TableDef
    Dim qdf As QueryDef
    Dim rs As Recordset
 
    Set db = CurrentDb
    Set tbl = db.TableDefs("[dbo_db]")
 
    If tbl.Connect <> vbNullString Then
 
        Set qdf = db.CreateQueryDef("")
        qdf.Connect = tbl.Connect
        qdf.SQL = "EXEC GetDataLaporan '" & Me.id & "'"
        qdf.ReturnsRecords = True
     
        Set rs = qdf.OpenRecordset
        Debug.Print "record Count : " & rs.RecordCount
        If Not rs.EOF Then
            Debug.Print rs!laporanXML
            xmlDoc_.loadXML (rs!laporanXML)
        End If
     
        rs.Close
        qdf.Close
     
    End If

Set xmlDoc_ = CreateObject("Microsoft.xmldom")
Menyediakan pembolehubah untuk XML Document bagi menerima data XML yang diambil dari SQL Server.

Set qdf = db.CreateQueryDef("")Membina Query sementara di dalam Ms Access sebagai pemboleh ubah qbf untuk menyimpan jadual data dari SQL Server.

qdf.Connect = tbl.ConnectMelakukan sambungan kepada SQL Server menggunakan ODBC bagi melaksanakan arahan Store Procedure yang telah dibentuk sebelumnya.

xmlDoc_.loadXML (rs!laporanXML)Memuatkan data XML kedalam pembolehubah xmlDoc_ untuk digunakan dalam peringkat seterusnya.


2. Tukarkan data XML kepada bentuk DAO.Recordset.
Contoh 1.1 - data XML yang terdapat dalam pemboleh ubah xmlDoc_
<laporan>
    <pecahan>
        <bhg>A</bhg>
        <desc>Umur/Bilangan</desc>
        <items>
            <no>A1</no>
            <desc>&lt; 20 Tahun</desc>
            <score>23</score>
        </items>
        <items>
            <no>A2</no>
            <desc>21 - 30 Tahun</desc>
            <score>76</score>
        </items>
    </pecahan>
    <pecahan>
        <bhg>B</bhg>
        <desc>Bahasa</desc>
        <items>
            <no>B1</no>
            <desc>Melayu</desc>
            <score>99</score>
        </items>
        <items>
            <no>B2</no>
            <desc>Arab</desc>
            <score>0</score>
        </items>
    </pecahan>
</laporan>
Bagi membolehkan sesuatu data XML diterjemahkan dalam bentuk ia perlulah mempunyai ciri-ciri yang lebih jelas bagi menerangkan fungsi setiap medan data yang wujud seperti nama medan, jenis data, panjang data dan sebagainya.
Recordset 
Contoh 1.2 - data XML yang lengkap.
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>
Untuk tujuan ini saya menggunakan data XML (contoh 1.1) kerana ia telah wujud dalam sistem yang sedang dipertingkatkan. Data ini perlulah diubah kepada bentuk Recordset terlebih dahulu sebelum ia boleh digunakan bersama element pada form.

Untuk tujuan ini saya menyediakan satu jadual data yang diberi nama mod_peserta_temp bagi menyimpan data sementara sebelum ia dipaparkan pada form dengan menggunakan fungsi PivotTable yang terdapat di dalam Ms Access.

Senarai aturan untuk menukarkan data XML kepada jadual mod_peserta_temp.
Dim xtb As TableDef
Dim addNew() as Variant
Dim fieldIndex as Integer
CurrentDb.Execute ("DELETE From mod_peserta_temp")
Set xrs = CurrentDb.OpenRecordset("mod_peserta_temp")
LoadNodesIntoRs Me.xmlObject.childNodes, xrs, 0
xrs.Close

Private Sub LoadNodesIntoRs(ByRef nodes As Object, rs As Recordset, recordCount As Integer)
       Dim xNode As Object
       For Each xNode In nodes

            recordCount = recordCount + 1
            If xNode.nodeType = 3 Then
                xNode.nodeType

                Select Case xNode.parentNode.nodeName
                    Case "desc"
                        If fieldIndex = 2 Then fieldIndex = 3 Else fieldIndex = 1
                    Case "bhg"
                        fieldIndex = 0
                    Case "no"
                        fieldIndex = 2
                    Case "score"
                        fieldIndex = 4
                 End Select

                    addNew(fieldIndex) = xNode.nodeValue

                If xNode.parentNode.nodeName = "score" Then
                    fieldIndex = 2
                    rs.addNew
                    addNew(4) & """]"
                    rs(0) = addNew(0)
                    rs(1) = addNew(1)
                    rs(2) = addNew(2)
                    rs(3) = addNew(3)
                    rs(4) = addNew(4)
                    rs.Update
                End If

            End If

            If xNode.hasChildNodes Then
                LoadNodesIntoRs xNode.childNodes, rs, recordCount
            End If

      Next xNode

End Sub

3. Paparkan Recordset dalam bentuk Jadual di dalam Form @ Report.

Setelah arahan aturan tersebut selesai satu jadual data akan terhasil dan sedia digunakan untuk dipaparkan pada form melalui berbagai cara. Selain itu anda juga boleh menggunakan kaedah lain yang wujud dimana anda boleh menyediakan jadual sementara dengan menggunakan arahan VBA dan paparkan kepada form. Mungkin akan saya sentuh diartikel yang lain.

Contoh hasil


1 comment:

Anonymous said...

www.facebook.com/soul.colours.collection