Share this topic on FacebookShare this topic on MySpaceShare this topic on Del.icio.usShare this topic on DiggShare this topic on StumbleUponShare this topic on TwitterShare this topic on GoogleShare this topic on Yahoo

Author Topic: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT  (Read 630 times)

0 Members and 1 Guest are viewing this topic.

Offline onytoo

  • Fox-id M.V.P
  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 45
  • Posts: 230
MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« on: March 05, 2010, 07:42:13 AM »
Seperti kita ketahui, VFP menggunakan dua metoda pembacaan/penulisan dari/ke database dengan
menggunakan SPT. Yaitu metoda synchronous dan asynchronous.

Dengan metoda synchronous VFP tidak mengembalikan kontrol ke aplikasi sebelum proses pembacaan/
penulisan selesai dikerjakan, sedangkan metoda asynchronous VFP akan mengembalikan kontrol ke
aplikasi segera setelah membaca/menulis sebagian data dilakukan.

Nah, metoda yang bisa kita gunakan untuk menampilkan progressbar pada saat query dengan SPT adalah
dengan metoda asynchronous.
Ketika SQLEXEC() dipanggil, hanya bagian-perbagian record yang akan proses.

Perhatikan contoh kode dibawah ini:


* buka koneksi database
m.lnHandle = SQLSTRINGCONNECT(m.lcConnectionString)

IF m.lnHandle >= 0

  * sebelum melakukan pembacaan data,
  * cek dulu jumlah record yang akan dibaca dalam mode synchronous
 
  SQLSETPROP(m.lnHandle, "Asynchronous", .F.)
  SQLSETPROP(m.lnHandle, "BatchMode", .T.)
  SQLEXEC(m.lnHandle, "SELECT COUNT(*) FROM mst_bank")
 
  m.lnRecCount = VAL(Count___)
 
  * reset nilai di objek progressbar
  thisform.oleProgress.value = 0
  thisform.lblCount.Caption = ''

  * set ke mode Asynchronous
  SQLSETPROP(m.lnHandle, "Asynchronous", .T.)
  SQLSETPROP(m.lnHandle, "BatchMode", .F.)
 
  * lakukan pembacaan data
  SQLEXEC(m.lnHandle, 'select * from mst_bank order by 1', 'csrbank')
 
  * karena metoda asynchronous, SQLEXEC akan membaca/menulis record sebagai "AS NEEDED",
  * kita tidak bisa menggunakan fungsi RECCOUNT() untuk mengambil jumlah record yang
  * sudah dibaca, karena RECCOUNT() akan menjadikan SQLEXEC sebagai "NEEDED" dan akan
  * membaca seluruh record pada tabel sama seperti mode synchronous
  * jadi disini kita akan mendeteksi secara manual jumlah record yang dibaca dengan perintah
  * SCAN..ENDSCAN
 
  SCAN
   
    m.lnRecno = RECNO()
    m.lnIndex = INT((m.lnRecno / m.lnRecCount) * 100)
    thisform.oleProgress.value = m.lnIndex
    thisform.lblCount.Caption = "Record #" + TRANSFORM(m.lnRecno) + " dari " + TRANSFORM(m.lnRecCount)
   
  ENDSCAN

  * CATATAN:
  * untuk membuktikan keterangan sebelumnya, anda bisa menukar kode SCAN..ENDSCAN diatas dengan:
  *   m.lnIndex = INT((RECCOUNT() / m.lnRecCount) * 100)
  *   thisform.oleProgress.value = m.lnIndex
  * (tanpa menggunakan SCAN..ENDSCAN) dan perhatikan apa efeknya
 
  * seluruh record sudah dibaca?
  IF EOF()
    SQLCANCEL(m.lnHandle)
    SQLDISCONNECT(m.lnHandle)
    GO TOP
  ENDIF
     
ENDIF


Agar lebih kelihatan prosesnya, coba lakukan pembacaan terhadap tabel dengan jumlah record yang
cukup besar.

