有时候屏幕条件中使用PARAMETERS时候,如果你为空的话,会查不出数据,但是可能你的想法是不想限制而已,但是系统默认理解为了空值,这个时候,如果取判断一下条件是不是空,在SQL里决定写不写的话,会导致很多的代码,当然理论上是可以的,现在介绍一种可以随机应变的屏幕条件选择的写法,可以省下很多的代码,例子如下。

第一种写法,代码如下:

SELECT-OPTIONS:S_ERZET FOR VBAK-ERZET,
S_ERNAM FOR VBAK-ERNAM.
PARAMETERS:P_VBELN TYPE VBAK-VBELN,
P_ERDAT TYPE VBAK-ERDAT.
DATA: LT_WHERE TYPE STRING.
IF P_VBELN IS NOT INITIAL.
LT_WHERE = 'VBELN = @P_VBELN AND' .
ENDIF.
IF P_ERDAT IS NOT INITIAL.
LT_WHERE = |{ LT_WHERE } ERDAT = @P_ERDAT AND|.
ENDIF.
LT_WHERE = |{ LT_WHERE } ERZET IN @S_ERZET AND ERNAM IN @S_ERNAM|.
*---如果里面有固定值也可以写进去------
"LT_WHERE = |{ LT_WHERE } ERDAT = '20180202' AND ERZET IN @S_ERZET AND ERNAM IN @S_ERNAM|.
*当然如果使用CONCATENATE拼字符串的老语法的话,需要如下写法,将固定值需要由3个引号包起来
"CONCATENATE LT_WHERE 'ERDAT = ' '''20180202''' 'AND ERZET IN @S_ERZET AND ERNAM IN @S_ERNAM' INTO LT_WHERE SEPARATED BY SPACE.
*-----有时候不知道需要多少个AND连接时候,保险做法可以合理使用去除字符串右边或者左边的and-------
"SHIFT LT_WHERE LEFT DELETING LEADING 'AND'.
"SHIFT LT_WHERE RIGHT DELETING TRAILING 'AND'.
IF LT_WHERE IS NOT INITIAL."判断where条件是不是为空。
SELECT VBELN,ERDAT,ERZET,ERNAM FROM VBAK UP TO ROWS INTO TABLE @DATA(LT_VBAK) WHERE (LT_WHERE) .
ELSE.
SELECT VBELN,ERDAT,ERZET,ERNAM FROM VBAK UP TO ROWS INTO TABLE @LT_VBAK.
ENDIF.
CL_DEMO_OUTPUT=>DISPLAY( LT_VBAK ).

第二种写法代码如下(里面还有赋值的新语法):

DATA:S_VBELN TYPE RANGE OF VBAK-VBELN, "相当于select-option:S_WERKS FOR MARD-WERKS,不过这样写就没有屏幕展示了
S_ERDAT TYPE RANGE OF VBAK-ERDAT.
DATA:S_ERZET TYPE RANGE OF VBAK-ERZET."相当于select-option:S_WERKS FOR MARD-ERZET
DATA:S_ERNAM TYPE RANGE OF VBAK-ERNAM."相当于select-option:S_WERKS FOR MARD-ERNAM
S_VBELN = VALUE #( SIGN ='I' OPTION = 'BT' ( LOW = HIGH = )
( LOW = HIGH = )
OPTION = 'NB' ( LOW = ) ).
DATA: LT_WHERE TYPE STRINGTAB."这个是内表
INSERT CONV #( 'VBELN IN @S_VBELN ' ) INTO TABLE LT_WHERE.
INSERT CONV #( 'AND ERDAT IN @S_ERDAT ' ) INTO TABLE LT_WHERE.
INSERT CONV #( 'AND ERZET IN @S_ERZET AND ERNAM IN @S_ERNAM' ) INTO TABLE LT_WHERE.
IF LT_WHERE IS NOT INITIAL."判断where条件是不是为空。
SELECT VBELN,ERDAT,ERZET,ERNAM FROM VBAK UP TO ROWS INTO TABLE @DATA(LT_VBAK) WHERE (LT_WHERE) .
ELSE.
SELECT VBELN,ERDAT,ERZET,ERNAM FROM VBAK UP TO ROWS INTO TABLE @LT_VBAK.
ENDIF.
CL_DEMO_OUTPUT=>DISPLAY( LT_VBAK ).

