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 ...
随机推荐
- Leetcode题目215.数组中的第K个最大元素(中等)
题目描述: 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- 2018-2019-2 20165330《网络对抗技术》Exp7 网络欺诈防范
目录 基础问题 相关知识 实验目的 实验内容 实验步骤 实验中遇到的问题 实验总结与体会 实验目的 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 返回目录 实验内容 简 ...
- Linux设备驱动程序 之 open和release
open方法 open方法提供给驱动程序以初始化的能力,在大部分驱动程序汇总,open应该完成以下工作: 1. 检查特定设备的错误,如设备为准备就绪或者硬件问题: 2. 如果设备是首次打开,则对其进行 ...
- chattr +i 锁定文件
reboot machine, 查看DNS服务器配置文件\etc\resolv.conf, 里面的内容变回原来的样子. 原因是resolv.conf文件被系统程序自动维护.为了防止该文件被跟改,可以为 ...
- vga转HDMI与hdmi转VGA区别
- ubuntu如何删除刚添加的源?
答: sudo add-apt-repository -r <source_url> 如: sudo add-apt-repository -r ppa:linaro-maintainer ...
- a lot of attention under the hood
Because one of the original goals of the Node.js project was to allow developers to easily build app ...
- 1、vinc = vict 胜、征服
- SSIS数据同步实践
SSIS数据同步实践 背景 在已初步验证不同实例下同构表数据同步方案之后,为了实现数据持续同步,需使用SSIS把之前的生成脚本和执行脚本的两个步骤组合在一起部署成包之后,通过JOB定时去执行: 测 ...
- Visual Studio Code 帮助查看器,指定的用于安装帮助内容的位置无效,或者您无权访问该位置
今天有个C# 类库文件里面的属性想要了解下,想到了Vs的帮助文档,其实也就是微软的MSDN:提示帮助查看器,指定的用于安装帮助内容的位置无效,或者您无权访问该位置: 最近两天vs也没有更新,并且也没有 ...