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 ...
随机推荐
- 原生javascript封装动画库
****转载自自己发表于牛人部落专栏的文章**** 一.前言 本文记录了自己利用原生javascript构建自己的动画库的过程,在不断改进的过程中,实现以下动画效果: 针对同一个dom元素上相继发生的 ...
- spring boot 下 开启 gzip
[参考文章]:Spring boot开启Gzip压缩 [参考文章]:Accept-Encoding Spring 版本 :5.1.2-RELEASE 1. application.yml 配置 ser ...
- python+selenium 切换至iframe
方法一: from selenium import webdriver driver = webdriver.Firefox() driver.switch_to.frame(0) # 1.用fram ...
- 处理flutter http请求添加application/json报错Cannot set the body fields of a Request with content-type “application/json”
在flutter中在http请求发送时设置"content-type": "application/json"会出现报错Cannot set the body ...
- AVQueuePlayer
想要视频一个接一个的无缝连续播放么? 还在用mpmovieplayercontroller么?out了! 介绍一个可以实现无缝连续播放视频的东西-------AVQueuePlayer ! AVQue ...
- python设计模式-命令模式
命令模式就是对命令的封装.所谓封装命令,就是将一系列操作封装到命令类中,并且命令类只需要对外公开一个执行方法execute,调用此命令的对象只需要执行命令的execute方法就可以完成所有的操作.这样 ...
- 《A Survey on Transfer Learning》迁移学习研究综述 翻译
迁移学习研究综述 Sinno Jialin Pan and Qiang Yang,Fellow, IEEE 摘要: 在许多机器学习和数据挖掘算法中,一个重要的假设就是目前的训练数据和将来的训练数据 ...
- 直连路由onlink
根据路由器学习路由信息.生成并维护路由表的方法包括直连路由(Direct).静态路由(Static)和动态路由(Dynamic).直连路由:路由器接口所连接的子网的路由方式称为直连路由:非直连路由:通 ...
- 新股定价谁说了算?一文读懂中国IPO询价制度
总体来说,在市场化条件下,确定股票首次公开发行的价格可以分为两个步骤:一是股票估值:选择一定的股票估值模型,对拟发行股票的公司进行估值,并初步确定发行价格和询价区间:二是发现股票市场价格,主要方式是I ...
- Java数组(3):创建测试数据
有时我们需要使用数组批量创建测试数据,接下来通过以下4点来举例. (1) 使用Arrays.fill()填充数据 (2) 使用Random类中JDK1.8提供的新方法用来生成随机数 (3) 一个随机数 ...