POWERBUILDER #11(menu)
PB#14 (tambahan)
Anda bisa menampilkan atau tidak window yg ada dengan mengaturnya di menu
Window spt tampak di gambar atas.
Di bahasa pemrograman lain di sebut juga project, di PB di sebut Workspace atau area
kerja kita.
Ketik nama workspace nya siswa dan saya simpan di folder c:\samplePB
Pilih target type nya, yaitu Application karena kita akan membuat aplikasi.
Klik tombol OK
Waktu anda klik di entrian bawah selanjutnya akan tampak spt ini.
Dan kalau anda lihat di direktory samplePB akan tampak spt ini :
Keterangan :
siswa.pbw adalah nama file workspacenya
siswa.pbt adalah nama file targetnya
siswa.pbl adalah nama file librarynya
Tampak window atau form yg anda buat sudah tampak di painter anda..
Klik kontrol command button spt tampak di atassampai tampil spt ini :
Pilih Static text spt tampak di gambar atas dan klik di area window/form anda spt ini :
Selanjutnya klik di area window spt ini dan atur text nya shg menjadi spt di bawah.
Untuk title/caption window nya sendiri anda klik di area kosong window dan ganti tiltle
nya :
Selanjutnya double click di tombol Close untuk mengisi click eventnya spt ini :
Anda ketik close(parent) yg artinya menutup parent dari tombol itu ..parent adalah
tempat tombol berada dg arti lain window itu.
Untuk kembali ke desain window tadi klik page/tab/frame Layout spt tampak di
gambar di bawah.
Spt ini
Selanjutnya untuk memanggil form ini pada saat aplikasi jalan pertama kali.
Double klik di object aplikasi siswa dan ketik koding spt berikut :
Catatan :
Dalam koding command button Close di window w_utama bisa anda ganti menjadi
close(w_utama) karena nama window itu adalah w_utama
Klik tombol close atau klik icon save untuk menyimpan project ini :
Selanjutnya klik menu Run di atas serta klik .Full Build Workspace spt ini
Untuk selanjutnya jika anda mau implementasi atau install di client cukup file
siswa.exe, file siswa.pbd dan file2 runtime PB nya yg anda sertakan.
Dalam PB #2 ini anda akan belajar membuat window type mdi! dan cara membuat
menu, buka workspace yg pernah anda buat di latihan PB #1 :
Rancangan aplikasi yg akan di buat nantinya adalah berupa aplikasi dg layar utama dan
ada menu untuk menjalankan window/form/modul entri yg ada.
Jadi tidak spt waktu latihan 1st di PB #1 yg tampil hanya berupa window tunggal saja.
Tipe data window utama untuk aplikasi dan bersifat spt screen, di PB dikenal sebagai
type window mdi! (multiple document interface)
Sebuah type window mdi!, type window ini sendiri harus memiliki menu
Ok sebelum anda tambah bingung..ikuti saja langkah2 berikut.
Membuat MENU :
Klik tombol New pilih tab PB Object pilih Menu dan klik tombol OK
Klik kanan pada text untitled0 spt ini dan klik Insert Submenu Item
Tanda & pada nama2 menu di gunakan sbg shortcutsehingga bisa di panggil dengan
menekan ALT+F
Klik kanan di &File dan klik Insert Submenu Item untuk membuat sub-menunya
Selanjutnya buat menu item lain dg cara klik kanan &File dan klik spt di bawah ini..
Dan buat sub-menu Transaksi serta menu item berikutnya sehingga hasilnya spt ini
Yap..sukses.
Note :
Menu-menu di atas belum berisi command/koding, sehingga jika anda klik menu Exit
pun window/aplikasi tdk akan Close atau Exit
Note :
m_file.m_exit artinya m_exit (E&xit) merupakan sub-menu dari m_file (&File)
Pada saat anda klik menu Exit maka akan keluar pertanyaan spt ini
Jika anda klik tombol Yes maka sistem akan HALT alias berhenti atau close(nilai
return valuenya 1, kalo 2 adalah No perhatikan susunan YesNo! yes=1 ..no=2)
Untuk latihan berikut ini Anda siapkan database sekolah dengan table tblsiswa di
mysql anda, adapun struktur tablenya spt ini :
1. nis char(8)
2. nama varchar(50)
3. kota varchar(15)
4. tgllhr date
5. jkel char(1)
6. tabungan float(10,0)
Note :
sekolah adalah nama databasenya
guzrud adalah nama servernya, sesuaikan dg nama server anda
root adalah id standard koneksi ke mysql nya
Commit on Disconnect jangan di centang !
Klik tombol Copy untuk mengcopy listing profile koneksinya.(perhatikan kalo copy
listing tersebut masih dlm kondisi ter-blok spt tampak di gambar atas)
Gunanya untuk apa ?! nanti anda tahu
Yap.sukses. !!
Klik tombol OK..
Selanjutnya untuk keluar dari modul profile ini klik tombol OK lagi
Dalam open event nya di atas command open(w_utama) klik kanan mouse dan
paste listing kode profile koneksinya .shg hasilnya spt ini( jadi tahu kan kenapa
tadi anda diminta untuk click tombol Copy lihat hal. 4)
Note :
connect; adalah perintah untuk konek ke database sesuai listing SQLCA nya
jika SQLCA.SQLDBCode bernilai selain 0 (nol) maka koneksi gagaljika koneksi gagal
maka sistem close.
SQLCA sendiri di PB adalah sebuah object dg type Transaction yg berfungsi
menangani koneksi ke database, SQLCA di deklarasikan sbg variable yg bersifat global
dan merupakan object standard PB untuk koneksi ke database.
Simpan perubahan yg terjadi ini akan terpakai pada saat pembuatan datawindow, ada
di sample berikutnya
Sample kali ini adalah membuat modul entry untuk data siswa.
Modul ini berupa window dgn beberapa tombol dan datawindow sbg interface datanya.
Datawindow sendiri berfungsi sbg display, serta memungkinkan user untuk
memanipulasi, update data dan informasi yg lain.
Window sendiri dalam hal ini berfungsi sbg tempat datawindow tersebut.
Jadi kalo digambarkan akan memiliki urutan sb :
Data Datawindow Window
Note :
Allow Updatesnya sudah di centang
Table to Updatenya sudah benar
Updateable Columnsnya sudah benar
Unique Key Column(s)nya juga sudah benar sesuai primary key mysql sbg databasenya.
Begitu juga klausa dan key modifikasinya juga sudah benar.
Klik datawindow dw_entri_siswa yg ada di system tree dan drag ke window.spt ini
Name control datawindow ini adalah dw_1 .nama ini bisa anda ganti sesuai
keinginan andasementara kita pakai dw_1 dulu..
Note :
dw_1 adalah nama dari kontrol datawindownya spt yg dijelaskan di atas
setTransObject(SQLCA) berfungsi untuk memberikan sepisifikasi object transaksi yg di
pergunakan, dalam hal ini adalah SQLCA.
retrieve() adalah perintah untuk SELECT (table/view) atau EXEC (store procedure).
Note :
Jka update() sukses, return value =1 maka commit jika tidak akan di rollback atau di
kembalikan spt keadaan sbl proses editing.
Double click tombol Delete dan ketik koding berikut(untuk hapus data)
if messagebox("Hapus Data","Anda Yakin ?",Exclamation!,YesNo!,2)=2 then return -1
if dw_1.rowcount()>0 then
dw_1.deleterow(0)
dw_1.setfocus()
if dw_1.update()=1 then
commit;
messagebox('Info..','Penghapusan Sukses !',information!,ok!)
Note :
deleterow(0) berfungsi untuk menghapus row aktif.
Double click tombol Close dan ketik koding berikut(untuk close window)
close(parent)
Note :
getrow() berfungsi untuk mengecek row aktif di datawindow .jika = 1 artinya di row
pertama.
scrolltorow(1) artinya mengeser pointer ke record/row 1
Double click tombol < dan ketik koding berikut(untuk ke row sebelumnya)
if dw_1.getrow() = 1 then
messagebox(":)","Data pertama !",Information!,Ok!)
else
dw_1.scrollpriorrow()
end if
Note
scrollpriorrow() untuk menggeser pointer ke row sebelumnya
Double click tombol > dan ketik koding berikut(untuk ke row berikutnya)
if dw_1.getrow() =dw_1.rowcount() then
messagebox(":)","Data terakhir !",Information!,Ok!)
else
dw_1.scrollnextrow()
end if
Note :
scrolltorow(jml row datawindow) artinya sama juga ke row terakhir
Selanjutnya double click menu Entri &Siswa dan ketik koding untuk memanggil
window w_entri_siswa spt ini
Note :
Membuka window w_entri_siswa sbg sheet atau lembar kerja yg bernaung di bawah/di
dalam window w_utama.
Angka 2 menunjukkan nomor menu item yg diasosiasikan dg sheet yg di buka.
original! menandakan window di open sesuai ukuran aslinya.
(anda bisa melihat detail penjelasan di help PB.blok command yg ingin dilihat detail
helpnya dan tekan tombol Shift + F1)
Begitulah tampilan sheet/window entri anda..jika data sudah ada klik tombol
Retrieve untuk menampilkan data yg pernah di entri.
Klik tombol ADD isi data spt ini dan klik tombol Update
Dari system tree double click window entri siswa w_entri_siswa shg tampak spt ini
Dan rightclick di area datawindow control nya.shg tampak spt berikut
Paling atas adalah design layout dari datawindownyaspt anda pernah buat
Bawahnya adalah preview dari datawindownya
Sedang yg paling bawah adalah list dari field2 databasenya.
Tekan dan tahan tombol control dan klik text keterangan dari field2 yg ada spt ini
Selanjutnya coba click area kosong dari datawindow anda dan klik lagi text Tgllhr :
seperti ini :
Ganti Text yg ada dg Lahir : saja.shg tampak spt ini dan hasilnya.
Anda coba ubah Jkel : menjadi Sex : shg tampak spt ini hasil akhirnya.
Selanjutnya rapikan dan rapatkan item2 atau field yg ada di situspt ini :
Serta rapatkan band detail anda ke atas.klik mouse dan geser ke atas spt ini :
Okclose painter editing datawindow ini dan jgn lupa save perubahan yg ada.
Anda juga bisa atur border/borderstyle datawindow control nya shg menjadi spt ini :
Dengan demikian sample make-up text, control field, window dan datawindow control
sudah selesai
Anda bisa coba sendiri dg efek bold, italic dan warna sesuai selera anda .
Jalankan aplikasi anda dan buku sheet/window entri data siswa spt ini
Klik data di nis dan tekan tombol ENTER ! Apa yg terjadi ?!
Selanjutnya anda bisa mengetik koding di dalam event ue_tombol ini.(ingat nama ini
bebas ya.tdk harus ue_tombol, justru yg penting adalah Event ID nya.
lb_enter =keydown(keyenter!)
lb_dwnrow =keydown(keydownarrow!)
lb_uparrow =keydown(keyuparrow!)
li_column_number =dw_1.getcolumn()
li_column_count =integer(dw_1.object.datawindow.column.count)
first_column =1
if keyflags=0 then
if lb_enter or lb_dwnrow then
if li_column_number=integer(dw_1.object.datawindow.column.count) then
dw_1.setcolumn(first_column)
else
dw_1.setcolumn(li_column_number + 1)
end if
elseif lb_uparrow then
if li_column_number=1 then
dw_1.setcolumn(integer(dw_1.object.datawindow.column.count))
else
dw_1.setcolumn(li_column_number - 1)
end if
end if
elseif keyflags=1 then
if lb_uparrow then
if li_column_number=integer(dw_1.object.datawindow.column.count) then
dw_1.setcolumn(first_column)
else
dw_1.setcolumn(li_column_number + 1)
end if
elseif lb_enter or lb_dwnrow then
if li_column_number=1 then
dw_1.setcolumn(integer(dw_1.object.datawindow.column.count))
else
dw_1.setcolumn(li_column_number - 1)
end if
end if
else
return 0
end if
Keterangan :
Keyflags = 0 artinya tanpa ada penekanan tombol kombinasi dg tombol function lain.
Keyflags = 1 ada penekanan tombol dg Shift
Keyflags = 2 ada penekanan tombol dg Ctrl
Keyflags = 3 ada penekanan tombol dg Shift + Ctrl
Keyflags = 4 ada penekanan tombol dg Alt dst-nya.
Keydown berfungsi untuk menentukan tombol apakah yg di tekan user.
Keydown(enter!) artinya jika/apakah yg di tekan ENTER..
Selanjutnya..
if lb_enter or lb_dwnrow then
// apakah yg di tekan enter atau panah bawah ?
if li_column_number=integer(dw_1.object.datawindow.column.count) then
// jika posisi kolom aktif = kolom terakhir/jml kolom
dw_1.setcolumn(first_column)
// posisi pointer kembali ke kolom pertama
else
dw_1.setcolumn(li_column_number + 1)
// jika tidak maka jalankan pointer ke kolom berikutnya
end if
elseif lb_uparrow then
// jika yg di tekan tombol panah atas
if li_column_number=1 then
// jika di posisi kolom 1 (pertama)
dw_1.setcolumn(integer(dw_1.object.datawindow.column.count))
// jalankan pointer di kolom terakhir
else
dw_1.setcolumn(li_column_number - 1)
// jika tdk di posisi terakhir maka jlnkan pointer ke kolom sblm nya
end if
end if
Note :
Lalu apakah kita harus membuat event ini di semua datawindow ? Yap benar
Tidak efisien dong kalo hrs ketik koding lagi ? Benar sekali
Coba jalankan aplikasi dan buka sheet entri data siswaspt ini
Klik di kolom Nama dan coba tekan tombol ENTER atau panah atas/bawah
Dan coba juga dikombinasikan dg tombol Shift
Perhatikan..
int li_column_number,li_column_count
first_column jgn disertakan di dlm koding inisbg ganti kita sudah buat di argument
name-nya.
lb_enter =keydown(keyenter!)
lb_dwnrow =keydown(keydownarrow!)
lb_uparrow =keydown(keyuparrow!)
li_column_number =dw_1.getcolumn()
li_column_count =integer(dw_1.object.datawindow.column.count)
if isnull(first_column) then
first_column =1
end if
if keyflags=0 then
if lb_enter or lb_dwnrow then
if li_column_number=integer(dw_1.object.datawindow.column.count) then
dw_1.setcolumn(first_column)
else
dw_1.setcolumn(li_column_number + 1)
end if
elseif lb_uparrow then
if li_column_number=1 then
dw_1.setcolumn(integer(dw_1.object.datawindow.column.count))
else
dw_1.setcolumn(li_column_number - 1)
end if
end if
elseif keyflags=1 then
if lb_uparrow then
if li_column_number=integer(dw_1.object.datawindow.column.count) then
dw_1.setcolumn(first_column)
else
dw_1.setcolumn(li_column_number + 1)
end if
elseif lb_enter or lb_dwnrow then
if li_column_number=1 then
dw_1.setcolumn(integer(dw_1.object.datawindow.column.count))
else
dw_1.setcolumn(li_column_number - 1)
end if
end if
else
return 0
end if
return 1
Untuk fungsi yg lain cara pembuatannya sama, tinggal sesuaikan parameter yg ada.
Coba jalankan dan buka sheet entri data siswa anda spt ini.
Perhatikan di MenuName isi dg menu sheet nya.dan simpan/save perubahan form ini
Pada saat modul sheet entri data siswa di jalankan akan tampak spt ini
Langkah selanjutnya ?
1. Membuat event untuk retrieve, add, update, delete, close, top, prior, next dan bottom.
2. Mengisi event2 tersebut dg koding spt yg ada di tombol2 itu
3. Delete semua tombol yg adakrn sudah tdk kita pakai lagi
4. Isi koding di menu sheet anda untuk menjalankan koding yg ada di sheet/window
Isi ue_update :
if dw_1.update()=1 then
commit;
messagebox('Info..','Penyimpanan Sukses !',information!,ok!)
else
rollback;
messagebox('Info..','Penyimpanan Gagal !',information!,ok!)
return
end if
Isi ue_close :
close(this)
Isi ue_top :
if dw_1.getrow() = 1 then
messagebox(":)","Data pertama !",Information!,Ok!)
else
dw_1.scrolltorow(1)
end if
Isi ue_prior :
if dw_1.getrow() = 1 then
messagebox(":)","Data pertama !",Information!,Ok!)
else
dw_1.scrollpriorrow()
end if
Isi ue_next :
if dw_1.getrow() =dw_1.rowcount() then
messagebox(":)","Data terakhir !",Information!,Ok!)
else
dw_1.scrollnextrow()
end if
Isi ue_bottom :
if dw_1.getrow() = dw_1.rowcount() then
messagebox(":)","Data terakhir !",Information!,Ok!)
else
dw_1.scrolltorow(dw_1.rowcount() )
end if
Perlu saya jelaskan juga bahwa logika tombol pada dasarnya sama juga dg apa yg pernah
saya berikan samplenya untuk aplikasi developer yg lain
Begitu juga koding yg ada masih dpt dikembangkan, semisal untuk data master detail.
Ok ..saya harapkan anda tekun dan teliti serta jgn patah semangatitu lah yg akan
membawa anda ke level selanjutnya dan level yg tak akan anda duga nantinya
(jgn lupa perbanyak doa dan rasa syukur kepada Nya)
Latihan kali ini kita akan mencoba membuat sample untuk entri sheet master detail,
atau header detail.
Maka di perlukan 2 table lagi spt ini (untuk mySQL saya pake myISAM) :
Master tblhujian dg key nis
Pilih Quick Select .terus perhatikan Retrieve on Preview tdk usah di centang
maksudnya apa.agar pada waktu window tercipta tdk langsung tampil di preview
Mengapa ? Jika data kosong no problem tapi kalo data anda jutaan maka anda harus
nunggu preview selesai dulu setiap kali anda modifikasi datawindow itu.
Bagaimana jika untuk nis saya ingin tampilkan nama siswa jadi bukan nis nya.
Atau dg kata lain dlm bentuk combobox
Untuk membuat combobox yg me-refer ke data lain di PB anda harus membuat suatu
datawindow baru yg diistilahkan dropdown datawindow
Nah krn data nis ini nanti me-refer dari data tblsiswa maka waktu membuat
drowdown datawindow kita memakai data dari tblsiswa tersebut.
Coba save dulu window yg baru saja anda buat ini dg nama dw_entri_h_ujian
Selanjutnya buat window baru, langkahnya sama dg cara di atas hanya anda pilih type
window tabular.
Dengan sumber data tblsiswa dan di ambil kolom nis dan nama spt ini :
Anda tarik band header ke atas dg mouse anda, sehingga judul kolom tertutup (atau anda
hapus dan tarik band header ke atas jg boleh).
Rapikan shg menjadi spt ini.(kasih jarak sedikit di bagian bawah detail)
Jika ada datanya klik tombol retrieve.jika belum klik tombol new
Selanjutnya mari kita buat detail nya berdasar table tbldujian di bawah :
Untuk table yg memakai key auto_increment atau key yg tercreate otomatis maka
Identity Column: nya harus di isi sesuai kolom-nya.
Selanjutnya buat Retrieval Arguments dg klik tombol shg tampli spt ini :
Modul ini meminta anda untuk memasukkan value sesuai type data argument-nya.
Lalu apakah waktu aplikasi jalan akan selalu tampil modul di atas ? Mengganggu dong ?
Modul di atas tidak akan tampil krn sewaktu kita retrieve datawindow tsb kita sertakan
langsung value argumentnya spt ini : dw_2.retrieve(001)
Note :
Kenapa retrieval argument harus di buat ?
Yapsekenarionya spt ini.data master detail terdiri atas 2 datawindow.
Pertama atau yg di atas (spt yg telah anda buat berdasar artikel #9a) adalah data master.
Yg kedua atau yg bawah adalah data detailnya.
Asumsinya beginisetiap data master digeser ke data/row untuk siswa yg berbeda maka
data detail akan mengikuti/berisi dg data detail yg sesuai dg masternya.
Nah untuk memfilter data detail ini agar sesuai dg data masternya di perlukanlah
retrieval argument di datawindow detailnya.
Jadi retrieval arguments sama dg filter ? Tidak juga krn PB mengenal filter sendiri.
Jika anda perhatikan di sheet anda sekarang sudah ada 2 datawindow untuk master dg
nama dw_1 dan detail dg nama dw_2.
Selanjutnya buka event OPEN dan modifikasi kodingnya spt ini :
dw_1.setTransObject(SQLCA)
dw_2.setTransObject(SQLCA)
dw_1.retrieve()
dw_2.setrowfocusindicator(hand!)
Note :
Semua datawindow harus sudah di set transaksi objectnya dg SQLCA
Setrowfocusindicator(hand!) untuk menampilkan penunjuk row berbentuk tangan/jari
telunjukmmm nanti anda bisa melihatnya sendiri
Note :
Getrow dan rowcount dipakai untuk memastikan bahwa data window tdk dlm kondisi
kosong.
Acceptext() berfungsi untuk menyimpan isi data baris aktif pada kontrol datawindow ke
dlm buffer kontrol datawindow. Jika fungsi ini tdk di jalankan maka baris aktif adalah
baris aktif sebelumnya.
string ls_nis
dw_2.retrieve(ls_nis)
Note :
Rowfocuschanged diperlukan jika user mengeser row master/header maka detail akan di
retrieve sesuai key relasinya. Perhatikan koding dw_2.retrieve(ls_nis)
Ls_nis sendiri diambil dari data nis yg ada di dw_1.
Perhatikan koding ini ls_nis=dw_1.getitemstring(dw_1.getrow(),"nis")
Inilah kenapa di awal tadi kita harus membuat retrieval arguments di datawindow detail.
dw_1.accepttext()
string ls_nis
ls_nis=dw_1.getitemstring(dw_1.getrow(),'nis')
dw_2.scrolltorow(dw_2.insertrow(0))
dw_2.setcolumn(3)
dw_2.setfocus()
dw_2.setitem(dw_2.getrow(),'nis',ls_nis)
Note :
Agar setiap data detail yg ditambahkan terelasi dg data masternya maka di datadetail
harus di set/simpan data key relasi yaitu berupa data nis
Perhatikan koding ini dw_2.setitem(dw_2.getrow(),'nis',ls_nis)
dw_2.setcolumn(3) kenapa 3 ? Betul krn kolom pelajaran adalah kolom urutan ke 3 yg
ada di tbldujian
Ok..selanjutnya coba jalankan aplikasi anda .dan buka sheet master detailnya spt ini :
Masih seputar sheet master detail, coba anda buka event ue_delete modifikasi koding
deletenya dg koding berikut agar detailnya jg ikut terhapus :
if dw_1.rowcount()=0 or dw_1.getrow()=0 then return
if messagebox("Hapus Data","Anda Yakin ?",Exclamation!,YesNo!,2)=2 then return
dw_1.accepttext()
string ls_nis
ls_nis=dw_1.getitemstring(dw_1.getrow(),'nis')
dw_1.deleterow(0)
dw_1.setfocus()
if dw_1.update()=1 then
commit;
delete from tbldujian where nis=:ls_nis ;
messagebox('Info..','Penghapusan Sukses !',information!,ok!)
else
rollback;
messagebox('Info..','Penghapusan Gagal !',information!,ok!)
return
end if
Note :
Perhatikan cara penulisan SQL Command untuk delete nya.
delete from tbldujian where nis=:ls_nis ;
(ditulis dg memakai : titik dua setelah tanda sama dengan dan setiap perintah SQL ini
agar di jalankan selalu diakhiri dg tanda ; titik koma)
Note :
Anda jg bisa tambahkan horizontal scrollbar jika datawindow anda lebar.
Hal ini jg bisa anda terapkan untuk dropdown datawindow anda.
Berikutnya saya akan memberikan sample yg menarik, coba buka sheet ujian spt ini :
Dalam kondisi data sudah terisi spt tampak di sheet atas.seharusnya combo untuk nama
siswa terproteksi atau disable artinya tdk memberikan kesempatan user untuk
merubahnya krn ini menyangkut primary key-nya.
Sekarang coba kita bikin suatu kesalahan editing misalnya dg mengganti nama siswa di
atas dg nama lain yg sebenarnya data itu jg sudah pernah di entrikan.
Coba nama Rudy anda ganti menjadi Tini dan save perubahan ituapa yg terjadi ?
Tampak modul error dari odbc mysql-nya yg menyatakan adanya duplikasi entri
Lalu coba anda lihat lagi apakah data dg nama siswa Rudy tersebut masih ada ?
Ternyata sudah tidak ada !! Kenapa ?
Close aplikasi anda dan coba modifikasi datawindow dw_entri_h_ujian
Setelah itu coba lihat Update Properties nya tampak spt ini :
Cara PERTAMA :
Dengan menganti rule update di atas dg memilih Use Update di key modificationnya.
Klik OK dan save kembali datawindow anda dan coba kembali kasus spt di atas tadi.
Krn data Rudy sudah terhapus coba input ulang lagi untuk latihan kali ini.
Detailnya tdk usah di entri kembali, krn untuk kasus di atas yg terhapus hanya data di
masternya alias tblhujian nya.
Sekarang coba anda lakukan langkah penggantian nama siswa yg notabene sudah pernah
di inputkan spt di hal. 3 dan save.
Apa yg terjadi ? Tampak pesan errornya tetapi data siswa Rudy tdk terhapus !!
Benarkah ? Coba klik tombol Retrieve ..yap data masih spt semula
Semoga anda bisa mengambil kesimpulan dari contoh kasus di atas.amien.
Cara KEDUA :
Modifikasi datawindow master anda serta klik kolom nis
Setelah itu di propertiesnya klik icon warna merah di kanan tulisan Protect spt tampak
pada gambar di atas.
Note :
Properties Protect berfungsi untuk melakukan proteksi terhadap kolom yg ada dengan
nilai true/1 atau false/0.
Untuk kasus di atas jika row/kolom bukan kolom baru maka kolom tersebut akan di
protect/disabled. Dengan kata lain kolom hanya enabled jika pada saat row baru atau
pada saat penambahan data baru.
Sekarang jika anda klik combo nama siswa tersebut tidak akan bisa dlm kondisi data
sudah ada spt tampak di gambar atas
Coba jalankan aplikasi anda dan buka sheet entri data siswa nya spt ini :
Modul datawindow error ini masih standar dengan informasi sesuai informasi error yg
dikeluarkan oleh odbc mysql nya.
string ls_pesan,ls_kodeerror
ls_kodeerror="("+string(kodeerror)+")"
if kodeerror=1062 then
ls_pesan=ls_kodeerror+' Data pernah di entri !'
messagebox(judul,ls_pesan,Information!,Ok!,1)
elseif kodeerror=1048 then
ls_pesan=ls_kodeerror+ ' Kode kosong !'
messagebox(judul,ls_pesan,Information!,Ok!,1)
elseif kodeerror=1027 then
ls_pesan=ls_kodeerror+' Data sedang di edit user lain !'
messagebox(judul,ls_pesan,Information!,Ok!,1)
else
ls_pesan=ls_kodeerror+pesan
messagebox(judul,ls_pesan,Information!,Ok!,1)
end if
return 1
Selanjutnya save dan coba jalankan serta buka sheet entri data siswaanda coba kembali
entri dg nis yg sama spt di atas (hal. 1)
Tampak pesan error yg tampil adalah pesan error yg telah anda definisikan di fungsi
f_dberror tadi.
if dw_1.update()=1 then
ls_nis=dw_1.getitemstring(dw_1.getrow(),'nis')
if isnull(ls_nis) then
messagebox('Info..','Data tdk boleh kosong !',information!,ok!)
return
else
commit;
messagebox('Info..','Penyimpanan Sukses !',information!,ok!)
end if
else
rollback;
messagebox('Info..','Penyimpanan Gagal !',information!,ok!)
return
end if
Sample di atas hanya mengecek 1 kolom null atau tidakuntuk kolom2 yg lain silahkan
di coba sendiri..
Sekarang jika data kosong anda save akan keluar pesan spt ini :
Perhatikan ada penambahan item menu Edit , Window dan Help yg penting adalah
Edit dan Window dlm kaitannya dg konsep MDI.
Kemudian untuk koding click event dari masing2 sub-menu item Window adalah sbb :
Clicked event Tile Vertical : w_utama.ArrangeSheets ( Tile! )
Clicked event Tile Horizontal : w_utama.ArrangeSheets ( TileHorizontal! )
Clicked event Layer : w_utama.ArrangeSheets ( Layer! )
Dengan koding clicked event yg sama dg menu sheet yg pernah anda buat.
Jangan lupa di propertiesnya untuk menu Window dan Edit dicentang visible dan
enabled nya.
Lakukan juga untuk sheet w_entri_ujian dan jangan lupa di save perubahan itu.
Sekarang coba jalankan aplikasi anda .
Anda lihat daftar sheet yg aktif ada di menu Transaksi bagaimana jika kita ingin
letakkan di menu Window ?
Caranya mudah ubah saja clicked event di menu yg menjalankan masing2 sheet dari
koding spt ini :
opensheet(w_entri_siswa,w_utama,2,original!)
menjadi spt ini..
opensheet(w_entri_siswa,w_utama,5,original!)
Tambahan..
Coba cek di target untuk event open kodingnya spt ini :
// mztolo 260106
// Profile sekolah
SQLCA.DBMS = "ODBC"
SQLCA.Lock = "RU"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DRIVER={MySQL ODBC 3.51 Driver};DESC=;
DATABASE=sekolah;SERVER=guzrud;UID=root;PASSWORD=;
PORT=3306;OPTION=3;STMT=;'"
connect ;
if SQLCA.SQLDBCode<>0 then
messagebox('Koneksi Gagal',SQLCA.SQLErrText,stopsign!)
halt close
end if
open(w_utama)
Note :
Mungkin anda pernah ketemu penulisan spt ini connect using sqlca ;
Kenapa di atas hanya di tulis connect ; saja tanpa statement using sqlca ?
Pada dasarnya default transaksi koneksi adalah SQLCA maka penulisan connect ; saja
sudah cukup, pemakaian using sqlca jika adanya lebih dari 1 transaksi koneksi.
Sehingga kita harus menjelaskan secara detail ke sistem koneksi yg mana yg dipakai.
Semoga ini bisa menambah pemahaman anda..amien
Selanjutnya anda tarik band header ke bawah untuk mengetik judul laporan tersebut
shg menjadi spt ini :
Dan blok serta geser ke bawah judul kolom yg tampak masih di atas.mjd spt ini :
Ganti value text dengan SMA 1 SUNTER dan perhatikan perubahan di detailnya
Buat lagi text judul yg lain dan rapikan dg menggeser-geser dg mouse sehingga hasilnya
akan menjadi spt ini :
Sekarang jika anda klik kanan dan retrieve di previewnya akan tampak spt ini :
Anda perhatikan nilai tabungan masih polos belum ada pemisah di nilai ribuannya
Sekarang mari kita kasih format untuk memberikan tanda pemisah ribuan.
Pertama klik kolom tabungan di detail dan ubah propertie nya spt ini :
Jangan lupa format display-nya di setting juga agar pemisah ribuan-nya ada
Note :
Tampak di koding itu spt biasa akan di set transaksi object nya.
Selanjutnya di retrieve data-nya dan tampilkan data secara print preview
Bagiamana jika ingin mencetak dari kode sekian s/d kode sekian ?
Bagaimana jika ingin merubah ukuran kertas dan jenis printer ?
Bagaimana jika ingin outputnya ke FILE ?
Bagaimana jika ingin mencetak dari halaman sekian s/d halaman sekian ?
Bagaimana jika ingin mencetak 2 copies ?
Bagaimana jika ingin mencetak dg besar 1 kali dari besar normal ?
Note :
Ada tambahan 5 radio button
1 checkbox
1 tombol preview (jadi sekenarionya nanti kita tdk mau data langsung tampil spt sample
sebelumnya, tetapi user hrs klik tombol preview dahulu)
Terus ubah lebar window menjadi = 4078 dan tinggi = 2748
Ubah juga lebar datawindow menjadi = 3941 dan tinggi = 1976
Judul dan icon window/sheet silahkan juga kalo mau di ubah
Kemudian hapus koding yg ada di event Open agar datawindow tdk langsung
retrieve atau di tampilkan.
Coba klik datawindow dw_1 dan hapus dataobject dw_lap_tabungan spt ini :
Note :
Perhatikan dw_1 adalah nama kontrol datawindow yg ada di window/sheet
Isi dataobject-nya pada saat klik tombol ini dg perintah dw_1.dataobject= .
Selanjutnya spt biasa set transaksi objectnya, retrieve dan preview-kan.
Note :
Perintah2 yg berhubungan dg preview dapat diterapkan/dijalankan jika datawindow
ada di posisi preview juga.
Untuk mengetahui atau mendapatkan indormasi apakah datawindow dlm kondisi
preview dipakai perintah describe
Selanjutnya mari kita buat range untuk mencetak kode nis sekian s/d sekian.
Tambahkan 2 buah SingleLineEdit kontrol spt ini :
kode1 =righttrim(sle_1.text)
kode2 =righttrim(sle_2.text)
dw_1.dataobject='dw_lap_tabungan'
dw_1.settransobject(sqlca)
dw_1.setfilter(dwfilter)
dw_1.filter()
dw_1.retrieve()
dw_1.object.datawindow.print.preview='yes'
Note :
Ntuk kasus ini saya berikan sample dg perintah FILTER
Anda bisa lihat cara memasukkan data nis ke variable yg ada (kode1 dan kode2),
begitu jg cara menyiapkan variablenya.
Selain itu perhatikan validasi untuk pengecekan apakah kode1 dan kode2 ada isi-nya.
Begitu juga dg cara penulisannya untuk variable setfilter yaitu dwfilter
Setelah itu agar filter jalan atau dilakukan maka lakukan setfilter sbg kondisinya dan
lakukan filter untuk datawindow tersebutdan retrieve tentunya.
Jika setfilter diisi variable yg kosong ( dwfilter= ) maka filter tdk akan berlaku atau
berarti data akan ditampilkan semua.
Paper Orientation ini mengacu pada properti datawindow di tab Print Specifications :
Adapun isi koding untuk event click radiobutton Default adalah spt ini :
if dw_1.describe('datawindow.print.preview')='yes' then
dw_1.Object.DataWindow.Print.orientation = 0
dw_1.Modify(' datawindow.paper.orientation = 0')
end if
Dan jika anda cetak maka akan tercetak secara Landscape juga.
Note :
Jika anda hanya ingin menampilkan secara preview saja maka cukup dg perintah ini :
dw_1.Object.DataWindow.Print.orientation = 1
Tetapi jika anda ingin perubahan di preview itu juga agar sama hasilnya di cetakan
berupa landscape maka di tambahkan perintah ini :
dw_1.Modify(' datawindow.paper.orientation = 1')
Note :
Perhatikan masih sama konsepnya yaitu dg memberikan modify kepada datawindow.
Modify ini bisa sekaligus banyak, atau dg kata lain datawindow bisa di modifikasi dg
perintah2 secara bersamaan.
Note :
Pertama kita akan mengetahui default row dari datawindow preview aktif ini ada
dihalaman berapa (tentunya sesuai dg ukuran kertas yg telah di setting).
Selanjutnya sama.modify juga.
Note :
Perhatikan datawindow akan dicetak sesuai data nomor halaman yg di entrikan di
SingleLineEdit (sle_3.text)
Contoh pengisiannya :
5 artinya halaman 5 saja
1-5 artinya halaman 1 s/d 5
1,4 artinya halaman 1 dan 4 saja
1,3,5-12 artinya halaman 1,3 terus 5 s/d 12
Untuk EditMask Copies tdk perlu ada koding ..hanya saja koding di click event tombol
Print anda ubah menjadi spt ini :
if dw_1.describe('datawindow.print.preview')='yes' then
dw_1.Modify(" datawindow.print.copies ='"+em_1.text +"'")
dw_1.print()
end if
Note :
Em_1.text adalah nama dari object/control EditMask Copies
Jadi user diberikan kesempatan untuk menulis nama file nya serta lokasi tempat file itu
akan di simpan.
Dan ini :
Note :
Untuk kedepannya sebaiknya window preview dibuat 1 khusus dan bisa dipakai untuk
semua preview laporan yg ada di aplikasi.
Setting print spt paper orientation, page range dll. bisa dibuatkan sheet tersendirijadi
tdk menggabung spt itu.
Memang langkah2 yg saya berikan berurutan dan satu demi satu agar rekan2 lebih mudah
memahami dan mengerti
Dan ini :
Klik OK..
Retrieve on Preview jika tdk anda centang maka datawindow akan ter-create tanpa
langsung menampilkan/preview data yg ada.
(seandainya data anda ribuan/milyaran dan harus preview maka akan memakan waktu)
Selanjutnya klik NEXT
Pilih table tbldujian dan pilih kolomnya spt tampak di gambar bawah ini
Klik dan tahan pakai mouse kolom nis dan drag ke tempat sebelah kanan spt ini :
Untuk membuat baris ke dualetakkan pointer di belakang kata SISWA dan tekan
Ctrl+Enter.dan tulis SMA 1 SUNTER spt ini :
Anda perhatikan total untuk per group dan untuk summary sudah ada dan data
ditampilkan group berdasar nis.
Selanjutnya jika anda perhatikan data di atas belum informatif.artinya itu nilai ujian
untuk siswa bernama siapa ? dengan pengawas siapa ?
Lalu caranya bagaimana ? Okmari kita tambahkan nama pengawasnya..
Dan pilih/klik Select Tables.. sampai keluar modul untuk memilih table yg lain spt ini :
Double klik tanda = spt tampak di gambar atas.sampai tampil spt ini :
Ok selanjutnya kita tambahkan nama siswa dg mengambil kolom dari table tblsiswa.
Langkahnya sama dg menekan tombol
Dan dari datawindow painter anda bisa klik kanan atau menekan icon spt ini :
Perhatikan judul kolom di pindah di header per-group dan tanggal dipindah ke footer.
Untuk centering judul anda bisa lakukan spt ini :
Klik judul di atas dan pilih Center di properti alignment-nyashg hasilnya spt ini :
Selanjuntya coba tambahkan line di atas dan bawah dari total per groupnya spt ini :
Upppsss.ada yg salah.. ?
Yap. itu rata2 tetapi kok rumusnya SUM bagaimana nih ?
Anda tinggal edit di propertisnya menjadi AVG
Untuk rata2 per group spt ini avg(nilai for group 1)
Untuk rata2 semua ubah menjadi spt ini avg(nilai for all)
Jangan lupa format untuk kedua nya pakai ###.00
kode1 =righttrim(sle_1.text)
kode2 =righttrim(sle_2.text)
dw_1.dataobject='dw_lap_ujian'
dw_1.settransobject(sqlca)
dw_1.setfilter(dwfilter)
dw_1.filter()
dw_1.retrieve()
dw_1.object.datawindow.print.preview='yes'
Setelah membaca sample 12(e) mungkinkah ada timbul pertanyaan dalam benak anda ?
Apakah setiap proses cetak harus memerlukan masing2 1 window/sheet cetak.
Jadi kalo ada proses cetak 10 maka perlu juga 10 sheet preview ?
Sedangkan jika kita lihat semua koding sama dan hanya 1 perbedaan yaitu tentang
datawindow object-nya saja.
Ok ..benar sekali kenapa kita tidak membuat atau cukup 1 sheet preview saja ?
Artinya sheet preview tersebut harus bisa menerima parameter untuk object datawindow
yg berbeda. Jika PB bisa.tentunyalalu dg perintah apa ?
Untuk membuka sheet biasa anda memakai ini :
opensheet(w_lap_tab,w_utama,5,original!)
Ok sebelum kita melangkah lebih jauh coba buka/modify sheet w_lap_tab dan save as
dengan nama w_preview.
w_preview inilah yg akan kita pakaiwindow preview yg sudah anda buat biarkan
saja sbg dokumentasi anda untuk belajar.
Selanjutnya di click event masing2 menu cetak coba anda ganti dg perintah2 ini :
Untuk laporan data siswa..
OpenSheetWithParm(w_preview,dw_lap_tabungan,w_utama,5,original!)
Untuk laporan per group ..
OpenSheetWithParm(w_preview,dw_lap_ujian,w_utama,5,original!)
kode1 =righttrim(sle_1.text)
kode2 =righttrim(sle_2.text)
dw_1.dataobject=ls_nama_window
dw_1.settransobject(sqlca)
dw_1.setfilter(dwfilter)
dw_1.filter()
dw_1.retrieve()
dw_1.object.datawindow.print.preview='yes'
Penjelasan.
Perhatikan perubahan koding di click event tombol PREVIEW di atas.
Terutama yg saya ketik dg warna merah..
Pertama spt biasa anda siapkan variable untuk tempat nama datawindow itu
string ls_nama_window
Setelah itu store data sesuai yg dilewatkan parameter dg perintah ini
ls_nama_window = Message.StringParm
Dan anda isikan dataobject untuk dw_1 dengan perintah ini..
dw_1.dataobject=ls_nama_window
Dengan demikian w_preview sudah bisa anda pakai untuk type cetakan laporan
tabungan dan daftar nilai ujian.
Hebatnya lagi capture parameter itu bisa dilakukan di koding sebuah click event tombol.
Jadi tdk harus anda set di open event sheet.atau event lain yg running atau dijalankan
waktu sheet pertama kali ditampilkan.
Bagaimana jika data hasil store parameter itu mau kita pakai disemua event sheet ?
Karena kalo spt sample di atas itu hanya bisa dipakai di event click tombol PREVIEW
saja.
string ls_nama_window
Terus capture datanya anda ketik di open event dari sheet tersebut spt ini :
ls_nama_window = Message.StringParm
kode1 =righttrim(sle_1.text)
kode2 =righttrim(sle_2.text)
dw_1.dataobject=ls_nama_window
dw_1.settransobject(sqlca)
dw_1.setfilter(dwfilter)
dw_1.filter()
dw_1.retrieve()
dw_1.object.datawindow.print.preview='yes'
Note :
Perintah di atas dipakai untuk membuka 2 window yaitu w_pre1 dan w_pre2 dari
type window/sheet yg sama yaitu w_preview
Dengan cara di atas barulah di mungkinkan untuk membuka sheet preview secara
bersamaan dari 2 atau lebih laporan yg ada.
Tampak di gambar bawah isi click event menu lap data nilai ujian siswa :
Kalo kita perhatikan mungkin ini adalah layout favorite anda..ada system tree nya ada
paint untuk datawindow..nama2 kolomnya dan tentunya properties
Tapi mungkin karena suatu hal maka.tampilan berantakan spt ini
Selanjutnya klik icon nomor 2 dari kiri. New Layout sampai tampil spt ini
Mmmmm..bedakan ?!
Lalu bagaimana jika kita maunya invisible tetapi tetap tampil di waktu desainnya
Caranya adalah. Klik menu DESIGN -> SHOW INVISIBLES
Nah pada saat membuat sheet atau modul yg lain..jgn lupa simpan di library
transaksi.pbl tersebut.