




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
深入QuickReport(一)作者:董维春(本文已在CSDN开发高手04年第一、二、三期上发表,应广大网友的要求,经编辑同意,发表在CSDN作者本人文档中,略有修改,但仅即于此,未经CSDN或作者本人同意任何个人与网站不得转载、摘抄,否则任何涉及到版权的行为后果自负)报表是数据库应用程序的基本组成部分之一,完整的数据库应用程序总要提供报表功能。与传统的数据库应用程序设计工具相比,C+ Builder中提供了QuickReport组件,使C+ Builder的数据库功能得到了极大的丰富。QuickReport是挪威Qusoft AS公司专门为C+ Builder设计的用于报表的一组控件,在C+ Builder上我们使用的QuickReport与专业版的QuickReport相比,在功能上还有很大的差距,但对于我们来说只要充分利用好她,就可以非常快捷的设计出功能强大、模式多样的数据报表,最重要的是她不需要我们花额外的钱去购买。其实QuickReport并不难,但介绍的这方面的内容实在太少,并且她的帮助文档写得也不太好,让那些想学习QuickReport的C+Builder爱好者找不到一个正确的、合适的方法。如果你想了解她、使用她,那好吧,让我来帮你认识这个妖女吧,如果此文对你能有所帮助,那是我最大的快乐!第一部分:QuickReport基本知识BCB引进的Qusoft公司的报表组件系列,它包括多个组件。首先有必要先简单的了解一下这二十三个组件的基本位置与功能。一、组件功能简介上面的两个图是QuickReport组件页的中所有组件,在BCB6中提供给我们使用的不会少于上面的23个的。下表是按上图中组件的位置先后,对各控件的使用功能逐一做了简单的介绍:1)QuickRep带有坐标,作为其他报表控件(如TQRBand)的容器,通过它的Band属性可以自动添加各种类型的TQRBand重要属性(Properties)使用说明DataSet连结数据来源,一般是ADO/BDE连接组件的名字Page纸张的设置,可展开BottomMargin10.0mm报表下边界尺寸Columns1报表分栏数,默认为1栏ColumnSpace0.0mm报表栏与栏间隔尺寸,Columns值大于1时有效LeftMargin10.0mm报表左边界尺寸Length210.0mm报表长度尺寸,与PaperSize设置相关OrientationpoPortraitpoLandscape报表方向 打印方向,有下面两个值:直印poPortrait、横印poLandscapePaperSizeA4报表打印纸张大小RightMargin10.0mm报表右边界尺寸Rulertrue报表标尺显示TopMargin10.0mm报表上边界尺寸Width297.0mm报表宽度尺寸,与PaperSize设置相关PrinterSettingCopies1报表复制份数Duplexfalse报表双重打印FirstPage0报表打印起始页LastPage0报表打印终止页OutPutBinAuto报表输出种类ReportTitle报表预览打印标题Unitsmm报表设计阶段显示标尺单位2)QRSubDetail建立一个主/明细(master/detail) 报表,连接明细文件的组件3)QRStringsBand可建立一读取TStrings中项次值的组件。在这个组件里有一个Items属性,若Items一个值(一行空、一回车行)都没有,那他上面的组件将不会起作用。当String List Editor中有几行,该组件上的内容就重复几次。若只有一行内容时,她与一个DetailBand是一样的;而多行时,也是差不多的,即先重复该区段内的可视组件几次(几行就几次),然后下一个再重复。比如三行,那就是第一个数据来三行,然后第二个数据来三行,再然后,直到最后4)QRBand用来确定在报表的不同位置应该显示什么内容,它上面可以放控件5)QRChildBand在报表中基础子项条列组件。他有一个ParentBand属性,你必须把他与其它band连接起来,只有这样在她里面布置的组件才有效。说直接就是已经有了一个Band而你还需要一个这样的组件,那就用她吧6)QRGroup在报表中对资料做逻辑上分组的组件。当你连接了几个datasets到报表时可以通过Groups成组的对dataset进行操作7)QRLabel打印静态的文本(即不是根据数据库值来改变的),作用象Tlabel 。 Caption的内容就打印出来的内容;AutoStretch是布尔型变量,当标签标题在设定范围内不能打印时,该属性将起作用,若为true,报表将继续打印没有打印完的文本,其它需要打印的文本将依次向后移动,反之,则超出部分不被打印8)QRDBText在报表中具有显示连结资料来源的文字功能的组件9)QRExpr在报表中具有显示陈述句或计算表示式值的组件10)QRSysData在报表中具有显示系统信息的组件11)QRMemo在报表中显示备注文字的组件12)QRExprMemo在报表中是TQRExpr和TQRMemo的混合组件13)QRRichText在报表中具有显示区域文字功能的组件14)QRDBRichText在报表具有显示连结资料来源的区域文字功能的组件15)QRShape在报表中处理几何图形的组件,如方形、圆角方形、椭圆16)QRImage在报表中显示静态的图片,包括(BMP,WMF,ICON)17)QRDBImage在报表中显示从数据库接收的图片18)QRCompositeReport在报表中连结有关与无关的报表组件,用于创建混合报表的组件,可以把两个或两个以上的报表连接在一起,组成一个报表19)QRPreview在执行阶段建立自订预览报表组件20)QRTextFilter将报表内容输出于ASCII text文件21)QRCSVFilter将报表内容输出于CSV文件22)QRHTMLFilter将报表内容输出于HTML文件23)QRChart可以在报表上应用的图表工具二、组件关系表下图说明了与QuickReport相关组件之间的连接与关系:ADOTable=|QRChilderBandDataBase=ADO=|=QuickRep=QRBand=可视化组件ADOQueryPreview();就可以了。没有人希望那个什么也不显示的TQuickRep组件摆在窗体上,这也告诉我们一点我们的程序中最好有两个Form:一个是放置控制QuickReport显示、打印或实现其它功能的,比如本例中放置控制按扭;一个是提供给QuickReport布置组件的。当然这不是说在一个Form中实现不了上述功能,其实你只要在窗体的OnCreate事件中把TQuickRep组件隐藏起来就可以了:void _fastcall TForm1:Form1Create(TObject *Sender)QuickRep1-Hide();要注意QR你不能用Show()调用,那你将得不到你想要的程序,当然用Preview()就没错了。以下是本例的程序源代码:#pragma package(smart_init)#pragma resource *.dfmTForm1 *Form1;/-_fastcall TForm1:TForm1(TComponent* Owner): TForm(Owner)/-void _fastcall TForm1:Form1Create(TObject *Sender)QuickRep1-Hide();/-void _fastcall TForm1:Button1Click(TObject *Sender)QuickRep1-Preview();/-进一步思考:有时我们想实现垂直输出,比如用TQRLabel里的内容我们想垂直显示能否实现?当然能实现。只要我们按如下设置就可以实现:AutoSize=false;/默认为trueAutoStrech=true;/ 默认为falseWordWrap=true;/ 默认为true,这是设置中的重点,这与Label中的设置是一样的Caption的值要注意,每个字符间一定要有空格;/一般的设置我们不会留空格,因为设计空格除了美观,没什么实际意义,但在这里必须留空格进一步思考:我们想显示有两位小数的数字,应该如何办呢?只要把该可视化组件的mask属性设为0.00就可以实现了。例二:TQRGroup、TQRExpr组件的应用该报表先列出州名,接着列出该州的所有公司及公司总数,一个州列完后空一行(Group中断),列出新的州名,接着列新州下的所有公司,没有填州名的公司统一列在“不清楚什么地区的”下面。1)新建一个Project。2)放一个TQuery在TForm上,其SQL属性为:select * from customer order by State,Company,即根据州、公司排序,DatabaseName为BCDEMOS,Active为true。3)放一个TQuickRep控件在Form1上,DataSet为Query1。4)放一个TQRBand在TQuickRep上面,把其BandType设成rbDetail。5)放一个TQRGroup控件在TQuickRep上,这时默认为Group Header。(任何时候当Group中断或更高级别的Group中断,这个Header都将打印出来,如果有表达式,根据表达式的值显示内容),接着添加一个Group Footer Band,但我们却不能找到这样的一个组件,那应该如何设计出Group Footer Band区段呢?我们只要放一个QRBand2在报表上,把TQRGroup的FooterBand属性指向QRBand2,看一下,QRBand2是不是变成了Group Footer Band。(TQRGroup的一个重要特性是表达式,任何时候当表达式的值改变时,Group都将中断,如表达式是按省列出城市名,当前列出辽宁省,当属于辽宁省的城市列完后,表达式值改变,这时Group中断,接着显示其他省的城市名),TQRGroup1的Expression属性设为Query1.State(根据不同的州来中断)。注意:为什么不直接再放一个TQRGroup,因为无论我们放多少个系统都会默认为 Group Header。6)放一个TQRExpr控件在Group Header上面,其Expression属性为:IF(Query1.State ,Query1.State,不清楚什么地区的),即如果公司的州没填,就归入“不清楚什么地区的”,否则归入具体的州。7)放三个TQRDBText在Detail上,他们的DataSet都指向Query1,DataField分别指向Company、Contact、Phone。8)再放一个TQRExpr控件在Group FooterBand上面,Expression为Query1.State+共有:+STR(COUNT)+个公司,作用是在每个州的公司列完后显示这个州总共有多少个公司。9)把鼠标放在QuickRep组件上(不能放在Band区段上),按右键选预览,应该看到不同的州名及其公司名称和该州公司总数。注意:大家发现看到并不是每个州公司的总数,每个州后列出的都是把上一个州的总数也加上的累计值,难道是我们错了,没有,检查一下你的Expression组件(运行COUNT那个)的ResetAfterPrint的属性值是否为true,如果不是把他改为true,现在看一下J进一步思考:每一组内容都联在一起,有些不爽,要是每组内容之间被什么分隔开就好了?其实这并不难实现,我们只要把QRBand2(group Footer)的HasChild属性设为true就可以了。当然你直接把一个TQRChildBand组件放在QuickRep1上,把她的ParentBand属性设置为QRBand2,同样可以实现上面的设置。另外我们同样可以在TQRChildBand布置其它可视化组件J进一步思考:要是每组结束后就换页,那不是更爽吗?只要我们把QRGroup1的ForceNewPage属性改为true就可以了,同样的组件还有一个ForceNewColumn。但一定要注意,我们改了哪个区段的这两个属性,就从哪个区段开始NewPage/NewColumn。例三、TQuickRep组件的Page属性应用PVC胸卡有些朋友一定见过,做这样的卡片并不太难,最近笔者就参与制作了一批胸卡,这里我们要讲的是卡片的设计。1)新建一个Project。2)放一个Table组件,把它指向我们的资源数据库,并把Active设为true。3)放置一个TQuickRep组件在Form1上,并把它DataSet设置为Table1,在她上面放一个TQRBand,把其BandType值设置成rbDetail。在Band区段上面按下图放置好四个TQRLabel组件、三个TQRDBText组件与一个TQRDBImage组件。4)三个TQRDBText组件的设置基本上一样的,把DataSet指定为Table1,然后在从DataField中选取正确的字段。我们可以同样的设置好TQRDBImage的相关属性。5)对页面进行设置,这是关键。一张纸上我们不可能只打印一个,打印得越多越多好,左边打完,在右边继续打印,这样才能充分利用原材料。我们这里用到了分栏,把Number of columns属性设为2,也就是分两栏。在TQuickRep中使用组件的快捷菜单Reportsettings打开Page的属性编辑器窗口,做如下设置:其中Pager size选择为自定义,在其后输入纸的大小 ,其它设置按上图即可。当然我们也可以在对象查看器窗口单击Page属性左端的编辑按钮,展开其属性值来进行正确的设置,如下图:6)TQRBand的Width设为228,然后重新调整好Band上组件的位置。228实际上是由386得到的。7)把鼠标放在QuickRep组件上(不能放在Band区段上),按右键选预览,看一下效果吧。难点:为了定位方便、准确,TQuickRep组件提供了坐标(一格一格的,边上带数字的,不会告诉我没看见吧J),从对纸张的设置我们知道这些坐标每整格相距为10mm,但在QR中,很多组件都没有单位,对于这10 mm,QR中对应的单位长度是38,这一点你一定要记住。通过上面的三个例子,我们已经可以进行了一些简单的报表设计,从例四开始我们将进一步的学习QuickReport,下面例程也只讲关键点,着重分析,省略一些重复性的语言。例四、主/明细(Master/Detail)报表与TQRSubDetail组件的应用设计主/明细报表的关键有两点:一是主/明细数据表的连接;二是对TQRSubDetail组件的正确使用。主从数据表连接示意图1(TTable与TTable)Master表关联Detail表组件名TTableTDataSource1TTable重要属性Name= DataSetNameTableNameName=DataSourceDabaseNameDabaseName(指定索引字段)IndexFieldNameMasterField(点击右侧“”调出Field Link Designer对话框,设置好关联字段)ActiveActive主从数据表连接示意图2(TTable与TQuery)Master表关联Detail表组件名TTableTDataSource1TTQuery重要属性Name= DataSetNameTableNameName=DataSourceDabaseNameDabaseName(指定索引字段)IndexFieldNameSQL(点击右侧“”调出StringlistEditor对话框设置好关联字段)ActiveActiveTQRSubDetail组件的设置:1)Master的值设为所在TQuickRep组件的名;2)DataSet的值设为连接明细表的组件名;3)点击Bands前面的“+”,展开属性,能看到HasFooter与HasHeader两个属性,把其值设为true,这样我们就得到了一对Group(当然完全我们完全可以用别的方法)。注意:通过TQRSubDetail属性Band里的HasHeader、HasFooter产生的Group组,在Group Header中没有Expression,她们默认按主/明细表的关联关系分组。其实没有他们,TQRSubDetail也是这样用的。我们建立如下图的主/明细报表:1)设置数据集在窗体上放置TTable、TDataSource、TQuery组件,把Table1、Query1的DatabaseName属性设置为BCDEMOS,把Table1的TableName设为customer.db(主表名),把IndexFieldName设为索引字段名CustNo。把DataSource1的DataSet设为Table1,为做主/明细数据做好准备。连接明细表的Query1,我们把其DataSource设为DataSource1,从而建立关联关系,并将其SQL属性设成:SELECT*FROMorders WHERE CustNo =:CustNo| |选择所有字段从orders表(从表)条件从表的字段建立主从关系主表字段这样我们就建立了明细表与主表的关联,明细表是按上式关系分组的,就是把CustNo一样的放在一起。2)设置报表结构首先,在前面设计的窗体上放置一个报表组件TQucikRep,在对象查看器窗口中把Band属性展开,将其HasColumnHeader、HasDetail、HasPageFooter、HasPageHeader、HasSummary和HasTitle属性设为true。把QuickRep1的DataSet属性设为Table1,为报表主表指定数据源。然后,把TQRSubDetail组件放到QuickRep1组件上,作为明细表Band区段。把其Master属性设置为QuickRep1,设置Bands的子属性HasHeader和HasFooter为true,并将其DataSet属性设置为Query1,指定明细表数据来源。3)设置主/明细报表的主体在ColumnHeaderBand1区段中添加主表中各字段的标题使用的报表标签组件(TQRLable),它们的Caption分别为客户号、公司、电话、传真和所在城市。在DetailBand1区段中添加显示主表字段值的报表组件(TQRDBText),与前面标题对应设置其字段,要注意的是它们的DataSet都为Table1。在明细报表部分,我们首先在GroupHeaderBand1中放置明细表的表头标签(TQRLable),它们的Caption依次设置为定单号、条款、付款方式、款项总额和未付款额。在QRSubDetail1区段中放置显示明细报表的组件对象(TQRDBText),其DataSet属性全设为Query1,字段名称依次是OrderNo、Terms、PaymentMethod和ItemsTotal。接着添加一个TQRExpr组件,设置其Master属性为QRSubDetail,打开表达编辑器,输入下面的表达式:INT(Query1.ItemsTotal-Query1.AmounPaid)在GroupFooterBand1区段中添加统计报表组件QRExpr2,并将其属性设置为QRSubDetail1,打开表达式编辑器,输入如下表达式:SUM(INT(Query1.ItemsTotal-Query1.AmounPaid)即计算未付款项的总额,并设置ResetAfterPrinter属性为true,这样,就可以统计出明细表的总额了。在SummaryBand1区段中添加一个QRExpr3,打开表达式编辑器,在其中输入如下语句:SUM(INT(Query1.ItemsTotal-Query1.AmounPaid)这样这个报表的主体我们就做完了,其它设置看一下上面的图你就应该明白了。下面我们再添加例一中的那样的程序代码,至此这样的一个复杂报表我们就完成了。本例是用TTable与TQuery做的主/明细数据关联,同样我们可以用TTable与TTable做主/明细数据关联,实现本例这样的报表。深入QuickReport(三)作者:董维春(本文已在CSDN开发高手04年第一、二、三期上发表,应广大网友的要求,经编辑同意,发表在CSDN作者本人文档中,略有修改,但仅即于此,未经CSDN或作者本人同意任何个人与网站不得转载、摘抄,否则任何涉及到版权的行为后果自负)第三部分:报表中的其他问题通过前两部分的学习,我想你对QuickRep已经有了一定的掌握,在这部分我们对报表设计中的其他一些问题做一下简单介绍,也许这些你并不常用,但同样这些内容对于我们学习QuickRep还是有很大益处的。此部分内容都以例程的形式讲解,为了保持文章的完整性,例子的编号接上部分。例五、报表的连接及保存通过上面的例子,你也许会动手做了几个报表,有时你一定会想把其中的一些报表连接起来,组成一个综合报表,并作为整体来操作。在BCB中实现这一点并不难,我们这时要用到TQRCompositeReport组件。它提供了一个OnAddReprots事件,在创建报表时将触发这个事件,因此我们只要在这个事件中用Add方法将需要连接在一起的报表添加到该组件的事件中就可以了。下面给出一个示例程序段,这是把两个报表添加到综合报表中的,代码如下:void _fastcall TForm1:QRCompositeReportAddReports(TObject *Sender)(TQRCompositeReport*)Sender)-Reports-Add(Form2-QuickRep1);/添加第一个报表(TQRCompositeReport*)Sender)-Reports-Add(Form3-QuickRep1);/添加第二个报表做好的报表我们一定都想保存起来,保存的文件格式有:文本格式文件(TXT),组件TQRTextFilter;超文本格式文件(HTML/HTM),组件TQRHTMLFilder;逗号分隔文件(CSV),组件TQRCSVFilter;以及报表文件。保存前三种格式文件需要调用ExportToFilter方法,而直接保存报表组件,则只需用Save。这个例子中我们放了一个TSaveDialog对话框和QuickReport组件页中的TQRTextFilter、TQRHTMLFilder、TQRCSVFilter三个组件。完整的代码如下:void _fastcall TForm1: SaveRepo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 并行计算架构设计实践
- 如何让初高中学生更好地掌握学业规划
- 新材料绿色能源开发协议
- 婚前财产协议书范文模板
- 互联网战略合作协议内容
- 农业产业供应链合作开发协议
- 会议记录与决策跟踪管理模板操作手册
- 企业采购合同审核与签订流程
- 生产进度计划及执行跟踪表格
- 课后那些有趣的事儿记事作文(11篇)
- 湿地巡护员培训课件
- 2025鄂尔多斯市城市建设投资集团招聘92人考试参考题库及答案解析
- 一氧化碳试卷及答案
- 2025年全国企业员工全面质量管理知识竞赛题库及答案(共132题) - 副本
- 果蔬加工工艺学:果蔬汁
- 门机防腐施工方案
- 定向井井眼轨迹计算课件
- 石景山区语文一模试卷讲评分析
- 八年级上学期语文周周练
- 《青光眼手术新进展》ppt课件
- 低压配电室送电方案(共2页)
评论
0/150
提交评论