TIPTOP之分割split函数方法、getIndexOf、subString、replace、临时表创建;

范例(cnmq001):

原:每次查询都把数据全部查询到临时表后再筛选;

现:查询到临时表的时候,增加可行的筛选条件,再二次筛选临时表的数据,进行优化;

1)临时表创建:

PRIVATE FUNCTION cnmq001_cr_tmp()
 
  DROP TABLE cnmq001_tmp 
  CREATE TEMP TABLE cnmq001_tmp(
   nmbc002 LIKE nmbc_t.nmbc002, 
   nmbc002_desc LIKE type_t.chr500, 
   nmbc005 LIKE nmbc_t.nmbc005, 
   nmbcdocno LIKE nmbc_t.nmbcdocno, 
   nmbcseq LIKE nmbc_t.nmbcseq, 
   nmbc006 LIKE nmbc_t.nmbc006, 
   nmbc007 LIKE nmbc_t.nmbc007, 
   nmbc007_desc LIKE nmajl_t.nmajl003,
   nmbcud001 LIKE nmbc_t.nmbcud001, 
   nmbc003 LIKE nmbc_t.nmbc003, 
   nmbc003_desc LIKE type_t.chr80, 
   inamt    LIKE type_t.num20_6, 
   nmbc100  LIKE nmbc_t.nmbc100,
   nmbc101  LIKE nmbc_t.nmbc101,
   outamt   LIKE type_t.num20_6,
   nmbccrtid LIKE nmbc_t.nmbccrtid,
   nmbccrtid_desc LIKE type_t.chr30,
   nmbccrtdt LIKE nmbc_t.nmbccrtdt
  )
  BEGIN WORK #170406-00001#1 放到事务里
   CALL cnmq001_ins_tmp()
  COMMIT WORK 
END FUNCTION

2)TIPTOP没有直接的split分割函数,所以走点弯路:

  LET l_token = base.StringTokenizer.create(ps_token,",")

   WHILE l_token.hasMoreTokens() 
      LET ls_token = l_token.nextToken()
          CALL cl_schedule_chk_mapping(ls_token,pd_field) 
    END WHILE

PRIVATE FUNCTION split_itemcount(p_arg1,p_arg2)
    DEFINE p_arg1   STRING
    DEFINE p_arg2   STRING
    DEFINE l_cnt    INT
    DEFINE tok      BASE.StringTokenizer

    #LET tok = base.StringTokenizer.create(p_arg1,p_arg2)  
    LET tok = base.StringTokenizer.createExt(p_arg1,p_arg2,"",TRUE)  
    LET l_cnt = tok.countTokens()  
    RETURN l_cnt

END FUNCTION
PRIVATE FUNCTION split(p_arg1,p_arg2,p_arg3)
    DEFINE p_arg1   STRING
    DEFINE p_arg2   STRING
    DEFINE p_arg3   INT
    DEFINE l_cnt    INT
    DEFINE l_idx    INT
    DEFINE l_retstr STRING
    DEFINE l_str    STRING
    DEFINE tok      BASE.StringTokenizer
    
    INITIALIZE l_retstr TO NULL
    #LET tok = base.StringTokenizer.create(p_arg1,p_arg2)  
    LET tok = base.StringTokenizer.createExt(p_arg1,p_arg2,"",TRUE)  
    LET l_cnt = tok.countTokens()  
    IF (p_arg3 <= 0) OR (l_cnt <= 0 ) OR (p_arg3 > l_cnt) THEN  
        LET l_retstr = NULL  
    ELSE  
        LET l_idx = 1  
        WHILE tok.hasMoreTokens()  
            LET l_str = tok.nextToken()   
            IF l_idx = p_arg3 THEN  
                LET l_retstr = l_str  
                EXIT WHILE  
            END IF  
            LET l_idx = l_idx + 1  
        END WHILE  
    END IF  
    RETURN l_retstr  

END FUNCTION

3)本人愚笨,试了几种方法,最后只能通过系统组合出来的条件,进行分割,再重组成自己所需的条件,用在临时表的查询上:

PRIVATE FUNCTION cnmq001_ins_tmp()
DEFINE l_sql STRING
DEFINE l_nmch006      LIKE nmch_t.nmch006
DEFINE l_nmcq006      LIKE nmcq_t.nmcq006
DEFINE l_nmck042      LIKE nmck_t.nmck042
DEFINE l_apde010      LIKE apde_t.apde010
DEFINE l_nmbb025      LIKE nmbb_t.nmbb025
DEFINE lr_tmp RECORD 
      nmbc002 LIKE nmbc_t.nmbc002, 
   nmbc002_desc LIKE type_t.chr500, 
   nmbc005 LIKE nmbc_t.nmbc005, 
   nmbcdocno LIKE nmbc_t.nmbcdocno, 
   nmbcseq LIKE nmbc_t.nmbcseq, 
   nmbc006 LIKE nmbc_t.nmbc006, 
   nmbc007 LIKE nmbc_t.nmbc007, 
   nmbc007_desc LIKE nmajl_t.nmajl003,
   nmbcud001 LIKE nmbc_t.nmbcud001, 
   nmbc003 LIKE nmbc_t.nmbc003, 
   nmbc003_desc LIKE type_t.chr80, 
   inamt    LIKE type_t.num20_6, 
   nmbc100  LIKE nmbc_t.nmbc100,
   nmbc101  LIKE nmbc_t.nmbc101,
   outamt   LIKE type_t.num20_6,
   nmbccrtid LIKE nmbc_t.nmbccrtid,
   nmbccrtid_desc LIKE type_t.chr30,
   nmbccrtdt LIKE nmbc_t.nmbccrtdt
   END RECORD
   
   #TEST 170531 by ljr
   DEFINE l_wc STRING
   DEFINE l_wc2 STRING
   DEFINE l_wc3 STRING
   DEFINE l_i INT
   INITIALIZE l_wc3 TO NULL
   CALL cl_replace_str(g_wc,"and","|") RETURNING l_wc
   FOR l_i=1 TO split_itemcount(l_wc,"|")
        LET l_wc2 = split(l_wc,"|",l_i)
        IF l_wc2.getIndexOf("nmbc002",1)>0 AND l_wc2.getIndexOf("nmbc002_",1)<=0 THEN
            LET l_wc3 = l_wc3,l_wc2," and "
        ELSE
            IF l_wc2.getIndexOf("nmbcdocno",1)>0 THEN
                LET l_wc3 = l_wc3,l_wc2," and "
            ELSE
                IF l_wc2.getIndexOf("nmbcseq",1)>0 THEN
                    LET l_wc3 = l_wc3,l_wc2," and "
                ELSE
                    IF l_wc2.getIndexOf("nmbc006",1)>0 THEN
                        LET l_wc3 = l_wc3,l_wc2," and "
                    ELSE
                        IF l_wc2.getIndexOf("nmbccrtid",1)>0 AND l_wc2.getIndexOf("nmbccrtid_",1)<=0  THEN
                            LET l_wc3 = l_wc3,l_wc2," and "
                        END IF
                    END IF
                END IF
            END IF
        END IF
   END FOR
    IF NOT cl_null(l_wc3) THEN
        LET l_wc3 = l_wc3.subString(1,l_wc3.getLength()-5)
    ELSE
        LET l_wc3 = " 1=1 "
    END IF
   
   
   #170406-00001#1---begin---insert放入excute
   LET l_sql = " INSERT INTO cnmq001_tmp VALUES (?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,?, ?,?,? )"
   PREPARE cnmq001_ins_tmp2 FROM l_sql
   #170406-00001#1---end---
   
   
   LET l_sql = " SELECT  UNIQUE nmbc002,'',nmbc005,nmbcdocno,nmbcseq,nmbc006,nmbc007,'',nmbcud001, ", 
               "  nmbc003,'',decode(nmbc006,'1',nmbc103,0) inamt,nmbc100,nmbc101,decode(nmbc006,'2',nmbc103,0) outamt,nmbccrtid,'',nmbccrtdt ",
               " FROM nmbc_t ",
               " WHERE nmbcent = ? AND nmbccomp = ? AND ",l_wc3
   PREPARE cnmq001_ins_tmp FROM l_sql
   DECLARE ins_curs CURSOR FOR cnmq001_ins_tmp  

   OPEN ins_curs USING g_enterprise,g_site
   FOREACH ins_curs INTO lr_tmp.*
     
     SELECT ooag011 INTO lr_tmp.nmbccrtid_desc
      FROM ooag_t WHERE ooagent=g_enterprise 
      AND ooag001 = lr_tmp.nmbccrtid
      
     SELECT nmaal003 INTO lr_tmp.nmbc002_desc 
       FROM nmaal_t WHERE nmaalent=g_enterprise
       AND nmaal001= lr_tmp.nmbc002
    
     SELECT nmajl003 INTO lr_tmp.nmbc007_desc 
       FROM nmajl_t WHERE nmajlent=g_enterprise
       AND nmajl001= lr_tmp.nmbc007
       AND nmajl002 = g_lang
     
      IF NOT cl_null(lr_tmp.nmbc003) THEN
         IF lr_tmp.nmbc003='EMPL' THEN
            SELECT apca014 INTO lr_tmp.nmbc003 FROM apca_t 
            WHERE apcaent=g_enterprise 
            AND apcadocno=lr_tmp.nmbcdocno
            
            SELECT ooag011 INTO lr_tmp.nmbc003_desc FROM ooag_t
            WHERE ooagent=g_enterprise AND ooag001 = lr_tmp.nmbc003
          ELSE          
            LET lr_tmp.nmbc003_desc = s_desc_get_trading_partner_full_desc(lr_tmp.nmbc003)
         END IF 
       END IF
       #新增摘要 
       IF cl_null(lr_tmp.nmbcud001) THEN 
         #1.包括其他收支单作业anmt310,客户收款单作业anmt540,抓取的是表nmbb_t,抓取的栏位是nmbb025,
         #如果抓取不到则再去到下一项 
          LET l_nmbb025=''
          LET l_apde010=''
          LET l_nmck042=''
          LET l_nmcq006=''
          LET l_nmch006=''
          SELECT nmbb025 INTO l_nmbb025 FROM nmbb_t 
           WHERE nmbbent=g_enterprise
             AND nmbbdocno=lr_tmp.nmbcdocno
             AND nmbbseq=lr_tmp.nmbcseq
          IF cl_null(l_nmbb025) THEN            
             #2.应付单aapt330,aapt331,aapt310,aapt301,都是应付单,抓取的表都是apde_t,
             #抓取的栏位都是apde010,如果抓取不到则再去到下一项
             SELECT apde010 INTO l_apde010 FROM apde_t
              WHERE apdeent=g_enterprise
                AND apdedocno=lr_tmp.nmbcdocno
                AND apdeseq=lr_tmp.nmbcseq            
             IF cl_null(l_apde010) THEN
                #汇款单anmt460,抓取表nmck_t,抓取的栏位是nmck042,如果抓取不到则再去到下一项
                SELECT nmck042 INTO l_nmck042 FROM nmck_t
                 WHERE nmckent=g_enterprise
                   AND nmckdocno=lr_tmp.nmbcdocno
                IF cl_null(l_nmck042) THEN
                  #4.应收票据兑现单,抓取表nmcq_t,抓取栏位是nmcq006,如果抓取不到则再去到下一项
                  SELECT nmcq006 INTO l_nmcq006 FROM nmcq_t
                   WHERE nmcqent=g_enterprise
                     AND nmcqdocno=lr_tmp.nmbcdocno
                     IF cl_null(l_nmcq006) THEN
                        #5.应付票据兑现单,抓取表nmch_t,抓取栏位是nmch006
                        SELECT nmch006 INTO l_nmch006 FROM nmch_t
                         WHERE nmchent=g_enterprise
                           AND nmchdocno=lr_tmp.nmbcdocno
                        LET lr_tmp.nmbcud001=l_nmch006
                     ELSE
                        LET lr_tmp.nmbcud001=l_nmcq006
                     END IF 
                ELSE
                   LET lr_tmp.nmbcud001=l_nmck042
                END IF 
             ELSE
                LET lr_tmp.nmbcud001=l_apde010
             END IF 
             
          ELSE
            LET lr_tmp.nmbcud001=l_nmbb025
          END IF 
       END IF        
       
       #170406-00001#1
       #INSERT INTO cnmq001_tmp VALUES(lr_tmp.*)
       EXECUTE cnmq001_ins_tmp2 USING lr_tmp.*
       
   END FOREACH

END FUNCTION

分隔符

MAIN
  DEFINE tok base.StringTokenizer 
  LET tok = base.StringTokenizer.create("/home/tomy","/")
  WHILE tok.hasMoreTokens()
    DISPLAY tok.nextToken()
  END WHILE
END MAIN

DEFINE llst_fields   base.StringTokenizer
   DEFINE ls_field      STRING

LET llst_fields = base.StringTokenizer.create(ps_fields, ",")
   WHILE llst_fields.hasMoreTokens()
      LET ls_field = llst_fields.nextToken()
      IF cl_null(ls_field) THEN
         CONTINUE WHILE
      END IF

原文地址:https://www.cnblogs.com/xiaoli9627/p/6929160.html