BMS-HOSxP Community
HOSxP => การเขียน SQL Script => ข้อความที่เริ่มโดย: James011 ที่ ธันวาคม 20, 2009, 16:02:19 PM
-
Zquery กับ CIientdataset มันดีแตกต่างกันไงคับ
-
ตัว clientdataset จะ ดึงข้อมูลมาไว้ในตัวมัน แล้วกรณีเรา (add,edit,update) มันจะทำใน memory ก่อน ซึ่งไม่ได้มีผลกับ ข้อมูล server จริง (ไม่ทำให้ server ทำงานหนัก) อย่าง กรณี user แก้ไข เปลี่ยนแปลง ข้อมูลที่ grid (หน้าจอการเงิน) ก็ไม่ได้มีผลกับข้อมูลจริง ที่ server จนกระทั่งใช้ คำสั่ง post คือการบันทึกลงใน memory และใช้คำสั่ง applyupdate(-1) คือการบันทึกเข้า server จริง เฉพาะที่มีการเปลี่ยนแปลง (delta) ครับ ซึ่งรูปแบบการใช้งาน
Zconnecttion --> Zquery-->datasetprovider-->clientdateset-->datasource
แต่เนื่องจาก เราใช้ functon HOSxP_Getdatset('select........') ฟังก์ชั่นนี้ จะสร้าง รูปแบบข้างบน แบบ runtime ไว้ให้อยู่แล้วครับ ซึ่ง ก็จะ ส่งค่า data ของ clientdatset มาให้
cds1.data := HOSxP_Getdataset('select....');
ส่วน ขั้นตอนบันทึก
HOSxP_UpdateDelta(cds1.delta,'select....') บันทีกเฉพาะมีการเปลี่ยนแปลง delta
ซึ่ง รูทีนนี้ มีคำสั่ง applyupdate(-1) อยู่แล้วครับ
และข้อดีอีกอย่าง สามารถ ทำ database แบบ local ได้ ก็ พวกไฟล์ cds น่ะครับ รวมทั่้ง ไฟล์ xml ด้วยครับ จากคุณสมบัติ clientdateset ครับ และอีกอย่างครับ กรณี จะเขียน เป็น 3 tier หนีไม่พ้นครับ ต้องใช้ clientdataset ครับ
ส่วน Zquery กรณีเรา (add,edit,update) แล้ว post มันส่งคำสั่ง ไปที่ server ทันที เหมาะกับการเขียน c/s ครับ
-
;D ;D ;D ตอบได้โดนใจจริงๆๆครับ thank ให้เลยครับ ขอบคุณครับ ;D ;D
-
ตัว clientdataset จะ ดึงข้อมูลมาไว้ในตัวมัน แล้วกรณีเรา (add,edit,update) มันจะทำใน memory ก่อน ซึ่งไม่ได้มีผลกับ ข้อมูล server จริง (ไม่ทำให้ server ทำงานหนัก) อย่าง กรณี user แก้ไข เปลี่ยนแปลง ข้อมูลที่ grid (หน้าจอการเงิน) ก็ไม่ได้มีผลกับข้อมูลจริง ที่ server จนกระทั่งใช้ คำสั่ง post คือการบันทึกลงใน memory และใช้คำสั่ง applyupdate(-1) คือการบันทึกเข้า server จริง เฉพาะที่มีการเปลี่ยนแปลง (delta) ครับ ซึ่งรูปแบบการใช้งาน
Zconnecttion --> Zquery-->datasetprovider-->clientdateset-->datasource
แต่เนื่องจาก เราใช้ functon HOSxP_Getdatset('select........') ฟังก์ชั่นนี้ จะสร้าง รูปแบบข้างบน แบบ runtime ไว้ให้อยู่แล้วครับ ซึ่ง ก็จะ ส่งค่า data ของ clientdatset มาให้
cds1.data := HOSxP_Getdataset('select....');
ส่วน ขั้นตอนบันทึก
HOSxP_UpdateDelta(cds1.delta,'select....') บันทีกเฉพาะมีการเปลี่ยนแปลง delta
ซึ่ง รูทีนนี้ มีคำสั่ง applyupdate(-1) อยู่แล้วครับ
และข้อดีอีกอย่าง สามารถ ทำ database แบบ local ได้ ก็ พวกไฟล์ cds น่ะครับ รวมทั่้ง ไฟล์ xml ด้วยครับ จากคุณสมบัติ clientdateset ครับ และอีกอย่างครับ กรณี จะเขียน เป็น 3 tier หนีไม่พ้นครับ ต้องใช้ clientdataset ครับ
ส่วน Zquery กรณีเรา (add,edit,update) แล้ว post มันส่งคำสั่ง ไปที่ server ทันที เหมาะกับการเขียน c/s ครับ
ไม่ทัน ;D
-
ขออธิบายเพิ่มเติม ในส่วนการสร้าง Object แบบ Runtime ครับ
ปกติ เราต้องประกาศตัวแปร เป็น ประเภท oject นั้นๆ เช่น
var
tc : Tclientdataset; ประกาศตัวแปร tc เป็นประเภท Clientdataset
begin
tc := Tclientdataset.create(ระบุความเป็นเจ้าของของ Oject ที่สร้าง);
end;
พารามิเตอร์ ที่ระบุ มี 3 แบบ ครับ
nil ,self และ Application
ทำไมต้องระบุ ความเป็นเจ้าของ เพราะ มันจะทำหน้า free Oject ให้เราเอง (คืนหน่วยความจำ)
ถ้า ระบุ nil (ไม่มีเจ้าของ) เราต้อง free เอง
tc := Tclientdataset.create(nil);
try
.....
......
finally
tc.free;
end;
ถ้าระบุ Self หมายถึง Form ที่ Oject เราเกาะอยู่ Form จะทำหน้าที่ Free ให้เราเอง
tc := Tclientdataset.create(self);
ถ้าระบุ Application หมายถึง โปรแกรม exe เรา เมื่อปิดโปรแกรม จะ free ให้เรา
tc := Tclientdataset.create(Application);
กรณี เราสร้าง Class เราไม่ต้องระบุเจ้าของ ครับ เช่น
var sl : TStringlist;
begin
sl := TStringlist.create;
try
....
....
finally
sl.free;
end;
ถ้าอธิบายผิดพลาดประการใด ขออภัยด้วยครับ หรือรบกวนผู้รู้ อธิบาย ให้ถูกต้องอีกที ครับ
หรือ รบกวน อ.อ๊อด ด้วยครับ ผมเองก็มือใหม่ ครับ :) :)
-
หาคำตอบมานานมากแล้ว ว่าทำไมจะต้อง เป็น
tc := Tclientdataset.create(nil);
ขอบคุณมากมาย