Credit to Unsplash

Tidak jauh berbeda dengan implementasi integrasi jqGrid untuk PHP, jqGrid juga dapat digunakan untuk server side yang dikembangkan menggunakan bahasa selain PHP. Pada tulisan ini saya menggunakannya untuk website yang dibangun dengan ASP Classic.

Terdapat 3 file VBS yang kembangkan yaitu Mathematic.asp, jqGrid.asp, dan pustaka JSON.

Mathematic.asp berisi fungsi matematika yang salah satunya terdapat fungsi ceil, JQGrid.asp sebagai helper untuk operasi pada JQGrid, dan pustaka JSON untuk melakukan encode decode JSON yang dibutuhkan oleh JQGrid.

Berikut adalah VBS untuk Mathematic.asp yang di dalamnya terdapat fungsi untuk ceiling. Untuk fungsi matematika selain ceil seperti floor, round, dan sebagainya tidak saya include dalam artikel ini karena tidak berkaitan.

Function ceil(n)
    Dim nref
    nref = CDbl(n)
    If Int(nref * 10 ) MOD 10 >= 0 Then
        ceil = Int(nref) + 1 
    Else
        ceil = Int(nref)
    End If
End Function

VBS Mathematic.asp dan pustaka JSON harus diinclude ke dalam jqGrid.asp. jqGrid.asp yang dibangun juga berfungsi sebagai helper. Berikut adalah VBS tersebut beserta dengan penjelasannya. Hal pertama yang saya lakukan adalah inisialiasi variabel-variabel yang biasanya dikirimkan oleh jqGrid.

Dim 
    command, 
	where, 
	searchField, 
	searchOper, 
	searchString, 
	ops, 
	opsRef 
Dim page, 
	limit, 
	sidx, 
	sord, 
	start, 
	count, 
	totalPage, 
	ceilParam, 
	lengthWhere, 
	querySQL 
Set command = Request("command")

Selanjutnya saya membuat sebuah prosedur dengan nama constructGridWhere yang digunakan untuk melakukan parsing perintah-perintah standar dari jqGrid menjadi operational where clause pada SQL. Variabel yang diolah oleh constructGridWhere adalah variabel global where yang telah didefinisikan sebelumnya.

Untuk menangkap request yang bersifat multi clause dari kombinasi maka saya mempergunakan Scripting.Dictionary sebagai collection dan setelah itu saya olah dengan perulangan for..each untuk melakukan concat.

Sub constructGridWhere() 
	Set ops = CreateObject("Scripting.Dictionary") 
	Set searchField = Request("searchField") 
	Set searchOper = Request("searchOper") 
	Set searchString = Request("searchString") 
	If Request("_search") = "true" Then 
		ops.add "eq","=" 
		ops.add "ne","<>" 
		ops.add "lt","<" 
		ops.add "le","<=" ops.add "gt",">" 
		ops.add "ge","=>" 
		ops.add "bw","LIKE" 
		ops.add "bn","NOT LIKE" 
		ops.add "in","LIKE" 
		ops.add "ni","NOT LIKE" 
		ops.add "ew","LIKE" 
		ops.add "en","NOT LIKE" 
		ops.add "cn","LIKE" 
		ops.add "nc","NOT LIKE" 
	End If 
	For Each key in ops 
		If searchOper = key Then 
			opsRef = ops(key) 
		End If Next 
		If searchOper = "eq" Then 
			searchString = searchString 
		End If 
		If (searchOper = "bw" Or searchOper = "bn") Then 
			searchString = searchString & searchString 
		End If 
		If searchOper = "ew" Or searchOper = "en" Then 
			searchString = searchString & "%" & searchString 
		End If 
		If searchOper = "cn" Or searchOper = "nc" Or searchOpern = "in" Or searchOper = "ni" Then 
			searchString = searchString & "%" & searchString & "%" 
		End If 
		where = searchField & opsRef & "'" & searchString &"'" 
End Sub

Untuk melakukan penarikan data dari tabel pada sebuah skema di database, saya membuat sebuah prosedur dengan nama constructGridData. Di mana pada prosedur tersebut diperlukan eksekusi terlebih dahulu terhadap constructGridData.

Pada prosedur berikut adalah perintah sederhana untuk melakukan seleksi data pada satu tabel saja. Sehingga apabila diperlukan join pada beberapa tabel atau advance query tentu saja masih diperlukan modifikasi.

