غالبًا ما قرأت مقالات لأبطال مشهورين على CSDN واستفدت كثيرًا مؤخرًا، كنت أعمل في مشروع وأحتاج إلى استخدام جدول ترافقي في التقرير، لكن العميل طلب تشغيله على الشبكة. لم يكن لدي أي خيار سوى كتابته بنفسي. تم استخدام جزء من التعليمات البرمجية للاستعلام العام لتحقيق الجدول الترافقي، ولا أجرؤ على استخدامه حصريًا، لذلك أقوم بتحميله على أمل أن يكون مصدر إلهام للآخرين بعض النصائح من الأبطال المشهورين.
وظيفة CreateTmptab(const AFieldDefs:TFieldDefs):TDataSet;
فار
TempTable:TatClientDataSet;
يبدأ
TempTable:=nil;
النتيجة: = لا شيء؛
إذا AFieldDefs<>لا شيء إذن
يبدأ
يحاول
TempTable:=TatClientDataSet.Create(application);
TempTable.FieldDefs.Assign(AFieldDefs);
TempTable.CreateDataSet;
النتيجة:=(TempTable as TDataSet);
يستثني
إذا TempTable<>لا شيء بعد ذلك
TempTable.Free;
النتيجة: = لا شيء؛
يرفع؛
نهاية
نهاية؛
نهاية؛
{
مجموعة بيانات مصدر SouDataset
حقل العمود الديناميكي للجدول الترافقي ColField
RowField حقل الصف الجدولي
حقل بيانات حقل البيانات
}
وظيفة GenCrossTable(SouDataset:tdataset;ColField,RowField,DataField:string):tdataset;
فار
Vdataset:tdataset;
tmpdataset:tatclientdataset;
مصدر البيانات:tdatasource;
tmpstrs:سلاسل;
روفال، كولفال، داتافال: سلسلة؛
أنا، ي: عدد صحيح؛
نوع البيانات: TFieldType؛
حجم البيانات: عدد صحيح؛
يبدأ
النتيجة: = لا شيء؛
إذا (ColField='') أو(RowField='')أو(DataField='') ثم
showmessage ("جميع الحقول ليست فارغة!")
آخر
يبدأ
إذا (ColField=RowField)
أو (ColField=DataField)
أو (RowField = DataField) بعد ذلك
showmessage('جميع الحقول ليست متساوية!')
آخر
إذا (self.SouDataSet.FieldByName(ColField).DataType=ftString)
أو (self.SouDataSet.FieldByName(ColField).DataType<>ftWideString)
أو (self.SouDataSet.FieldByName(ColField).DataType<>ftFixedChar)
أو (self.SouDataSet.FieldByName(ColField).DataType<>ftMemo)
أو (self.SouDataSet.FieldByName(ColField).DataType<>ftFmtMemo) ثم
يبدأ
يحاول
tmpstrs:=tstringlist.Create;
Vdataset:=SouDataSet;
Vdataset.First;
لأني:=0 إلى Vdataset.RecordCount-1
يبدأ
إذا (varisnull(SouDataSet.FieldValues[colfield])=false) و(SouDataSet.FieldValues[colfield]<>'') إذن
إذا tmpstrs.IndexOf(SouDataSet.FieldValues[colfield])=-1 ثم
يبدأ
tmpstrs.Add(SouDataSet.FieldValues[colfield]);
نهاية؛
Vdataset.Next;
نهاية؛
// إنشاء عناوين أعمدة ديناميكية
tmpdataset:=TClientDataSet.Create(Self);
tmpdataset.FieldDefs.Add(rowfield,ftstring,50,False);
لأني:=0 إلى tmpstrs.Count-1
يبدأ
مع tmpdataset.FieldDefs القيام به
يبدأ
Add(tmpstrs.Strings[i],ftInteger,0,False);
نهاية؛
نهاية؛
tmpdataset.FieldDefs.Add('Sum',ftInteger,0,False);
مصدر البيانات:=tdatasource.Create(self);
DataSource.DataSet:=tmpdataset;
مع DataSource القيام به
يبدأ
dataset:=Createtmptab(tmpdataset.FieldDefs);
dataset.Open;
نهاية؛
// إنشاء جدول مؤقت
Vdataset.First;
لأني:=0 إلى Vdataset.RecordCount-1
يبدأ
Rowval:=SouDataSet.fieldbyname(rowfield).AsString;
colval:=SouDataSet.fieldbyname(colfield).AsString;
dataval:=SouDataSet.fieldbyname(datafield).AsString;
إذا dataval='' ثم dataval:='0';
إذا DataSource.DataSet.Locate(rowfield,rowval,[loPartialKey]) ثم
يبدأ
DataSource.DataSet.Edit;
DataSource.DataSet.FieldByName(colval).AsString:=dataval;
DataSource.DataSet.FieldByName('Sum').AsInteger:=
DataSource.DataSet.FieldByName('Sum').AsInteger+strtoint(dataval);
DataSource.DataSet.Post;
نهاية
آخر
يبدأ
DataSource.DataSet.Append;
DataSource.DataSet.FieldByName(rowfield).AsString:=rowval;
لـ j:=1 إلى DataSource.DataSet.Fields.Count-1
DataSource.DataSet.Fields[j].AsCurrency:=0;
DataSource.DataSet.FieldByName(colval).AsString:=dataval;
DataSource.DataSet.FieldByName('Sum').AsString:=dataval;
DataSource.DataSet.Post;
نهاية؛
Vdataset.Next;
نهاية؛
result:=DataSource.DataSet;
// إنشاء مجموعة بيانات جدولية
com.tmpstrs.Free;
يستثني
نهاية؛
نهاية
آخر
showmessage('ColField يجب أن يكون من النوع String!') ;
نهاية؛
نهاية؛
اجتاز الكود أعلاه الاختبار على D7 وSQL Server 7.0/2000