QAD 实现批量导入菜单(GUI版) -Index4-UIConfig

1.对批量导入的菜单进行设置

/*------------------------------------------------------------------------
    File        : xxguicimset.p
    Purpose     : GUI CIMLOAD MENU CONFIG

    Syntax      :

    Description : 

    Author(s)   : TERRENCE ZHANG
    Created     : Sat Oct 29 13:38:56 CST 2016
    Notes       :
  ----------------------------------------------------------------------*/

&SCOPED-DEFINE WIDTHLMT 56
/*76  设置最大的合计宽度*/

{mfdtitle.i}

DEFINE VARIABLE clsname AS CHARACTER FORMAT "x(16)" NO-UNDO. /*类名*/
DEFINE VARIABLE menuname AS CHARACTER FORMAT "x(16)" NO-UNDO.
DEFINE VARIABLE contrname AS CHARACTER FORMAT "x(16)" INIT "xxcimgeneral.p" NO-UNDO.
DEFINE VARIABLE viewname AS CHARACTER FORMAT "x(16)" INIT "cimframe.cls"  NO-UNDO.
DEFINE VARIABLE frametitle AS CHARACTER FORMAT "x(50)" NO-UNDO.
DEFINE VARIABLE bptitle AS CHARACTER FORMAT "x(50)" NO-UNDO.
DEFINE VARIABLE datelab AS CHARACTER FORMAT "x(12)" NO-UNDO.
DEFINE VARIABLE showdate AS LOGICAL NO-UNDO.
DEFINE VARIABLE togbxlab AS CHARACTER FORMAT "x(12)" NO-UNDO.
DEFINE VARIABLE showtogbx AS LOGICAL NO-UNDO.
DEFINE VARIABLE togbx AS LOGICAL NO-UNDO.
DEFINE VARIABLE togbxmsgf AS CHARACTER FORMAT "x(50)" NO-UNDO.
DEFINE VARIABLE togbxmsgt AS CHARACTER FORMAT "x(50)" NO-UNDO.
DEFINE VARIABLE labellist AS CHARACTER FORMAT "x(16)" EXTENT 7 NO-UNDO. 
DEFINE VARIABLE formatlist AS DECIMAL EXTENT 7 INIT 8 NO-UNDO.
DEFINE VARIABLE visiblelist AS LOGICAL EXTENT 7 INIT YES NO-UNDO.
DEFINE VARIABLE totwidth AS DECIMAL NO-UNDO.

DEFINE VARIABLE i AS INTEGER INITIAL 1 NO-UNDO.
DEFINE VARIABLE choice AS LOGICAL INIT YES NO-UNDO.

FORM /*GUI*/ 
   
RECT-FRAME       AT ROW 1.4 COLUMN 1.25
RECT-FRAME-LABEL AT ROW 1   COLUMN 3 NO-LABEL
SKIP(.5)  /*GUI*/
clsname COLON 20 LABEL "MODEL-PROGRAM"
menuname COLON 55 LABEL "MENU-PROGRAM" SKIP(.2)
contrname COLON 20 LABEL "CONTR-PROGRAM"
viewname COLON 55 LABEL "VIEW-PROGRAM" SKIP(.2)
frametitle COLON 15 LABEL "MAIN TITLE" SKIP(.1)
bptitle COLON 15 LABEL "BROWSE NAME" SKIP(.1)
datelab COLON 15 LABEL "DATE LABEL" 
showdate COLON 45 LABEL "SHOW DATE" SKIP(.1)
togbxlab COLON 15 LABEL "TOGBX LABEL" 
showtogbx COLON 45 LABEL "SHOW TOGBX"
togbx COLON 70 LABEL "CHECKED"
SKIP(.1)
togbxmsgf COLON 15 LABEL "UNCHECKED MSG" SKIP(.1)
togbxmsgt COLON 15 LABEL "CHECKED MSG" SKIP(.2)
labellist[1] COLON 15 LABEL "LABEL[1]"
formatlist[1] COLON 45 LABEL "WIDTH[1]"
visiblelist[1] COLON 70 LABEL "VISIB[1]" SKIP
labellist[2] COLON 15 LABEL "LABEL[2]"
formatlist[2] COLON 45 LABEL "WIDTH[2]" 
visiblelist[2] COLON 70 LABEL "VISIB[2]" SKIP
labellist[3] COLON 15 LABEL "LABEL[3]"
formatlist[3] COLON 45 LABEL "WIDTH[3]" 
visiblelist[3] COLON 70 LABEL "VISIB[3]" SKIP
labellist[4] COLON 15 LABEL "LABEL[4]"
formatlist[4] COLON 45 LABEL "WIDTH[4]" 
visiblelist[4] COLON 70 LABEL "VISIB[4]" SKIP
labellist[5] COLON 15 LABEL "LABEL[5]"
formatlist[5] COLON 45 LABEL "WIDTH[5]" 
visiblelist[5] COLON 70 LABEL "VISIB[5]" SKIP
labellist[6] COLON 15 LABEL "LABEL[6]"
formatlist[6] COLON 45 LABEL "WIDTH[6]" 
visiblelist[6] COLON 70 LABEL "VISIB[6]" SKIP
labellist[7] COLON 15 LABEL "LABEL[7]"
formatlist[7] COLON 45 LABEL "WIDTH[7]"
visiblelist[7] COLON 70 LABEL "VISIB[7]"
SKIP(.5)
WITH FRAME a SIDE-LABELS WIDTH 80 ATTR-SPACE
NO-BOX THREE-D /*GUI*/.

