Author Topic: perintah set filter to  (Read 19110 times)

0 Members and 1 Guest are viewing this topic.

Offline Leon2

  • Junior Member
  • *
  • Posts: 305
  • Jelajahi Fox World U'll Be Happy n Rich
Re: perintah set filter to
« Reply #15 on: April 10, 2009, 01:59:07 AM »
@Armen Sakti :
Maaf Pak saya modif dikit, krn SELECT * FROM curTest WHERE ( cKondisi ) di tempat saya tidak menghasilkan data seperti yang seharusnya. :icon_salut:

@All :
Silahkan di coba dengan data tabel dan cursor (Note : 'CHR 13'-nya jgn lupa di betulin dulu yah masih eror juga samapi saat ini)

Code: [Select]
*------------------------------------------
SET decimal TO 3
SET SAFETY OFF

CLOSE TABLES

CREATE CURSOR curSQL ( ID_ n( 10 ), Remark c( 20 ), timestamp c( 30 ) )
CREATE CURSOR curFil ( ID_ n( 10 ), Remark c( 20 ), timestamp c( 30 ) )
FOR i = 1 TO 100000
INSERT INTO curSQL VALUES ( i, SYS( 2015 ), TRANSFORM( DATETIME() ) )
ENDFOR
SELECT CurSQL
COPY TO DTSQL && agar bisa diakses via fisik dbf

FOR i = 1 TO 100000
INSERT INTO curFil VALUES ( i, SYS( 2015 ), TRANSFORM( DATETIME() ) )
ENDFOR
SELECT CurFil
COPY TO DTFil && agar bisa diakses via fisik dbf

MESSAGEBOX( 'Saatnya melakukan Perbandingan kecepatan Filter vs Query' )

*-- Test waktu dengan Set Filter
nSec = SECONDS( )
*USE DtFil && Gunakan ini utk tabel data
SELECT CurFil && Gunakan ini untuk cursor
SET FILTER TO MOD(ID_,125)=0
BROWSE NOWAIT
nSecFilter = SECONDS( ) - nSec

*-- Test Waktu dengan Query masih dengan kondisi yang sama
nSec = SECONDS ()
*SELECT * FROM DtSQL WHERE MOD(ID_,125)=0 NOWAIT && Gunakan ini utk tabel data
SELECT * FROM CurSQL WHERE MOD(ID_,125)=0 NOWAIT && Gunakan ini untuk cursor
nSecQuery = SECONDS( ) - nSec

*-- Perbandingan waktu
cSelisih =  TRANSFORM( nSecQuery - nSecFilter )
MESSAGEBOX('Waktu Filter : '+TRANSFORM(nSecFilter)+ CHR 13 + 'Waktu Query : ';
+TRANSFORM( nSecQuery )+ CHR 13 + 'Filter lebih cepat '+cSelisih+' dari Query ')
*------------------------------------------
« Last Edit: April 10, 2009, 02:06:44 AM by Leon2 »
Kasih Sayang Tanpa Kekuatan Adalah Kelemahan
Kekuatan Tanpa Kasih Sayang Adalah Kezaliman
Cinta Itu Buta Tapi Lebih Buta Orang Yang Tidak Kenal Cinta

Offline armen_sakti

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 1.254
Re: perintah set filter to
« Reply #16 on: April 10, 2009, 04:23:14 AM »
@Leon,

Terima kasih atas keikutan nimbrungnya, sebenarnya ini adalah masalah kecil yaitu pemahaman Bagaimana Syntax yang kita tulis dikerjakan oleh Engine VFP. Setelah saya run code modifikasi dari mas Leon, rupanya sangat perlu juga saya tambahkan sedikit lagi pemahaman Syntax terhadap perlakuan atau Tugas yang dikerjakan Engine VFP

1. SET FILTER TO [KONDISI FILTER]
Perintah ini tidak menghasilkan apa2 hanya menyiapkan saringan saja, belum ada hasil apa2. Itu makanya terlihat Waktu yang dibutuhkan nol ( 0 ), begitu VFP menemukan perintah berikutnya yaitu BROWSE NOWAIT, barulah saringan tadi bekerja memilih record yang memenuhi syarat untuk lewat saringan. Dengan BROWSE NOWAIT barulah membutuhkan WAKTU untuk menyaring.

2. SELECT FIELD_LIST FROM TABLE WHERE [KONDISI FILTER] -> QUERY
Kalo Syntax ini memerintahkan Engine VFP menyiapkan saringan dan langsung menyaring dan selanjutnya di tampung pada ember..eh tabel/Cursor yang juga ditulis secara fisik ke Harddisk. Jadi pada Syntax Query ini VFP bekerja 3x.

