وحدة bdeclientdataset ؛
واجهة
يستخدم Windows و Sysutils والمتغيرات والفئات و DB و DBCommon و Midas ،
SQLTIMST ، DBCLIENT ، DBLOCAL ، مزود ، DBTABLES ؛
يكتب
{tbdequery}
tbdequery = فئة (tquery)
خاص
fkeyfields: سلسلة.
محمية
وظيفة psgetDefaultOrder: Tindexdef ؛ تجاوز؛
نهاية؛
{tbdeclientdataset}
tbdeclientdataset = فئة (tcustomCachedDataset)
خاص
fCommandText: سلسلة ؛
fcurrentCommand: سلسلة ؛
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: سلسلة) ؛
محمية
وظيفة getCommandText: سلسلة ؛ تجاوز؛
الإجراء المحمّل ؛ تجاوز؛
إشعار الإجراء (Acomponent: tcomponent ؛ العملية: Toperation) ؛ تجاوز؛
الإجراءات setactive (القيمة: منطقية) ؛ تجاوز؛
الإجراء setCommandText (القيمة: سلسلة) ؛ تجاوز؛
عام
إنشاء مُنشئ (مالك: tcomponent) ؛ تجاوز؛
تدمير المدمر. تجاوز؛
الإجراء clonecursor (المصدر: tcustomClientDataset ؛ إعادة تعيين: منطقية ؛
keepsettings: boolean = false) ؛ تجاوز؛
الإجراء getFileRnames (القائمة: tstrings) ؛ تجاوز؛
وظيفة getQuotechar: سلسلة.
مجموعة بيانات الخصائص: tdataset قراءة getDataset ؛
المنشورة
خاصية نشطة
Property CommandText: String Read GetCommandText اكتب setCommandText ؛
خاصية DBConnection: Tdatabase قراءة getConnection اكتب setConnection ؛
Property Masterfields قراءة getMasterfields كتابة setmasterfields.
ماجستير الممتلكات: tdatasource قراءة getMasterSource اكتب setDataSource ؛
نهاية؛
سجل الإجراءات ؛
تطبيق
يستخدم bdeconst ، midconst ؛
يكتب
{tbdecdsparams}
tbdecdsparams = فئة (tparams)
خاص
ffieldname: tstrings ؛
محمية
الإجراءات المحلية (SQL: سلسلة) ؛
عام
إنشاء مُنشئ (المالك: tpersistent) ؛
تدمير المدمر. تجاوز؛
نهاية؛
مُنشئ tbdecdsparams.create (المالك: tperSentive) ؛
يبدأ
ورث
ffieldname: = tstringList.create ؛
نهاية؛
Destructor tbdecdsparams.destroy ؛
يبدأ
Freeandnil (ffieldname) ؛
ورث
نهاية؛
الإجراء tbdecdsparams.parseselect (SQL: String) ؛
كونست
sselect = 'select' ؛
var
fwherefound: منطقية ؛
ابدأ: PCHAR ؛
fname ، القيمة: سلسلة ؛
sqltoken ، cursection ، lasttoken: tsqltoken ؛
params: عدد صحيح ؛
يبدأ
إذا كانت نقاط البيع ('' + sselect + '' ، صغيرة (سلسلة (pchar (sql) +8)))> 1 ثم الخروج ؛ // لا يمكن تحليل الاستفسارات الفرعية
START: = PCHAR (parseSQL (PCHAR (SQL) ، true)) ؛
Coursection: = stunknown ؛
LastToken: = Stunknown ؛
fwherefound: = false ؛
params: = 0 ؛
يكرر
يكرر
sqltoken: = nextsqltoken (start ، fname ، cursection) ؛
إذا كان sqltoken في [sthere] ثم
يبدأ
fwherefound: = صحيح ؛
Lasttoken: = sthere ؛
إنهاء آخر إذا كان sqltoken في [sttablename] ثم
يبدأ
{تحقق من الحصول على اسم الجدول المؤهل للمالك}
إذا ابدأ^ = '.' ثم
nextsqltoken (start ، fname ، cursection) ؛
إنهاء آخر
if (sqltoken = stvalue) و (lastToken = sthere) ثم
sqltoken: = stfieldName ؛
إذا كان sqltoken في sqlsections ثم corsection: = sqltoken ؛
حتى sqltoken في [stfieldName ، Setend] ؛
إذا كان fwherefound و (sqltoken في [stfieldname]) ثم
يكرر
sqltoken: = nextsqltoken (البدء ، القيمة ، اللعنة) ؛
إذا كان sqltoken في sqlsections ثم corsection: = sqltoken ؛
حتى sqltoken في [STEND ، stvalue ، stisnull ، stisnotnull ، stfieldName] ؛
إذا كانت القيمة = "؟" ثم
يبدأ
ffieldname.add (fname) ؛
INC (params) ؛
نهاية؛
حتى (params = count) أو (sqltoken في [send]) ؛
نهاية؛
{tbdequery}
وظيفة tbdequery.psgetDefaultOrder: Tindexdef ؛
يبدأ
إذا fkeyfields = '' ثم
النتيجة: = psgetDefaultorder الموروثة
آخر
ابدأ // تفاصيل الجدول الافتراضي الترتيب
النتيجة: = tindexdef.create (nil) ؛
result.options: = [ixunique] ؛ // Keyfield فريد من نوعه
result.name: = stringReplace (fkeyfields ، '؛' ، '_' ، [rfreplaceall]) ؛
النتيجة. الحقول: = fkeyfields ؛
نهاية؛
نهاية؛
{tbdeclientdataset}
مُنشئ tbdeclientdataset.create (annerer: tcomponent) ؛
يبدأ
خلق ورث (مالك) ؛
fdataset: = tbdequery.create (nil) ؛
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) ؛
var
افتتح: منطقية ؛
يبدأ
فتح: = (نشط = خطأ) ؛
يحاول
إذا فتحت ثم
يفتح؛
ورث GetFileRames (قائمة) ؛
أخيراً
إذا فتحت ثم أغلق ؛
نهاية؛
نهاية؛
دالة tbdeclientDataset.getCommandText: سلسلة ؛
يبدأ
النتيجة: = fCommandText ؛
نهاية؛
وظيفة tbdeclientDataset.getDataset: tdataset ؛
يبدأ
النتيجة: = fdataset كـ tdataset ؛
نهاية؛
الإجراء tbdeclientdataset.CheckmastersourceActive (MasterSource: tdatasource) ؛
يبدأ
إذا تم تعيينه (MasterSource) وتم تعيينه (MasterSource.Dataset) ثم
إن لم يكن MasterSource.Dataset.Active ثم
databaseerror (smasternotopen) ؛
نهاية؛
الإجراء tbdeclientdataset.setparamsfromsql (const value: string) ؛
var
مجموعة البيانات: tquery ؛
Tablename ، tempquery ، س: سلسلة ؛
القائمة: tbdecdsparams ؛
أنا: عدد صحيح.
الحقل: Tfield ؛
يبدأ
tablename: = getTablenameFromsQl (القيمة) ؛
إذا كان Tablename <> '' ثم
يبدأ
tempquery: = القيمة ؛
القائمة: = tbdecdsparams.create (الذات) ؛
يحاول
list.parseselect (tempquery) ؛
list.assignvalues (params) ؛
لأني: = 0 إلى list.count - 1 افعل
قائمة [i] .paramtype: = pTinput ؛
مجموعة البيانات: = tquery.create (nil) ؛
يحاول
dataset.databasename: = fdataset.databasename ؛
س: = getQuotechar ؛
dataset.sql.add ('حدد * من' + q + tablename + q + 'where 0 = 1') ؛ {لا تترجم}
يحاول
Dataset.Open ؛
لأني: = 0 إلى list.count - 1 افعل
يبدأ
if list.ffieldName.count> بعد ذلك
يبدأ
يحاول
الحقل: = dataset.fieldbyname (list.ffieldName [i]) ؛
يستثني
الحقل: = لا شيء ؛
نهاية؛
إنهاء آخر
الحقل: = لا شيء ؛
إذا تم تعيين (حقل) ثم
يبدأ
إذا
قائمة [i] .datatype: = field.datatype
وإلا إذا tstringfield (Field) .fixedchar ثم
قائمة [i] .datatype: = ftfixedchar
آخر
قائمة [i] .datatype: = ftstring ؛
نهاية؛
نهاية؛
يستثني
// تجاهل كل الاستثناءات
نهاية؛
أخيراً
Dataset.free ؛
نهاية؛
أخيراً
if list.count> 0 ثم
params.assign (قائمة) ؛
قائمة.
نهاية؛
نهاية؛
نهاية؛
الإجراء tbdeclientdataset.setsql (const value: string) ؛
يبدأ
إذا تم تعيينه (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: سلسلة) ؛
يبدأ
الحقول الرئيسية الموروثة: = القيمة ؛
إذا كانت القيمة <> "ثم
indexfieldNames: = value ؛
fdataset.fkeyfields: = '' ؛
نهاية؛
الإجراء tbdeclientdataset.setCommandText (القيمة: سلسلة) ؛
يبدأ
setCommandText الموروث (القيمة) ؛
fCommandText: = value ؛
إذا لم يكن (csloading في ComponentState) ثم
يبدأ
fdataset.fkeyfields: = '' ؛
indexFieldNames: = '' ؛
Masterfields: = '' ؛
indexName: = '' ؛
indexDefs.Clear ؛
params.clear ؛
إذا (CSDesigning في ComponentState) و (القيمة <> ')
setParamsfromsql (القيمة) ؛
نهاية؛
نهاية؛
وظيفة tbdeclientDataset.getConnection: tdatabase ؛
يبدأ
النتيجة: = fdatabase ؛
نهاية؛
الإجراء tbdeclientdataset.setConnection (القيمة: tdatabase) ؛
يبدأ
إذا كانت القيمة = fdatabase ثم الخروج ؛
تحقق
إذا تم تعيين (قيمة) ثم
يبدأ
إذا لم يكن (csloading في ComponentState) و (value.databasename = '') ثم
databaseerror (sdatabasenamemissing) ؛
fdataset.databasename: = value.databasename ؛
إنهاء آخر
fdataset.databasename: = '' ؛
fdatabase: = القيمة ؛
نهاية؛
وظيفة tbdeclientDataset.getQuotechar: سلسلة ؛
يبدأ
النتيجة: = '' ؛
إذا تم تعيينه (fdataset) ثم
النتيجة: = fdataset.psgetQuotechar ؛
نهاية؛
الإجراء tbdeclientdataset.clonecursor (المصدر: tcustomClientDataset ؛ إعادة تعيين: منطقية ؛
keepsettings: boolean = false) ؛
يبدأ
إذا لم يكن (المصدر هو tbdeclientdataset) ثم
databaseerror (sinvalidclone) ؛
Provider.dataset: = tbdeclientDataset (Source) .provider.dataset ؛
DBConnection: = tbdeclientDataset (Source) .DBConnection ؛
commandText: = tbdeclientDataset (source) .CommandText ؛
clonecursor الموروثة (المصدر ، إعادة تعيين ، الاحتفاظ) ؛
نهاية؛
الإجراء tbdeclientDataset.Notification (Acomponent: tcomponent ؛ العملية: Toperation) ؛
يبدأ
الإخطار الموروث (Acomponent ، التشغيل) ؛
إذا كانت التشغيل = OpreMove ثم
إذا كان acomponent = fdatabase ثم
يبدأ
fdatabase: = nil ؛
setActive (false) ؛
نهاية؛
نهاية؛
الإجراء tbdeclientdataset.setlocalparams ؛
الإجراء CreateParamSfrommasterfields (إنشاء: منطقية) ؛
var
أنا: عدد صحيح.
القائمة: tstrings ؛
يبدأ
القائمة: = tstringList.create ؛
يحاول
إذا أنشئ ثم
flocalparams.clear ؛
fdataset.fkeyfields: = masterfields ؛
list.commatext: = masterfields ؛
لأني: = 0 إلى list.count -1 افعل
يبدأ
إذا أنشئ ثم
flocalparams.createparam (ftunknown ، mastersource.dataset.fieldbyname (قائمة [i]). FieldName ،
ptinput) ؛
flocalparams [i] .assignfield (mastersource.dataset.fieldbyname (list [i])) ؛
نهاية؛
أخيراً
قائمة.
نهاية؛
نهاية؛
يبدأ
إذا (Masterfields <> '' ') وتم تعيينه (mastersource) وتم تعيينه (mastersource.dataset) ثم
يبدأ
CreateParamSfrommasterfields (صواب) ؛
fcurrentCommand: = addParamsqlfordetail (flocalparams ، commandtext ، true ، getQuotechar) ؛
نهاية؛
نهاية؛
الإجراء tbdeclientdataset.setDatasource (القيمة: tdatasource) ؛
يبدأ
الماجستير الموروث: = القيمة ؛
إذا تم تعيين (قيمة) ثم
يبدأ
إذا كانت packetRecords = -1 ثم packetRecords: = 0 ؛
إنهاء آخر
يبدأ
إذا كانت packetRecords = 0 ثم packetrecords: = -1 ؛
نهاية؛
نهاية؛
وظيفة tbdeclientdataset.getMasterSource: tdatasource ؛
يبدأ
النتيجة: = الماجستير الموروثة ؛
نهاية؛
الإجراء tbdeclientdataset.setDetailsActive (القيمة: منطقية) ؛
var
detaillist: stlist ؛
أنا: عدد صحيح.
يبدأ
detaillist: = tlist.create ؛
يحاول
getDetaildatasets (detaillist) ؛
لأني: = 0 ل detaillist.count -1 تفعل
إذا كان tdataset (detaillist [i]) هو tbdeclientDataset ثم
tbdeclientdataset (tdataset (detaillist [i])). نشط: = القيمة ؛
أخيراً
detaillist.free ؛
نهاية؛
نهاية؛
الإجراء tbdeclientDataset.SetActive (القيمة: منطقية) ؛
يبدأ
إذا كانت القيمة ثم
يبدأ
إذا كان csloading في ComponentState ثم
يبدأ
fstreamedactive: = صواب ؛
مخرج؛
نهاية؛
إذا كان Masterfields <> '' ثم
يبدأ
إذا لم يكن (csloading في ComponentState) ثم
CheckMasterSourCeactive (MasterSource) ؛
setlocalparams.
setSQL (fcurrentCommand) ؛
params: = flocalparams ؛
Fetchparams.
إنهاء آخر
يبدأ
setSQL (fCommandText) ؛
إذا params.count> 0 ثم
يبدأ
fdataset.params: = params ؛
Fetchparams.
نهاية؛
نهاية؛
نهاية؛
إذا كانت القيمة و (fdataset.objectView <> ObjectView) ثم
fdataset.objectView: = ObjectView ؛
setctive الموروثة (القيمة) ؛
setDetailsactive (القيمة) ؛
نهاية؛
سجل الإجراءات ؛
يبدأ
registerComponents ('bde' ، [tbdeclientDataset]) ؛
نهاية؛
نهاية.
// 以上经 dblocalb.pas 改装而成 ، 可存为任意文件名 ، 当然扩展名是 pas
// 然后安装此控件即可