DEFINE VARIABLE F-a-title AS CHARACTER.
F-a-title = "GUI CIMLOAD MENU CONFIG".
RECT-FRAME-LABEL:SCREEN-VALUE IN FRAME a = F-a-title.
RECT-FRAME-LABEL:WIDTH-PIXELS IN FRAME a = FONT-TABLE:GET-TEXT-WIDTH-PIXELS(RECT-FRAME-LABEL:SCREEN-VALUE IN FRAME a + " ", RECT-FRAME-LABEL:FONT).
RECT-FRAME:HEIGHT-PIXELS IN FRAME a = FRAME a:HEIGHT-PIXELS - RECT-FRAME:Y IN FRAME a - 2.
RECT-FRAME:WIDTH-CHARS IN FRAME a = FRAME a:WIDTH-CHARS - .5. /*GUI*/

mainloop:
REPEAT WITH FRAME a ON ENDKEY UNDO mainloop,LEAVE mainloop:
    UPDATE
    clsname VALIDATE(clsname NE "","Class name cannot be blank!")
    HELP "Please enter the Class name"
    WITH FRAME a
    EDITING:
      /* FIND NEXT/PREVIOUS RECORD */
      {mfnp.i xxqcfg_mstr clsname "xxqcfg_type = 'GUICIMSET' AND xxqcfg_chr01" clsname xxqcfg_chr01 xxqcfg_type}
        IF recno <> ? THEN DO:
            DO i = 1 TO 7:
                ASSIGN 
                labellist[i] = ENTRY(i,xxqcfg_chr16)
                formatlist[i] = DECIMAL(ENTRY(i,xxqcfg_chr17))
                visiblelist[i] = LOGICAL(ENTRY(i,xxqcfg_chr18)).
            END.  
        DISP 
          xxqcfg_chr10 @ menuname
          xxqcfg_chr11 @ viewname
          xxqcfg_chr12 @ contrname
          xxqcfg_chr01 @ clsname   
          xxqcfg_chr02 @ frametitle
          xxqcfg_chr03 @ bptitle
          xxqcfg_chr04 @ datelab 
          xxqcfg_log02 @ togbx
          xxqcfg_log03 @ showdate
          xxqcfg_log04 @ showtogbx
          xxqcfg_chr05 @ togbxlab 
          xxqcfg_chr08 @ togbxmsgf 
          xxqcfg_chr09 @ togbxmsgt    
          labellist
          formatlist
          visiblelist
          WITH FRAME a. 
          recno = ?.
        END.
    END. /* EDITING */

    clsname = ENTRY(1,clsname,".").
     
    IF SEARCH(clsname + ".cls") = ? AND SEARCH(clsname + ".r") = ? THEN 
    DO:
        MESSAGE "MODEL-PROGRAM " + clsname + ".cls" + " does not exist" VIEW-AS ALERT-BOX ERROR.
        UNDO,RETRY.    
    END.
          
    RUN dispset.

    UPDATE
    contrname HELP "F6=Re-compile Menu Program"
   /*viewname*/ GO-ON ("F6")
    WITH FRAME a.
    
    IF LASTKEY = KEYCODE("F6") /*手动重新编译*/
    THEN 
    DO:
        UPDATE menuname HELP "Press Key INSERT to Compile Menu Program" GO-ON("insert") WITH FRAME a.
        IF LASTKEY = KEYCODE("insert") THEN 
        RUN compile-rcode(REPLACE(clsname,"cim","")).
    END.
    
    loop-b:
    REPEAT ON ENDKEY UNDO loop-b,LEAVE loop-b:
        SET
        frametitle
        bptitle
        datelab 
        showdate
        togbxlab 
        showtogbx
        togbx
        togbxmsgf 
        togbxmsgt 
        labellist [1 FOR 7]
        formatlist [1 FOR 7]
        visiblelist[1 FOR 7]
        GO-ON ("F5" "CTRL-D")
        WITH FRAME a.
        
        IF LASTKEY = KEYCODE("F5") OR LASTKEY = KEYCODE("CTRL-D") THEN
        DO:
            MESSAGE "Confirm to delete?" VIEW-AS ALERT-BOX QUESTION BUTTONS YES-NO UPDATE choice.
            IF choice THEN
            DO:
                FOR FIRST xxqcfg_mstr WHERE xxqcfg_type = "GUICIMSET" AND xxqcfg_chr01 = clsname EXCLUSIVE-LOCK:
                    DELETE xxqcfg_mstr.
                    MESSAGE "Deleted".
                END.
            END.
            NEXT mainloop.
        END.
        
        /*
        totwidth = 0.
        DO i = 1 TO EXTENT(formatlist):
            IF visiblelist[i] = NO THEN NEXT.
            totwidth = totwidth + formatlist[i].
        END.
        IF totwidth NE {&WIDTHLMT} THEN 
        DO:
            MESSAGE 'The Total Width should be {&WIDTHLMT}' VIEW-AS ALERT-BOX WARNING.    /*宽度总和得是56*/
            UNDO loop-b,RETRY loop-b.
        END.
        */
        
        FIND FIRST xxqcfg_mstr WHERE xxqcfg_type = "GUICIMSET" AND xxqcfg_chr01 = clsname NO-ERROR.
        IF NOT AVAILABLE xxqcfg_mstr THEN DO:
            CREATE xxqcfg_mstr.
            ASSIGN xxqcfg_type = "GUICIMSET"
            xxqcfg_id = GUID 
            xxqcfg_chr01 = clsname
            xxqcfg_userid = global_userid
            xxqcfg_create = NOW.
        END.
        ASSIGN xxqcfg_chr02 = frametitle
        xxqcfg_chr03 = bptitle
        xxqcfg_chr04 = datelab
        xxqcfg_log02 = togbx
        xxqcfg_log03 = showdate
        xxqcfg_log04 = showtogbx
        xxqcfg_chr05 = togbxlab
        /*xxqcfg_chr06 = labellist[1]
        xxqcfg_chr07 = STRING(formatlist[1])*/
        xxqcfg_chr08 = togbxmsgf
        xxqcfg_chr09 = togbxmsgt
        xxqcfg_chr10 = menuname
        xxqcfg_chr11 = viewname
        xxqcfg_chr12 = contrname
        xxqcfg_chr16 = labellist[1]
        xxqcfg_chr17 = STRING(formatlist[1])
        xxqcfg_chr18 = STRING(visiblelist[1]).
        DO i = 2 TO 7:
            ASSIGN 
            xxqcfg_chr16 = xxqcfg_chr16 + "," + labellist[i]
            xxqcfg_chr17 = xxqcfg_chr17 + "," + STRING(formatlist[i])
            xxqcfg_chr18 = xxqcfg_chr18 + "," + STRING(visiblelist[i]).
        END.
        IF AVAILABLE xxqcfg_mstr THEN RELEASE xxqcfg_mstr.
        
        /*COMPILE VALUE(clsname + ".cls") SAVE.*/
        MESSAGE "Preview ?" VIEW-AS ALERT-BOX QUESTION BUTTONS YES-NO UPDATE choice.
        IF choice THEN
        DO:  
            {gprun.i ""gpwinrun.p"" "(menuname,'Menu Preview(Cimload will rollback)')"}        
            /*预览模式不会导入数据 因为在loop-b的事务中  ESC就会回滚导入的数据*/
        END.
    END.  /*loop-b*/
