单位BDECLIENTDATASET;
界面
使用Windows,Sysutils,变体,类,DB,DBCOMMON,MIDAS,
sqltimst,dbclient,dblocal,提供商,dbtables;
类型
{tbdequery}
tbdequery = class(tquery)
私人的
fkeyfields:string;
受保护
功能psgetDefaultOrder:tindexDef;覆盖;
结尾;
{tbdeclientdataset}
tbdeclientdataset = class(tcustomcacheddataset)
私人的
fcommandText:string;
fcurrentCommand:string;
fdataset:tbdequery;
fdatabase:tdatabase;
絮状:tparams;
fstreamedactive:布尔人;
程序CheckmastersOrceActive(Mastersource:tdatasource);
程序setDetailsactive(值:boolean);
函数getConnection:tdatabase;
函数getDataset:tdataset;
功能GetMasterSource:tdatasource;
功能GetMasterFields:String;
过程setConnection(值:tdatabase);
过程setDataSource(值:tdatasource);
过程setLocalParams;
过程SetMasterFields(const value:string);
过程setParamsFromsQl(const value:string);
过程setsql(const value:string);
受保护
函数getCommandText:string;覆盖;
加载过程;覆盖;
过程通知(分解:TCOMPONENT;操作:台面);覆盖;
过程setActive(值:布尔值);覆盖;
过程setCommandText(value:string);覆盖;
民众
构造函数创建(Alower:tcomponent);覆盖;
毁灭者销毁;覆盖;
程序clonecursor(来源:tcustomclientdataset; reset:boolean;
keepSettings:boolean = false);覆盖;
过程getFieldNames(列表:tstrings);覆盖;
函数getQuotechar:字符串;
属性数据集:tdataset read getDataset;
出版
属性活动;
属性命令文本:字符串读取getCommandText写入setCommandText;
属性dbConnection:tdatabase读取getConnection写入setConnection;
属性Masterfields读取GetMasterfields Write setMasterfields;
物业Mastersource:TDATASOURCE阅读GetMasterSource Write SetDatasource;
结尾;
程序登记册;
执行
使用BDECONST,MIDCONST;
类型
{tbdecdsparams}
tbdecdsparams = class(tparams)
私人的
ffieldname:tstrings;
受保护
Procedure parseSelect(SQL:String);
民众
构造函数创建(所有者:tpersistent);
毁灭者销毁;覆盖;
结尾;
构造函数tbdecdsparams.create(所有者:tpersistent);
开始
遗传;
ffieldName:= tstringlist.create;
结尾;
destructor tbdecdsparams.destroy;
开始
Freeandnil(ffieldname);
遗传;
结尾;
过程tbdecdsparams.parselect(sql:string);
const
sselect ='select';
var
fwherefound:布尔值;
开始:PCHAR;
fname,value:string;
sqltoken,cursection,lasttoken:tsqltoken;
参数:整数;
开始
如果pos('' + sselect +'',则小写(string(pchar(sql)+8)))> 1然后退出; //无法解析子查询
开始:= PCHAR(PARSESQL(PCHAR(SQL),true));
遏制:= stunknown;
LastToken:= stunknown;
fwherefound:= false;
参数:= 0;
重复
重复
sqltoken:= squltoken(start,fname,cursection);
如果在[sthere]中的sqltoken
开始
fwherefound:= true;
LastToken:= sthere;
结束否则,如果[sttableName]中的sqltoken,则
开始
{检查所有者合格的表名}
如果开始^ ='。'然后
NextSqlToken(start,fname,cutsection);
结束
如果(sqltoken = stvalue)和(lastToken = sthere),则
sqltoken:= stfieldName;
如果SQLSections中的SQLTOKEN,则均衡:= sqlToken;
直到[stfieldname,Stend]中的sqltoken;
如果[[stfieldname]中的fwhere和(sqltoken),则
重复
sqltoken:= squltoken(start,value,cursection);
如果SQLSections中的SQLTOKEN,则均衡:= sqlToken;
直到[Stend,Stvalue,Stisnull,Stisnotnull,stfieldName]
如果值='?'然后
开始
ffieldName.Add(fname);
inc(params);
结尾;
直到(params = count)或([stend]中的sqltoken);
结尾;
{tbdequery}
函数tbdequery.psgetDefaultOrder:tindexDef;
开始
如果fkeyfields ='',则
结果:=继承的psgetDefaultOrder
别的
开始//详细表默认顺序
结果:= tindexdef.create(nil);
结果:= [ixunique]; // Keyfield是唯一的
result.name:= stringreplace(fkeyfields,';','_',[rfreplaceall]);
result.fields:= fkeyfields;
结尾;
结尾;
{tbdeclientdataset}
constructor tbdeclientdataset.create(awher:tcomponent);
开始
继承的创建(Alower);
fdataset:= tbdequery.create(nil);
fdataset.name:= self.name +'dataset1';
dataSet dataSet:= fdataset;
sqldbtype:= typebde;
絮凝物:= tparams.create;
结尾;
destructor tbdeclientdataset.destroy;
开始
Freeandnil(絮状);
fdataset.close;
Freeandnil(fdataset);
继承销毁;
结尾;
过程tbdeclientdataset.getFieldNames(列表:tstrings);
var
开放:布尔人;
开始
打开:=(active = false);
尝试
如果打开
打开;
继承的getFieldNames(list);
最后
如果打开,请关闭;
结尾;
结尾;
函数tbdeclientdataset.getCommandText:string;
开始
结果:= fcommandText;
结尾;
函数tbdeclientdataset.getDataset:tdataset;
开始
结果:= fdataset作为tdataset;
结尾;
程序tbdeclientdataset.CheckmastersOrceActive(MasterSource:tdatasource);
开始
如果分配(MasterSource)并分配(Mastersource.dataset),则
如果不是Mastersource.dataset.Active
数据库(smasternotopen);
结尾;
过程tbdeclientdataset.setparamsfromsql(const value:string);
var
数据集:tquery;
tableName,tempquery,q:string;
列表:tbdecdsparams;
我:整数;
场:Tfield;
开始
tableName:= getTablEnameFromsql(value);
如果tablename <>'',则
开始
tempquery:= value;
列表:= tbdecdsparams.create(self);
尝试
list.parselect(tempquery);
List.AssignValues(params);
对于i:= 0到list.count -1做
列表[i] .paramtype:= ptinput;
数据集:= tquery.create(nil);
尝试
dataset.databasename:= fdataset.databasename;
问:= getQuotechar;
dataset.sql.add('select * from' + q + tablename + q +'whene 0 = 1'); {不要本地化}
尝试
dataset.open;
对于i:= 0到list.count -1做
开始
如果list.ffieldname.count>我然后
开始
尝试
字段:= dataset.fieldbyname(list.ffieldname [i]);
除了
字段:= nil;
结尾;
结束
字段:= nil;
如果分配(字段),则
开始
如果field.datatype <> ftString,则
列表[i] .datatype:= field.datatype
否则如果Tstringfield(field).fixedchar,则
列表[i] .datatype:= ftfixedchar
别的
列表[i] .datatype:= ftString;
结尾;
结尾;
除了
//忽略所有例外
结尾;
最后
dataset.free;
结尾;
最后
如果list.count> 0,然后
params.Assign(list);
list.free;
结尾;
结尾;
结尾;
过程tbdeclientdataset.setsql(const value:string);
开始
如果分配(提供者。dataset)
开始
tquery(dataSet).sql.clear;
如果值<>'',则
tquery(davider.dataset).sql.add(value);
继承的setCommandText(value);
结束
数据库(snodataprovider);
结尾;
过程tbdeclientdataset.loaded;
开始
继承加载;
如果fstreamedactive
开始
setActive(true);
fstreamedactive:= false;
结尾;
结尾;
函数tbdeclientdataset.getMasterfields:string;
开始
结果:=继承的Masterfields;
结尾;
过程tbdeclientdataset.setmasterfields(const value:string);
开始
继承的Masterfields:= value;
如果值<>'',则
indexFieldNames:= value;
fdataset.fkeyfields:='';
结尾;
过程tbdeclientdataset.setCommandText(value:string);
开始
继承的setCommandText(value);
fcommandText:= value;
如果不是(ComponentState中的CSLOAD),则
开始
fdataset.fkeyfields:='';
indexFieldNames:='';
Masterfields:='';
indexname:='';
indexdefs.clear;
params.clear;
if(componentState中的csdesign)和(value <>''),则
setParamsFromsQl(value);
结尾;
结尾;
函数tbdeclientdataset.getConnection:tdatabase;
开始
结果:= fdatabase;
结尾;
过程tbdeclientdataset.setConnection(值:tdatabase);
开始
如果值= fdatabase,则退出;
检查;
如果分配(值),则
开始
如果不是
数据库(sdatabasenamissing);
fdataset.databasename:= value.databasename;
结束
fdataset.databasename:='';
fdatabase:= value;
结尾;
函数tbdeclientdataset.getQuotechar:string;
开始
结果:='';
如果分配(FDATASET)
结果:= fdataset.psgetquotechar;
结尾;
过程tbdeclientdataset.clonecursor(来源:tcustomclientdataset; reset:boolean;
keepSettings:boolean = false);
开始
如果不是(源是tbdeclientdataset),则
数据库(sinvalidclone);
dataset:= tbdeclientdataset(source).provider.dataset;
dbConnection:= tbdeclientDataSet(source).dbConnection;
commandText:= tbdeclientDataSet(source).commandText;
继承的clonecursor(源,重置,keepsettings);
结尾;
过程tbdeclientdataset.notification(acomponent:tcomponent; toperation; operation:toperation);
开始
继承的通知(分支机构,操作);
如果操作= opremove,则
如果acomponent = fdatabase,则
开始
fdatabase:= nil;
setActive(false);
结尾;
结尾;
过程tbdeclientdataset.setlocalparams;
过程createparamsfrommasterfields(create:boolean);
var
我:整数;
列表:tstrings;
开始
列表:= tstringlist.create;
尝试
如果创建然后
flocalparams.clear;
fdataset.fkeyfields:= Masterfields;
list.commatext:= masterfields;
对于i:= 0 to list.count -1做
开始
如果创建然后
flocalparams.createparam(ftunknown,Mastersource.dataset.fieldbyname(list [i])。fieldName,
ptinput);
flocalparams [i] .ASSIGNFIELD(MASTERSOURCE.DATASET.FIELDBYNAME(list [i]));
结尾;
最后
list.free;
结尾;
结尾;
开始
如果(Masterfields <>'')并分配(Mastersource)并分配(Mastersource.dataset)然后
开始
createparamsfrommasterfields(true);
fcurrentCommand:= addParamsqlfordetail(flocalParams,commandText,true,getquotechar);
结尾;
结尾;
过程tbdeclientdataset.setdatasource(值:tdatasource);
开始
继承的MasterSource:= value;
如果分配(值),则
开始
如果packEtrecords = -1,则packEtrecords:= 0;
结束
开始
如果packEtrecords = 0,则packEtrecords:= -1;
结尾;
结尾;
函数tbdeclientdataset.getMasterSource:tdatasource;
开始
结果:=继承的Mastersource;
结尾;
过程tbdeclientdataset.setdetailsactive(值:boolean);
var
detaillist:tlist;
我:整数;
开始
detaillist:= tlist.create;
尝试
getDetaildatasets(detaillist);
对于i:= 0 to detaillist.count -1做
如果tdataset(detaillist [i])是tbdeclientdataset,则
tbdeclientdataset(tdataset(detaillist [i]))。活动:= value;
最后
detaillist.free;
结尾;
结尾;
过程tbdeclientdataset.setactive(值:boolean);
开始
如果值,则
开始
如果在componentState中加载,则
开始
fstreamedactive:= true;
出口;
结尾;
如果Masterfields <>'',则
开始
如果不是(ComponentState中的CSLOAD),则
Checkmastersourceective(Mastersource);
setlocalparams;
setSQL(fcurrentCommand);
参数:=絮状;
fetchparams;
结束
开始
setSQL(fcommandText);
如果参数> 0,则
开始
fdataset.params:= params;
fetchparams;
结尾;
结尾;
结尾;
如果值和(fdataset.objectView <> ObjectView),则
fdataset.ObjectView:= ObjectView;
继承的setActive(value);
setDetailsactive(value);
结尾;
程序登记册;
开始
registerComponents('bde',[tbdeclientdataset]);
结尾;
结尾。
//以上经dblocalb.pas改装而成,可存为任意文件名,当然扩展名是pas
//然后安装此控件即可