用ActiveX控件和JavaScript脚本实现基于Web的票据套打(源码下载)

    本文所描述的是在某大型国企中发票打印的设计与实现。由于本系统是作为一个项目的组成部分而不是一个独立的项目存在,所以用户很自然的提出了发票打印的操作要以WEB形式进行操作。这一个看似简单的需求导致了无数的后话,说实话:感谢客户给我一个锻炼的机会。现在项目已经到了验收阶段,这让我有机会从这个项目中把收获到的东西好好总结一下,有一些东西可能出了这个公司的门就再也不会遇见了,于是本文诞生了!

    先说明一下该系统的过程吧.

    首先就认为是一个简单的本地(网络)打印机的调用过程罢了(一个南京的朋友有类似的DEMO,还提供了源码DOWNLOAD),没想到项目中有一个信息发布平台的子系统,结果用户就强烈的,非常强烈的要求要将打印在WEB上实现,也罢也罢,那就得要做一个内嵌WEB的控件来调用打印机了,想了想用DELPHI来开发算了,它的ACTIVEX FORM真不错.好不容易把控件搞定了,下面就是数据源的问题了.


图1 - DELPHI ACTIVEX FORM INTERFACE LIST


    也是因为自己经验不足,没有充分意识到数据源在本系统里面的重要性(其实已经早就意识到了,只不过....).下面介绍下票据数据源的信息:在该企业里有已上马的SAP系统,当然要我通过SAP写AB语言来进行访问,那就要了我的命算了.好在SAP数据库本身就是一个及其复杂的ORACLE而已(在SAP这层上进行的关联还是牛B的),而已也有对应字段的含义,于是建立一个ORACLE数据库连接不就了了么?众所周知,SAP数据库可不是想让你连过久连多久的,而已其服务器的资源是非常宝贵的,最可恶的是这其中涉及很多的非技术因素,如果每个企业应用都直连SAP,它就离死不远了.所以就有一个本地ORACLE数据库的存在,想想做个DTS就KO了吧,非也非也.SAP的数据库字符集和我们通常所有的ORACLE不同,SAP为德文字符集,而我们的是中文的,在做数据DTS时无法进行字符集的转换,造成应用时的展示为乱码,由于两个字符集在数据存储时的空间就不同(中文16位,德文8位),所以就要在其中做字符集的转换,但是又不能在ORACLE上创建第二个实例,郁闷啊郁闷啊,也不是SHUT DOWN,因为在本地ORACLE上还有其他的应用数据库,只好做了一个BUFFER SERVER结合UDP通讯进行数据库的操作.该操作的步骤如下:
    1.BUFFER与SAP数据库建立DB LINK
    2.BUFFER字符集转换为SAP字符集
    3.清空BUFFER
    4.利用DB LINK,用SAP数据填充BUFFER
    5.改变BUFFER为中文字符集
    6.清空LOCAL
    7.用BUFFER填充LOCAL
    是不是所有问题都解决了呢?不是,ACTIVEX的控件在脚本访问的同时不仅仅要从本地ORACLE数据库获取数据,而已必须对打印的历史记录进行记录操作(相同开票凭证的发票如果已经经过打印显然是不能够再次打印的), 所以在脚本里就要能够通过WebService获取数据源,因为这里采用了WebService对本地数据库进行访问(只所以采用WebService的方式,而不将其作为控件的组成是为了降低系统偶合程度),同时记录下已打印的票据信息,在打印操作结束前在用于记录打印历史的数据库中进行Insert操作,这里用到的"无闪烁刷新"(利用JavaScript访问WebService就是其中的一种实现方式)也是工控上的实时报表常用的技术,当然这里少不了Microsoft提供的webservice.htc.

    下面是系统架构图,涉及到的东西比较多,针对这个图说明两点:
    1.Application Database采用的是ACCESS数据库
    2.WEBDEC / ZHS16GBK为ORACLE字符集的名称

图2 - 系统整体架构图

    由于过程中并非都由我进行编码,本着互相交流的愿望,所有源码提供下载(已经过初步测试).
    向我的同事们鼓掌!同时也希望大家多提意见,共同进步.

    Web Site
    UDP SERVER
    ACTIVEX控件

posted on 2005-11-08 20:51  Yoko  阅读(15979)  评论(17编辑  收藏  举报