版权声明:本文为博主原创文章,未经博主允许不得转载。 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实现数据记录本地打印的更多相关文章

  1. 利用shuf对数据记录进行随机采样

    最近在用SVM为分类器做实验,但是发现数据量太大(2000k条记录)但是训练时间过长...让我足足等了1天的啊!有人指导说可以先进行一下随机采样,再训练,这样对训练结果不会有太大影响(这个待考证).所 ...

  2. Linux下FastDFS分布式存储-总结及部署记录

    一.分布式文件系统介绍分布式文件系统:Distributed file system, DFS,又叫做网络文件系统:Network File System.一种允许文件通过网络在多台主机上分享的文件系 ...

  3. uniGUI for C++ builder之杂七杂八小知识

    uniGUI for C++ builder之杂七杂八小知识 2018年09月30日 22:16:05 中国银行之路在脚下 阅读数:41 标签: uniguibuilder 更多 个人分类: C++ ...

  4. (25)uniGUI for C++ builder之UniHTMLMemo初使用及uniGUI如何调用javaScript

    (25)uniGUI for C++ builder之UniHTMLMemo初使用及uniGUI如何调用javaScript 2018年09月29日 22:58:20 中国银行之路在脚下 阅读数:11 ...

  5. 在不格式化原有系统盘的情况下,利用grub4dos+firadisk制作RamOS VHD Win7总结

    在不格式化原有系统盘的情况下,利用grub4dos+firadisk制作RamOS VHD Win7总结在不格式化原有系统盘的情况下,用grub4dos+firadisk安装WIN7到VHD,内存大的 ...

  6. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件

    原创,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4555328.html  之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量 ...

  7. EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题

    小故事 在开始讲这篇文章之前,我们来说一个小故事,纯素虚构(真实的存钱逻辑并非如此) 小刘发工资后,赶忙拿着现金去银行,准备把钱存起来,而与此同时,小刘的老婆刘嫂知道小刘的品性,知道他发工资的日子,也 ...

  8. 利用FastReport传递图片参数,在报表上展示签名信息

    在一个项目中,客户要求对报表中的签名进行仿手写的签名处理,因此我们原先只是显示相关人员的姓名的地方,需要采用手写方式签名,我们的报表是利用FastReport处理的,在利用楷体处理的时候,开发展示倒是 ...

  9. 使用FastReport报表工具生成标签打印文档

    在我们实际开发报表的时候,我们需要按一定的业务规则组织好报表的模板设计,让报表尽可能的贴近实际的需求,在之前的随笔中<使用FastReport报表工具生成报表PDF文档>介绍了FastRe ...

随机推荐

  1. LibreOJ #6008. 「网络流 24 题」餐巾计划 最小费用最大流 建图

    #6008. 「网络流 24 题」餐巾计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  2. Jackson高并发情况下,产生阻塞

    情况:在高并发情况下,查看线程栈信息,有大量的线程BLOCKED. 从线程栈得知,线程栈中出现了阻塞,锁在了com.fasterxml.jackson.databind.ser.SerializerC ...

  3. Linux 双网关(电信与联通)

    经常有这种需求,一台Linux服务器配置电信IP和网通IP,默认情况下,后启动的网卡的网关生效.南电信北网通,配置电信和网通IP,无非是为了减少网络延时,使电信用户的请求响应在电信网络中传输,网通用户 ...

  4. oracle 视图带参数

    -- create or replace package p_view_param is --参数一 function set_ID(num number) return number; functi ...

  5. ajax 跨域请求没有带上cookie 解决办法

    公司项目前后端分离.. 前端全部html 静态页面.. 后端java 接口服务 由于前后端分离,出现跨域问题. 为了解决,我们使用jsonp 方式请求接口服务,暂时解决了跨域问题(使用jquery a ...

  6. maven 介绍(zz )

    Maven 编辑     目录 1简介 2特点 3常用命令 4推荐书籍 5Win7配置 6生命周期     1   1简介 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构 ...

  7. java14

    1.方法:定义一个小功能,储存某段代码,方便在需要时调出来反复使用 !!!!重复使用 格式: static void 名称(){ } 注意点: ①在static main方法中要调用其他方法,调用的其 ...

  8. mysql 批量杀进程

    select concat('KILL ',id,';') from information_schema.processlist where user='root';

  9. 【转】如何用Redis做LRU-Cache

    LRU(Least Recently Used)最近最少使用算法是众多置换算法中的一种. Redis中有一个maxmemory概念,主要是为了将使用的内存限定在一个固定的大小.Redis用到的LRU ...

  10. hadoop 修改datanode balance带宽使用限制

    前段时间,一个客户现场的Hadoop看起来很不正常,有的机器的存储占用达到95%,有的机器只有40%左右,刚好前任的负责人走了,这边还没有明确接班人的时候. 我负责的大数据计算部分,又要依赖Hadoo ...