QAD 实现批量导入菜单(GUI版) -Index5-Model
1.Model示例
Exp: 导入通用代码 36.2.13, mgcodemt.p
/*------------------------------------------------------------------------
File : cimgcode
Purpose :
Syntax :
Description :
Author(s) : TERRENCE ZHANG
Created : Thu Feb 01 12:49:01 CST 2018
Notes :
----------------------------------------------------------------------*/
&SCOPED-DEFINE SK + CHR(10) +
CLASS cimgcode INHERITS cimbase IMPLEMENTS Icimode:
DEFINE PROTECTED TEMP-TABLE tempgcode NO-UNDO
FIELD tpguid AS CHARACTER
FIELD tpfldname AS CHARACTER COLUMN-LABEL 'Field Name'
FIELD tpvalue AS CHARACTER COLUMN-LABEL 'Value'
FIELD tpcmmt AS CHARACTER COLUMN-LABEL 'Comments'
FIELD tpisok AS LOGICAL
FIELD tpmsg AS CHARACTER.
CONSTRUCTOR PUBLIC cimgcode(INPUT domain AS CHARACTER,INPUT langdir AS CHARACTER,INPUT usrid AS CHARACTER):
ASSIGN global_domain = domain global_user_lang_dir = langdir global_userid = usrid.
tptbhd = TEMP-TABLE tempgcode:HANDLE.
END CONSTRUCTOR.
METHOD OVERRIDE PROTECTED VOID vcheckdata():
FOR EACH tempgcode:
FIND FIRST code_mstr WHERE code_domain = global_domain AND code_fldname = tpfldname AND code_value = tpvalue NO-WAIT NO-ERROR.
IF LOCKED code_mstr THEN tpmsg = 'This record was locked,unable to update'. /*锁判断*/
IF AVAILABLE code_mstr THEN RELEASE code_mstr.
IF LENGTH(tpfldname,'RAW') > 32 THEN ASSIGN tpmsg = "The length of Field Name exceeds limit".
IF LENGTH(tpcmmt,'RAW') > 24 THEN ASSIGN tpmsg = "The length of Comments exceeds limit".
END.
END METHOD.
METHOD PUBLIC OVERRIDE VOID vexecload(INPUT cimexec AS CHARACTER,INPUT testmode AS LOGICAL):
DEFINE VARIABLE dstring AS CHARACTER NO-UNDO. /*字符串流*/
DEFINE VARIABLE cim AS cimload NO-UNDO. /*CIMLOAD类*/
cim = NEW cimload(global_user_lang_dir). /*设定语言路径*/
cim:testmode = testmode.
FOR EACH tempgcode ON ERROR UNDO,LEAVE: /*事务可以每条 可以整次导入 do transaction 的范围*/
dstring = QUOTER(tpfldname) {&SK} QUOTER(tpvalue) {&SK} QUOTER(tpcmmt).
dstring = dstring {&SK} ".".
cim:uiload(dstring,cimexec).
ASSIGN
tpisok = NOT cim:hverr /*取反*/
tpmsg = cim:errmsg.
IF cim:hverr THEN UNDO,NEXT.
END.
DELETE OBJECT cim.
cim = ?.
END METHOD.
METHOD PUBLIC VOID mainblock():
vmainblock('mgcodemt.p',NO).
END METHOD.
END CLASS.
Exp: 导入替代结构 13.15, bmasmt.p
/*------------------------------------------------------------------------
File : cimbmas
Purpose :
Syntax :
Description :
Author(s) : TERRENCE ZHANG
Created : Thu Feb 01 12:49:01 CST 2018
Notes :
----------------------------------------------------------------------*/
&SCOPED-DEFINE SK + CHR(10) +
CLASS cimbmas INHERITS cimbase IMPLEMENTS Icimode FINAL:
DEFINE PROTECTED TEMP-TABLE tempbm NO-UNDO
FIELD tpguid AS CHARACTER
FIELD tppar AS CHARACTER COLUMN-LABEL 'Item Number'
FIELD tpcomp AS CHARACTER COLUMN-LABEL 'BOM Code'
FIELD tpref AS CHARACTER COLUMN-LABEL 'Reference'
FIELD tprmks AS CHARACTER COLUMN-LABEL 'Remarks'
FIELD tpisok AS LOGICAL
FIELD tpmsg AS CHARACTER.
CONSTRUCTOR PUBLIC cimbmas(INPUT domain AS CHARACTER,INPUT langdir AS CHARACTER,INPUT usrid AS CHARACTER):
ASSIGN global_domain = domain global_user_lang_dir = langdir global_userid = usrid.
tptbhd = TEMP-TABLE tempbm:HANDLE.
END CONSTRUCTOR.
METHOD PROTECTED OVERRIDE VOID vcheckdata():
FOR EACH tempbm:
IF NOT CAN-FIND(FIRST pt_mstr WHERE pt_domain = global_domain AND pt_part = tppar NO-LOCK)
THEN ASSIGN tpmsg = 'Item Number ' + tppar + ' doesnot exist'.
IF NOT CAN-FIND(FIRST bom_mstr WHERE bom_domain = global_domain AND bom_parent = tpcomp NO-LOCK)
THEN ASSIGN tpmsg = 'BOM Code ' + tpcomp + ' doesnot exist'.
IF LENGTH(tpref,'RAW') > 12 THEN ASSIGN tpmsg = "The length of Reference exceeds limit".
IF LENGTH(tprmks,'RAW') > 24 THEN ASSIGN tpmsg = "The length of Remarks exceeds limit".
END.
END METHOD.
METHOD PUBLIC OVERRIDE VOID vexecload(INPUT cimexec AS CHARACTER,INPUT testmode AS LOGICAL):
DEFINE VARIABLE dstring AS CHARACTER NO-UNDO. /*字符串流*/
DEFINE VARIABLE cim AS cimload NO-UNDO. /*CIMLOAD类*/
cim = NEW cimload(global_user_lang_dir). /*设定语言路径*/
cim:testmode = testmode.
FOR EACH tempbm ON ERROR UNDO,LEAVE:
dstring = setq(tppar).
dstring = dstring {&SK} setq(tpcomp) + ' ' + setq(tpref).
dstring = dstring {&SK} setq(tprmks).
dstring = dstring {&SK} ".".
dstring = dstring {&SK} ".".
cim:uiload(dstring,cimexec).
ASSIGN
tpisok = NOT cim:hverr /*取反*/
tpmsg = cim:errmsg.
IF cim:hverr THEN UNDO,NEXT.
END.
DELETE OBJECT cim.
cim = ?.
END METHOD.
METHOD PUBLIC VOID mainblock():
vmainblock('bmasmt.p',NO). /*调用13.15菜单*/
END METHOD.
END CLASS.
主要要素:
1.继承cimbase类 实现Icimode接口
2.定义一个临时表 用来存储从Excel读取的数据
注意需有 tpguid tpisok tpmsg 三个字段 作用 tpguid:唯一标识符 tpisok:是否导入成功 tpmsg:检验信息/导入错误信息
3.构造函数 传入当前的global_domain global_user_lang_dir global_userid 用于后续使用
4.vcheckdata() 自定义检查 可以在标准程序之外加上自己的检查逻辑 会在导入前执行,如果检查出则不会执行cimload,而导出检查信息
5.vexecload() 实例化cimload类 从临时表 生成导入字符串 执行导入 如果出错则回滚出错的导入 (自定义cimload类另有文章说明)
6.mainblock() 实现接口的方法 cimframe类(View)里用到
新增一个GUI 批量导入菜单 就编写如上一个model类 在xxguicimset.p设置完成后 即可使用

浙公网安备 33010602011771号