----Dalam karya penulis sebelumnya yang menggunakan Delphi untuk mengembangkan database, pengguna mengajukan persyaratan berikut: untuk secara dinamis menghasilkan laporan berdasarkan hasil kueri mereka sendiri dan kemudian mencetaknya. Setelah banyak eksplorasi, penulis menggunakan metode pembuatan kontrol QuickReport secara dinamis untuk memenuhi kebutuhan pengguna. Berikut ini akan dijelaskan cara-caranya, semoga dapat memberikan beberapa tips bermanfaat bagi sobat yang mempunyai pekerjaan serupa.
1. Ide dasar
----Pertama tulis beberapa parameter kueri (seperti perintah SQL, nama bidang, lebar bidang, dll.) ke dalam file sementara dalam format tertentu. Saat membuat laporan, cukup buat berbagai kontrol QuickReport secara dinamis berdasarkan parameter yang dicatat dalam file sementara.
2. Implementasi program
2.1 Format file sementara
----Format file sementara dapat disesuaikan dengan kebutuhan. Delphi menyediakan kelas TInifile, yang membuatnya sangat nyaman untuk mengoperasikan file berformat INI di Delphi. Ada banyak artikel tentang format dan pengoperasian spesifik file INI, jadi saya tidak akan membahas detailnya di sini. Format file sementara adalah sebagai berikut:
Laporan.ini
: Laporkan detail
[detail_rep]
Judul=XXXXX tabel
: Pengaturan kertas cetak, 1 adalah kertas A4, 2 adalah kertas B5, 3 adalah 16K
Halaman=1
: Mode pencetakan, 1 berarti pencetakan horizontal, 0 berarti pencetakan vertikal.
Orientasi=1
: Jumlah bidang yang disertakan dalam laporan
kolom=8
: Informasi komponen TQurey
[Data Qurey]
: Isi perintah SQL komponen Tqurey di komponen QuickReport
Sql_command=pilih V_XM,V_JGZW,V_BMMC,V_DWMC,V_DWZW,V_ZY,V_ZC,V_BGDH dari Hvzzjg dimana V_XM LIKE '李%'
[kol_0]
Keterangan=Nama
DataFiled=V_XM
Lebar=60
…
…
2.2 Menghasilkan laporan QuickReport secara dinamis
--- Kontrol utama laporan dan pengaturan properti utamanya adalah sebagai berikut
Nama kontrol | Nama kelas | milik | nilai atribut |
Formulir_rep | Formulir | keterangan | laporan dinamis |
Rep Cepat | TQuickRep | Kumpulan Data | REP_QUERY |
DetilBand1 | TQRBand | Tipe Pita | rbDetail |
KolomHeaderBand1 | TQRBand | Tipe Pita | rbColumnHeader |
REP_Sumber Data | Sumber Data T | Kumpulan Data | Rep_Query |
Rep_Query | Permintaan | Nama Basis Data | BASIS REPDATA |
Rep_Database | Basis Data T | Terhubung | BENAR |
Params.String | 'NAMA SERVER=XXX 'MAME PENGGUNA=XXX' 'Kata Sandi=XXX' | ||
Nama Basis Data | BASIS REPDATA |
Kontrol yang ditunjukkan pada tabel di atas dibuat secara manual di dalam program. Kontrol lain harus dibuat secara dinamis dalam program.
2.2.2 Prosedur utama
satuan f_rep;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Varian, Kelas, Grafik, Kontrol, Formulir,
Dialog, ExtCtrls, QuickRpt, QRCtrls, DB, DBTables,PRINTERS,QRPrntr,inifiles,
TeeProcs, TeEngine, DbChart, QRTEE;
jenis
TForm_rep = kelas(TForm)
Rep Cepat: TQuickRep;
DetailBand1: TQRBand;
ColumnHeaderBand1: TQRBand;
REP_DataSource: TDataSource;
REP_QUERY: Kueri;
rep_Database: TDatabase;
procedure TForm_rep.QuickRepAfterPreview(Sender: TObject);//Setelah browsing, lepaskan semua komponen yang dibuat
pribadi
{Deklarasi pribadi}
publik
{Pernyataan publik}
akhir;
var Formulir_rep:TForm_Rep;
ketik //Ringkasan informasi laporan
C_rep_Summary=catatan
Judul:string;//Judul laporan
Halaman:TQRPaperSize;//Pengaturan halaman laporan, jenis kertas apa yang digunakan
Orientasi:TPrinterOrientation;//Pengaturan halaman laporan, baik horizontal maupun vertikal
Kolom:integer;//Jumlah kolom yang disertakan dalam laporan
akhir;
jenis
C_Rep_Col_Summary=catatan//Ringkasan informasi kolom laporan
Keterangan:string;//nama kolom laporan
DataFiled:string;//Nama field dalam database yang sesuai dengan kolom laporan
Lebar:integer;//lebar kolom laporan
akhir;
jenis
C_Rep_Col_Sum_store=record //Menyimpan informasi ringkasan kolom laporan
Caption_array:array string;
DataFiled_array:array string;
Lebar_array:array bilangan bulat;
akhir;
var
rep_Ringkasan:C_rep_Ringkasan;
Rep_Col_Summary:C_Rep_Col_Summary;
Rep_Col_Sum_store:C_Rep_Col_Sum_store;
Colum_Name: susunan tQRRichText;
Colum_Data:array TQRDBRichText;
C_Query:TQuery;
prosedur Form_rep_init();
procedure DynCreat_TQRDBText(Colum_Num:integer;Colum_Height:integer;DataSet_Name:TQuery);//Membuat kontrol TQRDBText secara dinamis
procedure DynCreat_TQRRichtext(Colum_Num:integer);//Membuat kontrol TQRRichtext secara dinamis
prosedur DynCreat_TQuery(Inifile_Name:Tinifile);//pernyataan SQL untuk membuat kontrol TQuery secara dinamis
procedure Get_PageCount();//Dapatkan jumlah total halaman yang dicetak
fungsi Open_IniFile():Tinifile;//Membuka file sementara
prosedur Read_Col_Summary(Inifile_Name:Tinifile);//Baca informasi ringkasan kolom laporan
procedure Read_Rep_Summary(Inifile_Name:Tinifile);//Baca ringkasan informasi laporan
function rep_chanslateOrientation(var Rep_Orientation:integer):TPrinterOrientation;//Konversi pengaturan mode pencetakan
function rep_chanslatepage(var Rep_Page:integer):TQRPaperSize;//Mengonversi pengaturan ukuran halaman cetak
pelaksanaan
{$R *.dfm}
function rep_chanslatepage(var Rep_Page:integer):TQRPaperSize;//Mengonversi pengaturan jenis halaman cetak
mulai
kasus Rep_Page dari
1: mulai
hasil:=A4;
Form_rep.QuickRep.PrinterSettings.PaperSize:=A4;
akhir;
2: mulai
hasil:=B5;
Form_rep.QuickRep.PrinterSettings.PaperSize:=B5
akhir;
3: mulai
hasil:=Eksekutif;
Form_rep.QuickRep.PrinterSettings.PaperSize:=Eksekutif;
akhir;
akhir;
akhir;
function rep_chanslateOrientation(var Rep_Orientation:integer):TPrinterOrientation;//Konversi pengaturan mode pencetakan
mulai
kasus Rep_Orientasi dari
0: mulai
hasil:=poPortrait;//0 vertikal
Form_rep.QuickRep.PrinterSettings.Orientation:=poPortrait;
akhir;
1: mulai
hasil:=poLandscape;//1 horisontal
Form_rep.QuickRep.PrinterSettings.Orientation:=poLandscape;
akhir;
akhir;
akhir;
fungsi Open_IniFile():Tinifile;//Membuka file sementara
var Nama file: string;
Ini_NamaFile:string;
mulai
Nama file:='Laporan.ini';
Ini_NamaFile:=Jalur_File+Nama File;
Hasil:=Tinifile.Create(Ini_NamaFile);
akhir;
procedure Read_Rep_Summary(Inifile_Name:Tinifile);//Baca ringkasan informasi laporan
var Rep_Page,Rep_Orientation:integer;
mulai
rep_Page:=Inifile_Name.Readinteger('rep_detail','Page',1);
Rep_Orientation:=Inifile_Name.Readinteger('rep_detail','Orientation',0);
dengan rep_Summary lakukan
mulai
Kolom:=Inifile_Name.Readinteger('rep_detail','columns',0);
Judul:=Inifile_Name.Readstring('rep_detail','Judul','Laporan tanpa nama');
page:=rep_chanslatepage(Rep_Page);//Mengonversi ukuran halaman pencetakan
Orientasi:=rep_chanslateOrientation(Rep_Orientation);//Konversi pengaturan mode pencetakan
akhir;
akhir;
prosedur Read_Col_Summary(Inifile_Name:Tinifile);//Baca informasi ringkasan kolom laporan
var i_count: bilangan bulat;
mulai
//Simpan informasi kolom dalam array
dengan Rep_Col_Sum_store lakukan
mulai
SetLength(Caption_array,rep_Summary.Columns);
SetLength(DataFiled_array,rep_Summary.Columns);
SetLength(Width_array,rep_Summary.Columns);
akhir;
untuk i_count:=0 hingga rep_Summary.Columns-1 lakukan
mulai
dengan Rep_Col_Summary lakukan
mulai
Keterangan:=Inifile_Name.Readstring('col_'+inttostr(i_count),'Caption','Tanpa Nama');
DataFiled:=Inifile_Name.Readstring('col_'+inttostr(i_count),'DataFiled','');
Lebar:=Inifile_Name.Readinteger('col_'+inttostr(i_count),'Width',0);
akhir;
dengan Rep_Col_Sum_store lakukan
mulai
Caption_array[i_count]:=Rep_Col_Summary.Caption;
DataFiled_array[i_count]:=Rep_Col_Summary.DataFiled;
Lebar_array[i_count]:=Rep_Col_Summary.Width;
akhir;
akhir;
akhir;
procedure DynCreat_TQRRichtext(Colum_Num:integer);//Membuat kontrol TQRRichtext secara dinamis, yang digunakan untuk menampilkan nama Cina setiap kolom dalam laporan
var Kolom_Nama_daftar:TString;
mulai
Colum_Name[Colum_Num]:=tQRRichtext.Create(aplikasi); //Buat kontrol TQRRichtext
Nama_Kolom[Nomor_Kolom].Induk:=Form_rep.ColumnHeaderBand1;
Nama_Kolom[Nomor_Kolom].Frame.DrawTop:=true;
Nama_Kolom[Nomor_Kolom].Frame.DrawBottom:=true;
Form_rep.ColumnHeaderBand1.Tinggi:=40;
Nama_Kolom[Nomor_Kolom].Tinggi:=40;
Nama_Kolom[Nomor_Kolom].Font.Tinggi:=-14;
Colum_Name[Colum_Num].Font.Name:='Tubuh Neraka';
Nama_Kolom[Nomor_Kolom].Atas:=0;
Nama_Kolom[Nomor_Kolom].Penjajaran:=taCenter;
Nama_Kolom[Nomor_Kolom].AutoStretch:=false;
//Gambar garis tabel
Nama_Kolom[Nomor_Kolom].Bingkai.Gaya:=psSolid;
Nama_Kolom[Nomor_Kolom].Bingkai.Lebar:=1;
Nama_Kolom[Nomor_Kolom].Frame.DrawRight:=true;
Nama_Kolom[Nomor_Kolom].Frame.DrawBottom:=true;
jika Kolom_Num=0 maka
mulai
Nama_Kolom[Nomor_Kolom].Frame.DrawLeft:=true;
akhir;
//Menetapkan informasi dalam catatan RRep_Col_Sum_store ke Colum_Name
Colum_Name_list:=TStringList.Buat;
Colum_Name_list.Add(Rep_Col_Sum_store.Caption_array[Colum_Num]);
Nama_Kolom[Nomor_Kolom].Baris:=Daftar_Nama_Kolom;
Nama_Kolom[Nomor_Kolom].Lebar:=Rep_Col_Sum_store.Width_array[Colum_Num];
Nama_Kolom[Nomor_Kolom].Terlihat:=benar;
//Hitung batas kiri
jika Kolom_Num>0 maka
Nama_Kolom[Nomor_Kolom].Kiri:=Nama_Kolom[Nomor_Kolom-1].Kiri+Nama_Kolom[Nomor_Kolom-1].Lebar
kalau tidak
Nama_Kolom[Nomor_Kolom].Kiri:=0;
akhir;
Catatan: Kontrol TQRRichtext digunakan di sini karena kontrol TQRRichtext dapat secara otomatis membungkus baris ketika namanya terlalu panjang.
procedure DynCreat_TQRDBText(Colum_Num:integer;Colum_Height:integer;DataSet_Name:TQuery);//Membuat kontrol TQRDBText secara dinamis, yang digunakan untuk menampilkan nilai setiap kolom
mulai
Kolom_Data[Nomor_Kolom]:=tQRDBText.Create(aplikasi);
Kolom_Data[Kolum_Nomor].Induk:=Form_rep.DetailBand1;
//Setel kumpulan data
Kolom_Data[Kolom_Nomor].DataSet:=Nama_DataSet;
//Setel properti array Colum_Data.DateField ke nama field di C_Rep_Col_Sum_store
Kolom_Data[Colum_Num].DataField:=Rep_Col_Sum_store.DataFiled_array[Colum_Num];
Kolom_Data[Nomor_Kolom].Lebar:=Rep_Col_Sum_store.Width_array[Colum_Num];
Data_Kolom[Nomor_Kolom].Tinggi:=Tinggi_Kolom;
Form_rep.DetailBand1.Height:=Colum_Height;
Kolom_Data[Kolom_Nomor].Atas:=0;
Kolom_Data[Nomor_Kolom].UkuranOtomatis:=salah;
Kolom_Data[Kolum_Nomor].AutoStretch:=false;
Kolom_Data[Kolum_Nomor].WordWrap:=false;
Kolom_Data[Nomor_Kolom].Terlihat:=benar;
//Gambar garis tabel
Kolom_Data[Nomor_Kolom].Bingkai.Gaya:=psSolid;
Kolom_Data[Kolom_Nomor].Frame.DrawRight:=true;
Kolom_Data[Nomor_Kolom].Frame.DrawBottom:=true;
jika Kolom_Num=0 maka
Kolom_Data[Nomor_Kolom].Frame.DrawLeft:=true;
//Hitung batas kiri
jika Kolom_Num>0 maka
Kolom_Data[Nomor_Kolom].Kiri:=Kolum_Data[Nomor_Kolom-1].Kiri+Kolum_Data[Kolum_Nomor-1].Lebar
kalau tidak
Kolom_Data[Kolom_Nomor].Kiri:=0;
akhir;
procedure DynCreat_TQuery(Inifile_Name:Tinifile);//Secara dinamis mengatur pernyataan SQL dari kontrol TQuery
var
Sql_command:string;
mulai
Flag_CreatQuery:=salah;
Sql_command:=Inifile_Name.Readstring('QureyData','Sql_Command','');
Form_rep.REP_QUERY.Tutup;
Form_rep.REP_QUERY.SQL.Hapus;
Form_rep.REP_QUERY.SQL.Append(Sql_command);
jika belum Form_rep.REP_QUERY.Siapkan
Form_rep.REP_QUERY.Siapkan;
mencoba
Formulir_rep.REP_QUERY.ExecSQL;
Form_rep.REP_QUERY.Aktif:=true;
Form_rep.REP_QUERY.AutoCalcFields:=true;
Flag_CreatQuery:=benar;
kecuali
Application.MessageBox('Kesalahan pernyataan SQL!','Permintaan sistem',MB_ICONWARNING);
Flag_CreatQuery:=salah;
akhir;
akhir;
prosedur Form_rep_init();
var i_count: bilangan bulat;
Rep_IniFile:Tinifile;//