/* */

Friday, February 5, 2010

[belajar-access] lookup

----- Original Message -----
From: "Aksan Kurdin" <aksan.kurdin@gmail.com>
To: <belajar-access@yahoogroups.com>
Sent: Friday, February 05, 2010 4:06 PM
Subject: Re: [belajar-access] lookup


> Dear P. Maulana,
>
> Saya akan menyambung penjelasan kemarin, jadi tidak merujuk pada query
> yang anda kirim ini.
> Kita mulai dari form order/PO yang kosong:
>
>
> Setelah semua field header kita isi, maka saat mengisi textbox indent
> no, kita diberi kesempatan untuk memasukkan nomor indent yang akan
diorder.
> Cara pengisian bisa dengan mengklik tombol lookup (bernama
> cmdIndentLookup), atau langsung mengisi di textbox kalau P. Maulana
> ingat nomor indent yang belum di order tersebut.
> Jika lupa, tidak mengapa, ketik saja sembarang, nanti oleh program akan
> dikeluarkan form lookup ke nomor indent yang available.
>
>
>
>
> Event yang diperlukan oleh form ini adalah menangkap klik button :
>
> Private Sub cmdIndentLookup_Click()
> LookupIndent
> End Sub
>
> dan event after update pengisian dari Indent No textbox:
>
> Private Sub IndentNo_AfterUpdate()
> Dim rs As ADODB.Recordset
> Dim frm As Form
> On Error GoTo errHandle

