/* */

Monday, February 8, 2010

[belajar-access] lookup

----- Original Message -----
From: "Maulana" <maulana_pup@yahoo.co.id>
To: <belajar-access@yahoogroups.com>
Sent: Monday, February 08, 2010 8:04 AM
Subject: Re: [belajar-access] lookup


Trims banyak P.Aksan ats pembahasan2nya
tapi maaf saya belum sempat pelajari soalnya
ada sdikit hambatan untuk konsen k topik ini, istri sy sdang sakit
jadi saya harus konsen k rumah sakit bolak balik
jadinya ngga sempat nengok2 e-mail, dan ini baru ada waktu sempat untuk cek
dan pastinya akan saya dalami...

Maulana

----- Original Message -----
From: Aksan Kurdin
To: belajar-access@yahoogroups.com
Sent: Friday, February 05, 2010 4:20 PM
Subject: Re: [belajar-access] lookup


Ok, P. Maulana

Sekarang kita membahas form lookupnya sendiri.

Secara sederhana, lookup untuk nomor dokumen bisa saja diwakili oleh combo
box:

combo box tersebut di set row sourcenya ke query: qs_IndentOutstanding
Ini adalah cara yang paling mudah dan cepat pembuatannya. Jika data indent
masih sedikit, loading form po tidak akan lama, tetapi jika data indent
sudah lama, maka untuk membuka form po membutuhkan selesainya dulu
qs_IndentOutstanding menarik data saat loading form, barulah form po di
display di layar.

cara berikutnya adalah membuat satu form lookup sendiri. karena berdiri
sendiri, maka proses loading qs_IndentOutstanding hanya pada form lookup ini
sendiri, sehingga form po tidak terpengaruh.

Ok ....

Form lookup yang saya buat adalah memberikan satu form header sebagai
dasar operasi pencarian, dan satu kontrol sub form unbound sebagai list
detail yang akan di cari.
form unbound ini nanti bisa diisi dari berbagai sub form lookup, sesuai
dengan kebutuhan. Misalnya lookup customer, lookup barang, lookup suplier,
lookup outstanding, dlsb.

Berikut desain form frm_lookup:

see, semua unbound.

ok mari kita bahas isi kode form lookup. di bagian deklarasi saya
memerlukan kode seperti berikut:

Option Compare Database
Option Explicit

Private mbol_Select As Boolean
Private mbol_CanClose As Boolean

form adalah class. maka saya sebut dua variabel di atas sebagai property
form frm_lookup.
mbol_select menandakan apakah kita telah menekan tombol select di form
(menjatuhkan pilihan)
mbol_canclose saya perlukan agar form bisa saya kontrol tidak bisa ditutup
oleh tombol silang, ctrl-f4, atau ctrl-w.
ingat, form ini kalau sudah dijatuhkan pilihan, akan di hide, bukan
ditutup, agar nilai2 yang kita butuhkan bisa kita ambil dari modul lain.

selanjutnya saya memerlukan satu property read write SelectOk. Berikut
deklarasinya:

Property Get SelectOk() As Boolean
SelectOk = mbol_Select
End Property

Property Let SelectOk(vData As Boolean)
mbol_Select = vData
mbol_CanClose = True

If mbol_Select Then
Me.Visible = False
End If
End Property


dalam dunia oop, property itu istimewa. jika kita memberikan nilai
padanya, dia akan menjalankan metode let. jika kita mengambil nilai darinya,
dia akan menjalankan perintah get.
contoh, kalau saya berikan kode:

SelectOk = True

maka itu adalah triger untuk menjalankan metode let. operan sebelah kanan
akan menjadi parameter vData pada method Let.
Jadi hanya dengan memberikan nilai true pada SelectOk, maka class form ini
akan menjalan :
- memberi nilai true pada mbol_select
- memberikan nilai true pada mbol_canclose
- menyembunyikan form (seolah-olah ditutup)

dua sub berikut untuk handle click event tombol select dan cancel:

Private Sub cmdCancel_Click()
mbol_CanClose = True
mbol_Select = False
Me.Visible = False
End Sub

Private Sub cmdSelect_Click()
mbol_CanClose = True
mbol_Select = True
Me.Visible = False
End Sub

selanjutnya code berikut hanya untuk kerapian form:

Private Sub Form_Resize()
On Error GoTo errHandle
Me.frmChild.Width = Me.InsideWidth - 200
Me.frmChild.Height = Me.InsideHeight _
- Nz(Me.Section(acHeader).Height, 0) _
- Nz(Me.Section(acFooter).Height, 0) - 200
Exit Sub
errHandle:
MsgBox Err.Description, vbInformation, Err.Number
End Sub


dengan demikian, sub form akan selalu mengikuti perubahan sise window
frm_lookup.
selanjutnya kode untuk handel combo box find dan text box find:

Private Sub cboFindCriteria_Change()
Me.txtFind = ""
Me.txtFind.SetFocus
End Sub

Private Sub txtFind_Change()
With Me.frmChild.Form
If Trim("" & Me.txtFind.Text) = "" Then
.Filter = ""
.FilterOn = False
Else
.Filter = Me.cboFindCriteria & " LIKE '*" & Me.txtFind.Text &
"*'"
.FilterOn = True
End If
End With
End Sub

Kode ini akan sangat membantu proses filtering. list ribuan bisa di
persempit dengan mengetik-kan beberapa huruf kunci saja di text box find,
otomatis sub datasheet akan terfilter.