END.  /*main-loop*/

PROCEDURE dispset.
    FIND FIRST xxqcfg_mstr WHERE xxqcfg_type = "GUICIMSET" AND xxqcfg_chr01 = clsname NO-LOCK NO-ERROR.
    IF AVAILABLE xxqcfg_mstr THEN
    DO:
        ASSIGN menuname = xxqcfg_chr10
        viewname = xxqcfg_chr11
        contrname = xxqcfg_chr12.
        IF menuname = '' THEN 
        ASSIGN menuname = REPLACE(clsname,"cim","xx") + "loadc.p".
        DO i = 1 TO 7:
            ASSIGN 
            labellist[i] = ENTRY(i,xxqcfg_chr16)
            formatlist[i] = DECIMAL(ENTRY(i,xxqcfg_chr17))
            visiblelist[i] = LOGICAL(ENTRY(i,xxqcfg_chr18)).
        END.
        /*如果为空 则出现默认*/
        DISPLAY 
          menuname
          xxqcfg_chr11 @ viewname
          xxqcfg_chr12 @ contrname
          xxqcfg_chr02 @ frametitle
          xxqcfg_chr03 @ bptitle
          xxqcfg_chr04 @ datelab 
          xxqcfg_log02 @ togbx
          xxqcfg_log03 @ showdate
          xxqcfg_log04 @ showtogbx
          xxqcfg_chr05 @ togbxlab 
          xxqcfg_chr08 @ togbxmsgf 
          xxqcfg_chr09 @ togbxmsgt    
          labellist
          formatlist
          visiblelist
        WITH FRAME a.
    END.
    ELSE DO:
        ASSIGN menuname = REPLACE(clsname,"cim","xx") + "loadc.p".
        DISPLAY
          menuname 
          contrname
          viewname
          "" @ frametitle
          "" @ bptitle
          "" @ datelab 
          showdate
          showtogbx
          togbx
          "" @ togbxlab 
          "" @ togbxmsgf 
          "" @ togbxmsgt 
          "" @ labellist[1]
          "" @ labellist[2]
          "" @ labellist[3]
          "" @ labellist[4]
          "" @ labellist[5]
          "" @ labellist[6]
          "" @ labellist[7]
          "8.00" @ formatlist[1]
          "8.00" @ formatlist[2]
          "8.00" @ formatlist[3]
          "8.00" @ formatlist[4]
          "8.00" @ formatlist[5]
          "8.00" @ formatlist[6]
          "8.00" @ formatlist[7] 
          "yes" @ visiblelist[1]
          "yes" @ visiblelist[2]
          "yes" @ visiblelist[3]
          "yes" @ visiblelist[4]
          "yes" @ visiblelist[5]
          "yes" @ visiblelist[6]
          "yes" @ visiblelist[7]  
        WITH FRAME a. 
        /*{mfmsg.i 1 1}*/
    END.
