在PB 7.0中实现多数据窗口的连续打印
PowerBuilder最吸引人的地方就是她那强大的数据窗口技术,它为展现数据的本质提供了丰富的手段,数据窗口能够从多种数据源提取数据,然后以多种风格展现在用户面前,对于一个PB程序员能否用好用活数据窗口是那么的重要,同时也反映出编程人员的一定技术水平。相信在看了本文之后一定会对你编写程序有所帮助,文中如有任何不妥之处还请同仁们多多指教。
在实际的应用中我们或许会碰到用户有这样的要求,在第一张报表上打印一个客户的购买商品的统计数据,以后的每页显示的是他购买商品的明晰清单。也就是相当于打印两份报表,一份是统计报表,另一份是明细表。单纯就这两份报表而言对于任何一个PB程序员来说都不是什么难事,很容易就可以搞定,我们完全可以分两张报表打印给用户,但这还总是让我们觉得似乎缺了点什么,毕竟用户是想让这两份报表作为一个整体出现,最起码的要求是它们的页号应该连续,并且同时也能告之用户总共有多少页。这就涉及到多个数据窗口连续打印的问题。
首先,统计和明细的结果是根据用户输入的条件来得到的,这是个不定的结果,我们无法预先得知会有多少条数据,更别说需要多少页了。即便是我们能够确定有多少条数据也会因为用户打印机的纸张设置不同而会出现不同的显示结果。其次,要在统计表和明细表里显示两张报表的总页数,这个有点难度,毕竟对于两张报表来说都是个未知数,即对于统计表来说,它可以知道自己的总页数,但不知道明细表的总页数。同样对于明细表也是这样,只知道自己的总页数,而不知道统计表的总页数。这样很难在两张报表里分别显示它们的页数之和。虽然如此可对于它们自己而言当前是第几页还是能够确定的,这个只要调用数据窗口的内嵌函数Page()就可以很容易的得到。
下边我们就通过一个简单的例子来探讨如何实现多个数据窗口连续打印技术。程序首先让用户输入客户号,然后系统根据用户输入的客户号统计出该客户各类商品的购买总数以及订购的每一种商品明细。整个程序的执行如下三副图所示:


在开始之前先让我们看一下例子中用到的三张表的结构以及它们之间的相互关系,见下图: 
其中,表Customer和表Sales_Order通过cust_id(客户编号)相关联,表Sales_Order和表Sales_Order_Items通过id(销售定单号)相关联。这三张表取自于PB自带的演示数据库。
首先我们要做的第一件事就是制作两张带检索参数的数据窗口,这个很简单我就不细说了。其中,统计表命名为dw_1,明细表命名为dw_2。同时,为了在打印的时候显示给用户“第几页”“总共多少页”的信息,因此在两张报表每页的底端分别加上一个计算域用来显示当前页数和总页数信息。以统计表dw_1为例,在dw_1中增加两个计算域,取名为page_1 和computer_2。见下图: 
接下来要做的就是如何正确给这两个计算域赋值。对于当前页的显示,在前面已经说过了,可以直接在计算域的表达试中调用数据窗口的内嵌函数Page(),因此,在page_1的表达式中写上函数Page()。
- ·以假乱真 Linux中实现Vista界面
·Max粒子系统轻松实现群蝶飞舞
·利用VB6.0实现五线谱作曲工具
·轻松实现电脑一分为二:Betwin
·用VC实现小型矢量图形系统的开发(上)
·盗QQ的密码软件模拟实现(VC)
·让Excel 2007实现双面打印的两种另类方
·洪水攻击原理及代码实现全攻略
·用ATL实现VC插件
·ASP.NET系统用户权限设计与实现
由于该计算域的放置是为了在程序中能够引用,相当于一个变量,目的也只是得到明细表的页数,这对于用户来说他并不需要知道,所以将它设为不可见,即Visible属性为FALSE。然后设置该计算域的表达式为:“0”。这只是个初始值,需要在程序中更新。
要在程序中动态得到一个数据窗口的页数需要用到两个函数Describe()和Evaluate(),函数的意义如下:
1、 函数Describe()
定义:
dwcborder="0" align="center" alt="在PB 7.0中实现多数据窗口的连续打印(图七)" />
- ·以假乱真 Linux中实现Vista界面
·Max粒子系统轻松实现群蝶飞舞
·利用VB6.0实现五线谱作曲工具
·轻松实现电脑一分为二:Betwin
·用VC实现小型矢量图形系统的开发(上)
·盗QQ的密码软件模拟实现(VC)
·让Excel 2007实现双面打印的两种另类方
·洪水攻击原理及代码实现全攻略
·用ATL实现VC插件
·ASP.NET系统用户权限设计与实现

至此,整个程序结束。下面是完整的程序代码:
********************* 程序代码 **********************
// 设置两张报表的显示模式为预览模式
tab_1.tabpage_1.dw_1.object.datawindow.print.preview = true
tab_1.tabpage_2.dw_2.object.datawindow.print.preview = true
tab_1.tabpage_1.dw_1.Retrieve(integer(tab_1.tabpage_3.sle_1.text))
tab_1.tabpage_2.dw_2.Retrieve(integer(tab_1.tabpage_3.sle_1.text))
string ls_pagecount
// 得到明细表中的页数
ls_pagecount = tab_1.tabpage_2.dw_2.describe("Evaluate('pagecount()',1)")
tab_1.tabpage_1.dw_1.object.next_pagecount.expression = ls_pagecount
// 设置统计表中的存放明细表总页数的计算域next_pagecount
// 得到统计表中的页数
ls_pagecount = tab_1.tabpage_1.dw_1.describe("Evaluate('pagecount()',1)")
// 设置明细表中的存放统计表总页数的计算域previous_pagecount
tab_1.tabpage_2.dw_2.object.previous_pagecount.expression = ls_pagecount
********************* 结束 **********************
至此,有关多个数据窗口连续打印技术就全部讲述完毕,为了便于大家能够更好的理解,我提供了一个PB的源程序,它是在WIN98环境下,PB7.03调试通过。由于本文所用的数据库是PB自带的例程数据库所以没有被打包。进入讨论组讨论。
- 最新文章
- PB中数据窗口的精确页面打印技术[01-04]
- 循序渐进学习Power Builder 6.0(6-2)[01-04]
- 循序渐进学习Power Builder 6.0(6-1)[01-04]
- 循序渐进学习Power Builder 6.0(6-0)[01-04]
- 循序渐进学习Power Builder 6.0(5-2)[01-04]
- 循序渐进学习Power Builder 6.0(5-1)[01-04]
- 相关文章
