1. 程式人生 > >uniGUI for C++ builder下如何利用FastReport實現數據記錄本地打印

uniGUI for C++ builder下如何利用FastReport實現數據記錄本地打印

ces sof dbus 實現 Owner 查詢 設置 web 同時

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/dlboy2018/article/details/81040260

(中行雷威2018.7.14於杭州機場)

(同一個世界,同一個夢想,交流學習C++Builder XE10,傳承c++builder的魅力!歡迎各地朋友加入我的QQ群484979943,進群密碼“BCB”,同時也請將該群號廣為宣傳,希望能夠廣集各方高手,共同進步。如需下載開發工具及源代碼請加入我的QQ群。)

【閱讀倡議】

1、有問題請留言;

2、沒問題請點贊;

3、看連載請加群;

4、下源碼請加群;

【開發工具】

1、C++Builder10.2.2tokyo

2、FMSoft_uniGUI_Complete_Professional_1.10.0build1462(正版)

3、FastReport5.6.2 (安裝使用請訪問我的另一篇博客https://blog.csdn.net/dlboy2018/article/category/7492809)

本例子將詳細教授如何通過FastReport的PDF導出功能實現數據庫記錄的打印,本教程的源代碼清到我的QQ群共享文件A02-源代碼裏下載。

一、新建項目

1、新建項目,主目錄d:\testPrint

技術分享圖片

2、將MainModule窗口上放置一個UniConnection數據庫聯接控件和OracleUniProvider數據庫驅動控件。

技術分享圖片

對UniConnection進行屬性設置。

技術分享圖片技術分享圖片

3、在UniMainModule窗口的OnCreate事件中添加連接數據庫代碼
void __fastcall TUniMainModule::UniGUIMainModuleCreate(TObject *Sender)
{
String dbIp="127.0.0.1",dbPort="1521",dbSid="ORCL",dbUser="webframe",dbPass="webframe2018";
UniConnection1->Disconnect();
UniConnection1->ProviderName="Oracle";
UniConnection1->SpecificOptions->Add("direct=true");
//UniConnection1->SpecificOptions->Add("Charset=ZHS16GBK");
UniConnection1->Username=dbUser;
UniConnection1->Password=dbPass;
UniConnection1->Server=dbIp+":"+dbPort+":"+dbSid;
//ShowMessageN(UniConnection1->Server);


try
{
UniConnection1->Connect();
}
catch(...)
{
Uniguidialogs::ShowMessageN("連接數據庫["+dbIp+"]失敗!");
//FormMain->Close();
}
}

//---------------------------------------------------------------------------

4、在UniMainModule窗口的OnBrowserClose事件中添加斷開數據庫代碼

void __fastcall TUniMainModule::UniGUIMainModuleBrowserClose(TObject *Sender)
{
UniConnection1->Close();
}

//---------------------------------------------------------------------------

5、在UniMainModule.h中定義rowId全局變量

//---------------------------------------------------------------------------


#ifndef MainModuleH
#define MainModuleH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <UniGUIMainModule.hpp>
#include "DBAccess.hpp"
#include "OracleUniProvider.hpp"
#include "Uni.hpp"
#include "UniProvider.hpp"
#include <Data.DB.hpp>
//---------------------------------------------------------------------------
class TUniMainModule : public TUniGUIMainModule
{
__published: // IDE-managed Components
TUniConnection *UniConnection1;
TOracleUniProvider *OracleUniProvider1;
void __fastcall UniGUIMainModuleCreate(TObject *Sender);
void __fastcall UniGUIMainModuleBrowserClose(TObject *Sender);
private: // User declarations
public: // User declarations
String rowId;
__fastcall TUniMainModule(TComponent* Owner, TComponent* AUniApplication);
};
//---------------------------------------------------------------------------
TUniMainModule *UniMainModule(void);
//---------------------------------------------------------------------------

#endif

6、包含FastReport的頭文件和靜態庫目錄

C:\Program Files (x86)\Embarcadero\Studio\19.0\FastReport\LibD25

C:\Program Files (x86)\Embarcadero\Studio\19.0\FastReport\Source

技術分享圖片技術分享圖片技術分享圖片

二、設置UniMainForm主窗口

技術分享圖片

1、包含MainModule窗口

//---------------------------------------------------------------------------
#include <vcl.h>
#include <uniGUIVars.hpp>
#pragma hdrstop


#include "Main.h"
#include "MainModule.h"
#include "Unit1.h"

2、main.h定義變量

class TMainForm : public TUniForm
{
__published: // IDE-managed Components
TUniBitBtn *UniBitBtn1;
TUniQuery *UniQuery1;
TUniDBGrid *UniDBGrid1;
TUniDataSource *UniDataSource1;
void __fastcall UniBitBtn1Click(TObject *Sender);
void __fastcall UniDBGrid1CellClick(TUniDBGridColumn *Column);
void __fastcall UniFormShow(TObject *Sender);
private: // User declarations
String mySql,rowId;
public: // User declarations
__fastcall TMainForm(TComponent* Owner);
};
//---------------------------------------------------------------------------
TMainForm *MainForm(void);
//---------------------------------------------------------------------------

#endif

3、擺放UniQuery,UniDBGrid,UniDataSource控件

UniDBGrid的DataSource指向UniDataSource1,UniDataSource1的DataSet指向UniQuery1,UniQuery1的connection指向UniMainModule.UniConnection1,

UniDBGrid1->Options->dgRowSelect=true

UniDBGrid1->Options->dgCheckSelect=true

4、UniDBGrid1添加OnCellClick事件

void __fastcall TMainForm::UniDBGrid1CellClick(TUniDBGridColumn *Column)
{
//點擊表格選擇記錄
if(UniQuery1->RecNo<1)
{
return;
}
//取打印的行編號
UniMainModule()->rowId=UniQuery1->FieldByName("rowid")->AsString;

}

5、UniBitBtn1打印按鈕事件

void __fastcall TMainForm::UniBitBtn1Click(TObject *Sender)
{
//打印
TUniForm1 *form1=new TUniForm1(UniApplication);
form1->ShowModal();

}

6、初始顯示查詢記錄

void __fastcall TMainForm::UniFormShow(TObject *Sender)
{
//查詢
UniQuery1->Close();
UniQuery1->SQL->Clear();
mySql="select work_id 申請編號,work_man 申請人,work_list 內部加班人,work_corp 外部加班人,";
mySql+="work_date1 計劃開始時間,work_date2 計劃結束時間,auth_team 審批部門,auth_name 審批人,";
mySql+="auth_date 審批時間,auth_stat 審批狀態,work_reason 加班事由,work_date3 實際開始時間,";
mySql+="work_date4 實際結束時間, work_rest 酬勞方式,work_times 加班工資倍數,team_name 申請團隊,part_name 申請部門,inst_name 申請機構,rowid";
mySql+=" from work_apply order by work_id desc";
UniQuery1->SQL->Add(mySql);
UniQuery1->Open();


UniDBGrid1->Columns->Items[0]->Width=100;
UniDBGrid1->Columns->Items[1]->Width=60;
UniDBGrid1->Columns->Items[2]->Width=150;
UniDBGrid1->Columns->Items[3]->Width=150;
UniDBGrid1->Columns->Items[4]->Width=110;
UniDBGrid1->Columns->Items[5]->Width=110;
UniDBGrid1->Columns->Items[6]->Width=80;
UniDBGrid1->Columns->Items[7]->Width=60;
UniDBGrid1->Columns->Items[8]->Width=110;
UniDBGrid1->Columns->Items[9]->Width=80;
UniDBGrid1->Columns->Items[10]->Width=200;
UniDBGrid1->Columns->Items[11]->Width=100;
UniDBGrid1->Columns->Items[12]->Width=100;
UniDBGrid1->Columns->Items[13]->Width=100;
UniDBGrid1->Columns->Items[14]->Width=100;
UniDBGrid1->Columns->Items[15]->Width=100;
UniDBGrid1->Columns->Items[16]->Width=100;
UniDBGrid1->Columns->Items[17]->Width=100;




UniMainModule()->rowId="";


}
//---------------------------------------------------------------------------

三、新建一個打印窗口

技術分享圖片技術分享圖片

技術分享圖片

1、在新建窗口上放置UniPDFFrame1控件用於顯示生成的PDF文件和自動出現打印機選擇和打印按鈕。

frxReport1用於配置打印頁面,frxDBDataset1用戶關聯打印模板和數據集,frxPDFExport1用於將打印頁面frxReport1導出PDF文檔。

frxBarCodeObject1是打印模板用到的條形碼控件。UniQuery1用於查詢要打印的數據。

UniQuery1-〉Connection=UniMainModule.UniConnection1

2、包含UniMainModule和UniServerModule頭文件

#include <vcl.h>

#pragma hdrstop


#include "Unit1.h"
#include "MainModule.h"
#include "ServerModule.h"

3、雙擊frxReport1打開打印模板設計

技術分享圖片

逐個編輯對應的數據字段,比如申請編號,雙擊輸入:

技術分享圖片

設計好打印模板後,將其保存到執行代碼運行的同級目錄下,D:\testPrint\Win32\Debug。

4、打印代碼

在本打印窗口的BefroeShow事件中添加打印事件

void __fastcall TUniForm1::UniFormBeforeShow(TObject *Sender)
{
//打印
AnsiString rptFileName,mySql;
String url;
//
UniQuery1->Close();
UniQuery1->SQL->Clear();
mySql="select work_id 申請編號,work_man 申請人,work_list 內部加班人,work_corp 外部加班人,";
mySql+="work_date1 計劃開始時間,work_date2 計劃結束時間,auth_team 審批部門,auth_name 審批人,";
mySql+="auth_date 審批時間,auth_stat 審批狀態,work_reason 加班事由,work_date3 實際開始時間,";
mySql+="work_date4 實際結束時間, work_rest 酬勞方式,work_times 加班工資倍數,team_name 申請團隊,part_name 申請部門,inst_name 申請機構,rowid";
mySql+=" from work_apply where rowid=:w1";
UniQuery1->SQL->Add(mySql);
UniQuery1->ParamByName("w1")->Value=UniMainModule()->rowId;
UniQuery1->Open();
rptFileName="report_jiaban.fr3";
if(UniQuery1->RecordCount>0)
{
if(!FileExists(UniServerModule()->StartPath+rptFileName))
{
ShowMessage("【打印失敗】打印模板文件"+rptFileName+"不存在!");
return;
}
frxReport1->Clear();
frxDBDataset1->UserName="frxDBDataset1";
frxReport1->LoadFromFile(UniServerModule()->StartPath+rptFileName);
frxReport1->DataSets->Clear();
frxDBDataset1->DataSet=UniQuery1;
frxReport1->DataSets->Add(frxDBDataset1);
frxReport1->PrintOptions->ShowDialog=false;
frxReport1->ShowProgress=true;
frxReport1->EngineOptions->SilentMode=true;
frxReport1->EngineOptions->EnableThreadSafe=true;
frxReport1->EngineOptions->DestroyForms=false;
frxReport1->EngineOptions->UseGlobalDataSetList=false;


frxPDFExport1->Background=true;
frxPDFExport1->ShowProgress=true;
frxPDFExport1->ShowDialog=false;
frxPDFExport1->FileName=UniServerModule()->NewCacheFileUrl(false,"pdf","","",url,true);
frxPDFExport1->DefaultPath="";


frxReport1->PreviewOptions->AllowEdit=false;
frxReport1->PrepareReport();
frxReport1->Export(frxPDFExport1);


UniPDFFrame1->PdfURL=url;


}
else
{
ShowMessage("沒有可以打印的記錄!");
}
}


四、ORACLE數據表結構

1、表結構

技術分享圖片

2、建用戶代碼

DROP USER WEBFRAME CASCADE;


CREATE USER WEBFRAME
IDENTIFIED BY <password>
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
-- 3 Roles for WEBFRAME
GRANT CONNECT TO WEBFRAME;
GRANT DBA TO WEBFRAME;
GRANT RESOURCE TO WEBFRAME;
ALTER USER WEBFRAME DEFAULT ROLE ALL;
-- 1 System Privilege for WEBFRAME
GRANT UNLIMITED TABLESPACE TO WEBFRAME;

3、建表代碼

ALTER TABLE WEBFRAME.WORK_APPLY
DROP PRIMARY KEY CASCADE;


DROP TABLE WEBFRAME.WORK_APPLY CASCADE CONSTRAINTS;


CREATE TABLE WEBFRAME.WORK_APPLY
(
INST_NAME VARCHAR2(50 BYTE),
PART_NAME VARCHAR2(50 BYTE),
TEAM_NAME VARCHAR2(50 BYTE),
WORK_ID VARCHAR2(20 BYTE),
WORK_MAN VARCHAR2(20 BYTE),
WORK_LIST VARCHAR2(100 BYTE),
WORK_CORP VARCHAR2(200 BYTE),
WORK_DATE1 DATE,
WORK_DATE2 DATE,
WORK_DATE3 DATE,
WORK_DATE4 DATE,
WORK_REASON VARCHAR2(200 BYTE),
AUTH_TEAM VARCHAR2(50 BYTE),
AUTH_NAME VARCHAR2(20 BYTE),
AUTH_DATE DATE,
AUTH_STAT VARCHAR2(10 BYTE),
WORK_HOURS FLOAT(126),
WORK_TIMES FLOAT(126),
WORK_FEES FLOAT(126),
WORK_REST VARCHAR2(10 BYTE)
)
TABLESPACE USERS
RESULT_CACHE (MODE DEFAULT)
PCTUSED 0
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 64K
NEXT 1M
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;


COMMENT ON TABLE WEBFRAME.WORK_APPLY IS ‘加班申請表‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.INST_NAME IS ‘機構‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.PART_NAME IS ‘部門‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.TEAM_NAME IS ‘團隊‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.WORK_ID IS ‘編號‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.WORK_MAN IS ‘申請人‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.WORK_LIST IS ‘行內人員‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.WORK_CORP IS ‘行外人員‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.WORK_DATE1 IS ‘計劃開始時間‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.WORK_DATE2 IS ‘計劃結束時間‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.WORK_DATE3 IS ‘實際開始時間‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.WORK_DATE4 IS ‘實際結束時間‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.WORK_REASON IS ‘加班原因‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.AUTH_TEAM IS ‘審批團隊‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.AUTH_NAME IS ‘審批人‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.AUTH_DATE IS ‘審批時間‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.AUTH_STAT IS ‘審批狀態‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.WORK_HOURS IS ‘小時數‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.WORK_TIMES IS ‘加班費倍數‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.WORK_FEES IS ‘加班費‘;


COMMENT ON COLUMN WEBFRAME.WORK_APPLY.WORK_REST IS ‘調休、加班費‘;






CREATE UNIQUE INDEX WEBFRAME.WORK_APPLY_PK ON WEBFRAME.WORK_APPLY
(WORK_ID, WORK_DATE1, INST_NAME, PART_NAME, TEAM_NAME)
LOGGING
TABLESPACE USERS
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
NEXT 1M
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
)
NOPARALLEL;




ALTER TABLE WEBFRAME.WORK_APPLY ADD (
CONSTRAINT WORK_APPLY_PK
PRIMARY KEY
(WORK_ID, WORK_DATE1, INST_NAME, PART_NAME, TEAM_NAME)
USING INDEX WEBFRAME.WORK_APPLY_PK
ENABLE VALIDATE);

五、運行結果

http://127.0.0.1:8077

技術分享圖片技術分享圖片

就要起飛了,時間好緊張,終於搞定.本文僅簡單介紹了單條記錄的打印,其實如何打印全權取決於UniQuery查詢回來多少數據和FaseReport如何設置打印模板..,飛了,大連見。

--------------------- 本文來自 中國銀行之路在腳下 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/dlboy2018/article/details/81040260?utm_source=copy

uniGUI for C++ builder下如何利用FastReport實現數據記錄本地打印