AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > PowerBuilder

在PB 7.0中实现多数据窗口的连续打印

51自学网 2015-09-27 http://www.51zixue.net

  现在来实现总页数赋值。我们知道在在数据窗口的内嵌函数中除了能得到当前页的Page()函数,还有一个函数叫PageCount(),它的功能是得到当前报表的总页数。如果说只有一张报表的话直接把它写上就行了,但问题是现在的总页数实际上是当前报表(统计表)总页数加上另一张报表(明细表)总页数之和。为了在统计表中得到明细表的总页数,我们不妨再增加一个计算域next_pagecount,该计算域保存有明细表的页数。见下图:



  由于该计算域的放置是为了在程序中能够引用,相当于一个变量,目的也只是得到明细表的页数,这对于用户来说他并不需要知道,所以将它设为不可见,即Visible属性为FALSE。然后设置该计算域的表达式为:“0”。这只是个初始值,需要在程序中更新。

  要在程序中动态得到一个数据窗口的页数需要用到两个函数Describe()和Evaluate(),函数的意义如下:

  1、 函数Describe()

  定义:

dwcontrol.Describe(propertylist)

  它的功能是返回数据窗口控件结构方面的指定信息,包括数据窗口对象以及数据窗口对象中其他对象的属性取值。你可以在这个函数中指定一个或者多个需要取得值的属性字符串,此外,该函数还能执行数据窗口内嵌函数组成的表达试。

  其中,参数Dwcontrol表示连接数据窗口对象的数据窗口控件、子数据窗口控件或者数据存储。Propertylis表示String类型的变量,可以是属性列表或内嵌函数表达式。该函数返回String类型的变量。有关Describe()的具体含义和用法还请参阅用户手册。

  2、 函数Evaluate()

  定义:

Evaluate('expression', rownumber)

  它是Describe函数中的一个求值函数,它可以执行数据窗口画笔中定义的计算域中的表达式,并返回字符型结果。其中,Expression代表想要执行的包含内嵌函数的表达式;Rownumber表示要执行表达式的数据窗口内的数据行

  3、举例说明:

string ls_return
ls_return = dw_1.Describe("Evaluate(' if (sales_amount > 2, 0, sale_amount)', 1")

  以上代码表示,如果第一条数据的sales_amount值大于2,则函数返回“2”,否则ls_return 的值为sales_amount。注意,函数Describe返回的是字符串类型的数据。

  有了这两个函数之后我们就可以在程序中得到一个数据窗口的页数,实现代码如下

string ls_pagecount
ls_pagecount = dw_2.Describe("Evaluate('pagecount()',1)") // 得到DW_2中总页数
dw_1.object.next_pagecount.expression = ls_pagecount // 给计DW_1中的算域赋值

  最后我们就可以在computer_2计算域的表达式中写上:pageCount() + next_pagecount,从而得到两张报表的页数之和。

  对于明细的表的做法也是如此,就不再浪费笔墨了。需要提醒大家注意的是,由于明细表是紧接着统计表打印出来的,所以它的当前页数理所当然应该接着统计表连续下去,因此在明细表的当前页数计算域中不能是简单的page(),因该加上统计表的总页数,即,page() + previous_pagecount。其中previous_pagecount为计算域,是用来存放统计表的总页数,它相当于统计表中的next_pagecount。同样,也应该在代表总页数的计算域的表达式中加上统计表的总页数,即,pagecount() + previous_pagecount。

  当全部设置完之后我们可以来看看效果如何了。运行一下,两张报表的当前页数和总页数都很正确,而且第二份报表的页数也是正好承接于第一份报表。在目前看来至少是符合了程序的设计要求,现在我们来打印看看...奇怪,怎么报表的页号乱了?是不是程序写错了?...都不是!通过分析显示的报表和打印的报表我们发现,原来我们上面所取得的报表总页数都只是显示时候的,即它的结果是根据你的数据窗口控件的大小计算出来的。也就是说,假设这次在数据窗口里检索出10条符合条件的记录,如果数据窗口做的足够大的话,那么这10条记录是在一页中显示,但如果数据窗口做小了,数据就会分成几页显示(相对于数据窗口控件的大小),在这种情况下我们就会看见在数据窗口控件的右边出现一个垂直滚动条允许用户通过上下滚动查看全部的数据。无论你的数据窗口做的大还是小,这10条记录在一张标准的A4纸上是完全可以打印的下,这也就是为什么会出现上面的这种页号和总页数不相符的原因。

 
 

上一篇:PB中用Windows API制作位图菜单  下一篇:PB中数据窗口的精确页面打印技术