>
> InitRecordSet rs, "SELECT IndentNo FROM qs_IndentOutstanding_Det
> WHERE IndentNo = '" & Me.IndentNo.Text & "'", True
> With rs
> If .RecordCount = 0 Then
> LookupIndent
> End If
> End With
> DestroyRecordset rs
>
> Exit Sub
>
> errHandle:
> ErrMsg
> Set rs = Nothing
> Set frm = Nothing
> End Sub
>
> Untuk klik tombol lookup, hanya satu perintah, yaitu langsung buka form
> lookup melalui sub LookupIndent.
> Untuk event after update indentno, sub akan mengecek terlebih dahulu
> apakah entri-an yang dimasukkan ada dalam nomor indent yang outstanding.
> Caranya adalah secara ADO kita buka recordset dari query
> qs_IndentOutstanding_Det, dengan parameter nomor indent yang dimasukkan
> dalam textbox. Jika nomor tersebut ada, maka recordcount dari recordset
> tersebut pasti ada (>0), jika tidak ada, maka perintah yang sama
> dilakukan -> lookupindent.
>
> ok, saya terangkan sedikit beberapa fungsi udf yang ada di
> indentno_afterupdate:
>
> *- initrecordset*
>
> Public Sub InitRecordSet(rs As ADODB.Recordset, sql As String,
> OpenReadWrite As Boolean)
> On Error GoTo errHandle
>
> Set rs = New ADODB.Recordset
> With rs
> .CursorLocation = adUseClient
> .ActiveConnection = CurrentProject.Connection
> .LockType = IIf(OpenReadWrite, adLockOptimistic, adLockReadOnly)
> .CursorType = IIf(OpenReadWrite, adOpenKeyset, adOpenStatic)
> If Trim(sql) <> "" Then
> .Open sql
> End If
> End With
> Exit Sub
>
> errHandle:
> ErrMsg
> End Sub
>
> Ini adalah fungsi pembungkus saya untuk menghemat baris, dengan
> memberikan kondisi default pada recordset, yaitu cursorlocation saya set
> local (aduseclient), activeconnection saya set pada mdb yang sekarang
> (currentproject.connection), lalu locktype dan cursortype berupa
> parameter yang akan diberikan dari sub pemanggil. Jika ada sql
> diberikan, recordset langsung akan membuka sql tersebut.
>
>
>
> *- DestroyRecordset*
>
> Public Sub DestroyRecordset(rs As ADODB.Recordset)
> On Error Resume Next
> If rs.State <> adStateClosed Then
> rs.Close
> End If
> Set rs = Nothing
> End Sub
>
> Setiap apa yang sudah dipesan di memory harus dilepas lagi, dan untuk
> menyederhanakan baris pelepasan tersebut, saya bungkus dalam fungsi ini.
>
> *
> - ErrMsg*
>
> Public Sub ErrMsg()
> MsgBox Err.Description, vbInformation, "Error# " & Err.Number
> End Sub
>
> Biar gak panjang2 nulisnya kalau untuk error handler.....
>
>
> Ok, lanjut pada pembahasan lookup nomor dokumen. Sekarang apa yang
> dilakukan oleh fungsi LookupIndent :
>
> Sub LookupIndent()
> Dim frm As Form
> On Error GoTo errHandle
>
> DoCmd.OpenForm FormName:="frm_Lookup", OpenArgs:="frm_lkpIndent",
> WindowMode:=acDialog
> Set frm = Forms("frm_Lookup")
> If frm.SelectOk Then
> Me.IndentNo = frm.frmChild.Form.IndentNo
> If MsgBox("Add detail indent from this document?" & vbCrLf _
> & "If not, you can choose one by one in details", _
> vbInformation + vbYesNo, "Adding indent item") = vbYes Then
> AddIndentItemAll
> End If
> End If
> DoCmd.Close acForm, "frm_Lookup"
> Set frm = Nothing
>
> Exit Sub
>
> errHandle:
> ErrMsg
> Set frm = Nothing
> End Sub
>
>
> perhatikan sekarang. Saya memanggil satu form lookup "frm_Lookup",
> dengan memberikan open argumens "frm_lkpIndent", yang merupakan subform
> untuk lookup indent dokumen, dan saya set sebagai window dialog.
> artinya, form lookup ini akan berada di atas window yang lain, dan
> menghentikan eksekusi kode selanjutnya sampai form ini 'di tutup'.
> sengaja saya beri tanda petik, karena sebenarnya form lookup tidak
> ditutup, tetapi hanya di sembunyikan (hide=true).
> Setelah kita melakukan pilihan pada form lookup, dan menekan tombol ok,
> maka form akan tertutup, dan barulah kode selanjutnya di eksekusi.
> Saya menggunakan variable frm untuk merujuk pada form lookup yang
> tersembunyi, untuk mengambil nilai2 yang ada dalam form tersebut. Dalam
> hal ini adalah nomor indent.
> Setelah nomor indent di peroleh, saya baru memberikan pertanyaan pada
> user, apakah langsung menambah item detail sekarang atau nanti. Jika mau
> sekarang, maka prosedur AddIndentItemAll akan di jalankan.
>
>
>
> Apa yang dilakukan oleh prosedur tersebut:
>
> Sub AddIndentItemAll()
> Dim sql As String
> On Error GoTo errHandle
> DoCmd.RunCommand acCmdSaveRecord
>
> sql = "INSERT INTO T_POD ( OrderNo, StoreKode, UnitPrice,
> Discount, DiscPct, OrderQty) "
> sql = sql & "SELECT '" & Me.OrderNo & "', StoreKode, UnitPrice,
> 0, 0, Qty "
> sql = sql & "FROM qs_IndentOutstanding_Det2 "
> sql = sql & "WHERE qs_IndentOutstanding_Det2.IndentNo='" &
> Me.IndentNo & "' AND Qty <> 0;"
>
> CurrentProject.Connection.Execute sql
>
> Me.frm_POD_sub.Form.Requery
> Exit Sub
> errHandle:
> ErrMsg
> End Sub
>
> yap, secara programming, kita langsung menambahkan item indent
> outstanding dari nomor dokumen tersebut dengan perintah execute sql.
> Bapak bisa kan mengerti kode di atas?
> Isi masing2 query sudah saya berikan di mail sebelumnya.
> Nah, sekarang kita sudah selesai melakukan penambahan otomatis untuk
> indent outstanding nomor indent yang diinginkan.
>
>
>
> Nah sekarang kita sudah bisa melakukan edit pada detail untuk
> menyesuaikan dengan yang sesungguhnya. Mungkin S01 tidak dipesan
> seluruhnya, tapi 10 saja dulu, kita ubah order qty dari 50 menjadi 10.
> Mungkin harga S02 adalah 100, maka kita ubah unit price dari S02 menjadi
> 100.
> Total discountnya barangkali 15%, maka discount total kita ubah.
> Kesemua field hitungan yang lain otomatis menyesuaikan.
>
> Nah, selanjutnya sekarang kita bahas untuk lookup item di detail,
> andaikan tadi tidak kita pilih jawaban otomatis menambah item detail,
> tetapi hendak memasukkannya satu per satu.
> Saya kosongkan lagi item detail dengan menghapus tiga item tersebut.
> Caranya sama dengan pengisian nomor indent, sekarang saya ingin memilih
> item yang akan di order. Caranya adalah dengan mengentri textbox store
> kode pada detail, masukkan karakter sembarang saja, maka form lookup
> detail akan keluar.
>
>
>
>
>
>
>
> Berikut adalah desain dari sub form order detail:
>
>
>
>
> dan event yang perlu untuk memperoleh lookup detail item indent kita
> pasang di after update store kode:
>
> Private Sub StoreKode_AfterUpdate()
> Dim rs As ADODB.Recordset
> Dim frm As Form
> On Error GoTo errHandle
>
> Set rs = New ADODB.Recordset
> With rs
> .CursorLocation = adUseClient
> .ActiveConnection = CurrentProject.Connection
> .LockType = adLockReadOnly
> .Open "SELECT StoreKode FROM qs_IndentOutstanding_Det2 WHERE
> StoreKode = '" & Me.StoreKode.Text & "' AND IndentNo = '" &
> Me.Parent.Form!IndentNo & "'"
> If .RecordCount = 0 Then
> DoCmd.OpenForm FormName:="frm_Lookup",
> OpenArgs:="frm_lkpIndentD," & Me.Parent.Form!IndentNo,
WindowMode:=acDialog
> Set frm = Forms("frm_Lookup")
> If frm.SelectOk Then
> Me.StoreKode = frm.frmChild.Form.StoreKode
> Me.UnitPrice = frm.frmChild.Form.UnitPrice
> Me.OrderQty = frm.frmChild.Form.Qty
> End If
> DoCmd.Close acForm, "frm_Lookup"
> Set frm = Nothing
> End If
> End With
>
> Exit Sub
>
> errHandle:
> ErrMsg
> Set rs = Nothing
> Set frm = Nothing
>
> End Sub
>
> Nah, penjelasannya sama seperti diatas P. Maulana, cuma model ADO-nya
> sengaja saya buat alternatif tidak memakai UDF saya :)
> Biar familiar dulu dengan ADO programming.
>
> Selanjutnya adalah pembahasan pembuatan form lookup.
> Saya pikir butuh waktu bagi rekan-rekan untuk mencerna ulasan ini, dan
> saya juga minta feedback, bagian mana kira2 yang masih harus dipertajam.
>
>
> Aksan Kurdin
>
> ps. Sekali lagi, P. Maulana, saya minta maaf ya, mungkin anda merasa
> respon saya lambat, tapi ini dibuat tersendat2, nyicil2 nyuri2 waktu.
> Kadang diniatin malam pulang kerja, tapi anda maklum dah, abis makan
> pasti bawanya nikmat kalau langsung tidur ... :)
>
>
> On 2/4/2010 8:34 AM, Maulana wrote:
> > [Attachment(s) <#TopText> from Maulana included below]
> > minta bantuan file ada d attch.
> >
>
>
>


----------------------------------------------------------------------------
----


> Dear P. Maulana,
>
> Saya akan menyambung penjelasan kemarin, jadi tidak merujuk pada query
yang anda kirim ini.
> Kita mulai dari form order/PO yang kosong:
>
>
> Setelah semua field header kita isi, maka saat mengisi textbox indent no,
kita diberi kesempatan untuk memasukkan nomor indent yang akan diorder.
> Cara pengisian bisa dengan mengklik tombol lookup (bernama
cmdIndentLookup), atau langsung mengisi di textbox kalau P. Maulana ingat
nomor indent yang belum di order tersebut.
> Jika lupa, tidak mengapa, ketik saja sembarang, nanti oleh program akan
dikeluarkan form lookup ke nomor indent yang available.
>
>
>
>
> Event yang diperlukan oleh form ini adalah menangkap klik button :
>
> Private Sub cmdIndentLookup_Click()
> LookupIndent
> End Sub
>
> dan event after update pengisian dari Indent No textbox:
>
> Private Sub IndentNo_AfterUpdate()
> Dim rs As ADODB.Recordset
> Dim frm As Form
> On Error GoTo errHandle
>
> InitRecordSet rs, "SELECT IndentNo FROM qs_IndentOutstanding_Det WHERE
IndentNo = '" & Me.IndentNo.Text & "'", True
> With rs
> If .RecordCount = 0 Then
> LookupIndent
> End If
> End With
> DestroyRecordset rs
>
> Exit Sub
>
> errHandle:
> ErrMsg
> Set rs = Nothing
> Set frm = Nothing
> End Sub
>
> Untuk klik tombol lookup, hanya satu perintah, yaitu langsung buka form
lookup melalui sub LookupIndent.
> Untuk event after update indentno, sub akan mengecek terlebih dahulu
apakah entri-an yang dimasukkan ada dalam nomor indent yang outstanding.
Caranya adalah secara ADO kita buka recordset dari query
qs_IndentOutstanding_Det, dengan parameter nomor indent yang dimasukkan
dalam textbox. Jika nomor tersebut ada, maka recordcount dari recordset
tersebut pasti ada (>0), jika tidak ada, maka perintah yang sama
dilakukan -> lookupindent.
>
> ok, saya terangkan sedikit beberapa fungsi udf yang ada di
indentno_afterupdate:
>
> - initrecordset
>
> Public Sub InitRecordSet(rs As ADODB.Recordset, sql As String,
OpenReadWrite As Boolean)
> On Error GoTo errHandle
>
> Set rs = New ADODB.Recordset
> With rs
> .CursorLocation = adUseClient
> .ActiveConnection = CurrentProject.Connection
> .LockType = IIf(OpenReadWrite, adLockOptimistic, adLockReadOnly)
> .CursorType = IIf(OpenReadWrite, adOpenKeyset, adOpenStatic)
> If Trim(sql) <> "" Then
> .Open sql
> End If
> End With
> Exit Sub
>
> errHandle:
> ErrMsg
> End Sub
>
> Ini adalah fungsi pembungkus saya untuk menghemat baris, dengan memberikan
kondisi default pada recordset, yaitu cursorlocation saya set local
(aduseclient), activeconnection saya set pada mdb yang sekarang
(currentproject.connection), lalu locktype dan cursortype berupa parameter
yang akan diberikan dari sub pemanggil. Jika ada sql diberikan, recordset
langsung akan membuka sql tersebut.
>
>
>
> - DestroyRecordset
>
> Public Sub DestroyRecordset(rs As ADODB.Recordset)
> On Error Resume Next
> If rs.State <> adStateClosed Then
> rs.Close
> End If
> Set rs = Nothing
> End Sub
>
> Setiap apa yang sudah dipesan di memory harus dilepas lagi, dan untuk
menyederhanakan baris pelepasan tersebut, saya bungkus dalam fungsi ini.
>
>
> - ErrMsg
>
> Public Sub ErrMsg()
> MsgBox Err.Description, vbInformation, "Error# " & Err.Number
> End Sub
>
> Biar gak panjang2 nulisnya kalau untuk error handler.....
>
>
> Ok, lanjut pada pembahasan lookup nomor dokumen. Sekarang apa yang
dilakukan oleh fungsi LookupIndent :
>
> Sub LookupIndent()
> Dim frm As Form
> On Error GoTo errHandle
>
> DoCmd.OpenForm FormName:="frm_Lookup", OpenArgs:="frm_lkpIndent",
WindowMode:=acDialog
> Set frm = Forms("frm_Lookup")
> If frm.SelectOk Then
> Me.IndentNo = frm.frmChild.Form.IndentNo
> If MsgBox("Add detail indent from this document?" & vbCrLf _
> & "If not, you can choose one by one in details", _
> vbInformation + vbYesNo, "Adding indent item") = vbYes Then
> AddIndentItemAll
> End If
> End If
> DoCmd.Close acForm, "frm_Lookup"
> Set frm = Nothing
>
> Exit Sub
>
> errHandle:
> ErrMsg
> Set frm = Nothing
> End Sub
>
>
> perhatikan sekarang. Saya memanggil satu form lookup "frm_Lookup", dengan
memberikan open argumens "frm_lkpIndent", yang merupakan subform untuk
lookup indent dokumen, dan saya set sebagai window dialog.
> artinya, form lookup ini akan berada di atas window yang lain, dan
menghentikan eksekusi kode selanjutnya sampai form ini 'di tutup'. sengaja
saya beri tanda petik, karena sebenarnya form lookup tidak ditutup, tetapi
hanya di sembunyikan (hide=true).
> Setelah kita melakukan pilihan pada form lookup, dan menekan tombol ok,
maka form akan tertutup, dan barulah kode selanjutnya di eksekusi.
> Saya menggunakan variable frm untuk merujuk pada form lookup yang
tersembunyi, untuk mengambil nilai2 yang ada dalam form tersebut. Dalam hal
ini adalah nomor indent.
> Setelah nomor indent di peroleh, saya baru memberikan pertanyaan pada
user, apakah langsung menambah item detail sekarang atau nanti. Jika mau
sekarang, maka prosedur AddIndentItemAll akan di jalankan.
>
>
>
> Apa yang dilakukan oleh prosedur tersebut:
>
> Sub AddIndentItemAll()
> Dim sql As String
> On Error GoTo errHandle
> DoCmd.RunCommand acCmdSaveRecord
>
> sql = "INSERT INTO T_POD ( OrderNo, StoreKode, UnitPrice,
Discount, DiscPct, OrderQty) "
> sql = sql & "SELECT '" & Me.OrderNo & "', StoreKode, UnitPrice, 0,
0, Qty "
> sql = sql & "FROM qs_IndentOutstanding_Det2 "
> sql = sql & "WHERE qs_IndentOutstanding_Det2.IndentNo='" &
Me.IndentNo & "' AND Qty <> 0;"
>
> CurrentProject.Connection.Execute sql
>
> Me.frm_POD_sub.Form.Requery
> Exit Sub
> errHandle:
> ErrMsg
> End Sub
>
> yap, secara programming, kita langsung menambahkan item indent outstanding
dari nomor dokumen tersebut dengan perintah execute sql. Bapak bisa kan
mengerti kode di atas?
> Isi masing2 query sudah saya berikan di mail sebelumnya.
> Nah, sekarang kita sudah selesai melakukan penambahan otomatis untuk
indent outstanding nomor indent yang diinginkan.
>
>
>
> Nah sekarang kita sudah bisa melakukan edit pada detail untuk menyesuaikan
dengan yang sesungguhnya. Mungkin S01 tidak dipesan seluruhnya, tapi 10 saja
dulu, kita ubah order qty dari 50 menjadi 10.
> Mungkin harga S02 adalah 100, maka kita ubah unit price dari S02 menjadi
100.
> Total discountnya barangkali 15%, maka discount total kita ubah.
> Kesemua field hitungan yang lain otomatis menyesuaikan.
>
> Nah, selanjutnya sekarang kita bahas untuk lookup item di detail, andaikan
tadi tidak kita pilih jawaban otomatis menambah item detail, tetapi hendak
memasukkannya satu per satu.
> Saya kosongkan lagi item detail dengan menghapus tiga item tersebut.
Caranya sama dengan pengisian nomor indent, sekarang saya ingin memilih item
yang akan di order. Caranya adalah dengan mengentri textbox store kode pada
detail, masukkan karakter sembarang saja, maka form lookup detail akan
keluar.
>
>
>
>
>
>
>
> Berikut adalah desain dari sub form order detail:
>
>
>
>
> dan event yang perlu untuk memperoleh lookup detail item indent kita
pasang di after update store kode:
>
> Private Sub StoreKode_AfterUpdate()
> Dim rs As ADODB.Recordset
> Dim frm As Form
> On Error GoTo errHandle
>
> Set rs = New ADODB.Recordset
> With rs
> .CursorLocation = adUseClient
> .ActiveConnection = CurrentProject.Connection
> .LockType = adLockReadOnly
> .Open "SELECT StoreKode FROM qs_IndentOutstanding_Det2 WHERE
StoreKode = '" & Me.StoreKode.Text & "' AND IndentNo = '" &
Me.Parent.Form!IndentNo & "'"
> If .RecordCount = 0 Then
> DoCmd.OpenForm FormName:="frm_Lookup",
OpenArgs:="frm_lkpIndentD," & Me.Parent.Form!IndentNo, WindowMode:=acDialog
> Set frm = Forms("frm_Lookup")
> If frm.SelectOk Then
> Me.StoreKode = frm.frmChild.Form.StoreKode
> Me.UnitPrice = frm.frmChild.Form.UnitPrice
> Me.OrderQty = frm.frmChild.Form.Qty
> End If
> DoCmd.Close acForm, "frm_Lookup"
> Set frm = Nothing
> End If
> End With
>
> Exit Sub
>
> errHandle:
> ErrMsg
> Set rs = Nothing
> Set frm = Nothing
>
> End Sub
>
> Nah, penjelasannya sama seperti diatas P. Maulana, cuma model ADO-nya
sengaja saya buat alternatif tidak memakai UDF saya :)
> Biar familiar dulu dengan ADO programming.
>
> Selanjutnya adalah pembahasan pembuatan form lookup.
> Saya pikir butuh waktu bagi rekan-rekan untuk mencerna ulasan ini, dan
saya juga minta feedback, bagian mana kira2 yang masih harus dipertajam.
>
>
> Aksan Kurdin
>
> ps. Sekali lagi, P. Maulana, saya minta maaf ya, mungkin anda merasa
respon saya lambat, tapi ini dibuat tersendat2, nyicil2 nyuri2 waktu. Kadang
diniatin malam pulang kerja, tapi anda maklum dah, abis makan pasti bawanya
nikmat kalau langsung tidur ... :)
>
>
> On 2/4/2010 8:34 AM, Maulana wrote:
>
> minta bantuan file ada d attch.
>
>

No comments:

Post a Comment