mbak-mbak, mas-mas, maaf... sepertinya cursor itu beda dech dgn 'tabel'.
Cursor itu merupakan singkatan dari *CUR*rent *S*et *O*f *R*ecord.
Klo aku sih biasanya njelasinnya ke temen2ku gini :
misal ada query "SELECT No, Nama, Telp FROM Customer"
n misal ngebalikin berupa data yg kira2 begini :
+----+------------------+------------+
| No | Nama | Telp |
+----+------------------+------------+
| 01 | eRQee | 0856 |
| 02 | Nia | 0316 |
| 03 | Tomcat | 0815 |
| 04 | GNuKa | 0341 |
+----+------------------+------------+
nah semua hasil SELECT, disebut dataset, yang akan ditampung dalam
object Recordset.
Set rs = con.Execute("SELECT No, Nama, Telp FROM Customer")
begitu kira-kira. Nah, object rs itu isinya merupakan array dua dimensi (klo
istilah-nya ComponentOne menyebutnya dgn textmatrix) dengar arsitektur kira2
seperti ini
+----------+-----------+------------------+------------+
| | fields[0] | fields[1] | fields[2] |
+----------+-----------+------------------+------------+
| row[0] | 01 | eRQee | 0856 |
| row[1] | 02 | Nia | 0316 |
| row[2] | 03 | Tomcat | 0815 |
| row[3] | 04 | GNuKa | 0341 |
| *EOF | | | |
+----------+-----------+------------------+------------+
eksekusi SELECT akan menghasilkan mendapatkan dataset, yang jika menggunakan
adUseServer maka *server* lah yang menampung hasil query pada query cache di
engine nya. trus pas client memerlukan datanya,* server akan ngirim 1 per
satu*.
jika menggunakan adUseClient maka hasil query *bulet2* akan di-kirim ke
memory client seluruhnya dan akan diolah di sisi client..
biasanya, utk retreive hasil recordset banyak yg make model perulangan
(while ato for) walo secara teknis lebih lightweight klo pake perulangan
FOR.
comboCustomer.Clear
ListKodeCustomer.Clear
rs.movefirst
do while not rs.EOF
ListKodeCustomer.additem rs.fields(0)
comboCustomer.additem rs.fields(1)
rs.movenext
loop
~~ : ato : ~~
dim i as integer
comboCustomer.Clear
ListKodeCustomer.Clear
rs.movefirst
for i = 1 to rs.recordcount
ListKodeCustomer.additem rs.fields(0)
ComboCustomer.additem rs(1)
rs.movenext
next i
~~~
nah, *mana yg merupakan CURSOR itu???
pada awal code sebelum perulangan, ada event rs.movefirst. dan setiap sekali
proses eksekusi 1 perulangan ada event rs.movenext
trus ada juga event rs.move(x) dengan x bisa kita isi angka yg menunjukkan
baris ke berapa dalam dataset yg mau kita aktivasi.
di situlah cursor. Current Set of Record. Menunjukkan Recordset pada row
berapa yg (mau kita) aktif(kan) sehingga value dari .fields-nya bisa kita
retreive ke variabel.
ketika rs.movefirst, cursor akan mengaktivasi row *pertama*. dan nilai
rs.fields(0) akan bernilai "01" sementara rs.fields(1) akan bernilai "eRQee"
trus ketika rs.movenext, posisi cursor udah berubah ke row selanjutnya. dan
nilai rs.fields(0) akan bernilai "01" sementara rs.fields(1) akan bernilai
"Nia"
begitu seterusnya.
Klo kita mau "jump" ke (misal) row yang ke-4? Bisa. Jalankan rs.move 4.
InsyaAllah nilai rs.fields(0) akan bernilai "04" dan rs.fields(1) akan
bernilai "GNuKa"
~~
disitulah CURSOR.
sekarang kita renungkan bareng2 aja, seandainya cursorlocation itu ditaroh
di server "apa konsekuensinya" dan seandainya ditaroh di "client" apa juga
konsekuensinya. Carilah yang optimal, utk kasus yang tepat, gunakan metode
yang tepat...
mari kita berandai-andai...(*mode nyoba mancing diskusi = on*)
--
regards,
Rizky Prihanto
~~~~~~~~~~~~~~~~~~~
Office : C4 Computer Communities Club (http://www.cee-papat.com)
Personal : http://www.software-arsitek.web.id
----- Original Message -----
From: Lilis
To: [email protected]
Sent: Tuesday, November 27, 2007 7:52 AM
Subject: [Programmer-VB] Tips n Triks membangun aplikasi dgn Recordset
Terputus
hallo temen2,
>
> kali ini aku coba mau kasih materi kuliah deh :-) sapa tau aja ada yg mau
> minta les private
> hihihihihih,.....
>
> judul materi ini adalah " Recordset Terputus "
>
> mungkin sudah ada temen2 yg paham dan mungkin juga belum ada yang paham
> tentang recordset terputus.
> terkadang kalo programmer membangun suatu sistem client server, si
> programmer ga memikirkan
> bahwa kadang user males utk log off dari sistem nya. sehingga seharian
> kadang aplikasi nya
> masih terus berjalan. nah ini menyebabkan server terus menerus "mengadakan
> hubungan" dgn
> user tsb, coba bayangkan jika ada lebih dari 10 user yang tidak mau log
> off
> maka tentulah
> kinerja server jadi agak "lelet" krn harus terus menerus membuka koneksi
> ke
> user padahal sudah
> tidak diperlukan.
>
> tapi dengan adanya teknologi recordset terputus, (bahkan VB .Net sdh
> mendefault kan teknologi ini)
> maka beban server bisa berkurang sekalipun si user itu tetap ga mau log
> off
> atau menutup
> aplikasi nya.
>
> ada tiga property dari type recordset yg bisa digunakan
> 1. CursorLocation
> 2. CursorType
> 3. LockType
>
> property CursorLocation menandai dimana cursor recordset itu dibuat. apa
> sih
> arti cursor?
> istilah cursor sebenarnya identik dengan sebutan table, jadi boleh
> dikatakan
> bahwa cursor
> itu bisa juga disebut table.
> CursorLocation apabila tdk di definisikan maka defaultnya adalah server
> (adUseServer).
> apabila CursorLocation ditentukan pada sisi server maka semua lalulintas
> operasi data
> diserahkan sama server. krn semua proses dikerjakan dl server inilah
> CursorLocation jenis
> server lebih lamban dibandingkan dengan cursor yg berbasiskan - client
> karena hnya menyediakan
> akses tunggal.
> berbeda apabila cursor nya berbasis client, semua proses dikerjakan pada
> client itu sendiri,
> sehingga beban server tidaklah terlalu "megap-megap" krn ngurusin lalu
> lintas data dari
> bebrapa client. (bisa dibayangkan kan?)
> nah dari gambaran inilah maka dipilihlah CursorLocation yg ideal utk
> membangun suatu
> Recordsest Terputus yaitu adUseClient.
>
> setelah kita tentukan CursorLocation nya, maka kita tentukan jenis
> cursornya
> untuk menyediakan
> suatu perubahan pada recordset.
>
> ada 4 jenis perubahan cursor (CursorType) ini yaitu:
> 1. Dynamic
> 2. KeySet
> 3. Static
> 4. Forward-only
>
> masing2 cursor memang punya kelebihan dan kekurangan, tapi krn skrng aku
> lagi bicara tentang
> recordset terputus maka ga semuanya dibahas :-(
>
> dari ke4 CursorType diatas, type Static adalah CursorType satu2nya yang
> cocok dgn CursorLocation
> berbasis client. CursorType Static adalah jenis cursor yang perubahanya
> tidak langsung bisa
> dilihat apabila ada operasi Insert, Update, atau Delete pada data. utk
> melakukannya harus
> dikenakan perintah updatebatch.
>
> nah, selesai kita mendefinisikan CursorTypenya, selanjutnya adalah
> menentukan penguncian
> recordset yg dinamakan dgn LockType. LockType adalah tipe dari penguncian
> yang digunakan saat
> operasi update dikerjakan ke database.
> ada 4 type kunci ini yaitu:
> 1. adLockReadOnly
> 2. adLockPessimistic
> 3. adLockOptimistic
> 4. adLockBatchOptimistic
>
> karena kita sedang membicarakan recordset terputus maka penguncian
> adLockBatchOptimistic
> satu2nya yg dibutuhkan dlm teknologi ini. yaitu suatu proses peng
> update-tan
> yang dikerjakan
> dengan cara batch shg perubahan recordset tsb dikirim ke server dgn cara
> updatebatch.
> masih ingat kan mata kuliah komunikasi data sewaktu kuliah?
> ada 3 cara proses transfer data: online, offline dan batch
> lalu apa itu batch?
>
> jadi sebagai kesimpulan nya, recordset terputus dapat didefinisikan dgn
> cara
> sbb:
> 1. lokasi cursor nya berbasis client
> 2. tipe penguncian recordsetnya adalah optimistik batch
> 3. jenis cursornya adalah static
>
> untuk memutuskan sebuah recordset, caranya sangat sederhana yaitu dgn cara
> mengeset
> active connnection ke nothing.
>
> berikut ini adalah contoh kode utk membuat recordset terputus.
>
> private cn as connection
> private rs as recordset
>
> set cn=new connection
> set rs=new recordset
>
> cn.provider = "sqloledb"
> cn.open "server=(local);database=northwind;uid=sa;pwd=password"
>
> with rs
> .cursorlocation = adUseClient
> .Loctype = adLockBatchOptimistic
> .CursorTyp e= adOpenStatic
> .Source = "SELECT * FROM Customers"
> .open
>
> '--recordset terputus
> Set .ActiveConnection=nothing
> end with
>
> apabila ada operasi penambahan atau manipulasi yg lain (DML)
>
> rs.AddNew
> rs.Fields("customerid").Value=Text1.Text
> rs.Fields("CompanyName").Value=Text2.Text
>
> '--koneksikan kembali
> rs.ActiveConnection=cn
> rs.UpdateBatch
>
> '----selesai
>
> ok segitu dulu ya materinya, kalo ada yg perlu diperbaiki atau ditambahkan
> silahkan saja.
> lilis juga manusia punya keterbatasan. semoga bermanfaat utk programmer
> indonesia.
>
> salam
> lilis
>
>