最新消息:本站持续更新中,请注意添加收藏夹。搜索关键词时,多换一个同义词。比如要搜索界面,可以尝试页面,画面,PER档等词汇。善于搜索,将大大提高你的查找效率。

T100报表查询——自动刷新数据,双击明细打开关联作业

后端代码 bron1984 4458浏览

 

 

这次的范例是(cxmq100);

目的:实现报表数据自动刷新,双击明细数据打开相关的查询作业;

1)在MAIN前进行客制变量定义:

#add-point:自定義模組變數-客製(Module Variable) name="global.variable_customerization"
 
TYPE type_g_input RECORD
    refresh        LIKE type_t.num10,
    autoRefresh     LIKE type_t.chr1
END RECORD
 
DEFINE    g_input          type_g_input  #INPUT條件
 
DEFINE    g_seconds        LIKE type_t.num10
DEFINE    g_time1          DATETIME YEAR TO SECOND
DEFINE    g_time2          STRING
DEFINE    g_time3          STRING
DEFINE    l_hhmmss         STRING
DEFINE    g_total          LIKE type_t.num10
#end add-point

 

2)在cxmq100_init()中将客制变量进行初始化赋值:

#add-point:畫面資料初始化 name="init.init"
LET g_input.refresh = 1
LET g_input.autoRefresh = 'Y'
LET g_total = g_input.refresh * 60
LET g_seconds = 0
#end add-point

 

3)在 cxmq100_ui_dialog() 中DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)下置入INPUT指令,让用户输入数据,并在此实现自动刷新数据的功能:

DIALOG ATTRIBUTES(UNBUFFERED,FIELD ORDER FORM)
   #add-point:input段落 name="ui_dialog.input"
 
   INPUT g_input.refresh,g_input.autoRefresh FROM refresh,autoRefresh ATTRIBUTE(WITHOUT DEFAULTS)
   BEFORE INPUT
      ON idle  5
         if g_input.autoRefresh = "Y" then
             IF g_time1 IS NULL THEN
                LET g_time1 = cl_get_current()
             END IF
             #去掉“-”,“:”和空格,得到2个数字做大小比较,不要求得到准确的秒数差
             LET g_time2 = g_time1
             LET g_time2 = s_chr_minus(g_time2,'-',0)
             LET g_time2 = s_chr_minus(g_time2,':',0)
             LET g_time2 = s_chr_atrim(g_time2)
             LET l_hhmmss = g_time2.substring(9,10)*3600+g_time2.substring(11,12)*60+g_time2.substring(13,14)
             LET g_time2 = g_time2.substring(1,8),l_hhmmss
             LET g_time3 = cl_get_current()
             LET g_time3 = s_chr_minus(g_time3,'-',0)
             LET g_time3 = s_chr_minus(g_time3,':',0)
             LET g_time3 = s_chr_atrim(g_time3)
             LET l_hhmmss = g_time3.substring(9,10)*3600+g_time3.substring(11,12)*60+g_time3.substring(13,14)
             LET g_time3 = g_time3.substring(1,8),l_hhmmss
             #DISPLAY 'g_time2 =',g_time2         #预埋调试用,可放开看时间调试
             #DISPLAY 'g_time3 =',g_time3
             #display '3-2 =',g_time3 - g_time2   
             #这个2是容许误差2秒,2秒内的误差都不会触发重计倒计时,这是因为服务器有时候会很卡、停顿,尤其是网络的延迟,这些都会造成误差,如果特别卡,可以适当放大秒数误差,但是会造成必须操作X秒以上才会触发重计的现象
             IF g_time3 - g_time2 < 2 THEN
                IF g_seconds >= g_total THEN    #自动刷新设为60秒
                   CALL cxmq100_b_fill()
                   LET g_seconds = 0
                END IF
                LET g_time1 = cl_get_current()
                LET g_seconds = g_seconds + 1
                #DISPLAY g_seconds
             ELSE
             #DISPLAY 'cl_get_current()           =',cl_get_current()    预埋调试用,可放开看时间调试
             #DISPLAY 'g_time1                    =',g_time1
             #DISPLAY 'cl_get_current() - g_time1 =',cl_get_current() - g_time1        
             #LET g_seconds = 0
                LET g_time1 = cl_get_current()           
             END IF
         end if
          
      AFTER FIELD refresh
         IF NOT cl_null(g_input.refresh) THEN
            Let g_total = g_input.refresh * 60
         END IF   
   END INPUT
   #end add-point

