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 ...
随机推荐
- AcWing:177. 噩梦(bfs)
给定一张N*M的地图,地图中有1个男孩,1个女孩和2个鬼. 字符“.”表示道路,字符“X”表示墙,字符“M”表示男孩的位置,字符“G”表示女孩的位置,字符“Z”表示鬼的位置. 男孩每秒可以移动3个单位 ...
- 8.8 JQuery框架
8.8 JQuery框架 一.JQuery是一个javascript的框架,是对javascript的一种封装. 通过JQuery可以非常方便的操作html的元素\要使用Jquery需要导入一个第三方 ...
- centos7下面改变亮度
通过改自己的配置文件来改变亮度的方法在我的机器上面是不中用了,我的是台式机,我用的集成显卡,目前我找到的还勉强的方法就是通过安装redshift来改变屏幕的亮度,我就是不喜欢太亮,差点瞎了. 具体是这 ...
- 编译安装 Nginx
一.下载 https://nginx.org/en/download.html yum install -y wget wget http://nginx.org/download/nginx-1.1 ...
- nodejs服务端实现post请求
博客之前写过一篇php实现post请求的文章. 今天想到好久没有输出了,重新认识到输出的重要性.百般思索该写些什么?想来想去,想到了两点: 逐步熟练nodejs各种场景知识,针对mysql数据交互和f ...
- 1.ibatis核心类
- Android屏幕横竖屏切换和生命周期管理的详细总结
一般的我们去切换屏幕方向都是不希望Activity被重新创建,这时就需要对一些属性进行设置,或者使用代码设置. 今天想学一下Android屏幕横竖屏切换,但是网上很多知识不准确或不正确, ...
- VC 实现程序只运行一个实例,并激活已运行的程序
转载:http://blog.sina.com.cn/s/blog_4b44e1c00100bh69.html 进程的互斥运行:CreateMutex函数实现只运行一个程序实例 正常情况下,一个进程的 ...
- DeviceUtils
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> import androi ...
- js 操作select和option常见用法
1.获取选中select的value和text,html <select id="mySelect"> <option value="1"&g ...