Gitu mas Leon sebagai kesimpulannya.

Other Case,
Kode modify dari mas Leon, setelah saya pelajari dan diRUN dan saya coba switching tanda Remark ( * ), untuk melihat perbedaan yang terjadi, rupanya terilat kalo Cursor hampir 2x lebih cepat dari Tabel. Nah itu juga tidak tepat cara perbandingannnya mas, jadi gini:

- USE DtFil && Gunakan ini utk tabel data
Itu gimana VFP bekerja? Sudah jelas kerja VFP 2x, yaitu
   1.) Memebuka tabel dari fisik Harddisk
   2.) membentuk Work Area Recordset

- SELECT CurFil && Gunakan ini untuk cursor
  Nah kalo ini artinay cursor curFil sudah terbuka dan recordset berada pada Work Area sebelumnya, jelas itu hanya 1x Perintah VFP yaitu menindahkan foucus recordset ke Area curFil

Jadi seolah olah pake tabel juga lebih lambat dari cursor, padhal tidak begitu contras, hanya saya yang tertanam di pikiran sebagian Fox-er saat ini kalo tabel ditulis secara fisik, sedangkan Cursor tidak. Tetapi baik Tabel ataupun Cursor adalah dimensi Recordset yang sama2 ditulis VFP secara fisik pada Harddisk.
Maaf kalo salah tolong di koreksi

Offline armen_sakti

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 1.254
Re: perintah set filter to
« Reply #17 on: April 10, 2009, 04:28:51 AM »
Oh ya lupa ini gambar hasi test:

Offline nestorbj

  • Junior Member
  • *
  • Posts: 134
    • http://
Re: perintah set filter to
« Reply #18 on: April 10, 2009, 04:27:12 PM »
Jadi seru rupanya. ::)
Sekali lagi semuanya ini masalah pilihan pribadi.

Pak David Mustakim bisa paham betul apa yg saya maksud.

Saya juga tdk membantah apa yg dikatakan mas Armen Sakti, cuma memang beda topik. Pembahasannya jadi bergeser  8)

Cuma yg perlu kita ingat tujuan kita adalah bagaimana bisa membantu menyelesaian suatu masalah dgn cara yg terbaik. Untuk itulah kita gabung di forum ini.

 Remember ... the FOX will be with you ... always *

Offline Leon2

  • Junior Member
  • *
  • Posts: 305
  • Jelajahi Fox World U'll Be Happy n Rich
Re: perintah set filter to
« Reply #19 on: April 10, 2009, 04:50:58 PM »
@p.Armen :
Quote
...makanya terlihat Waktu yang dibutuhkan nol ( 0 )...

Coba Bapak non aktifkan/rubah coding 2 baris terakhir menjadi :
Code: [Select]
*use in select( 'curTest' )
*use in select( 'curQryResult ')

lalu coba kita browse data yg aktif di data session, harapan saya p.Armen menemui hasil yang sama dengan yg saya coba menurut saya itulah kenapa jadi 0 dan bukan 0,XXX ( :icon_biggrin: toh hasilnya tetap saja membuktikan bahwa filter lbh cepat untuk kasus seperti dalam coding p.Armen)

Saya suka :
Quote
.. seolah olah pake tabel juga lebih lambat dari cursor, padhal tidak begitu contras, hanya saya yang tertanam di pikiran sebagian Fox-er saat ini kalo tabel ditulis secara fisik, sedangkan Cursor tidak. Tetapi baik Tabel ataupun Cursor adalah dimensi Recordset yang sama2 ditulis VFP secara fisik pada Harddisk...

@p.Armen & p.David :
Saya setuju dengan pendapat p.Armen untuk satu kasus tertentu (set filter bisa lebih cepat dari Query/VFP SQL) akan tetapi saya juga setuju untuk pendapat p.David untuk kasus yang berbeda (jaringan apalagi aplikasi integrated), yang pada intinya saya lebih menghindari 'set filter' krn aplikasi yang saya buat lebih ke kasus p.David, bukan berarti saya tidak mengakui bukti dari p.Armen (hanya berusaha membuat lebih proporsional saja), harapan saya bahwa kita semua bisa menyadari bahwa kalau vendornya saja masih mempertahankan suatu commmand itu karena ada alasan yang mungin saat ini belum kita ketahui , semua tinggal masalah waktu.... dan ini salah satunya keuntungan yang bisa kita ambil bersama  antara penjelasan p.Armen & p.David bahwa performance 'set filter' tidak seburuk yang disangkakan selama ini namun tidak berarti juga lebih cepat untuk kasus2 filtering yang lain karena kembali lagi tujuan kita buat cuci muka atau mengisi bak air mandi.  :icon_salut:

Hal positif yang bisa saya ambil dari p.nestorbj adalah pertanyaan-nya masih bersifat umum tanpa deskripsi yang lebih spesifik sehingga memunculkan dua opini yang menurut saya dua2-nya benar sesuai dengan latar belakang contoh masing2.

@All :
Mohon dimaafkan kalau ada hal2 yang tidak berkenan  :icon_biggrin:


« Last Edit: April 10, 2009, 05:01:09 PM by Leon2 »
Kasih Sayang Tanpa Kekuatan Adalah Kelemahan
Kekuatan Tanpa Kasih Sayang Adalah Kezaliman
Cinta Itu Buta Tapi Lebih Buta Orang Yang Tidak Kenal Cinta

Offline armen_sakti

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 1.254
Re: perintah set filter to
« Reply #20 on: April 10, 2009, 09:06:30 PM »
Maaf, Karena saya tidak pandai menerangkan maksud dengan cermat, maka saya kutip ini, dan tidak ada lagi argumen saya selanjutnya.
Quote from: 'from VFP Help'
- SET FILTER TO [lExpression] [IN nWorkArea | cTableAlias]
Specifies a condition that records in the current table must meet to be accessible.
Once SET FILTER is issued, only the records that satisfy the condition specified by the logical expression lExpression are available in the table. All commands that access the table respect the SET FILTER condition. A separate filter can be set for every open table.
The condition specified by SET FILTER isn't evaluated until the record pointer is moved in the table.

Tidak ada dari kalimat yang saya kutip diatas bahwa SET FILTER ibarat mengambil air/data dengan GAYUNG/alat, tetapi 'Specifies a condition that records in the current table' menyiapkan saringan untuk menyaring air/data dalam bak/tabel. Beda lho Mengambil air dengan Gayung akhirnya mendapatkan segayung air, tetapi menyiapkan saringan air belum mendapatka air.

Jadi SET FILTER TO itu hanya Menetapkan suatu kondisi Record didalam tabel sekarang untuk dapat diakses, aias belum melakukan proses penyaringan, sehingga waktu proses = 0. Proses penyaringan dilakukan jika di BROWSE, barulah ada waktu proses.

Quote from: 'from VFP Help'
- SQL SELECT....
Retrieves data from one or more tables. When you use SQL SELECT to create a query, Visual FoxPro parses the query and retrieves the specified data from the tables. You can create a SQL SELECT query from the Command window, in a Visual FoxPro program, or using the Query Designer. Please review the Considerations for SQL SELECT Statements help topic for more information on using SQL SELECT.

Nah dari kutipan diatas sudah jelas bahwa SELECT - SQL Melakukan Retrieves data dari satu atau beberapa tabel, sudah pasti melakukan proses dan hasilnya sudah jelas berupa air/data dalam wadah baru, tidak bisa kita ketahui cara mengambil air pake gayung atau ember, tetapi bisa kita lakukan penyaringan air/data dahulu sebelum dimasukan kewadah baru tersebut.

Kesimpulan saya gini:
SET FILTER
SET PATH
SET DATE
SET APA SAJA
Semua SET tersbut tidak melakukan kerja tapi menetapkan properties/sifat untuk dikerjakan, maka waktu proses = 0
Tetapi jika SET FILTER di lanjutkan dengan BROWSE NOWAIT, artinya menampilkan semua yang disaring tersebut tetapi tidak terbentuk tabel baru.
Sedangkan SELECT...FROM...WHERE... INTO CURSOR/TABLE/ARRAY dilanjutkan BROWSE NOWAIT artinya melakukan pengambilan data tertentu/disaring kemudian ditempatkan pada media baru cursor/tabel/array

Masa mo dibandingkan lambat mana menetapkan dengan melakukan ? ya ga cocok dongk. Dengan memahami kedua perbedaan diatas baru kita dapat memilih Instuksi mana yang lebih tepat digunakan sesuai kondisi keberadaan data local atau remote.

Hikmah perbedaan pandangan ini adalah untuk mencapai optimasi penyusunan code program.
Jika yang saya tulis semua adalah benar itu berasal dari referensi yang saya kutip, tetapi jika tulisan saya tersebut salah, itu merupakan kelemahan saya dalam memahaminya, mohon maaf jika ada yang tidak berkenaan.
« Last Edit: April 10, 2009, 09:09:40 PM by armen_sakti »

Offline davidmustakim

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 14.053
  • Awas ya...
