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 #-# 放到事务里 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、临时表创建;的更多相关文章
- oracle实现split函数功能
转载: http://blog.csdn.net/jojo52013145/article/details/6758279在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 R ...
- js使用split函数按照多个字符对字符串进行分割的方法
这篇文章主要介绍了js使用split函数按照多个字符对字符串进行分割的方法,实例分析了split函数的使用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了js使用split函数按照多个 ...
- SQL中实现SPLIT函数几种方法
例1 代码如下 复制代码 create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10))returns @temp ...
- 举例详解Python中的split()函数的使用方法
这篇文章主要介绍了举例详解Python中的split()函数的使用方法,split()函数的使用是Python学习当中的基础知识,通常用于将字符串切片并转换为列表,需要的朋友可以参考下 函数:sp ...
- javascript 中 split 函数分割字符串成数组
分割字符串成数组的方法有很多,不过使用最多的还是split函数 <script language="javascript"> str="2,2,3,5,6,6 ...
- Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数
Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数 //字符串分割: Split var reg: TPerlRegEx; List: TStrings; ...
- 【转载】C#使用Split函数根据特定分隔符分割字符串
在C#程序开发过程中,很多时候可能需要将字符串根据特定的分割字符分割成字符或者List集合,例如根据逗号将字符串分割为数组,或者根据竖线将字符串分割成数组,C#中提供了Split()函数来快速将字符串 ...
- Python中的split()函数的使用方法
函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(lis ...
- Android 使用split函数进行多个空格分割
在项目中经常会遇到按字符分割字符串的情况,可以使用String对象的split函数进行分割. 先看实际情况: String str = "关键词1 关键词2 关键词3"; Stri ...
随机推荐
- java什么时候进行垃圾回收,垃圾回收的执行流程
java的垃圾回收分为 三个区域新生代 老年代 永久代 一个对象实例化时 先去看伊甸园有没有足够的空间如果有 不进行垃圾回收 ,对象直接在伊甸园存储.如果伊甸园内存已满,会进行一次minor gc然后 ...
- ubuntu 安装eclipse for c++
linux的GUI和windos比起来实在逊色,虽然它的终端模式(命令行模式)非常强大.linux发行版ubuntu的GUI相对其他版本要华丽一些,所以最近由redhat转向ubuntu进行linux ...
- Java-AQS源码详解(细节很多!)
ReentrantLock调用lock()时时序图: addWaiter方法: enq方法:自旋 它维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用 ...
- cast()、decimal(M,D) --SQL对查询字段保留小数位操作
参考:http://database.51cto.com/art/201005/201651.htm http://www.lai18.com/content/1693593.html 直接上例子,以 ...
- Qt图形测绘窗口部件介绍
Qt 图形测绘窗口部件,主要使用第三方窗口部件: 1.Qwt:http://qwt.sourceforge.net 开源免费 2.GraphPak: http://www.ics.com 收费 3. ...
- Windows/Linux C/C++任意键继续
#include <stdio.h> #include <stdlib.h> #ifdef _WIN32 #include <stdlib.h> #else #in ...
- CNN中感受野大小的计算
1 感受野的概念 从直观上讲,感受野就是视觉感受区域的大小.在卷积神经网络中,感受野的定义是 卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小. 2 感受野 ...
- rest-assured学习资料
rest-assured 使用指南 https://blog.csdn.net/wx19900503/article/details/54944841/
- 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 ...
- 使用Python爬取mobi格式电纸书
最近做了个微信推送kindle电子书的公众号:kindle免费书库 不过目前电子书不算非常多,所以需要使用爬虫来获取足够书籍. 于是,写了以下这个爬虫,来爬取kindle114的电子书. 值得注意的地 ...