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

范例(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分割函数,所以走点弯路:

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
时间: 2024-10-18 19:42:07

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

JavaScript中split函数

JavaScript中split函数方法是将一个字符串分割为子字符串,然后将结果作为字符串数组返回.使用方法: stringObj.split( [separator[, limit]]) 其中stringObj是必选项.要被分解的 String 对象或文字.该对象不会被 split 方法修改. separator是可选项.字符串或 正则表达式 对象,它标识了分隔字符串时使用的是一个还是多个字符.如果忽略该选项,返回包含整个字符串的单一元素数组. limit是可选项.该值用来限制返回数组中的元素

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

这篇文章主要介绍了js使用split函数按照多个字符对字符串进行分割的方法,实例分析了split函数的使用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了js使用split函数按照多个字符对字符串进行分割的方法.分享给大家供大家参考.具体分析如下: js中的split()函数可以对字符串按照指定的符号进行分割,但是如果字符串中存在多个分割符号,js的split()函数是否还可以胜任呢,答案是肯定的,js的split()函数可以通过正则表达式实现多分隔符的字符串分割,调用也很简单,下面

SQL中实现SPLIT函数几种方法

例1 代码如下 复制代码 create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10))returns @temp table(a varchar(100))--实现split功能 的函数--date :2003-10-14as begin declare @i int set @SourceSql=rtrim(ltrim(@SourceSql)) set @i=charindex(@StrSeprate,@So

SQL Server Split函数 支持分割符多字节

SQL Server Split函数 --说明: --支持分割符多字节 --使用方法 --Select * FROM DBO.F_SQLSERVER_SPLIT('1203401230105045','0') --select * from DBO.F_SQLSERVER_SPLIT('abc1234a12348991234','1234') --Select * from DBO.F_SQLSERVER_SPLIT('ABC',',') ALTER FUNCTION [dbo].[F_SQLS

SQL中实现SPLIT函数几种方法总结

例1 代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10)) returns @temp table(a varchar(100)) --实现split功能 的函数 --date :2003-10-14 as begin declare

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

这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下 函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)os.path.split():按照路径将文件名和路径分割开 一.函数说明1.split()函数语法:str.

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

分割字符串成数组的方法有很多,不过使用最多的还是split函数 <script language="javascript"> str="2,2,3,5,6,6"; //这是一字符串 var strs= new Array(); //定义一数组 strs=str.split(","); //字符分割 for (i=0;i<strs.length ;i++ ) { document.write(strs[i]+"<b

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

Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数 //字符串分割: Split var   reg: TPerlRegEx;   List: TStrings; begin   List := TStringList.Create;   reg := TPerlRegEx.Create(nil);   reg.Subject := 'aaa,bbb,ccc,ddd';   reg.RegEx  := ','; {这里可是运行相当复杂的分割符啊}   reg

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

函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)os.path.split():按照路径将文件名和路径分割开 一.函数说明1.split()函数语法:str.split(str="",num=string.count(str))[n] 参数说明:str:   表示为分隔符,默认为空格,但是不能为空('').若字符串中没有分隔符,则把