Re: perintah set filter to
« Reply #21 on: April 10, 2009, 09:12:38 PM »
.... akan tetapi saya juga setuju untuk pendapat p.David untuk kasus yang berbeda (jaringan apalagi aplikasi integrated), yang pada intinya saya lebih menghindari 'set filter' krn aplikasi yang saya buat lebih ke kasus p.David, bukan berarti ....
Teknologi "Client-Server" yang sangat diakui dunia muncul dari kenyataan bahwa pada umumnya aplikasi masa-kini ber-interaksi dengan sumber data yang sangat besar dan dinamis dimana data berubah cepat dalam hitungan persekian detik (contoh paling sederhana misalnya data penjualan di swalayan besar dengan puluhan kasir pada jam sibuk). Mem-filter cursor statis (hasil select di RAM yang berumur "bahkan baru" beberapa detik lalu) dianggap tidak memadai terutama kalau untuk dasar perhitungan. Bila alternatifnya mem-filter terhadap sumber data langsung, maka untuk mengeksekusi refresh filter  VFP perlu menarik seluruh data yang sangat besar itu dari server ke pc client, melalui kabel jaringan yang dalam kasus nyata/real-life juga sedang dipakai oleh users lain. Pembebanan media jaringan ini bahkan terjadi ber-ulang2 saat event refresh grid otomatis berlangsung. Bayangkan akibatnya bukan hanya pada data kita melainkan juga pada jaringan / kepentingan user lain.

Sebaliknya: select-sql atau parameterized view ~ "client-server" memroses request data di sisi server dan mengirim melalui kabel/lainnya hanya set data yang dimintamenjamin 2 hal:
(1) traffic rendah / = cepat,  dan
(2) data yang disajikan selalu terkini

Test @armen diatas hanya membentuk data kecil 5MB statis dan berada/ditulis ke PC klien,. Jalur data adalah bus-mainboard pc user sendiri, bukan kabel jaringan yang sedang dipakai bersama users lain.  Kasus beda/tidak relevan!.  Saya hanya bicara kasus nyata / real-life @Leon2, sampel statis tidak!

Kapan pak David diberitauhu maksud tesebut oleh nestorbj? Wah kok ga di post langsung ya di forum?
Sama seperti @Leon2,  nggak perlu diberitahu ya udah harus tahu aja, entah sebagian orang emang lain.

« Last Edit: April 11, 2009, 06:02:38 AM by davidmustakim »

Offline Leon2

  • Junior Member
  • *
  • Posts: 305
  • Jelajahi Fox World U'll Be Happy n Rich
Re: perintah set filter to
« Reply #22 on: April 10, 2009, 11:52:14 PM »
@All :
*)The condition specified by SET FILTER isn't evaluated until the record pointer is moved in the table.  :icon_thumleft: (seperti yang p.Armen kutip dari Help)
   
Quote
*-- Test waktu dengan Set Filter
cKondisi = MOD( ID_,125 ) = 0
nSec = SECONDS( )
SET FILTER TO ( cKondisi )
*COPY TO ADDBS( GETENV( "TEMP" ) ) + SYS ( 2015 ) + '.tmp'
nSecFilter = SECONDS( ) - nSec

Ini sebabnya kenapa hasilnya 0 krn tidak ada perintah penggerakan record pointer sama sekali untuk curTest (diantara baris 'set filter' dengan 'nSecFilter') sehingga syntax filter hanya menjadi sebuah command penegasan saja sedangkan proses filter itu sendiri tidak pernah terjadi.

Selain BROWSE (untuk mengerakkan record pointer) kita juga bisa pake SKIP atau GO TOP atau GO BOTTOM agar perintah filter dapat diproses (di help tidak disebutkan bahwa proses penyaringan dilakukan jika di BROWSE barulah ada waktu proses :icon_salut:, sama seperti bahwa 'SET FILTER' ibarat mengambil air/data dengan GAYUNG/alat tidak saya temukan di file help  :icon_thumleft:)

Jadi saya tegaskan bahwa saya tidak percaya kalau filtering 100.000 record dengan 'Set filter' adalah 0 detik tapi saya percaya  kalau Set Filter memang lebih cepat dari Select Command (untuk kasus dari  contoh coding p.Armen)

Mohon maaf kalau salah interprestasi , karena saya masih harus banyak belajar dari senior2 sekalian apalagi bahasa inggris saya hanya pas2-an saja :icon_salut:

@Armen & David :
Terima kasih Bapak2 sudah memberi masukan kepada teman2 dan saya, berkat besar bagi saya dan secara komunitas adalah suatu hal yang indah dan positif yang bisa saya peroleh di forum ini.  :icon_salut: :icon_salut: :icon_salut:
« Last Edit: April 11, 2009, 12:24:43 AM by Leon2 »
Kasih Sayang Tanpa Kekuatan Adalah Kelemahan
Kekuatan Tanpa Kasih Sayang Adalah Kezaliman
Cinta Itu Buta Tapi Lebih Buta Orang Yang Tidak Kenal Cinta

Offline rnd

  • Hero Member
  • *
  • Posts: 1.283
Re: perintah set filter to
« Reply #23 on: April 11, 2009, 01:42:13 PM »
sebenarnya saya ngak ingin membandingkan mana yg lebih cepat antara set filter mau pun select..where, sebagai masukan aja sih, pernah  pengalaman kebetulan data dbfnya lumayan besar, waktu set filter di jalankan tidak ada efek apa apa, tetapi ketika terjadi perpindahan pointer  seperti yg mas Leon sampaikan barulah terasa pelan, dengan select saya ngak ketemu masalah seperti filter ini, tapi kembali ke kitalah, mana lebih cocoklah,   

Offline davidmustakim

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 14.053
  • Awas ya...
Re: perintah set filter to
« Reply #24 on: April 11, 2009, 05:11:45 PM »
hehehe CASE CLOSED aja deh

Offline nestorbj

  • Junior Member
  • *
  • Posts: 134
    • http://
Re: perintah set filter to
« Reply #25 on: April 11, 2009, 07:10:25 PM »
Ada buku yg baik sekali untuk dibaca kalau ingin tahu banyak tentang bagaimana mengoptimasikan Visual Foxpro. Buku itu adalah "Hacker's Guide to Visual Foxpro 7" (sayang yg 9 belum keluar).

Di bagian ""Faster Than a Speeding Bullet" dan penjelasan perintah "SET FILTER TO" ada saran yg sangat bagus agar perintah SET FILTER bisa dipercepat. Tapi entah diperbolehkan (legal) saya mengutipnya di sini atau tidak.
 Remember ... the FOX will be with you ... always *

Offline nestorbj

  • Junior Member
  • *
  • Posts: 134
    • http://
Re: perintah set filter to
« Reply #26 on: April 11, 2009, 08:12:49 PM »
Atau lihat artikel ini di fox.wikis.com http://fox.wikis.com/wc.dll?Wiki~VFPMisusedAndAbused~VFP
dan http://fox.wikis.com/wc.dll?Wiki~VFPGotchasLanguage~VFP di bagian "Grids"

Ya ... semoga pembahasan ini bisa membantu kita melihat pilihan-pilihan yg ada dari software tercinta kita.
 Remember ... the FOX will be with you ... always *

Offline davidmustakim

  • Fox-id M.V.P
  • Hero Member
  • *
  • Posts: 14.053
  • Awas ya...
Re: perintah set filter to
« Reply #27 on: April 11, 2009, 08:31:25 PM »
very good references

Offline taz

  • Administrator
  • Hero Member
  • *
  • Posts: 2.515
  • Do SEARCH berfore post guys!
    • http://fox-id.com
Re: perintah set filter to
« Reply #28 on: April 13, 2009, 12:39:43 AM »
OK, walaupun sedikit ada flame, karena topic yang bagus, say abuat sticky.
Great job every one!
@nestorbj : terima kasih buat referensinya.
Thread tetap saya buka.
@ all and newbie member : Jangan ada poting permintaan dikirim ke email ini dan itu. USE PM (saya yakin kalau tidak saya tulis disini nanti ada yang post begitu)
Sekali lagi. GREAT TOPIC! GREAT REF! GREAT POST 2 ALL!
- Fox-id.org is KiOSS Project exclusive member -


Offline edyist

  • Newbie
  • *
  • Posts: 32
Re: perintah set filter to
« Reply #29 on: June 09, 2009, 04:25:37 PM »
Saya baru baca thead ini, ada yg mau ditanyakan tentang set filter dan parameterized view.

sebelumnya saya menganggap set filter itu view yang diparameterized, tapi setelah baca thread ini jadi ragu.
berarti set filter itu bukan parameterized view ya?

memang ada beberapa keanehan waktu saya membuat coding spt ini
sele tableA
brow --> hasil muncul 100 data
jml = recc('tableA')
wait wind allt(str(jml)) --> hasil 100

lalu saya coba set filter dengan cara seperti ini
sele tableA
brow --> hasil muncul 4 data
set filter qty > 10
jml = recc('tableA')
wait wind allt(str(jml)) --> hasilnya tetap 100

benar tidak ya analisa saya??