Nah, sekarang yang terakhir event load/unload form.

Private Sub Form_Load()
Dim arr() As String
Dim sql As String
On Error GoTo errHandle

Me.frmChild.SourceObject = ""
mbol_CanClose = False
mbol_Select = False

arr = Split(Me.OpenArgs, ",")
Me.Caption = Me.Auto_Title0.Caption
With Me.frmChild
.SourceObject = arr(0)
.Form.Filter = ""
.Form.FilterOn = False
.Top = 100
.Left = 100
End With

Select Case arr(0) 'subformname

Case "frm_lkpIndent"
Me.cboFindCriteria.RowSource = "'Indent
No';'IndentNo';'Agency';'Agency'"
Me.cboFindCriteria = "IndentNo"
Me.Auto_Title0.Caption = "Lookup for Indent Outstanding"

Case "frm_lkpIndentD"
Me.cboFindCriteria.RowSource = "'Store
Kode';'StoreKode';'Store Name';'StoreName'"
Me.cboFindCriteria = "StoreKode"
Me.Auto_Title0.Caption = "Lookup for Item Indent Outstanding"
Me.frmChild.Form.Filter = "IndentNo = '" & arr(1) & "'"
Me.frmChild.Form.FilterOn = True

Case "frm_lkpSupp"
Me.cboFindCriteria.RowSource = "'Supp
Code';'SupplierKode';'Name';'SupplierName'"
Me.cboFindCriteria = "SupplierKode"
Me.Auto_Title0.Caption = "Lookup for supplier"

End Select
Exit Sub

errHandle:
MsgBox Err.Description, vbInformation, Err.Number
End Sub

Private Sub Form_Unload(Cancel As Integer)
Cancel = Not mbol_CanClose
End Sub

saat loading form ini, kita reset dulu subform:
Me.frmChild.SourceObject = ""
mbol_CanClose = False
mbol_Select = False


kode berikut ini :
arr = Split(Me.OpenArgs, ",")
Me.Caption = Me.Auto_Title0.Caption
With Me.frmChild
.SourceObject = arr(0)
.Form.Filter = ""
.Form.FilterOn = False
.Top = 100
.Left = 100
End With

akan memisahkan openargs form untuk keperluan mengeset sourceobject dan
parameter-parameter tertentu.
anda masih ingat kan potongan kode memanggil lookupindent berikut:

DoCmd.OpenForm FormName:="frm_Lookup", OpenArgs:="frm_lkpIndent",
WindowMode:=acDialog

perhatikan bahwa sourceobject frmChild saya boundkan ke arr(0), yaitu
frm_lkpIndent.


Nah, berikut adalah subform frm_lkpIndent:

saya boundkan form ini pada query qs_IndentOutstanding.

agar sifatnya dinamis, maka seting berikut perlu dilakukan:
Select Case arr(0) 'subformname

Case "frm_lkpIndent"
Me.cboFindCriteria.RowSource = "'Indent
No';'IndentNo';'Agency';'Agency'"
Me.cboFindCriteria = "IndentNo"
Me.Auto_Title0.Caption = "Lookup for Indent Outstanding"


Untuk lookup indent, maka combo box criteria cukup berisi by Indent No
atau by Agency saja.

Sekarang anda perhatikan kode dari form unload.
Private Sub Form_Unload(Cancel As Integer)
Cancel = Not mbol_CanClose
End Sub

saya akan mencegah form ditutup melalui tombol x, ctrl-f4, ctrl-w, dengan
cara membandingkan nilai parameter cancel di unload form. jika mbol_Canclose
masih false, selamanya form ini tidak bisa ditutup. anda harus mengeset
variabel ini ke true jika dalam develop ingin menutup form tersebut. caranya
masuk ke vbe editor, lalu di immediate window ketik: mbol_canclose=true
(enter).
selanjutnya form itu sudah bisa ditutup.


Sebelum kelupaan, untuk openargs form lookup. Jika anda perhatikan, saya
membuat array dinamik untuk menampung pemisahan openargs sesuai tanda koma,
ke dalam array.
Contoh berikut dari form detail po, saat lookup indent detail:

DoCmd.OpenForm FormName:="frm_Lookup",
OpenArgs:="frm_lkpIndentD," & Me.Parent.Form!IndentNo, WindowMode:=acDialog

openargs akan berisi, contoh: "frm_lkpIndentD,IND-001"
jika di split, maka arr akan berisi:
arr(0) = "frm_lkpIndentD"
arr(1) = "IND-001"

lantas perhatikan penggalan code :

Case "frm_lkpIndentD"
Me.cboFindCriteria.RowSource = "'Store
Kode';'StoreKode';'Store Name';'StoreName'"
Me.cboFindCriteria = "StoreKode"
Me.Auto_Title0.Caption = "Lookup for Item Indent Outstanding"
Me.frmChild.Form.Filter = "IndentNo = '" & arr(1) & "'"
Me.frmChild.Form.FilterOn = True

filter subform bisa diatur dengan mempersempit IndentNo hanya pada nomor
"IND-001" -> arr(1).

Sampai di sini selesailah pembahasan form lookup kita.
File mdb akan saya kirim setelah ini, setelah anda mencobanya.
Seperti biasa, tolong feedback, bagian mana yang harus saya bahas
mendalam.


aksan kurdin

No comments:

Post a Comment