|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622 。
您需要 登录 才可以下载或查看,没有帐号?注册
x
如果大家用过QAD这套ERP软件的话,对她提供的Cimload这套工具应该不太陌生吧。
可是最近用的时候却发现奇怪的问题:
按照Cimload格式生成的数据,手工在界面中输入会报错,但Cimload结果一切正常,prn文件中的记录显示没有错误,但数据却没有录入到系统中。
于是,研究了一下Cimload功能的原程序,问题解决,现在分享一下经验吧,呵呵。
环境介绍:
1. 目前公司用的系统是eb2.1,因此,后面所有源码的分析都是基于这一版本,其他版本可能有所不同。
2. 要执行Cimload的程序是以前公司自己写的,因此,并未考虑到Cimload功能。
源码分析:
好了,废话了这么多,现在进入正题吧,先看下面的代码:(代码是从36.15.2这个画面中提取出来的,对应文件名为 mgbdpro.p )
PROCEDURE process_all:
......
/*以下为第一部分功能*/
input from value(work_i_file) no-echo.
output to value(work_o_file) keep-messages.
batchrun=yes.
do on stop undo aloop,leave aloop:
{gprun.i execname}/*这里才是真正的在做Cimload*/
end.
output close.
input close.
......
......
/*以下为第二部分功能*/
input from value(work_o_file) no-echo.
repeat:
linefield = ""./*linefield是字符类型的数组*/
set linefield with width 255.
if linefield[1] = "**" or
linefield[1] = "ORACLE" or
linefield[1] = (getTermLabel("WARNING",11) + ":") or
linefield[1] = (getTermLabel("ERROR",8) + ":")
then do:
/*中间是错误记录的代码*/
end.
end.
process_all这个过程,就是执行Cimload的核心代码(其实,还有个过程process_by_screen,功能和process_all差不多,差异好像是process_by_screen直接从Cimload文件中读数据执行,不经过bdl_mstr、bdld_det这2个表的处理吧,不过其具体代码懒得研究了,只是猜测而已,呵呵),她内部大致分为2个部分,第一部分执行Cimload,第二部分对前面生成的临时文件作分析,判断错误情况。
第一部分,Cimload功能分析:
<a 首先,work_i_file存的是要执行的Cimload数据,其格式实际上就是我们导入的Cimload原始资料,但去掉了@@batchload和@@end这两行,而且,只包含一条数据(也就是36.15.1中生成的一个Group ID对应的数据,所有数据是通过循环调用这个过程来导入的);
<b 然后,设置batchrun这个全局变量,其功能应该是告诉系统环境现在是在批处理模式下运行吧;
<c 通过调用{gprun.i execname},就可以把数据写到系统中了,其实这句话实际上就是一个run命令,execname实际上就是@@batchload后面的程序名(从这里看,Cimload功能应该是被系统给集成了,像update、prompt-for这类函数可能会根据batchrun的设置而自动选择是显示一个界面让用户输入,还是从当前的输入流中读取数据吧),注意,这条语句被包含在一个do语句中,do语句会捕捉在运行过程中产生的所有stop消息,换句话说,也就是如果我们在写程序时发现录入的数据有错误,则可以调用stop命令,这样,就可以停止Cimload的运行了;
<d 对于运行过程中生成的所有消息,都会被写入到work_o_file所对应的文件中,而这个文件,则是第二部分功能的主要数据源;
第二部分,Cimload错误分析:
这部分比较简单,没什么可说的,只要记住,如果想生成错误消息,只要在要输出的消息前面加上“WARNING: ”或“ERROR: ”就可以了,注意最后的空格不能省。
好了,就写道这里吧。
最后,给自己作作宣传吧,最近开通了博客,欢迎大家来做客,一起讨论技术。
本文在博客中的链接为:
http://blog.csdn.net/xinghun61/archive/2010/06/03/5646088.aspx
|
|