Multi Column AutoComplete using Visual Foxpro 9

Awalnya lagi iseng-iseng nyobain autocomplete nya visual foxpro 9, setelah dicoba-coba ternyata yang tampil di autocomplete nya visual foxpro 9 cuma 1 kolom saja. kalo misalnya kita butuh lebih dari satu kolom gimana ya ? trus lagi development program sekarang pake visual foxpro 7 yang notabene nya belum support feature autocompletenya. maka dengan sedikit trik jadilah multi column autocomplete nya. seharusnya bisa juga di run di visual foxpro 7 karena kita tidak menggunakan feature autocomplete nya Visual Foxpro 9.

Skenarionya kurang lebih seperti ini, :
1. kita buat satu class textbox yang bisa menampilkan data autocomplete jika textbox tersebut diisi data. karena kita tidak menggunakan fasilitas autocompletenya visual foxpro, maka kita akan menggunakan InteractiveChange nya textbox untuk mendeteksi perubahan data di textbox.
2. Data autocomplete ditampilkan dengan control listbox, yang di cek terlebih dahulu, jika sudah ada maka tinggal set visible dan posisinya saja.
3. Jika data di listbox di klik 2x atau enter, maka kita isi data textbox dengan value dari listbox, dengan mereferensikan textbox di propertiesnya listbox.
4. Jika form di klik, listbox di set visible = .f.

kita menggunakan cursor curAuto sebagai tempat untuk menampilkan data, jadi pastikan kita tidak menggunakan cursor curAuto untuk keperluan lain di form yang sama.

Dalam satu form kita cuma butuh 1 listbox autocomplete, tinggal di set posisi dan visible nya saja.

oke, sekarang contoh coding nya :
berikut adalah coding class dari textbox autocomplete saya :

**************************************************
 *-- Class: txt_auto (g:\sisui\sisui.vcx)
 *-- ParentClass: _txt (g:\sisui\sisui.vcx)
 *-- BaseClass: textbox
 *-- Time Stamp: 06/23/13 06:31:00 PM
 *
 DEFINE CLASS txt_auto AS _txt

*-- auto complete table di server
 sqltable = ""
 *-- clause where untuk auto complete
 sqlwhere = ""
 *-- jumlah record dari auto complete
 nlimit = 10
 *-- bound column auto complete
 nbound = 1
 *-- fields auto complete
 sqlfields = ""
 *-- field cari di autocomplete
 sqlfieldlookup = ""
 Name = "txt_auto"

PROCEDURE InteractiveChange
 lcvalue = ALLTRIM(this.Value)

IF MOD(LEN(lcvalue),2) = 0

IF VARTYPE(this.Parent.cmbAuto) = "O"
 mysql = [select ] + this.sqlfields + [ from ] + this.sqltable
 mysql = mysql + [ where ] + this.sqlfieldlookup + [ like '%] + lcvalue + [%' ]

IF !EMPTY(this.sqlwhere)
 mysql = mysql + [ and ] + this.sqlwhere
 ENDIF

mok = SQLEXEC(gnsql_hnd,mysql,"curautolagi")
 IF mok < 0
 MESSAGEBOX("Tidak bisa ambil data dari : " + mysql)
 RETURN
 ENDIF

SELECT curAuto
 ZAP IN curAuto
 APPEND FROM DBF("curautolagi")
 USE IN curautolagi

this.Parent.cmbAuto.oref = this
 this.Parent.cmbAuto.top = this.top + 25
 this.Parent.cmbAuto.left = this.left
 this.Parent.cmbAuto.requery()
 this.Parent.cmbAuto.visible = .t.
 ELSE
 mysql = [select ] + this.sqlfields + [ from ] + this.sqltable
 mysql = mysql + [ where ] + this.sqlfieldlookup + [ like '%] + lcvalue + [%' ]

IF !EMPTY(this.sqlwhere)
 mysql = mysql + [ and ] + this.sqlwhere
 ENDIF

mok = SQLEXEC(gnsql_hnd,mysql,"curauto")
 IF mok < 0
 MESSAGEBOX("Tidak bisa ambil data dari : " + mysql)
 RETURN
 ENDIF

this.Parent.AddObject("cmbAuto","listauto")
 this.Parent.cmbAuto.oref = this
 this.parent.cmbAuto.rowsource = "curAuto"
 this.Parent.cmbAuto.rowsourcetype = 2
 this.Parent.cmbAuto.requery()
 this.Parent.cmbAuto.top = this.top + 25
 this.Parent.cmbAuto.left = this.left
 this.Parent.cmbAuto.visible = .t.
 ENDIF
 ENDIF
 ENDPROC

ENDDEFINE
 *
 *-- EndDefine: txt_auto
 **************************************************

dan berikut adalah coding class listbox autocomplete nya
 **************************************************
 *-- Class: listauto (g:\sisui\sisui.vcx)
 *-- ParentClass: listbox
 *-- BaseClass: listbox
 *-- Time Stamp: 06/23/13 06:33:12 PM
 *
 DEFINE CLASS listauto AS listbox

ColumnCount = 2
 ColumnWidths = "70,250"
 RowSourceType = 2
 Height = 240
 ColumnLines = .F.
 Width = 349
 *-- object reference
 oref = ""
 Name = "listauto"

PROCEDURE DblClick
 this.oref.value = this.Value
 this.Visible = .F.
 this.oref.setfocus()
 ENDPROC

ENDDEFINE
 *
 *-- EndDefine: listauto
 **************************************************

udah, itu doang … tinggal di drop aja ke form dan diatur propertisnya. di tempat saya seperti ini pengaturannya :

autocomplete_prop

dan berikut penampakannya pemirsah … :

autocomplete

itu juga cuma hasil coba-coba doang dan pasti jauh dari sempurna, untuk penyempurnaannya silahkan dikreasikan sendiri-sendiri ya … misalnya, dengan menambahkan propertis lebar kolom, kolom yang di bound, trus sama nambah kode buat query select berdasarkan beberapa fields … lumayan kan? bisa bikin autocomplete dengan cuma setting beberapa propertis doang ….

kalo ada pertanyaan ato ada yang mau bagi2 ilmu juga bisa kontak saya di email : shes12_edp@yahoo.com

mudah2an bermanfaat !

#vfp still the best !

Advertisements