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 !