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设置完成后 即可使用

posted @ 2020-12-21 15:16  skyofchaos  阅读(330)  评论(0)    收藏  举报