END PROCEDURE.

PROCEDURE compile-rcode:
    DEFINE INPUT PARAMETER insname AS CHARACTER NO-UNDO.   /*实例名*/ 
    &IF PROVERSION < '11' &THEN
    DEFINE VARIABLE tempfile AS CHARACTER NO-UNDO.
    
    DEFINE VARIABLE guipath AS CHARACTER NO-UNDO.
    DEFINE VARIABLE j AS INTEGER NO-UNDO.
    DO j = 1 TO NUM-ENTRIES(PROPATH):    /*程序所在的目录*/
        IF ENTRY(j,PROPATH) MATCHES("*\guicli")
        THEN DO:
            ASSIGN guipath = ENTRY(j,PROPATH).
            LEAVE.
        END.
    END.
    
    ASSIGN tempfile = "d:\xx" + insname + 'loadc.p'.
    OUTPUT TO VALUE(tempfile).
    PUT UNFORMATTED "~{mfdeclre.i~}" SKIP. 
    PUT UNFORMATTED "DEFINE VARIABLE " + insname + " AS " + clsname + " NO-UNDO." SKIP.
    PUT UNFORMATTED insname + " = NEW " + clsname + "(global_domain,global_user_lang_dir,global_userid)." SKIP.
    PUT UNFORMATTED '~{gprun.i ""' + contrname + '"" "(INPUT ' + insname + ')"~}.' SKIP.
    PUT UNFORMATTED "DELETE OBJECT " + insname + "." SKIP.
    PUT UNFORMATTED insname + "= ?." SKIP.
    OUTPUT CLOSE.
    COMPILE VALUE(tempfile) SAVE INTO VALUE(guipath + "\" + REPLACE(global_user_lang_dir,"/","\") + "xx").
    OS-DELETE VALUE(tempfile) NO-ERROR.
    FOR FIRST xxqcfg_mstr WHERE xxqcfg_type = "GUICIMSET" AND xxqcfg_chr01 = clsname: 
        ASSIGN xxqcfg_chr11 = ''.
    END.
    IF AVAILABLE xxqcfg_mstr THEN RELEASE xxqcfg_mstr.    
    MESSAGE "MENU PROGRAM COMPILED,CONTINUE TO SET?" VIEW-AS ALERT-BOX QUESTION BUTTONS YES-NO UPDATE choice.
    IF choice THEN
    DO:  
        ASSIGN CLIPBOARD:VALUE = "xx" + insname + 'loadc.p'. 
        {gprun.i ""gpwinrun.p"" "('mgmemt.p','MENU SYSTEM MAINT')"}
    END.
    &ENDIF
END PROCEDURE.

2.在Procedure Editor 里运行程序(也可编译后挂菜单)

设置相应字段的名称 宽度 是否显示后 可以预览菜单 (执行cimframe类)

TIPS:在预览模式里测试导入,显示成功也会回滚(事务控制)

3.补充 自动生成的代码(入口程序)  compile-rcode子过程生成 这个文件名用来挂菜单

{mfdeclre.i}
DEFINE VARIABLE gcode AS cimgcode NO-UNDO.
gcode = NEW cimgcode(global_domain,global_user_lang_dir,global_userid).
{gprun.i ""xxcimgeneral.p"" "(INPUT gcode)"}.
DELETE OBJECT gcode.
gcode = ?.

 分配权限后就可以使用了

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