ฉันมักจะอ่านบทความของฮีโร่ชื่อดังใน CSDN และได้รับประโยชน์มากมาย เมื่อเร็วๆ นี้ ฉันกำลังทำโปรเจ็กต์และจำเป็นต้องใช้ครอสแท็บในรายงาน แต่ลูกค้าขอให้ทำงานได้บนกริด ฉันไม่มีทางเลือกอื่นนอกจากต้องเขียนโค้ดด้วยตัวเอง มีการใช้โค้ดบางส่วนสำหรับการสืบค้นทั่วไปเพื่อทราบถึงครอสแท็บ คำแนะนำจากฮีโร่ชื่อดัง
ฟังก์ชัน CreateTmptab(const AFieldDefs:TFieldDefs):TDataSet;
var
TempTable:TatClientDataSet;
เริ่ม
TempTable:=ไม่มี;
ผลลัพธ์:=ไม่มี;
ถ้า AFieldDefs<>ไม่มีเลย
เริ่ม
พยายาม
TempTable:=TatClientDataSet.Create(แอปพลิเคชัน);
TempTable.FieldDefs.Assign (AFieldDefs);
TempTable.CreateDataSet;
ผลลัพธ์:=(TempTable เป็น TDataSet);
ยกเว้น
ถ้า TempTable<>ไม่มีเลย
TempTable ฟรี;
ผลลัพธ์:=ไม่มี;
ยก;
จบ
จบ;
จบ;
-
ชุดข้อมูลต้นฉบับ SouDataset
ฟิลด์คอลัมน์ไดนามิกแท็บไขว้ ColField
ฟิลด์แถวครอสแท็บ RowField
เขตข้อมูล DataFielddata
-
ฟังก์ชัน GenCrossTable(SouDataset:tdataset;ColField,RowField,DataField:string):tdataset;
var
Vdataset:tdataset;
tmpdataset:ชุดข้อมูล Tatclient;
แหล่งข้อมูล:tdatasource;
tmpstrs:tstrings;
rowval, colval, dataval: สตริง;
ฉัน,j:จำนวนเต็ม;
ประเภทข้อมูล: 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.สร้าง;
Vdataset:=SouDataSet;
Vdataset.First;
สำหรับ i:=0 ถึง Vdataset.RecordCount-1 ทำ
เริ่ม
ถ้า (varisnull(SouDataSet.FieldValues[colfield])=false) และ (SouDataSet.FieldValues[colfield]<>'') แล้ว
ถ้า tmpstrs.IndexOf(SouDataSet.FieldValues[colfield])=-1 แล้ว
เริ่ม
tmpstrs.Add(SouDataSet.FieldValues[โคลฟิลด์]);
จบ;
Vdataset ถัดไป;
จบ;
//สร้างชื่อคอลัมน์แบบไดนามิก
tmpdataset:=TClientDataSet.Create(ตนเอง);
tmpdataset.FieldDefs.Add(แถวฟิลด์,ftstring,50,เท็จ);
สำหรับ i:=0 ถึง tmpstrs.Count-1 ทำ
เริ่ม
ด้วย tmpdataset.FieldDefs ทำ
เริ่ม
เพิ่ม(tmpstrs.Strings[i],ftInteger,0,False);
จบ;
จบ;
tmpdataset.FieldDefs.Add('ผลรวม',ftInteger,0,False);
แหล่งข้อมูล:=tdatasource.Create(ตนเอง);
DataSource.DataSet:=tmpdataset;
ด้วยแหล่งข้อมูลทำ
เริ่ม
ชุดข้อมูล:=Createtmptab(tmpdataset.FieldDefs);
ชุดข้อมูลเปิด;
จบ;
//สร้างตารางชั่วคราว
Vdataset.First;
สำหรับ i:=0 ถึง Vdataset.RecordCount-1 ทำ
เริ่ม
rowval:=SouDataSet.fieldbyname(rowfield).AsString;
colval:=SouDataSet.fieldbyname(โคลฟิลด์).AsString;
dataval:=SouDataSet.fieldbyname(ดาต้าฟิลด์).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);
แหล่งข้อมูล 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;
แหล่งข้อมูล DataSet.Post;
จบ;
Vdataset ถัดไป;
จบ;
ผลลัพธ์:=DataSource.DataSet;
//สร้างชุดข้อมูลครอสแท็บ
tmpstrs.ฟรี;
ยกเว้น
จบ;
จบ
อื่น
showmessage('ColField ต้องเป็นประเภท String!');
จบ;
จบ;
โค้ดข้างต้นผ่านการทดสอบบน D7 และ SQL Server 7.0/2000