Saya sering membaca artikel pahlawan terkenal di CSDN dan mendapatkan banyak manfaat. Baru-baru ini, saya sedang mengerjakan sebuah proyek dan perlu menggunakan tab silang di laporan, tetapi pelanggan memintanya agar dapat dioperasikan di Grid. Saya tidak punya pilihan selain menulisnya sendiri. Sepotong kode digunakan untuk permintaan umum untuk mewujudkan crosstab. Saya tidak berani menggunakannya secara eksklusif, jadi saya mengunggahnya dengan harapan dapat menginspirasi orang lain beberapa nasihat dari pahlawan terkenal.
fungsi CreateTmptab(const AFieldDefs:TFieldDefs):TDataSet;
var
Tabel Temp:TatClientDataSet;
mulai
Tabel Temp:=nihil;
Hasil:=nihil;
jika AFieldDefs<>nihil maka
mulai
mencoba
TempTable:=TatClientDataSet.Create(aplikasi);
TempTable.FieldDefs.Assign(AFieldDefs);
TempTable.CreateDataSet;
Hasil:=(TempTable sebagai TDataSet);
Kecuali
jika TempTable<>nihil maka
TempTable.Gratis;
Hasil:=nihil;
mengangkat;
akhir
akhir;
akhir;
{
Kumpulan data sumber SouDataset
Bidang kolom dinamis tab silang ColField
Bidang baris tab silang RowField
Bidang DataFielddata
}
fungsi GenCrossTable(SouDataset:tdataset;ColField,RowField,DataField:string):tdataset;
var
Kumpulan data V: kumpulan data;
tmpdataset:tatclientdataset;
Sumber Data:tdatasource;
tmpstrs:tstring;
nilai baris,colval,dataval:string;
saya,j: bilangan bulat;
tipe data: TFieldType;
Ukuran Data: bilangan bulat;
mulai
hasil:=nihil;
jika (ColField='') atau(RowField='')atau(DataField='') maka
showmessage('Semua Field tidak boleh NULL!')
kalau tidak
mulai
jika (ColField=RowField)
atau(ColField=DataField)
atau(RowField=DataField) lalu
showmessage('Semua Bidang tidak Sama!')
kalau tidak
jika (self.SouDataSet.FieldByName(ColField).DataType=ftString)
atau (self.SouDataSet.FieldByName(ColField).DataType<>ftWideString)
atau (self.SouDataSet.FieldByName(ColField).DataType<>ftFixedChar)
atau (self.SouDataSet.FieldByName(ColField).DataType<>ftMemo)
atau (self.SouDataSet.FieldByName(ColField).DataType<>ftFmtMemo) lalu
mulai
mencoba
tmpstrs:=tstringlist.Buat;
Vdataset:=SouDataSet;
Vdataset.Pertama;
untuk i:=0 hingga Vdataset.RecordCount-1 lakukan
mulai
jika (varisnull(SouDataSet.FieldValues[colfield])=false) dan (SouDataSet.FieldValues[colfield]<>'') maka
jika tmpstrs.IndexOf(SouDataSet.FieldValues[colfield])=-1 maka
mulai
tmpstrs.Tambahkan(SouDataSet.FieldValues[colfield]);
akhir;
Vdataset.Berikutnya;
akhir;
//Buat judul kolom dinamis
tmpdataset:=TClientDataSet.Buat(Mandiri);
tmpdataset.FieldDefs.Add(rowfield,ftstring,50,False);
untuk i:=0 hingga tmpstrs.Count-1 lakukan
mulai
dengan tmpdataset.FieldDefs lakukan
mulai
Tambahkan(tmpstrs.Strings[i],ftInteger,0,False);
akhir;
akhir;
tmpdataset.FieldDefs.Add('Jumlah',ftInteger,0,False);
Sumber Data:=tdatasource.Create(mandiri);
Sumber Data.DataSet:=tmpdataset;
dengan DataSource lakukan
mulai
kumpulan data:=Buattmptab(tmpdataset.FieldDefs);
kumpulan data.Buka;
akhir;
//Buat tabel sementara
Vdataset.Pertama;
untuk i:=0 hingga Vdataset.RecordCount-1 lakukan
mulai
rowval:=SouDataSet.fieldbyname(rowfield).AsString;
colval:=SouDataSet.fieldbyname(colfield).AsString;
dataval:=SouDataSet.fieldbyname(datafield).AsString;
jika dataval='' maka dataval:='0';
jika DataSource.DataSet.Locate(rowfield,rowval,[loPartialKey]) lalu
mulai
DataSource.DataSet.Edit;
DataSource.DataSet.FieldByName(colval).AsString:=dataval;
DataSource.DataSet.FieldByName('Jumlah').AsInteger:=
DataSource.DataSet.FieldByName('Jumlah').AsInteger+strtoint(dataval);
Sumber Data.DataSet.Posting;
akhir
kalau tidak
mulai
DataSource.DataSet.Append;
DataSource.DataSet.FieldByName(rowfield).AsString:=rowval;
untuk j:=1 hingga DataSource.DataSet.Fields.Count-1 lakukan
DataSource.DataSet.Fields[j].AsCurrency:=0;
DataSource.DataSet.FieldByName(colval).AsString:=dataval;
DataSource.DataSet.FieldByName('Jumlah').AsString:=dataval;
Sumber Data.DataSet.Posting;
akhir;
Vdataset.Berikutnya;
akhir;
hasil:=DataSource.DataSet;
//Buat kumpulan data tab silang
tmpstrs.Gratis;
kecuali
akhir;
akhir
kalau tidak
showmessage('ColField Harus Bertipe String!') ;
akhir;
akhir;
Kode di atas lulus tes pada D7 dan SQL Server 7.0/2000