动态SQL屏幕条件选择(里面还有赋值的新语法)的更多相关文章

  1. Mybatis中动态SQL多条件查询

    Mybatis中动态SQL多条件查询 mybatis中用于实现动态SQL的元素有: if:用if实现条件的选择,用于定义where的字句的条件. choose(when otherwise)相当于Ja ...

  2. .Net程序员学用Oracle系列(28):PLSQL 之SQL分类和动态SQL

    1.SQL 语句分类 1.1.分类方法及类型 1.2.数据定义语言 1.3.数据操纵语言 1.4.其它语句 2.动态 SQL 理论 2.1.动态 SQL 的用途 2.2.动态 SQL 的语法 2.3. ...

  3. 你好,C++(19)“老师,我这次四级考试过了没有?”——4.2 条件选择语句

    4.2  条件选择语句 “老师,我这次四级考试过了没有?” 如果老师被问到这个问题,他会如何回答?是的,他会根据不同的条件选择不同的回答: 如果考试成绩大于等于60,那就回答:“恭喜你,你通过了这次考 ...

  4. 接口的绑定方案和动态SQL

    1. 接口绑定方案 MyBatis中, 提供了一套接口绑定方案. 程序员可以提供一个接口, 然后提供对应接口的一个mapper.xml文件. MyBatis会自动将接口和xml文件进行绑定. 实际上就 ...

  5. Mybatis学习第三天——输入输出映射以及动态SQL

    注意:以下传入数据与输出数据类型部分使用别名的方式,别名在SqlMapConfig.xml核心文件中配置 1.输入映射 1.1 传递简单数据类型 1.2 传递pojo中的类类型 1.3 传递Query ...

  6. 动态SQL之、条件判断(转)

    错误方式一: 在mybatis的动态sql语句中使用<if>标签可以判断sql中的条件是否成立. <select id="getPerson" resultTyp ...

  7. MyBatis中动态SQL语句完成多条件查询

    一看这标题,我都感觉到是mybatis在动态SQL语句中的多条件查询是多么的强大,不仅让我们用SQL语句完成了对数据库的操作:还通过一些条件选择语句让我们SQL的多条件.动态查询更加容易.简洁.直观. ...

  8. MyBatis动态SQL第一篇之实现多条件查询(if、where、trim标签)

    一.动态SQL概述 以前在使用JDBC操作数据时,如果查询条件特别多,将条件串联成SQL字符串是一件痛苦的事情.通常的解决方法是写很多的if-else条件语句对字符串进行拼接,并确保不能忘了空格或在字 ...

  9. (转)[SQL Server] 动态sql给变量赋值(或返回值给变量)

    本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) decla ...

随机推荐

  1. Springcloud 微服务 高并发(实战1):第1版秒杀

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列之15 [博客园总入口 ] 前言 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家介绍三个版 ...

  2. ubuntu上编译和使用easy_profiler对C++程序进行性能分析

    本文首发于个人博客https://kezunlin.me/post/91b7cf13/,欢迎阅读最新内容! tutorial to compile and use esay profiler with ...

  3. Java面试必备:手写单例模式

    面试官:请手写下几种常见的单例模式 我:好的(面带微笑),心里暗喜(送分题). 没成想提笔便写出了如此豪放的代码,不堪回首,请原谅我的不羁! 此篇整理了几种常见的单例模式代码示例,再有面试官让手撕单例 ...

  4. javascript 模块化开发(一)

    什么是模块化 将一组模块(及其依赖项)以正确的顺序拼接到一个文件(或一组文件)中的过程. 传统的模块化做法. 模块是实现特定功能的一组属性和方法的封装. 将模块写成一个对象,所有的模块成员都放到这个对 ...

  5. [browser location和history] 简单实现了个路由[转载]

    今天看了1下前面写的,好像缺乏交流性,周末再来弄吧 -0- 今天看了browser 的 location 和 history location属性 // //location.hash 性是一个可读可 ...

  6. 【JDBC】工具类的抽取

    jdbc.properties属性文件 driverClass=com.mysql.jdbc.Driver url=jdbc:mysql:///jdbctest username=root passw ...

  7. 27-限制容器的 Block IO

    Block IO 是另一种可以限制容器使用的资源.Block IO 指的是磁盘的读写,docker 可通过设置权重.限制 bps 和 iops 的方式控制容器读写磁盘的带宽,下面分别讨论. 注:目前 ...

  8. redis的缓存雪崩、缓存穿透和缓存击穿

    缓存雪崩: 比如给缓存中的key设置了统一的过期时间,而在过期时间点,有大量的请求进来,这个时候redis中没有用户请求的资源,所以所有的请求会全部拥到数据库,如果数据库有报警监测的话,可能会报一下警 ...

  9. Linux 打开端口方法

    关闭防火墙:service iptables stop 开启防火墙:service iptables start 防火墙状态:service iptables status 永久关闭:chkconfi ...

  10. Internet Download Manager是什么?

    在互联网下载管理器(也被称为IDM)是一款共享软件下载管理器,这意味着你可以下载该程序,并尝试它的试用期内免费. 以下是IDM最佳功能的列表: 支持多种浏览器和应用程序 一键下载文件 内置防病毒检查 ...