----ในงานก่อนหน้าของผู้เขียนที่ใช้ Delphi ในการพัฒนาฐานข้อมูล ผู้ใช้ได้หยิบยกข้อกำหนดดังกล่าว: เพื่อสร้างรายงานแบบไดนามิกตามผลลัพธ์การสืบค้นของตนเองแล้วจึงพิมพ์ออกมา หลังจากการสำรวจมาหลายครั้ง ผู้เขียนได้ใช้วิธีการสร้างตัวควบคุม QuickReport แบบไดนามิกเพื่อตอบสนองความต้องการของผู้ใช้ วิธีนี้อธิบายไว้ด้านล่างนี้ โดยหวังว่าจะให้คำแนะนำที่เป็นประโยชน์แก่เพื่อนๆ ที่มีงานคล้ายๆ กัน
1. แนวคิดพื้นฐาน
----ขั้นแรกให้เขียนพารามิเตอร์การสืบค้น (เช่น คำสั่ง SQL ชื่อฟิลด์ ความกว้างของฟิลด์ ฯลฯ) ลงในไฟล์ชั่วคราวในรูปแบบที่กำหนด เมื่อสร้างรายงาน เพียงสร้างการควบคุม QuickReport ต่างๆ แบบไดนามิกตามพารามิเตอร์ที่บันทึกไว้ในไฟล์ชั่วคราว
2. การนำโปรแกรมไปใช้
2.1 รูปแบบไฟล์ชั่วคราว
---- รูปแบบของไฟล์ชั่วคราวสามารถปรับแต่งได้ตามความต้องการ ผู้เขียนใช้รูปแบบไฟล์ INI Delphi มีคลาส TInifile ซึ่งทำให้สะดวกมากในการใช้งานไฟล์รูปแบบ INI ใน Delphi มีบทความมากมายเกี่ยวกับรูปแบบและการดำเนินการเฉพาะของไฟล์ INI ดังนั้นฉันจะไม่ลงรายละเอียดที่นี่ รูปแบบไฟล์ชั่วคราวเป็นดังนี้:
รายงาน.ini
: รายละเอียดการรายงานตัว
[รายละเอียดตัวแทน]
ชื่อเรื่อง=ตาราง XXXX
: การตั้งค่ากระดาษการพิมพ์ 1 คือกระดาษ A4 2 คือกระดาษ B5 3 คือ 16K
หน้า=1
: โหมดการพิมพ์ 1 หมายถึงการพิมพ์แนวนอน 0 หมายถึงการพิมพ์แนวตั้ง
ปฐมนิเทศ=1
: จำนวนฟิลด์ที่รวมอยู่ในรายงาน
คอลัมน์=8
:ข้อมูลส่วนประกอบ TQurey
[คิวเรย์ข้อมูล]
: เนื้อหาของคำสั่ง SQL ของส่วนประกอบ Tqurey ในส่วนประกอบ QuickReport
Sql_command=select V_XM,V_JGZW,V_BMMC,V_DWMC,V_DWZW,V_ZY,V_ZC,V_BGDH จาก Hvzzjg โดยที่ V_XM LIKE '李%'
[คอล_0]
คำบรรยาย=ชื่อ
DataFiled=V_XM
ความกว้าง=60
-
-
2.2 สร้างรายงาน QuickReport แบบไดนามิก
--- การควบคุมหลักของรายงานและการตั้งค่าคุณสมบัติหลักมีดังนี้
ชื่อการควบคุม | ชื่อชั้นเรียน | คุณสมบัติ | ค่าแอตทริบิวต์ |
Form_rep | ทีฟอร์ม | คำบรรยายภาพ | รายงานแบบไดนามิก |
ตัวแทนด่วน | TQuickRep | ชุดข้อมูล | REP_QUERY |
รายละเอียดแบนด์1 | ทีคิวอาร์แบนด์ | ประเภทวงดนตรี | rbรายละเอียด |
คอลัมน์HeaderBand1 | ทีคิวอาร์แบนด์ | ประเภทวงดนตรี | rbColumnHeader |
REP_แหล่งข้อมูล | TDataSource | ชุดข้อมูล | Rep_Query |
Rep_Query | ทีคิวรี | ชื่อฐานข้อมูล | ฐานข้อมูลซ้ำ |
ตัวแทน_ฐานข้อมูล | ทีดาต้าเบส | เชื่อมต่อแล้ว | จริง |
Params.Strings | 'ชื่อเซิร์ฟเวอร์=XXX' 'ผู้ใช้มาเมม=XXX' 'รหัสผ่าน=XXX' | ||
ชื่อฐานข้อมูล | ฐานข้อมูลซ้ำ |
การควบคุมที่แสดงในตารางด้านบนถูกสร้างขึ้นด้วยตนเองในโปรแกรม การควบคุมอื่นๆ จะต้องถูกสร้างขึ้นแบบไดนามิกในโปรแกรม
2.2.2 ขั้นตอนหลัก
หน่วย f_rep;
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม,
กล่องโต้ตอบ, ExtCtrls, QuickRpt, QRCtrls, DB, DBTables, เครื่องพิมพ์, QRPrntr, inifiles,
TeeProcs, TeEngine, DbChart, QRTEE;
พิมพ์
TForm_rep = คลาส (TForm)
QuickRep: TQuickRep;
DetailBand1: TQRแบนด์;
ColumnHeaderBand1: TQRBand;
REP_DataSource: TDataSource;
REP_QUERY: TQuery;
ตัวแทน_ฐานข้อมูล: TDatabase;
ขั้นตอน TForm_rep.QuickRepAfterPreview (Sender: TObject); // หลังจากเรียกดูแล้ว ให้ปล่อยส่วนประกอบที่สร้างขึ้นทั้งหมด
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
{ประกาศสาธารณะ}
จบ;
var Form_rep:TForm_Rep;
พิมพ์ //ข้อมูลสรุปของรายงาน
C_rep_Summary=บันทึก
Title:string;//ชื่อเรื่องของรายงาน
Page:TQRPaperSize;//การตั้งค่าหน้ารายงาน ประเภทของกระดาษที่ใช้
Orientation:TPrinterOrientation;//การตั้งค่าหน้าของรายงาน ไม่ว่าจะเป็นแนวนอนหรือแนวตั้ง
คอลัมน์:จำนวนเต็ม;//จำนวนคอลัมน์ที่รวมอยู่ในรายงาน
จบ;
พิมพ์
C_Rep_Col_Summary=record//ข้อมูลสรุปของคอลัมน์รายงาน
Caption:string;//ชื่อคอลัมน์ของรายงาน
DataFiled:string;//ชื่อฟิลด์ในฐานข้อมูลที่สอดคล้องกับคอลัมน์ของรายงาน
ความกว้าง:จำนวนเต็ม;//ความกว้างคอลัมน์ของรายงาน
จบ;
พิมพ์
C_Rep_Col_Sum_store=record //ข้อมูลสรุปการจัดเก็บคอลัมน์รายงาน
Caption_array:อาร์เรย์ของสตริง;
DataFiled_array:อาร์เรย์ของสตริง;
width_array:อาร์เรย์ของจำนวนเต็ม;
จบ;
var
rep_Summary:C_rep_Summary;
Rep_Col_Summary:C_Rep_Col_Summary;
Rep_Col_Sum_store:C_Rep_Col_Sum_store;
Colum_Name: อาร์เรย์ของ tQRRichText;
Colum_Data:อาร์เรย์ของ TQRDBRichText;
C_Query:TQuery;
ขั้นตอน Form_rep_init();
ขั้นตอน DynCreat_TQRDBText (Colum_Num:integer;Colum_Height:integer;DataSet_Name:TQuery);//สร้างการควบคุม TQRDBText แบบไดนามิก
ขั้นตอน DynCreat_TQRRichtext (Colum_Num: integer); // สร้างการควบคุม TQRRichtext แบบไดนามิก
ขั้นตอน DynCreat_TQuery(Inifile_Name:Tinifile);//คำสั่ง SQL เพื่อสร้างการควบคุม TQuery แบบไดนามิก
ขั้นตอน Get_PageCount();//รับจำนวนหน้าที่พิมพ์ทั้งหมด
ฟังก์ชัน Open_IniFile():Tinifile;//เปิดไฟล์ชั่วคราว
ขั้นตอน Read_Col_Summary(Inifile_Name:Tinifile);//อ่านข้อมูลสรุปของคอลัมน์รายงาน
ขั้นตอน Read_Rep_Summary(Inifile_Name:Tinifile);//อ่านข้อมูลสรุปของรายงาน
ฟังก์ชั่น rep_chanslateOrientation(var Rep_Orientation:integer):TPrinterOrientation;//แปลงการตั้งค่าโหมดการพิมพ์
ฟังก์ชั่น rep_chanslatepage(var Rep_Page:integer):TQRPaperSize;//แปลงการตั้งค่าขนาดหน้าที่พิมพ์
การดำเนินการ
{$R *.dfm}
ฟังก์ชั่น rep_chanslatepage(var Rep_Page:integer):TQRPaperSize;//แปลงการตั้งค่าประเภทหน้าที่พิมพ์
เริ่ม
กรณี Rep_Page ของ
1:เริ่มต้น
ผลลัพธ์:=A4;
Form_rep.QuickRep.PrinterSettings.PaperSize:=A4;
จบ;
2:เริ่มต้น
ผลลัพธ์:=B5;
Form_rep.QuickRep.PrinterSettings.PaperSize:=B5
จบ;
3:เริ่มต้น
ผลลัพธ์:=ผู้บริหาร;
Form_rep.QuickRep.PrinterSettings.PaperSize:=ผู้บริหาร;
จบ;
จบ;
จบ;
ฟังก์ชั่น rep_chanslateOrientation(var Rep_Orientation:integer):TPrinterOrientation;//แปลงการตั้งค่าโหมดการพิมพ์
เริ่ม
กรณี Rep_Orientation ของ
0:เริ่มต้น
result:=poPortrait;//0 เป็นแนวตั้ง
Form_rep.QuickRep.PrinterSettings.Orientation:=poPortrait;
จบ;
1:เริ่มต้น
result:=poLandscape;//1 เป็นแนวนอน
Form_rep.QuickRep.PrinterSettings.Orientation:=poLandscape;
จบ;
จบ;
จบ;
ฟังก์ชัน Open_IniFile():Tinifile;//เปิดไฟล์ชั่วคราว
ชื่อไฟล์ var: string;
Ini_Filename:สตริง;
เริ่ม
ชื่อไฟล์:='Report.ini';
Ini_Filename:=File_Path+ชื่อไฟล์;
ผลลัพธ์:=Tinifile.Create(Ini_Filename);
จบ;
ขั้นตอน Read_Rep_Summary(Inifile_Name:Tinifile);//อ่านข้อมูลสรุปของรายงาน
var Rep_Page, Rep_Orientation: จำนวนเต็ม;
เริ่ม
rep_Page:=Inifile_Name.Readinteger('rep_detail','Page',1);
Rep_Orientation:=Inifile_Name.Readinteger('rep_detail','การวางแนว',0);
ด้วย rep_Summary ทำ
เริ่ม
คอลัมน์:=Inifile_Name.Readinteger('rep_detail','columns',0);
Title:=Inifile_Name.Readstring('rep_detail','Title','Unnamed report');
page:=rep_chanslatepage(Rep_Page);//แปลงขนาดหน้าที่พิมพ์
Orientation:=rep_chanslateOrientation(Rep_Orientation);//แปลงการตั้งค่าโหมดการพิมพ์
จบ;
จบ;
ขั้นตอน Read_Col_Summary(Inifile_Name:Tinifile);//อ่านข้อมูลสรุปของคอลัมน์รายงาน
var i_count: จำนวนเต็ม;
เริ่ม
//บันทึกข้อมูลคอลัมน์ในอาร์เรย์
ด้วย Rep_Col_Sum_store ทำ
เริ่ม
SetLength(Caption_array,rep_Summary.Columns);
SetLength(DataFiled_array,rep_Summary.Columns);
SetLength(Width_array,rep_Summary.Columns);
จบ;
สำหรับ i_count:=0 ถึง rep_Summary.Columns-1 ทำ
เริ่ม
ด้วย Rep_Col_Summary ทำ
เริ่ม
คำบรรยาย:=Inifile_Name.Readstring('col_'+inttostr(i_count),'Caption','Unnamed');
DataFiled:=Inifile_Name.Readstring('col_'+inttostr(i_count),'DataFiled','');
ความกว้าง:=Inifile_Name.Readinteger('col_'+inttostr(i_count),'Width',0);
จบ;
ด้วย Rep_Col_Sum_store ทำ
เริ่ม
Caption_array[i_count]:=Rep_Col_Summary.คำบรรยาย;
DataFiled_array[i_count]:=Rep_Col_Summary.DataFiled;
width_array[i_count]:=Rep_Col_Summary.Width;
จบ;
จบ;
จบ;
ขั้นตอน DynCreat_TQRRichtext(Colum_Num:integer);//สร้างตัวควบคุม TQRRichtext แบบไดนามิก ซึ่งใช้เพื่อแสดงชื่อภาษาจีนของแต่ละคอลัมน์ในรายงาน
var Colum_Name_list:TStrings;
เริ่ม
Colum_Name[Colum_Num]:=tQRRichtext.Create(application); // สร้างตัวควบคุม TQRRichtext
Colum_Name[Colum_Num].ผู้ปกครอง:=Form_rep.ColumnHeaderBand1;
Colum_Name[Colum_Num].Frame.DrawTop:=true;
Colum_Name[Colum_Num].Frame.DrawBottom:=true;
Form_rep.ColumnHeaderBand1.ความสูง:=40;
Colum_Name[Colum_Num].ความสูง:=40;
Colum_Name[Colum_Num].Font.Height:=-14;
Colum_Name[Colum_Num].Font.Name:='เนื้อนรก';
Colum_Name[Colum_Num].ด้านบน:=0;
Colum_Name[Colum_Num].การจัดตำแหน่ง:=taCenter;
Colum_Name[Colum_Num].ยืดอัตโนมัติ:=false;
//วาดเส้นตาราง
Colum_Name[Colum_Num].Frame.Style:=psSolid;
Colum_Name[Colum_Num].Frame.Width:=1;
Colum_Name[Colum_Num].Frame.DrawRight:=true;
Colum_Name[Colum_Num].Frame.DrawBottom:=true;
ถ้า Colum_Num=0 แล้ว
เริ่ม
Colum_Name[Colum_Num].Frame.DrawLeft:=true;
จบ;
//กำหนดข้อมูลในบันทึก RRep_Col_Sum_store ให้กับ Colum_Name
Colum_Name_list:=TStringList.Create;
Colum_Name_list.Add(Rep_Col_Sum_store.Caption_array[Colum_Num]);
Colum_Name[Colum_Num].Lines:=Colum_Name_list;
Colum_Name[Colum_Num].ความกว้าง:=Rep_Col_Sum_store.Width_array[Colum_Num];
Colum_Name[Colum_Num].มองเห็นได้:=true;
//คำนวณขอบเขตด้านซ้าย
ถ้า Colum_Num>0 แล้ว
Colum_Name[Colum_Num].ซ้าย:=Colum_Name[Colum_Num-1].ซ้าย+Colum_Name[Colum_Num-1].ความกว้าง
อื่น
Colum_Name[Colum_Num].ซ้าย:=0;
จบ;
หมายเหตุ: มีการใช้ตัวควบคุม TQRRichtext ที่นี่เนื่องจากตัวควบคุม TQRRichtext สามารถตัดบรรทัดโดยอัตโนมัติเมื่อชื่อยาวเกินไป
ขั้นตอน DynCreat_TQRDBText(Colum_Num:integer;Colum_Height:integer;DataSet_Name:TQuery);//สร้างตัวควบคุม TQRDBText แบบไดนามิก ซึ่งใช้เพื่อแสดงค่าของแต่ละคอลัมน์
เริ่ม
Colum_Data[Colum_Num]:=tQRDBText.Create(แอปพลิเคชัน);
Colum_Data[Colum_Num].ผู้ปกครอง:=Form_rep.DetailBand1;
//ตั้งค่าชุดข้อมูล
Colum_Data[Colum_Num].ชุดข้อมูล:=DataSet_Name;
//ตั้งค่าคุณสมบัติอาร์เรย์ Colum_Data.DateField เป็นชื่อฟิลด์ใน C_Rep_Col_Sum_store
Colum_Data[Colum_Num].DataField:=Rep_Col_Sum_store.DataFiled_array[Colum_Num];
Colum_Data[Colum_Num].ความกว้าง:=Rep_Col_Sum_store.Width_array[Colum_Num];
Colum_Data[Colum_Num].ความสูง:=Colum_Height;
Form_rep.DetailBand1.Height:=Colum_Height;
Colum_Data[Colum_Num].ด้านบน:=0;
Colum_Data[Colum_Num].ขนาดอัตโนมัติ:=false;
Colum_Data[Colum_Num].ยืดอัตโนมัติ:=false;
Colum_Data[Colum_Num].WordWrap:=false;
Colum_Data[Colum_Num].มองเห็นได้:=true;
//วาดเส้นตาราง
Colum_Data[Colum_Num].Frame.Style:=psSolid;
Colum_Data[Colum_Num].Frame.DrawRight:=true;
Colum_Data[Colum_Num].Frame.DrawBottom:=true;
ถ้า Colum_Num=0 แล้ว
Colum_Data[Colum_Num].Frame.DrawLeft:=true;
//คำนวณขอบเขตด้านซ้าย
ถ้า Colum_Num>0 แล้ว
Colum_Data[Colum_Num].ซ้าย:=Colum_Data[Colum_Num-1].ซ้าย+Colum_Data[Colum_Num-1].ความกว้าง
อื่น
Colum_Data[Colum_Num].ซ้าย:=0;
จบ;
ขั้นตอน DynCreat_TQuery (Inifile_Name:Tinifile); // ตั้งค่าคำสั่ง SQL ของตัวควบคุม TQuery แบบไดนามิก
var
Sql_command:สตริง;
เริ่ม
Flag_CreatQuery:=false;
Sql_command:=Inifile_Name.Readstring('QureyData','Sql_Command','');
Form_rep.REP_QUERY.ปิด;
Form_rep.REP_QUERY.SQL.ล้าง;
Form_rep.REP_QUERY.SQL.ผนวก (Sql_command);
ถ้าไม่ใช่ Form_rep.REP_QUERY.เตรียมไว้แล้ว
Form_rep.REP_QUERY.เตรียม;
พยายาม
Form_rep.REP_QUERY.ExecSQL;
Form_rep.REP_QUERY.ใช้งานอยู่:=true;
Form_rep.REP_QUERY.AutoCalcFields:=true;
Flag_CreatQuery:=true;
ยกเว้น
Application.MessageBox('คำสั่ง SQL ผิดพลาด!','ระบบพร้อมท์',MB_ICONWARNING);
Flag_CreatQuery:=false;
จบ;
จบ;
ขั้นตอน Form_rep_init();
var i_count: จำนวนเต็ม;
Rep_IniFile:Tinifile;//