鼎捷T100程序开发(批次作业开发)
背景需求
我们遇到一个问题,很多期初导入系统的供应商以及客户,很多都没有联络对象识别码,需要给这些缺失联络对象识别码的生成对应的联络对象识别码并将联络识别码填入客户或者供应商表联络对象识别码栏位,所以我们需要开发一个批次作业用于批次生成缺失的联络对象识别码,并将联络对象识别码更新到供应商对应联络识别码栏位。
页面设计
联络对象识别码主要根据联络对象类型以及联络对象编码生成。比如供应商类型就是供应商或者客户,编码就是供应商编码。那么我们批次作业的画面需要这两个栏位,联络对象类型和联络对象编码。可以参考aooi350联络对象维护作业,联络对象类型使用下拉框,联络对象编码使用开窗,批次作业,需要增加一个进度条显示处理的进度。
程序设计
需要根据用户在批次作业画面上录入的条件,查询联络对象识别码空缺的,将这些循环写入数组,并每次生成联络对象识别码,以及更新供应商表中联络对象识别码。这个过程中要在事务中进行,如果遇到错误需要回滚。
开发步骤详解
▎程序创建配置
1.1 打开azzi900,客制程序以c开头,中间是两码模组名,最后一码按照作业类型设置,维护作业单据类型给t,基础资料维护给i或者m。批次作业给p,Q报表给q,R报表给r。例如我们今天要开发一个针对aooi350联络对象识别码没有自动生成的,需要给批次生成,批次程序编码可以为coop350,程序名称为联络对象识别码批次生成作业。(所有弹窗点是即可)
2.1 打开azzi910,和刚刚azzi900一样,维护作业编号,作业编号和程序编号一致,自动带出程序编号和程序名称,如果不一致的需要自己输入程序编号。(所有弹窗点是即可)
▎规格签出与画面生成
3.1 打开并登录T100设计器,点击规格下的下载规格(版本控制),会透过gdc打开adzp050[SPEC]。
3.2 我们在adzp050中搜索刚创建的程序编号coop350,勾选后点击同时签出程序,弹窗点击是。我们将规格和程序同时签出,一般新增程序都是同时签出。
4.1 通过dgc打开adzp168(画面生成器),画面编号输入coop350,选择作业类型为批次作业,会弹窗提示不需要设置字段,不能通过该工具设计画面,生成一个固定空框架,需要在T100设计器中进行设计,点击确定后点击生成画面。
4.2 点击生成画面后,会弹窗预览生成的空框架,点击exit。
4.4 然后弹窗提示是否执行程序编译,点击是。
4.5 最后会弹窗提示程序coop350预编译完成,我们点击确定。
▎画面元素设计
5.1 回到T100设计器,和刚T100设计器一样,点击规格-规格下载(版本控制),搜索coop350,勾选后点击下载。
5.2 点击档案下的开启档案。
5.3 在文件中可以按照修改日期进行排序,一般新下载的会更新修改日期,最新的日期。或者通过文件名称进行搜索也是可以的,选中文件后,双击或者点击打开。规格的扩展名都是tzs。
5.4 增加一个联络对象类型的下拉框。填写表名、以及参考的字段,控件代号,查询条件等。
5.5 再增加一个联络对象编码的开窗栏位。
5.6 字段对应的说明都是以lbl_开头连接对应的栏位编码。
5.7 画面设计完成后,需要点击重排,最后点击上传。
▎程序逻辑实现
6.1 点击程序下的下载程序
6.2 搜索coop350,勾选后点击下载。
6.3 和刚的规格一样,在档案-开启档案,找到刚刚下载的最新的coop350程序,双击打开。程序的扩展名都是tzc。
6.4 打开的程序先不进行修改,先上传一下,保证根据画面生成的程序是OK的。如果没有任何报错说明生成的OK的。
6.5 先对页面上的栏位进行设计,先设置联络对象类型下拉框的内容。
6.6 下拉框的内容是在azzi600里面设置的。
6.7 设置联络对象编码开窗的逻辑,根据联络对象类型选择设置开窗,目前只会用到供应商或者客户所以只写交易对象开窗,后续使用其他联络对象时,这里可以改写为CASE的形式。
6.8 右键funtion,点击新增函式,先新增一个方法,先将程序处理逻辑编写完,一会直接调用即可。
6.9 先定义游标,变量可以根据程序的逻辑逐个定义即可。先将需要处理的数据放入数组中,在for循环中开启事务逐个进行处理。直接在FOREACH中进行事务处理,事务可能会出现一些异常。单独一个for循环进行处理。这里是为了一个供应商处理完就进行事务提交,如果说整个做为一个事务,在FOREACH外进行事务处理,也是可以的。
▎核心代码|方法代码
DEFINE l_sql STRING
#动态数组
DEFINE l_pmaa_d DYNAMIC ARRAY OF RECORD l_pmaa001 LIKE pmaa_t.pmaa001,l_pmaal003 LIKE pmaal_t.pmaal003
END RECORD
#状态码
DEFINE l_success LIKE type_t.num5
#生成的联络对象识别码
DEFINE l_oofa001 LIKE oofa_t.oofa001
#数组下标
DEFINE l_i LIKE type_t.num10
DEFINE l_n LIKE type_t.num10
#进度条
DEFINE l_chr STRING
DEFINE l_stagecomplete LIKE type_t.num20_6#定义游标SQLLET l_sql = " SELECT pmaa001, pmaal003FROM pmaa_tLEFT JOIN pmaal_tON pmaalent = pmaaentAND pmaal001 = pmaa001AND pmaal002 = '",g_dlang,"'WHERE pmaaent = ",g_enterprise,"AND (pmaa027 IS NULL OR pmaa027 = ' ')AND pmaastus = 'Y'AND ",g_wcPREPARE coop350_getpmaa_pre FROM l_sqlDECLARE coop350_getpmaa_cur CURSOR FOR coop350_getpmaa_preCALL l_pmaa_d.clear()LET l_i = 1#循环先写入数组FOREACH coop350_getpmaa_cur INTO l_pmaa_d[l_i].*IF SQLCA.sqlcode THENINITIALIZE g_errparam TO NULLLET g_errparam.code = SQLCA.sqlcodeLET g_errparam.extend = "coop350_getpmaa_cur"LET g_errparam.popup = TRUECALL cl_err()RETURNEND IFLET l_i = l_i + 1END FOREACH#获取数组长度,在for循环中处理数据,FOREACH中可能导致事务异常LET l_n = l_i - 1IF l_n > 0 THENCALL cl_err_collect_init()FOR l_i = 1 TO l_n#进度条LET l_chr = l_pmaa_d[l_i].l_pmaa001,":",l_pmaa_d[l_i].l_pmaal003 DISPLAY l_chr TO stagenow #说明信息LET l_stagecomplete = l_i* 100/l_n #进度显示是百分比,默认会%,乘100DISPLAY l_stagecomplete TO stagecomplete #进度条进度#开启事务CALL s_transaction_begin()LET l_success = ''LET l_oofa001 = ''#调用方法生成联络对象识别码CALL s_aooi350_ins_oofa('3',l_pmaa_d[l_i].l_pmaa001,'') RETURNING l_success,l_oofa001IF NOT l_success THENINITIALIZE g_errparam TO NULLLET g_errparam.code = SQLCA.sqlcodeLET g_errparam.extend = "oofa_t"LET g_errparam.popup = TRUECALL cl_err()CALL s_transaction_end('N','0') CONTINUE FOREND IF#更新交易对象表联络对象识别码UPDATE pmaa_t SET pmaa027 = l_oofa001 WHERE pmaaent = g_enterprise AND pmaa001 = l_pmaa_d[l_i].l_pmaa001IF SQLCA.sqlcode THENINITIALIZE g_errparam TO NULLLET g_errparam.code = SQLCA.sqlcodeLET g_errparam.extend = "upd pmaa_t"LET g_errparam.popup = TRUECALL cl_err()CALL s_transaction_end('N','0') CONTINUE FOREND IFCALL s_transaction_end('Y','0') END FOR CALL cl_err_collect_show()END IF
▎最终处理
6.10 最后在process中处理查询条件,刚刚游标定义中用到了g_wc,查询的是pmaa表,画面上使用的是oofa,需要将条件中oofa003转换为pmaa001。并调用刚刚编写的方法,最后点击上传。
这样我们就完成了批次作业的开发,如果要把作业挂载目录下,可以在azzi880(菜单维护作业)进行增加。