หน่วย bdeclientDataset;
ส่วนต่อประสาน
ใช้ windows, sysutils, ตัวแปร, คลาส, db, dbcommon, midas,
SQLTIMST, DBClient, DBLOCAL, ผู้ให้บริการ, DBTABLES;
พิมพ์
{tbdequery}
tbdequery = คลาส (TQUERY)
ส่วนตัว
FKEYFIELDS: String;
ได้รับการคุ้มครอง
ฟังก์ชั่น psgetDefaultOrder: tindexdef; แทนที่;
จบ;
{tbdeclientDataset}
tbDeclientDataset = คลาส (tCustomCacheDDataSet)
ส่วนตัว
fCommandText: String;
fcurrentCommand: String;
FDATASET: TBDEquery;
FDATABASE: TDATABASE;
flocalparams: tparams;
fstreamedactive: บูลีน;
ขั้นตอน CheckMastersourceActive (MasterSource: TDATASOURCE);
ขั้นตอน setDetailSactive (ค่า: บูลีน);
ฟังก์ชั่น getConnection: tDatabase;
ฟังก์ชั่น getDataSet: tDataset;
ฟังก์ชั่น getMastersource: tDataSource;
ฟังก์ชั่น getMasterfields: สตริง;
SetConnection ขั้นตอน (ค่า: tDatabase);
ขั้นตอน setDataSource (ค่า: tDataSource);
ขั้นตอน setlocalparams;
ขั้นตอน setMasterfields (ค่า const: สตริง);
ขั้นตอน setParamsFromsql (ค่า const: สตริง);
ขั้นตอน setsql (ค่า const: string);
ได้รับการคุ้มครอง
ฟังก์ชั่น getCommandText: สตริง; แทนที่;
โหลดขั้นตอน; แทนที่;
การแจ้งเตือนขั้นตอน (ACOMPONENT: TCOMPONENT; การดำเนินการ: TOPERATION); แทนที่;
ขั้นตอน setActive (ค่า: บูลีน); แทนที่;
ขั้นตอน setCommandText (ค่า: สตริง); แทนที่;
สาธารณะ
ตัวสร้างสร้าง (AOWNER: TCOMPONENT); แทนที่;
Destructor ทำลาย; แทนที่;
ขั้นตอน clonecursor (ที่มา: tcustomclientDataset; รีเซ็ต: บูลีน;
Keepsettings: บูลีน = เท็จ); แทนที่;
ขั้นตอน getfieldNames (รายการ: tStrings); แทนที่;
ฟังก์ชั่น getquotechar: สตริง;
ชุดข้อมูลคุณสมบัติ: tdataset อ่าน getDataset;
ที่ตีพิมพ์
คุณสมบัติที่ใช้งานอยู่;
Property Commandtext: String read getCommandText เขียน setCommandText;
คุณสมบัติ dbconnection: tdatabase อ่าน getconnection เขียน setconnection;
Property Masterfields อ่าน getMasterfields เขียน setmasterfields;
Property MasterSource: tdatasource อ่าน getMastersource เขียน setDataSource;
จบ;
ขั้นตอนการลงทะเบียน;
การดำเนินการ
ใช้ bdeconst, midconst;
พิมพ์
{tbdecdsparams}
TBDECDSPARAMS = คลาส (TPARAMS)
ส่วนตัว
ffieldname: tstrings;
ได้รับการคุ้มครอง
Procedure Parselect (SQL: String);
สาธารณะ
ตัวสร้างสร้าง (เจ้าของ: tpersistent);
Destructor ทำลาย; แทนที่;
จบ;
ตัวสร้าง tbdecdsparams.create (เจ้าของ: tpersistent);
เริ่ม
สืบทอด;
ffieldName: = tStringList.create;
จบ;
destructor tbdecdsparams.destroy;
เริ่ม
Freeandnil (ffieldName);
สืบทอด;
จบ;
ขั้นตอน tbdecdsparams.parseselect (SQL: String);
const
sselect = 'เลือก';
วาจา
Ferherfound: บูลีน;
เริ่มต้น: pchar;
fname, ค่า: สตริง;
sqltoken, cursection, lasttoken: tsqltoken;
params: จำนวนเต็ม;
เริ่ม
ถ้า pos ('' + sselect + '', ตัวพิมพ์เล็ก (สตริง (pchar (sql) +8)))> 1 จากนั้นออกจาก; // ไม่สามารถแยกวิเคราะห์แบบสอบถามย่อยได้
เริ่มต้น: = pchar (parsesql (pchar (sql), true));
คำสาป: = stunknown;
LastToken: = Stunknown;
fwherefound: = false;
params: = 0;
ทำซ้ำ
ทำซ้ำ
sqltoken: = nextsqltoken (เริ่ม, fname, cursection);
ถ้า sqltoken ใน [sthere] แล้ว
เริ่ม
fwherefound: = true;
LastToken: = Sthere;
สิ้นสุดอื่น ๆ ถ้า sqltoken ใน [sttablename] แล้ว
เริ่ม
{ตรวจสอบชื่อตารางที่ผ่านการรับรองของเจ้าของ}
ถ้าเริ่ม^ = '.' แล้ว
nextsqltoken (เริ่มต้น fname, cursection);
จบสิ้น
if (sqltoken = stvalue) และ (lastToken = sthere) แล้ว
sqltoken: = stfieldname;
ถ้า sqltoken ใน sqlsections แล้ว cursection: = sqltoken;
จนกระทั่ง sqltoken ใน [stfieldname, stend];
ถ้า fherherfound และ (sqltoken ใน [stfieldname]) แล้ว
ทำซ้ำ
sqltoken: = nextsqltoken (เริ่มต้นค่าการสาปแช่ง);
ถ้า sqltoken ใน sqlsections แล้ว cursection: = sqltoken;
จนกระทั่ง sqltoken ใน [Stend, stvalue, stisnull, stisnotnull, stfieldname];
ถ้า value = '?' แล้ว
เริ่ม
ffieldname.add (fname);
inc (params);
จบ;
จนกระทั่ง (params = count) หรือ (sqltoken ใน [Stend]);
จบ;
{tbdequery}
ฟังก์ชั่น tbdequery.psgetDefaultOrder: tindexdef;
เริ่ม
ถ้า fkeyfields = '' แล้ว
ผลลัพธ์: = psgetDefaultOrder ที่สืบทอดมา
อื่น
เริ่มต้น // รายละเอียดตารางลำดับเริ่มต้น
ผลลัพธ์: = tindexdef.create (ไม่มี);
result.options: = [ixunique]; // keyfield ไม่ซ้ำกัน
result.name: = stringreplace (fkeyfields, ';', '_', [rfreplaceall]);
result.fields: = fkeyfields;
จบ;
จบ;
{tbdeclientDataset}
Constructor tbdeclientDataset.create (AOWNER: TCOMPONENT);
เริ่ม
สืบทอดมาสร้าง (aowner);
fdataset: = tbdequery.create (ไม่มี);
fdataset.name: = self.name + 'dataSet1';
provider.dataset: = fdataset;
sqldbtype: = typeBde;
flocalparams: = tparams.create;
จบ;
destructor tbdeclientdataset.destroy;
เริ่ม
Freeandnil (flocalparams);
fdataset.close;
Freeandnil (fdataset);
ทำลายที่สืบทอดมา;
จบ;
ขั้นตอน tbdeclientDataset.getFieldNames (รายการ: tStrings);
วาจา
เปิด: บูลีน;
เริ่ม
เปิด: = (active = false);
พยายาม
ถ้าเปิดแล้ว
เปิด;
สืบทอด GetFieldNames (รายการ);
ในที่สุด
ถ้าเปิดปิดแล้วปิด;
จบ;
จบ;
ฟังก์ชั่น tbdeclientDataset.getCommandText: String;
เริ่ม
ผลลัพธ์: = fCommandText;
จบ;
ฟังก์ชั่น tbdeclientDataset.getDataset: tDataset;
เริ่ม
ผลลัพธ์: = fdataset เป็น tdataset;
จบ;
ขั้นตอน tbdeclientDataset.CheckMastersourceActive (Mastersource: TDataSource);
เริ่ม
หากได้รับมอบหมาย (Mastersource) และมอบหมาย (Mastersource.Dataset) แล้ว
ถ้าไม่ใช่ mastersource.dataset.active แล้ว
DatabaseError (SmasterNotopen);
จบ;
ขั้นตอน tbdeclientDataset.setParamsfromsql (ค่า const: สตริง);
วาจา
ชุดข้อมูล: TQUERY;
Tablename, TempQuery, Q: String;
รายการ: tbdecdsparams;
ฉัน: จำนวนเต็ม;
ฟิลด์: tfield;
เริ่ม
Tablename: = getTableNameFromsQl (ค่า);
ถ้า tablename <> '' แล้ว
เริ่ม
TempQuery: = ค่า;
รายการ: = tbdecdsparams.create (ตัวเอง);
พยายาม
list.parseselect (tempQuery);
list.assignvalues (params);
สำหรับ i: = 0 ถึง list.count - 1 ทำ
รายการ [i] .paramtype: = ptinput;
ชุดข้อมูล: = tQuery.create (ไม่มี);
พยายาม
DataSet.Databasename: = fDataset.Databasename;
ถาม: = getquotechar;
dataSet.sql.add ('เลือก * จาก' + q + tablename + q + 'โดยที่ 0 = 1'); {อย่าแปล}
พยายาม
DataSet.Open;
สำหรับ i: = 0 ถึง list.count - 1 ทำ
เริ่ม
ถ้า list.ffieldName.count> ฉันแล้ว
เริ่ม
พยายาม
ฟิลด์: = dataSet.fieldByName (list.ffieldName [i]);
ยกเว้น
ฟิลด์: = ไม่มี;
จบ;
จบสิ้น
ฟิลด์: = ไม่มี;
หากได้รับมอบหมาย (ฟิลด์) แล้ว
เริ่ม
ถ้า field.datatype <> ftstring แล้ว
รายการ [i] .datatype: = field.datatype
อื่นถ้า tstringfield (ฟิลด์) .fixedchar แล้ว
รายการ [i] .datatype: = ftfixedchar
อื่น
รายการ [i] .datatype: = ftstring;
จบ;
จบ;
ยกเว้น
// ละเว้นข้อยกเว้นทั้งหมด
จบ;
ในที่สุด
Dataset.free;
จบ;
ในที่สุด
ถ้า list.count> 0 แล้ว
params.assign (รายการ);
list.free;
จบ;
จบ;
จบ;
ขั้นตอน tbdeclientDataset.setsql (ค่า const: สตริง);
เริ่ม
หากได้รับมอบหมาย (provider.dataset) แล้ว
เริ่ม
TQUERY (Provider.Dataset) .sql.Clear;
ถ้าค่า <> '' แล้ว
TQUERY (Provider.Dataset) .sql.add (ค่า);
SetCommandText ที่สืบทอดมา (ค่า);
จบสิ้น
DatabaseError (Snodataprovider);
จบ;
ขั้นตอน tbdeclientDataset.loaded;
เริ่ม
โหลดที่สืบทอดมา;
ถ้า fstreamedactive แล้ว
เริ่ม
setActive (จริง);
fstreamedactive: = false;
จบ;
จบ;
ฟังก์ชั่น tbdeclientDataset.getMasterfields: สตริง;
เริ่ม
ผลลัพธ์: = Masterfields ที่สืบทอดมา;
จบ;
ขั้นตอน tbdeclientDataset.setMasterFields (ค่า const: สตริง);
เริ่ม
Masterfields ที่สืบทอดมา: = ค่า;
ถ้าค่า <> '' แล้ว
indexfieldnames: = ค่า;
fdataset.fkeyfields: = '';
จบ;
โพรซีเดอร์ tbdeclientDataset.setCommandText (ค่า: สตริง);
เริ่ม
SetCommandText ที่สืบทอดมา (ค่า);
fCommandText: = ค่า;
ถ้าไม่ (csloading ในส่วนประกอบ) แล้ว
เริ่ม
fdataset.fkeyfields: = '';
indexfieldnames: = '';
Masterfields: = '';
indexname: = '';
indexdefs.clear;
params.clear;
ถ้า (csdesigning ในส่วนประกอบ) และ (ค่า <> '') จากนั้น
SetParamsFromsQl (ค่า);
จบ;
จบ;
ฟังก์ชั่น tbdeclientDataset.getConnection: tDatabase;
เริ่ม
ผลลัพธ์: = fdatabase;
จบ;
ขั้นตอน tbdeclientDataset.setConnection (ค่า: tDatabase);
เริ่ม
ถ้าค่า = fDatabase จากนั้นออก;
Checkinactive;
หากได้รับมอบหมาย (ค่า) แล้ว
เริ่ม
ถ้าไม่ใช่ (csloading ในส่วนประกอบ) และ (value.databasename = '') จากนั้น
DatabaseError (SDATABASENAMEMISSING);
fdataset.databasename: = value.databasename;
จบสิ้น
fdataset.databasename: = '';
fdatabase: = ค่า;
จบ;
ฟังก์ชั่น tbdeclientDataset.getquotechar: String;
เริ่ม
ผลลัพธ์: = '';
ถ้าได้รับมอบหมาย (FDATASET) จากนั้น
ผลลัพธ์: = fdataset.psgetquotechar;
จบ;
ขั้นตอน tbdeclientDataset.clonecursor (ที่มา: tcustomclientDataset; รีเซ็ต: บูลีน;
Keepsettings: บูลีน = เท็จ);
เริ่ม
ถ้าไม่ใช่ (แหล่งที่มาคือ tbdeclientDataset) แล้ว
DatabaseError (SinvalidClone);
provider.dataset: = tbdeclientDataSet (แหล่งที่มา) .provider.dataset;
dbConnection: = tbdeclientDataSet (แหล่งที่มา) .dbconnection;
CommandText: = tbDeclientDataSet (แหล่งที่มา) .CommandText;
clonecursor ที่สืบทอดมา (แหล่งที่มา, รีเซ็ต, การตั้งค่า);
จบ;
ขั้นตอน tbdeclientDataSet.Notification (ACOMPONENT: TCOMPONENT; การดำเนินการ: TOPERATION);
เริ่ม
การแจ้งเตือนที่สืบทอดมา (Acomponent, การดำเนินการ);
ถ้าการดำเนินการ = opremove แล้ว
ถ้า acomponent = fDatabase แล้ว
เริ่ม
fdatabase: = nil;
setActive (เท็จ);
จบ;
จบ;
ขั้นตอน tbdeclientDataset.setLocalParams;
ขั้นตอน createParamsFrommasterfields (สร้าง: บูลีน);
วาจา
ฉัน: จำนวนเต็ม;
รายการ: tstrings;
เริ่ม
รายการ: = tStringList.create;
พยายาม
หากสร้างแล้ว
flocalparams.clear;
fdataset.fkeyfields: = Masterfields;
list.Commatext: = Masterfields;
สำหรับ i: = 0 ถึง list.count -1 ทำ
เริ่ม
หากสร้างแล้ว
flocalparams.createparam (ftunknown, mastersource.dataset.fieldbyname (รายการ [i]). fieldname
ptinput);
flocalparams [i] .assignfield (mastersource.dataset.fieldbyname (รายการ [i]));
จบ;
ในที่สุด
list.free;
จบ;
จบ;
เริ่ม
if (Masterfields <> '') และมอบหมาย (MasterSource) และมอบหมาย (Mastersource.Dataset) แล้ว
เริ่ม
CreateParamsFrommasterfields (จริง);
fcurrentCommand: = addparamsqlfordetail (flocalparams, Commandtext, True, Getquotechar);
จบ;
จบ;
ขั้นตอน tbdeclientDataset.setDataSource (ค่า: tDataSource);
เริ่ม
Mastersource ที่สืบทอดมา: = ค่า;
หากได้รับมอบหมาย (ค่า) แล้ว
เริ่ม
ถ้า packetrecords = -1 แล้ว packetrecords: = 0;
จบสิ้น
เริ่ม
ถ้า packetrecords = 0 แล้ว packetrecords: = -1;
จบ;
จบ;
ฟังก์ชั่น tbdeclientDataset.getMastersource: tDataSource;
เริ่ม
ผลลัพธ์: = Mastersource ที่สืบทอดมา;
จบ;
ขั้นตอน tbdeclientDataset.setDetailsactive (ค่า: บูลีน);
วาจา
Detaillist: tlist;
ฉัน: จำนวนเต็ม;
เริ่ม
Detaillist: = tlist.create;
พยายาม
getDetailDatasets (Detaillist);
สำหรับ i: = 0 ถึง detaillist.count -1 do
ถ้า tdataset (detaillist [i]) เป็น tbdeclientDataSet แล้ว
tbdeclientDataset (tDataset (detaillist [i])). active: = value;
ในที่สุด
Detaillist.free;
จบ;
จบ;
ขั้นตอน tbdeclientDataset.setActive (ค่า: บูลีน);
เริ่ม
ถ้าค่าแล้ว
เริ่ม
ถ้า csloading ในส่วนประกอบ state แล้ว
เริ่ม
fstreamedactive: = true;
ออก;
จบ;
ถ้า Masterfields <> '' แล้ว
เริ่ม
ถ้าไม่ (csloading ในส่วนประกอบ) แล้ว
CheckMastersourceActive (MasterSource);
Setlocalparams;
setSQL (fcurrentCommand);
params: = flocalparams;
FetchParams;
จบสิ้น
เริ่ม
setSQL (fCommandText);
ถ้า params.count> 0 แล้ว
เริ่ม
fdataset.params: = params;
FetchParams;
จบ;
จบ;
จบ;
ถ้าค่าและ (fDataset.ObjectView <> ObjectView) จากนั้น
fdataset.objectView: = ObjectView;
สืบทอด setActive (ค่า);
SetDetailSactive (ค่า);
จบ;
ขั้นตอนการลงทะเบียน;
เริ่ม
registercomponents ('bde', [tbdeclientDataSet]);
จบ;
จบ.
// 以上经 dblocalb.pas 改装而成, 可存为任意文件名, 当然扩展名是 pas
// 然后安装此控件即可