Berbagai macam bahasa pemrograman baik Visual Basic, C++, PHP atau Visual Foxpro membutuhkan koneksi untuk melakukan pengolahan CRUD (Create, Read, Update dan DELETE) terhadap berbagai database seperti MySQL, Oracle atau pun database yang lain.
Setiap satu perintah Query membutuhkan satu kali koneksi agar dapat dijalankan oleh mesin database (database engine). nah, untuk menghemat koneksi atau mempercepat proses tersebut, dan agar banyak perintah (query-multi-statements / QMS) dapat dijalankan dalam satu kali koneksi ke database dibutuhkan sebuah PROCEDURE yang dapat menjalankan banyak perintah dalam satu waktu (satu kali koneksi atau pemanggilan koneksi). Proses akan menjadi lebih cepat karena langsung dijalankan di engine nya.
Kode dibawah ini merupakan sebuah procedure yang saya buat pada database MySQL untuk menjalankan banyak perintah yaitu:
delimiter // CREATE PROCEDURE invoice_buat (IN asql1 TEXT,IN asql2 TEXT, IN cidlogon VARCHAR(36)) BEGIN SET @a=asql1; PREPARE bsql FROM @a; EXECUTE bsql; SET @b=asql2; PREPARE bsql FROM @b; EXECUTE bsql; INSERT INTO loguser_detail (idlogon,aud,catatan) values (cidlogon,"1",asql1); DELETE FROM jual_temp WHERE idlogon=cidlogon; END// |
perintah tersebut diatas dapat dipanggil sebagai berikut:
call invoice_buat('insert into order (noorder,idlogon) values ("123","admin")', 'insert into order_list(noorder,kdbrg,unit,harga) select "123",kdbrg,unit,harga from jual_temp where idlogon="admin"', "admin"); |
dari perintah diatas parameter asql1 digunakan untuk membuat nomor order yang baru, sedangkan parameter asql2 digunakan untuk mengisi tabel order_list, perintah delete pada prosedur berfungsi untuk menghapus file temporer berdasarkan idlogon.
Sedangkan perintah INSERT INTO loguser_detail digunakan untuk menyimpan audit trail atas semua perintah-perintah yang telah diberikan ke dalam tabel.
Jadi prosedur diatas sekali panggil / konek dapat melakukan 4 perintah sekaligus. Mudah2an dengan teknik ini bisa mempercepat lagi proses pengolahan data yang dilakukan oleh program.
Selamat mencoba.
* Dipersembahkan buat http://fox-id.org khususnya tn. Foxy dan RND.
Tambahan:
untuk odbc driver versi 5.3 ke atas agar dapat menjalankan banyak query dalam satu connect maka pada perintah connect ke databasenya ditambahkan menjadi sebagai berikut: (Microsoft Visual FoxPro)
lcl_cstr="DATABASE=mydata;SERVER=localhost;port=3306;UID=root; pwd=admin;"+; "option=67108864;DRIVER={MySQL ODBC 5.3 ANSI Driver};" |
Met Sore Pak Yanto, Maaf Kemaren Salah Forum :
mo minta tolong nih:
Koding untuk perhitungan denda berdasarkan tgl Jttempo (VFP 9)
sample case :
No_reg ! No_kwt ! Bayar ! Tgl_jt ! Tgl_byr ! Denda ! Juml_hari ! Reff
001 ! ea001 ! 200000 ! 12/10/17 ! 15/10/17 ! 0 ! 3 ! 000101
002 ! ea010 ! 150000 ! 10/08/17 ! 15/10/17 ! 66000 ! 66 ! 000102
002 ! ea011 ! 150000 ! 10/09/17 ! 15/10/17 ! 35000 ! 35 ! 000103
002 ! ea012 ! 150000 ! 10/10/17 ! 15/10/17 ! 0 ! 0 ! 000104
003 ! ea002 ! 250000 ! 02/07/17 ! 15/10/17 ! 105000 ! 105 ! 000105
004 ! ea005 ! 100000 ! 16/10/17 ! 15/10/17 ! 0 ! 0 ! 000106
dari sample case diatas hendak saya kurangkan 10% sebagai reward hasil penagihan, dengan catatan penagihan lebih dari 3 hari akan dikenakan denda 0,5% dari total bayar atau minimal 1000, bila terlambat 3bln atau lebih, bila dibayar tunggakannya sampai normal atau tanpa ada keterlambatan lagi reward diberikan kepada petugas tagihnya, koding yg saya pakai memang memberikan solusi seperti yg saya kehendaki, tapi untuk case No_reg 003 ada kendala yakni masih memberikan reward 10% dari tagihan atau sebesar 10500, padahal nasabah belum lancar dalam pembayaran atau masih ada tunggakan pembayaran selama 3 bulan.
Dari sini saya minta saran Pak Yanto Koding / Script yg benar dalam penyelesaian Masalah saya ini Pak. (alamat Email n6633cx@gmail.com)
Atas Perhatian dan saran serta masukannya saya ucapkan Terima Kasih
Ronnie – Malang
@ronnie: coba sy lihat scriptnya mungkin pada script yg anda buat ada sedikit kesalahan, karena menurut keterangan anda, semua sudah ok, hanya untuk kasus yang nomor 003 yg belum ok…
pagi Kak Yanto :
maksud saya agar terjadi pembatasan mengenai pemberian fee tagihan dengan syarat bila keterlambatan lebih dari 40 hari dan semua tunggakan terbayar normal atau lancar, tanpa ada tagihan lagi yg benar seperti apa kodingnya, selama ini saya pakai koding, dari sample chase diatas saya ambil dari dbf feetagihan :
select distinct feetagihan.no_reg, feetagihan.no_kwt, feetagihan.denda, feetagihan.juml_hari as ;
telat, val(str(0000000)) as fee from feetagihan order by feetagihan.noreg into cursor tempfee
kodingnya pengisian fee di cursor tempfee sebagai berikut :
select tempfee
do while not eof()
select feetagihan
locate for feetagihan.no_reg = tempfee.no_reg
if found()
if juml_hari = 40
replace tempfee.fee with ;
tempfee.denda * 0.1
endif
endif
fee dalam tempfee keluar semua,
terutama ** terjadi keterlambatan 3 bulan dan terbayar 1x masih ada tunggakan 2 bulan belum bayar, keluar fee 10.500, berdasarkan statement seharusnya tidak muncul (bila semua tunggakan terselesaikan maka fee bulan lalu bisa dikeluarkan / tunggakan 0)?,
di asterik * fine aja seperti yg saya harapkan kak Yanto?
Ronnie – Malang
terpotong lagi kodingnya :
select tempfee
do while not eof()
select feetagihan
locate for feetagihan.no_reg = tempfee.no_reg
if found()
if juml_hari >= 40
replace tempfee.fee with ;
tempfee.denda * 0.1
endif
endif
Yang saya inginkan pembatasan fee bila nunggak belum terbayar sampe lunas / tunggakan 0 fee bisa diberikan?
bila koding saya rubah :
select tempfee
do while not eof()
select feetagihan
locate for feetagihan.no_reg = tempfee.no_reg
if found()
if juml_hari <= 40
replace tempfee.fee with ;
tempfee.denda * 0.1
endif
endif
tunggakan di no_reg 003 memang gak muncul, kendala di No_reg 002 no_kwt ea010 gak muncul sebesar 6.600 (nasabah bayar tunggakan sampai 0 / tanpa tunggakan), Bagaimana mengatasinya kak Yanto?
dari kasus di atas, coba buatkan kolom manual di excel dengan menambahkan 1 kolom untuk fee dulu, kemudian isi manual dengan penjelasan misalkan untuk no_reg 001 berisikan 500 hal ini dikarenakan……. dst, dst sehingga bisa ditemukan pola logika yang anda inginkan. kemudian coba kirimkan ke email: ARNILA2008@GMAIL.COM
gee..thanks Kak Yanto?
coba saya bikin dulu kak? sapa tau ketemu script yg benar atas masalah saya?
udah saya kirim kak Yanto? minta Pencerahannya agar kelar nih masalah saya?
supaya tidak tampil di tempfee
maka pada baris 13-14 (perintah SQL)
DI EXCEL tambahkan saja where
WHERE BULAN.TERBAYAR<BULAN.TELAT
silahkan di coba dulu….
thankz Kak Yanto….
1 Hal Lagi? mengenai Forum Fox-id ingin jadi member koq belom di approve yach?
Kak Yanto, mohon arahan apa yang harus kita buat untuk menjalankan program single user menjadi multi user. terima kasih
script saya jalankan seperti ini Kak Yanto :
SELECT distinct ;
feetagih.no_reg, ;
feetagih.no_kwt, ;
feetagih.jum_hari, ;
feetagih.denda, ;
VAL(STR(000000000)) ;
as fee ;
FROM feetagih ;
WHERE feetagih.tgl_bayar > ;
feetagih.tgl_jt ;
ORDER BY ;
feetagih.no_reg ;
INTO CURSOR tempfee READWRITE
thisform.grid1.RecordSource = ‘tempfee’
SELECT tempfee
DO WHILE NOT EOF()
IF tempfee.jum_hari >= 4
REPLACE tempfee.fee WITH ;
tempfee.denda * 0.1
ENDIF
SELECT tempfee
SKIP
ENDDO
cursor tempfee sbb:
no_reg ! no_kwt ! jum_hari ! denda ! fee
001 ! ea001 ! 3 ! 0 ! 0
002 ! ea010 ! 66 ! 66000 ! 6600
002 ! ea011 ! 35 ! 35000 ! 3500
002 ! ea012 ! 5 ! 5000 ! 500
003 ! ea002 ! 105 ! 105000 ! 10500
no_reg 001 terlambat 3 hari koq muncul, seharusnya tidak muncul?
saya ubah lagi Seperti ini :
SELECT distinct ;
feetagih.no_reg, ;
feetagih.no_kwt, ;
feetagih.jum_hari, ;
feetagih.denda, ;
VAL(STR(000000000)) ;
as fee ;
FROM feetagih ;
WHERE feetagih.tgl_bayar = 4
REPLACE tempfee.fee WITH ;
tempfee.denda * 0.1
ENDIF
SELECT tempfee
SKIP
ENDDO
SELECT distinct ;
feetagih.no_reg, ;
feetagih.no_kwt, ;
feetagih.jum_hari, ;
feetagih.denda, ;
VAL(STR(000000000)) ;
as fee ;
FROM feetagih ;
WHERE feetagih.tgl_bayar < ;
feetagih.tgl_jt ;
ORDER BY ;
feetagih.no_reg ;
INTO CURSOR tempfee READWRITE
thisform.grid1.RecordSource = 'tempfee'
sy tambah scrip pengisian fee sbb :
SELECT tempfee
DO WHILE NOT EOF()
IF tempfee.jum_hari >= 4
REPLACE tempfee.fee WITH ;
tempfee.denda * 0.1
ENDIF
SELECT tempfee
SKIP
ENDDO
cursor tempfee menjadi seperti ini:
no_reg ! no_kwt ! jum_hari ! denda ! fee
004 ! ea005 ! 0 ! 0 ! 0
jadi bingung Kak Yanto?
padahal saya harapkan cursor tempfee sbb :
no_reg ! no_kwt ! jum_hari ! denda ! fee
001 ! ea001 ! 3 ! 0 ! 0
002 ! ea010 ! 66 ! 66000 ! 6600
002 ! ea011 ! 35 ! 35000 ! 3500
002 ! ea012 ! 5 ! 5000 ! 500
004 ! ea005 ! 0 ! 0 ! 0
@yuswan: Databasenya tradisional (*.dbf) atau menggunakan mysql. kalau tradisional yang harus diperhatikan adalah saat membuka data, saat update atau pun saat menghapus data.
kalau menggunakan mysql anda dapat membacanya di
https://play.google.com/store/books/details/ARYANTO_PEMROGRAMAN_DATABASE_MYSQL_DENGAN_MICROSOF?id=k9svDwAAQBAJ
@ronnie irawan: coba perhatikan kembali data pada jum_hari dan kriteria (where) pada saat data diload….
dear Kak Yanto?
Ada soala lagi nich? minta sample coding single query untuk mencari data yang belum tercatat di database vfp?
bentuk databasenya bayar.dbf seperti ini
no_faktur, no_reg,tanggal, tgl_jt,pokok_k, bunga_k, jum_hari
001,a0011,12/12/18,15/12/18,105000,25000,-3
002,b0111,12/12/18,12/11/18,175000,35000,30
006,c0121,12/12/18,10/10/18,300000,100000,91
010,d1101,12/12/18,25/12/18,105000,45000,-13
pertanyaannya sbb:
cara menampilkan data 003,004,005 dan 007,008,009 dalam bentuk query bagaimana, kebetulan database diatas sepenggal kejadian di periode bulan desember?
andaikata ingin melihat data yang belum tercatat mulai awal tahun 2018 s/d akhir tahun 2018, sql / query yg benar seperti apa?
dari database diatas kemungkinan besar sudah terhapus dan sudah direindex (pack data function)?
saya pake koding :
select *.bayar where not in(select no_reg.bayar, no_faktur.bayar from bayar ;
group by 1, 2 order by 1) tempbayar order by no_faktur.bayar into cursor lunas readwrite
SELECT *.bayar FROM bayar WHERE no_faktur.bayar (SELECT no_faktur.bayar, ;
no_reg.bayar FROM bayar group by 1,2 order by 1) tempbayar
saya run koq keluar error massage ?
koding saya seperti ini :
SELECT *.bayar FROM bayar WHERE no_faktur.bayar (SELECT no_faktur.bayar, ;
no_reg.bayar FROM bayar group by 1,2 order by 1) tempbayar
saya run koq keluar error massage ?
SELECT *.bayar FROM bayar WHERE no_faktur.bayar not in (SELECT no_faktur.bayar, ;
no_reg.bayar FROM bayar group by 1,2 order by 1) tempbayar
saya run koq keluar error massage ?
waduh, kok bingun uji saja yang tanggal bayar nya masih kosong berarti belum bayar, atau jumlahpembayarn kosong berarti belum bayar
select * from bayar where empty(tglbayar)
select * from bayar where jumbayar=0
dan lain-lain….
thanks kak yanto?? atas sarannya…jgn bosan2 ngajarin newbie ya?? tros belajar dan belajar mumpung forum tidak ditutup kayak fox-id…. thanks once again
@ronnie: ok sip, jangan bosan2 juga jika ada yang ingin ditanyakan, tanyakan saja… selama aq bisa jawab aq usahakan jawab….mohon maaf jika jawaban2nya kurang begitu memuaskan….