Sub constructGridData(fieldKey, table) 
	Call constructGridWhere() 
	Set page = Request("page") 
	Set limit = Request("rows") 
	Set sidx = Request("sidx") 
	Set sord = Request("sord") 
	start = limit * page - limit 
	If start < 0 Then 
        start = 0 
    End If 
    Set resultSet = Server.createObject("ADODB.Recordset") 
    resultSet.Open "SELECT COUNT("& fieldKey &") AS TotalRecord FROM " & table, connection 
    If Not resultSet.Eof Then 
        count = CInt(resultSet.Fields("TotalRecord")) 
    Else 
        count = 0 
    End If 
    resultSet.Close 
    Set resultSet = Nothing ceilParam = count/limit 
    If count > 0 Then
		totalPage = ceil(ceilParam) 
	Else 
		totalPage = 0 
	End If 
	If page > totalPage Then 
		page = totalPage 
	End If 
	lengthOps = Len(opsRef) 
	If Not lengthOps = 0 THEN 
		querySQL = "SELECT * FROM " & table & " WHERE " & where & " ORDER BY " & sidx & " " & sord & " LIMIT " & limit 
	Else 
		querySQL = "SELECT * FROM " & table & " ORDER BY " & sidx & " " & sord & " LIMIT " & limit 
	End If 
	Set resultSet = Server.createObject("ADODB.Recordset") 
	resultSet.Open querySQL, connection 
End Sub

Untuk fungsi terakhir yang diperlukan adalah mengisi cell data dalam bentuk JSON berdasarkan collection of data (array).

Function myCell(id, cellArray) 
	Dim o : 
		Set o = jsObject 
		o("id") = id 
		o("cell") = cellArray 
		Set myCell = o 
End Function

Dalam melakukan testing terhadap fungsi-fungsi tersebut atas dasar keperluan load data dengan nama produceData, maka saya membuat sebuah controller yang dapat mengirimkan data berdasarkan request dari jGrid table dalam bentuk format JSON. Controller ini bernama UserController.asp.

Apabila membutuhkan contoh koneksi ke database dapat melihat pada posting artikel saya yang sebelumnya.

command = Request("command") 
If command = "load" Then 
	Call produceData() 
End If 

Sub produceData 
	Call constructGridData("field_pk","nama_tabel") 
	Set myData = jsObject() 
	myData("page") = page 
	myData("total") = totalPage 
	myData("records") = count 
	Set myData("rows") = jsArray() 
	Do While Not resultSet.Eof 
		id = resultSet.Fields("field_pk") 
        propertyA = resultSet.Fields("kolom_1") 
		propertyB = resultSet.Fields("kolom_n") 
		Set myData("rows")(Null) = myCell(id, array(id,propertyA,propertyB)) 
		resultSet.MoveNext 
		Loop myData.Flush 
End Sub

Untuk penyelesaiannya di sisi klien, berikut adalah javascript untuk menghasilkan jqGridnya:

$(document).ready(function () {
  $("#gridData").jqGrid({
    url: "/WebService/UserController.asp?command=load",
    mtype: "post",
    datatype: "json",
    colNames: ["ID", "Property A", "Property B"],
    colModel: [
      {
        name: "id",
        index: "id",
        width: 30,
      },
      {
        name: "propertyA",
        index: "propertyA",
        width: 30,
        sortable: true,
      },
      {
        name: "propertyB",
        index: "propertyB",
        width: 30,
        sortable: true,
      },
    ],
    autowidth: true,
    height: 280,
    rowNum: 10,
    rowList: [10, 20, 30],
    pager: "#pager",
    sortname: "id",
    viewrecords: true,
    sortorder: "asc",
    caption: "Data caption",
  });
  $("#gridData").jqGrid("navGrid", "#pager", {
    add: false,
    del: false,
    edit: false,
  });
})

Dari sini dapat disimpulkan cukup mudah ketika sudah terdapat base layout seperti prosedur dan fungsi yang generic dalam menghasilkan data untuk jqGrid. Sebetulnya pada tahap ini masih diperlukan custom pada query agar lebih dinamis namun perlu waktu tambahan supaya dapat tercapai.

Sekiranya bermanfaat bagi yang membutuhkan. Salam.

Disadur dari blog lama saya di WordPress.com