Web打印利器之-PbDataWindow

业务场景

前段时间公司要把PB的东东搞到Asp.Net项目里,并实现打印.考虑过使用水晶报表,这样PB的DataWindow(数据窗口)就用不上了,这个很心痛,而且水晶报表相当于是个鸡肋.(书中暗表,PB的DataWindow相当相当的强大,不用确实可惜).经过多方打探和印证,PB的DataWindow有个active的web控件,叫active datawindow.其实sybase本身推出了datawindow.net,但个人感觉,使用起来没有active datawindow好用.

active datawindow的强大之外在于

l 可以以字符串方式加载数据

l Asp.net所涉及的样式表,js代码一律不需要,我们只需要在后台将数据加载至dataset或datatable对象里即可,调用一个转为字符串的方法,直接加载即可

l PB中可以用Create方式在DataWindow中创建一个对象,同样的语法,直接可以在active datawindow调用.这样就最大程度的解决了PB和Net间共用问题.

好了,废话不多说了.先看一下整体效果图,如图-1所示.本篇贴子就是详细讲解一下如何使用这个控件实现web打印.

图-1

怎么样,效果还可以吧!展示区部分,使用的就是active datawindow控件.如果使用拼接html字符串的方式,可能要拼上一段时间吧,而且html的样式也可拼接进去.至少对于我来说,我会疯掉.现在web开发流行这样一句话:行为和结构分开!

实现环境

首先,要装个pb11.5,原因是需要其中的dll和cab文件,只要有这些dll和cab包之外,再加上pb必备的dll文件,也可以不装pb11.5的(所有的dll和cab文件,均可以下载).文件列表如下所示,如图-2和图-3所示

图-2

图-3

若已安装pb11.5的

cab文件在\Sybase\Shared\PowerBuilder文件夹

dll文件在\Sybase\PowerBuilder 11.5\DotNET\bin文件夹.还有一部分dll文件是pb必备的,在系统盘的/window/system32/文件夹里可以找到,pb开头的

实现步骤

下面我们通过一个完整的实例来展现它的强大

第1步,搭建环境,新建一个web项目解决方案,将我们之前安装好的cab和dll文件放进来,整体布局如图-4所示

图-4

在此说明下

App_Code是针对这个控件封装的一些类

Cab是控件安装包

Pbl是数据窗口展示部分,一个页面的样式,布局,非数据部分都在这里存储

Public下面的js文件,也是针对这个控件封装的js前端类

这里要注意一下,由于此控件加载数据是通过ajax方法从后端取数据加载的,因此前后端交互所产生的数据量会比较大,需要在web.config加上如下代码,如图-5所示

图-5

其次,我们需要布局一个页面,比如样式,文字大小和颜色等,这里我使用的是PB11.5,目前没有什么好工具可以替代PB来画数据窗口,如图-6所示,我们画好了一个页面

图-6

里面对于文字的大小,字体,颜色等都可以调整.而且还可以把数据窗口导出至字符串文件,如图-7所示

图-7

保存成字符串的文件后,好处多多啊!

第2步,在页面中引用此控件,如图-8所示

图-8

引入之后,所有准备工作都以完成,接下来就直接编写代码了

第3步,编程实现数据加载,采用的是ajax从后台取数据,在前台加载,我们先看看后台代码,如图-9所示

图-9

我们说下代码的思路

1. 首先,创建一个datastore对象,相当于net里的dataset/datatable,即数据集,创建它时,要指定它是所属哪个数据窗口(相当于数据源,sql语句是啥)

2. 其次,将要加载至此控件中的数据加载至dataset或datatable对象中,然后通过ds_print.Retrieve(table_data)即可实现绑定,看就这一句话,就实现了数据的加载,加载好以后,通过ajax方法传至前台页面,前台页面接收到值以后,按图-10所示代码即可实现加载

图-10

至此,加载数据过程结束,让我们看看最终效果图,如图-11所示

图-11

提供的示例项目中有详细代码,在此不再赘述.

开发结论

1. 整个开发过程中,最为复杂的环节属于画页面的过程,加载数据只需加载至dataset/datatable对象中即可

2. 动态实现控件赋值,如图-12所示.同时我们还可以动态的创建控件,删除控件,控件包括图片,计算域均可

图-12

3. 较为复杂的报表,比如主明细,有表头和表尾,套打之类的,都没有问题.

结论

在bs软件中实现cs方式的打印,实在是bs软件打印功能的利器,在此强烈推荐!

FAQ

1. 问:执行打印事件时没有响应?

答:需要指定一个打印机名称,在前台代码中指定即可,如图-13

图-13

2. 问:所有控件都可以动态创建吗?

答:可以,请参考PbDwModelWebUI类方法

3. 问:有表头,表体和表尾的报表如何处理?

答:制作数据窗口的时候,制作为复合式数据窗口,分别对这个数据窗口中的子数据窗口加载数据即可,详细代码请参考PbDwModelWebUI类

4. 问:数据窗口中栏目类型是下拉菜单如何加载其数据源?

答:将下拉菜单的数据源看成是datatable即可,也相当于子数据窗口,详细代码请参考PbDwModelWebUI类

5. 问:关于此控件的帮助文档在哪可以找到?

答:PB11.5编程环境中即可找到,如图-14所示.browser页面内,选ole页面即可

图-14

6. 问:提示控件安装失败或者没有提示安装

答:在ie选项-高级里,关于active控件的选项,置为提示或启用,如果仍然不可以,再在ie选项->安全->自定义级别里,将active控件的选项,置为提示或启用即可

最后,祝大家使用此控件愉快,同时,本人免费提供该控件技术支持!

 

源码WebPbDataWindow

你可能感兴趣的:(报表打印)