范例(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. elasticsearch集群部署以及head插件安装

    环境准备 elasticsearch是Java程序写的因此必须装jdk,否则使用不了. [root@openstack ~]# java -versionopenjdk version "1 ...

  2. main.js中import引入css与引入js的区别

    表现:引入css样式文件能够作用到全局,而引入js文件就只能在main.js中产生作用 在 main.js 中引入的 css 都是全局生效的.引入的 js 文件只在 main.js 中生效,是因为 m ...

  3. C#_选择结构,Console的应用,数据类型转换

    1:先看一个顺序结构编程,代码如下: using System; using System.Collections.Generic; using System.Linq; using System.T ...

  4. Linux设备驱动程序 之 Makefile

    典型的模块Makefile如下所示: ifneq ($(KERNELRELEASE),) obj-m := hello.o else KERNELDIR ?=/lib/modules/$(shell ...

  5. Vue.js 生命周期、计算属性及侦听器

    一.创建一个Vue实例 每个Vue应用都是使用Vue函数创建一个Vue实例.所有的Vue组件都是一个Vue实例,并且接受相同的选项对象(一些根实例特有的选项除外). 数据和方法 当一个实例被创建后,它 ...

  6. Java 比较两个字符串的相似度算法(Levenshtein Distance)

    转载自: https://blog.csdn.net/JavaReact/article/details/82144732 算法简介: Levenshtein Distance,又称编辑距离,指的是两 ...

  7. Jenkins的详细安装及使用

    操作环境:Windows 踩过的坑:1,报错403,因为tomcat限制了访问地址(https://www.cnblogs.com/luoruiyuan/p/6518508.html) 2,构建spr ...

  8. Eclipse中给SVN添加项目

    SVN添加项目, 1.在svn资源库中的目标路径上右键,新建一个远程文件夹,文件夹名称和项目名称一致即可. 2,在新建的远程目录上右键,选导入,导入我们要放到svn的本地项目. 3.导入时选中项目的名 ...

  9. 实验一 绘制任意斜率的直线段 | 使用VS2017工具

    这世界上有很多坑,注定有些坑是要填的.下面我就用VS2017使用MFC对这个课堂实验进行填坑. 一.实验目的 (1)掌握任意斜率直线段的重点 Bresenham 扫描转换算法: (2)掌握 Cline ...

  10. [Kaggle] How to handle big data?

    上一篇,[Kaggle] How to kaggle?[方法导论] 这里再做一点进阶学习. 写在前面 "行业特征" 的重要性 Ref: Kaggle2017—1百万美金的肺癌检测竞 ...