ON IDLE 5 表示空闲时间5秒执行;

AFTER FIELD refresh 表示用户在输入完指定的字段动作完毕后,计算机会处理AFTER FIELD下的程序段;

 

4)实现双击明细数据打开相关查询作业的功能:

①依然在cxmq100_ui_dialog() 下先把doubleClick的action事件【modify_detail】客制好:

#主選單用ACTION
&include "main_menu_exit_dialog.4gl"
&include "relating_action.4gl"
#交談指令共用ACTION
&include "common_action.4gl"
 
#add-point:查詢方案相關ACTION設定前 name="ui_dialog.set_qbe_action_before"
ON ACTION modify_detail
   LET g_action_choice="modify_detail"
   IF cl_auth_chk_act("modify_detail") THEN
      IF g_detail_idx>=1 THEN
         CALL cxmq100_qrystr(g_xmabuc_d[g_detail_idx].xmabucdocno)
      END IF
   END IF
#end add-point

明细单号xmabucdocno作为PK传入cxmq100_qrystr函数;

 

5) cxmq100_qrystr(p_docno)函数:

PRIVATE FUNCTION cxmq100_qrystr(p_docno)
   DEFINE p_docno LIKE xmdk_t.xmdkdocno
   #DEFINE l_slip     LIKE oobal_t.oobal002
   #DEFINE l_prog     LIKE oobx_t.oobx004
   #DEFINE l_success  LIKE type_t.num5
   DEFINE ls_js      STRING
   DEFINE la_param   RECORD
          prog       STRING,
          actionid   STRING,
          background LIKE type_t.chr1,
          param      DYNAMIC ARRAY OF STRING
          END RECORD
   #抓取單據別
   {
   LET l_slip = ''
   LET l_prog = ''
   IF NOT cl_null(p_docno) THEN
      CALL s_aooi200_get_slip(p_docno) RETURNING l_success,l_slip
      IF NOT cl_null(l_slip) THEN
         #抓取程式名稱
         SELECT oobx004 INTO l_prog
           FROM oobx_t
          WHERE oobxent = g_enterprise
            AND oobx001 = l_slip
      END IF
      IF NOT cl_null(l_prog) THEN
         INITIALIZE la_param.* TO NULL
         LET la_param.prog     = l_prog
         LET la_param.param[1] = p_docno
         LET ls_js = util.JSON.stringify(la_param)
         CALL cl_cmdrun(ls_js)
      END IF
   END IF
   }
   IF NOT cl_null(p_docno) THEN
         INITIALIZE la_param.* TO NULL
         LET la_param.prog     = "cxmt631"
         LET la_param.param[1] = p_docno
         LET ls_js = util.JSON.stringify(la_param)
         CALL cl_cmdrun(ls_js)
   END IF
END FUNCTION

注意上面使用了{}注释的内容在这个范例中不适用;

 

下方代码,双击单身明细,打开cxmt631作业:

<span style="font-size: 18px; color: #ff0000;">IF NOT cl_null(p_docno) THEN
         INITIALIZE la_param.* TO NULL
         LET la_param.prog     = "cxmt631"
         LET la_param.param[1] = p_docno
         LET ls_js = util.JSON.stringify(la_param)
         CALL cl_cmdrun(ls_js)
   END IF</span>

转载请注明:赫非域 » T100报表查询——自动刷新数据,双击明细打开关联作业