版权声明:本文为博主原创文章,未经博主允许不得转载。 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. read temperature

    button1, button2, richtexbox1, serialport1, using System;using System.Collections.Generic;using Syst ...

  2. Netty 源码 ChannelHandler(四)编解码技术

    Netty 源码 ChannelHandler(四)编解码技术 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一.拆包与粘 ...

  3. Shortest Unsorted Continuous Subarray LT581

    Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...

  4. jedis常用API

    一.Redis Client介绍 1.1.简介 Jedis Client是Redis官网推荐的一个面向java客户端,库文件实现了对各类API进行封装调用. Jedis源码工程地址:https://g ...

  5. 64位ubuntu 兼容32位

    http://www.cnblogs.com/mliudong/p/4086797.html 首先要打开64位系统对32位的支持 第一步:确认64为架构的内核 dpkg --print-archite ...

  6. syslog、日志服务器安装、卸载详解、如何安装和卸载EventLog Analyzer

  7. 又一道区间DP的题 -- P3146 [USACO16OPEN]248

    https://www.luogu.org/problemnew/show/P3146 一道区间dp的题,以区间长度为阶段; 但由于要处理相邻的问题,就变得有点麻烦; 最开始想了一个我知道有漏洞的方程 ...

  8. linux系统配置参数修改

    一.永久修改主机名修改/etc/sysconfig/network,在里面指定主机名称HOSTNAME=然后执行命令hostname 主机名这个时候可以注销一下系统,再重登录之后就行了. 或者修改/e ...

  9. python读取文件操作.CSV

    #-*- encoding:utf-8 -*- import numpy as np import pandas as pd def test(): # header=0,表示文件第0行为列索引 # ...

  10. 实现两个sym转一个sym

    CVO输出如果是一个像素并行输出,选择内嵌人插入同步码.如果两个像素并行输出是不能选择内嵌的,只能选择分离的方式.如果把输出的并行数据给VIP并且要求是内嵌,那只能在内部转或者外部转. 这里是实现外部 ...