Memang diakui bahwa proses pembacaan akan lebih lambat, di kompi saya (AMD Athlon64 X2 4800+, 2.4GHz
RAM 4GB, WinXP Pro SP3) memerlukan waktu sekitar 0.7 detik untuk melakukan pembacaan 18.000 record
(dari localhost) menggunakan kode diatas.
Tabel yang dibaca:
mst_bank dg struktur
1. id (varchar 10, primary index)
2. nama (varchar 40)
3. cabang (varchar 40)
4. id_kota (varchar 10)
5. unit (varchar 40)

Tapi setidaknya kita telah memanfaatkan teknik 'Progressive Fetching' seperti yang di terangkan VFP
(lihat 'Speeding Up Data Retrieval' di VFP help).


OK. cukup dulu sampai disini, memang tidak sempurna dan maaf kalau ada kesalahan atau kekurangan.
Semoga bermanfaat bagi kita semua.

Offline aris_ah

  • Junior Member
  • *
  • Thank You
  • -Given: 3
  • -Receive: 2
  • Posts: 207
    • http://www.indosmartsys.com
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #1 on: March 05, 2010, 09:01:21 AM »


Mantabs....   tipsnya....

Offline armen

  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 10
  • Posts: 161
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #2 on: March 05, 2010, 09:24:50 AM »
Nice tips....
Pak sony, iko ambo tambah pointnyo

Offline onytoo

  • Fox-id M.V.P
  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 45
  • Posts: 230
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #3 on: March 05, 2010, 09:30:22 AM »
he..he..he
ternyata 'armen' itu adalah alias dari 'armen_sakti'

mau jadi nubi lagi da?

Offline armen

  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 10
  • Posts: 161
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #4 on: March 05, 2010, 09:30:46 AM »
Anyway ketika Read/Write record pake SPT(), pada Main Windows VFP Statusbar ada Counter Recrod yang telah di Read/Write. Apa tidak bisa di trap counter tersebut?
Quote from: VFP Help
SET TALK ON | OFF | WINDOW [WindowName] | NOWINDOW

Parameters
ON
........<skip>
WINDOW [ WindowName]

WindowName specifies a user-defined window to which talk is directed. You must create the user-defined window before directing talk to it. Talk is directed to the Visual FoxPro system window if the window you specify doesn't exist.


Kemungkinan progressbar bisa di Show pada Defined Window, kiranya akan lebih cepat prosesnya

Hehehehe....saya cuma berandai-andai aja pak Sony

Offline armen

  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 10
  • Posts: 161
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #5 on: March 05, 2010, 09:32:58 AM »
he..he..he
ternyata 'armen' itu adalah alias dari 'armen_sakti'
mau jadi nubi lagi da?


Benar pak Saya sudah Reinkarasi lho hahahaha

Offline onytoo

  • Fox-id M.V.P
  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 45
  • Posts: 230
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #6 on: March 05, 2010, 09:39:52 AM »
Anyway ketika Read/Write record pake SPT(), pada Main Windows VFP Statusbar ada Counter Recrod yang telah di Read/Write. Apa tidak bisa di trap counter tersebut?
Quote from: VFP Help
SET TALK ON | OFF | WINDOW [WindowName] | NOWINDOW

Parameters
ON
........<skip>
WINDOW [ WindowName]

WindowName specifies a user-defined window to which talk is directed. You must create the user-defined window before directing talk to it. Talk is directed to the Visual FoxPro system window if the window you specify doesn't exist.


Kemungkinan progressbar bisa di Show pada Defined Window, kiranya akan lebih cepat prosesnya

Hehehehe....saya cuma berandai-andai aja pak Sony


Ya..ya.. saya juga sudah memikirkan dan mencoba hal itu pak armen, hasilnya NIL!!!!
saya jadi bingung sendiri kenapa windownya gak muncul2, dikasih ACTIVATE WINDOW sih muncul tapi messagenya yg gak muncul ke window tsb. Nyerah deh!

atau ada triknya pak? bagi dong.....  :icon_biggrin:



Offline armen

  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 10
  • Posts: 161
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #7 on: March 05, 2010, 09:43:42 AM »
Lhaaa....jangan patah smagat pak,
kan ada
ACTIVATE WINDOW WindowName1 [, WindowName2 ...]
| ALL   [IN [WINDOW] WindowName
lanjutkan nanti sy tambah point lagi hehehe
« Last Edit: March 05, 2010, 09:46:07 AM by armen »

Offline taz

  • Administrator
  • Hero Member
  • *
  • Thank You
  • -Given: 10
  • -Receive: 31
  • Posts: 2503
  • Do SEARCH berfore post guys!
    • http://fox-id.com
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #8 on: March 05, 2010, 09:47:55 AM »
GREAT TIPS, walau sedikit ada breakdown, tapi mungkin di pengembangan selanjutnya peformanya bisa dioptimalkan.
jadi pengen riset di topic ini  :icon_study:
« Last Edit: March 05, 2010, 10:13:37 AM by taz »
- Fox-id.org is KiOSS Project exclusive member -


Offline onytoo

  • Fox-id M.V.P
  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 45
  • Posts: 230
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #9 on: March 05, 2010, 09:55:28 AM »
ini menurut sepengetahuan saya lho pak,

message record counter yg ditampilin di statusbar itu bisa dihilangkan dengan:
SET NOTIFY CURSOR OFF

nah kl seandainya ada yg memberi perintah tersebut alhasil kita tidak bisa lagi 'menikmati' counternya,
bukan begitu?

Offline armen

  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 10
  • Posts: 161
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #10 on: March 05, 2010, 10:02:32 AM »
lcSet = SET("Notify")
SET NOTIFY ON
......
<TRAP Counter>
.....
SET notify (lcSet)

Bisa gak

Offline onytoo

  • Fox-id M.V.P
  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 45
  • Posts: 230
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #11 on: March 05, 2010, 10:09:23 AM »
lcSet = SET("Notify")
SET NOTIFY ON
......
<TRAP Counter>
.....
SET notify (lcSet)

Bisa gak


barusan tak coba lagi: ni codingnya

m.lnHandle = SQLSTRINGCONNECT(m.lcConnectionString)
IF m.lnHandle > 0
DEFINE WINDOW wCounter AT 0,0 SIZE 10,50 IN SCREEN
ACTIVATE WINDOW wCounter
SET NOTIFY ON
SET TALK  WINDOW wCounter
=SQLEXEC(m.lnHandle, 'select * from mst_bank order by 1', 'csrbank')
SQLDISCONNECT(m.lnHandle)
ENDIF

gak ngaruh pak armen  ???

..., walau sedikit ada breakdown, tapi mungkin di pengembangan selanjutnya peformanya bisa dioptimalkan.
...


Yup! sudah pasti breakdown om taz....
Tapi tidak tertutup kemungkinan adanya peningkatan performa, mungkin dengan mengubah beberapa setingan
SQL property OR something, who knows?

Saya pribadi berharap ada diantara sekian banyak member fox-id selain saya yg mau mencoba mengembangkan dan menemukan TOP PERFOM -nya ya?

Semoga....  :thumbsup:

Offline armen

  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 10
  • Posts: 161
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #12 on: March 05, 2010, 12:15:29 PM »
Quote from: onytoo
......... di kompi saya (AMD Athlon64 X2 4800+, 2.4GHz
RAM 4GB, WinXP Pro SP3) memerlukan waktu sekitar 0.7 detik untuk melakukan pembacaan 18.000 record
(dari localhost) menggunakan kode diatas.
..............


Wah spek kompi gini untuk 18rb record 0.7 dt sangat lemot tuh...

Ini sy beri trik Tune-up agar ngacir

Yang Ini kurang optimal scriptnya

SCAN   
    m.lnRecno = RECNO()
    m.lnIndex = INT((m.lnRecno / m.lnRecCount) * 100)
    thisform.oleProgress.value = m.lnIndex
    thisform.lblCount.Caption = "Record #" + TRANSFORM(m.lnRecno) + "     dari " + TRANSFORM(m.lnRecCount)
   
ENDSCAN

Saran saya jangan show progres per Record, tapi show progres per 0.1 dt ato milisecond aja, saya yakin pak onytoo paham maksud sy....
Silahkan di modify lagi

upss.....jumatan dulu ah....

Offline onytoo

  • Fox-id M.V.P
  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 45
  • Posts: 230
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #13 on: March 05, 2010, 06:57:22 PM »
Saran saya jangan show progres per Record, tapi show progres per 0.1 dt ato milisecond aja, saya yakin pak onytoo paham maksud sy....


Hmm... maksudnya dikasih timer gitu pak?
saya dah coba saran pak armen, tapi tetap saja perintah SCAN..ENDSCAN yg harus dipakai, karena kalau tanpa
perintah itu, gak jalan saya gak tau kenapa,
beberapa perintah yg saya coba:
1.  SELECT COUNT(*) FROM csrbank WHERE thisform.UpdateProgress()
2.  COUNT WHILE thisform.Updateprogress() TO nID

 ... masih lelet


setelah saya ubah coding seperti ini:

....
CURSORSETPROP("FetchSize", 200, 'csrbank')
m.lnRec = 0
SCAN
  m.lnRecNo = RECNO()
  m.lnRec = m.lnRec + 1
  IF m.lnRec == 200
    m.lnRec = 0
    m.lnIndex = INT((m.lnRecNo / m.lnRecCount) * 100)
    .oleProgress.value = m.lnIndex
    .Label1.Caption = "Record #" + TRANSFORM(m.lnRecNo) + " dari " + TRANSFORM(m.lnRecCount)
  ENDIF
ENDSCAN
...

baru sedikit ada perubahan, jadi sekitar 0.5 dt,
fetchsize dg nilai yg lebih besar sdh dicoba, gak terasa perubahaannya

ada sugesti dari rekan-rekan?


Offline armen

  • Junior Member
  • *
  • Thank You
  • -Given: 7
  • -Receive: 10
  • Posts: 161
Re: MENAMPILKAN PROGRESSBAR SAAT QUERY DENGAN SPT
« Reply #14 on: March 05, 2010, 09:21:29 PM »
Quote from: onytoo
Hmm... maksudnya dikasih timer gitu pak?
saya dah coba saran pak armen, tapi tetap saja perintah SCAN..ENDSCAN yg harus dipakai, karena kalau tanpa
perintah itu, gak jalan saya gak tau kenapa,


He..he..he nah yang ini namanya salah tangkap, show progress per 0.1 ato milisecond tidak perlu dikasih timer tapi pake funciton SECOND() sebelum prosess, dan dalam looping gunakan kondisi untuk show progress per waktu gitu pak.

Jadi kira2 gini :

* Code UNTEST
........
........
lnStarTime = SECOND()
SCAN
    IF SECOND() - lnStarTime >= 0.1  && jika mau per 1/10 dt ato 0.5 juga boleh terserah aja
        lnStarTime = SECOND()         && Reset StarTime
        m.lnRecno = RECNO()
        m.lnIndex = INT((m.lnRecno / m.lnRecCount) * 100)
        thisform.oleProgress.value = m.lnIndex
        thisform.lblCount.Caption = "Record #" + TRANSFORM(m.lnRecno) + " dari " +             TRANSFORM(m.lnRecCount)
    ENDIF
ENDSCAN
......
......

Jadi kelemahan kode anda disana tadi setiap counter 1 record slalu Send Info to Progresbar padahal perobahan 1 record dari 18rb record itu tidak significan....


Maaf kalo sala salah kasih bahasa tersirat,
Urang Padang itu biasonyo ALUN TAKILEK LAH TAKALAM, tapi pak onytoo lain
ALUN TAKILEK LAH TAKILIA...
hehehe

Silahkan dibenahi lagi, laurnya spt diatas tapi
Follow members gave a thank to your post:
« Last Edit: March 05, 2010, 09:28:04 PM by armen »