范例(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 #-# 放到事务里
   CALL cnmq001_ins_tmp()
  COMMIT WORK
END FUNCTION

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

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 <= ) OR (l_cnt <=  ) OR (p_arg3 > l_cnt) THEN
        LET l_retstr = NULL
    ELSE
        LET l_idx =
        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 +
        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  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= TO split_itemcount(l_wc,"|")
        LET l_wc2 = split(l_wc,"|",l_i)
        IF l_wc2.getIndexOf()> AND l_wc2.getIndexOf()<= THEN
            LET l_wc3 = l_wc3,l_wc2," and "
        ELSE
            IF l_wc2.getIndexOf()> THEN
                LET l_wc3 = l_wc3,l_wc2," and "
            ELSE
                IF l_wc2.getIndexOf()> THEN
                    LET l_wc3 = l_wc3,l_wc2," and "
                ELSE
                    IF l_wc2.getIndexOf()> THEN
                        LET l_wc3 = l_wc3,l_wc2," and "
                    ELSE
                        IF l_wc2.getIndexOf()> AND l_wc2.getIndexOf()<=  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(,l_wc3.getLength()-)
    ELSE
        LET l_wc3 = " 1=1 "
    END IF

   #-#---begin---insert放入excute
   LET l_sql = " INSERT INTO cnmq001_tmp VALUES (?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,?, ?,?,? )"
   PREPARE cnmq001_ins_tmp2 FROM l_sql
   #-#---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
         #.包括其他收支单作业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
             #.应付单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
                  #.应收票据兑现单,抓取表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
                        #.应付票据兑现单,抓取表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        

       #-#
       #INSERT INTO cnmq001_tmp VALUES(lr_tmp.*)
       EXECUTE cnmq001_ins_tmp2 USING lr_tmp.*

   END FOREACH

END FUNCTION

分隔符

DEFINE tok       base.StringTokenizer

LET tok = base.StringTokenizer.create(l_cltname, '.') 
   WHILE tok.hasMoreTokens() 
      LET g_tc_img.tc_imgtype = tok.nextToken() 
   END WHILE

TIPTOP之分割split函数方法、getIndexOf、subString、replace、临时表创建;的更多相关文章

  1. oracle实现split函数功能

    转载: http://blog.csdn.net/jojo52013145/article/details/6758279在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 R ...

  2. js使用split函数按照多个字符对字符串进行分割的方法

    这篇文章主要介绍了js使用split函数按照多个字符对字符串进行分割的方法,实例分析了split函数的使用技巧,非常具有实用价值,需要的朋友可以参考下   本文实例讲述了js使用split函数按照多个 ...

  3. SQL中实现SPLIT函数几种方法

    例1 代码如下 复制代码 create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10))returns @temp ...

  4. 举例详解Python中的split()函数的使用方法

    这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下   函数:sp ...

  5. javascript 中 split 函数分割字符串成数组

    分割字符串成数组的方法有很多,不过使用最多的还是split函数 <script language="javascript"> str="2,2,3,5,6,6 ...

  6. Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数

    Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数 //字符串分割: Split var   reg: TPerlRegEx;   List: TStrings; ...

  7. 【转载】C#使用Split函数根据特定分隔符分割字符串

    在C#程序开发过程中,很多时候可能需要将字符串根据特定的分割字符分割成字符或者List集合,例如根据逗号将字符串分割为数组,或者根据竖线将字符串分割成数组,C#中提供了Split()函数来快速将字符串 ...

  8. Python中的split()函数的使用方法

    函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(lis ...

  9. Android 使用split函数进行多个空格分割

    在项目中经常会遇到按字符分割字符串的情况,可以使用String对象的split函数进行分割. 先看实际情况: String str = "关键词1 关键词2 关键词3"; Stri ...

随机推荐

  1. java什么时候进行垃圾回收,垃圾回收的执行流程

    java的垃圾回收分为 三个区域新生代 老年代 永久代 一个对象实例化时 先去看伊甸园有没有足够的空间如果有 不进行垃圾回收 ,对象直接在伊甸园存储.如果伊甸园内存已满,会进行一次minor gc然后 ...

  2. ubuntu 安装eclipse for c++

    linux的GUI和windos比起来实在逊色,虽然它的终端模式(命令行模式)非常强大.linux发行版ubuntu的GUI相对其他版本要华丽一些,所以最近由redhat转向ubuntu进行linux ...

  3. Java-AQS源码详解(细节很多!)

    ReentrantLock调用lock()时时序图: addWaiter方法: enq方法:自旋 它维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用 ...

  4. cast()、decimal(M,D) --SQL对查询字段保留小数位操作

    参考:http://database.51cto.com/art/201005/201651.htm http://www.lai18.com/content/1693593.html 直接上例子,以 ...

  5. Qt图形测绘窗口部件介绍

    Qt 图形测绘窗口部件,主要使用第三方窗口部件: 1.Qwt:http://qwt.sourceforge.net 开源免费 2.GraphPak: http://www.ics.com  收费 3. ...

  6. Windows/Linux C/C++任意键继续

    #include <stdio.h> #include <stdlib.h> #ifdef _WIN32 #include <stdlib.h> #else #in ...

  7. CNN中感受野大小的计算

    1 感受野的概念 从直观上讲,感受野就是视觉感受区域的大小.在卷积神经网络中,感受野的定义是 卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小. 2 感受野 ...

  8. rest-assured学习资料

    rest-assured 使用指南 https://blog.csdn.net/wx19900503/article/details/54944841/

  9. LC 881. Boats to Save People

    The i-th person has weight people[i], and each boat can carry a maximum weight of limit. Each boat c ...

  10. 使用Python爬取mobi格式电纸书

    最近做了个微信推送kindle电子书的公众号:kindle免费书库 不过目前电子书不算非常多,所以需要使用爬虫来获取足够书籍. 于是,写了以下这个爬虫,来爬取kindle114的电子书. 值得注意的地 ...