zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    数据库表的常见设计规则总结
    关于记录log日志的几种方法
    lambda表达式
    java8之stream和lambda表达式
    Andriod底层第三课-----启动流程2(Zygote)
    Andriod底层第三课---启动流程
    Andriod底层第二课-----编译系统
    Andriod 底层第一课----JNI
    Andriod 第八课----传感器
    Andriod第七课----ContentProvide
  • 原文地址:https://www.cnblogs.com/xiaoli9627/p/6929160.html
Copyright © 2011-2022 走看看