我有一个非常简单的选择:
select * from ZMM_TABLE
into CORRESPONDING FIELDS OF table lt_table
where mjahr = p_mjahr and
werks = p_werks and
。
当p_values呈现时 - 一切都很好。有六个,所以问题 - 如何只使用那些由用户填充的。而且我不能强制要求填写所有这些字段。我想到了案例陈述,但组合可能太多了。我应该如何尽可能简单地解决这个问题?
首先:请注意,NULL
值和空字段是两个完全不同的东西。 ABAP 应用程序中的NULL
值相对不常见,需要使用 IS [NOT] NULL
语句进行处理。
假设你真的是指空字段,而不是NULL
值:使用选择表,但使用规范的方式来定义它们,如果可能的话,使用现代方法来填充它们:
DATA: lt_range_whatever TYPE RANGE OF datatype_here.
lt_range_whatever = value #( ( sign = 'I' option = 'EQ' low = 'value' ) ).
SELECT foo, bar
FROM baz
INTO wherever
WHERE whatever IN @lt_range_whatever.
抱歉,我找到了另一种方法来实现此目的。使用如下语句:
select-OPTIONS: s_mjahr for ZMM_TABLE-mjahr no-EXTENSION
no INTERVALS,
...
select * from ZMM_TABLE
into CORRESPONDING FIELDS OF table lt_table
where mjahr in s_mjahr and
werks in s_werks and ... so on.
我假设您要过滤某些字段,如果过滤器为空,则该字段的任何值都是有效的。
最佳选择是根据需要生成查询。例如,如果用户输入"p_mjahr",而不是"p_werks",则发出创建类似...
select * from ZMM_TABLE
into CORRESPONDING FIELDS OF table lt_table
where mjahr = p_mjahr
如果无法做到这一点,您可以执行以下操作:
select * from ZMM_TABLE
into CORRESPONDING FIELDS OF table lt_table
where (mjahr = p_mjahr or p_mjahr = '') and
(werks = p_werks or p_werks = '') and
此查询的工作方式是,如果p_mjahr有一个值,则"or"的第二个参数将为 false,但第一个参数将按预期匹配。但是,如果p_mjahr是''
(空字符串),则or
子句的第二个参数将被true
,使整个子句true
。通过and
的进一步过滤器将按预期工作。
改用选择表的语法。为了使用它们,您必须像这样声明范围表:
DATA: BEGIN OF rtab OCCURS {10|n},
sign TYPE c LENGTH 1,
option TYPE c LENGTH 2,
low LIKE dobj,
high LIKE dobj,
END OF rtab.
它们要像这样填充:
rtab-sign = 'I'.
rtab-options = 'EQ'.
rtab-low = p_mjahr.
rtab-high = p_mjahr.
APPEND rtab.
如果选择表是初始的,则表达式 IN seltab
始终为 true。
p_values什么数据类型?
如果它们是 int 并且 mjahr 和 werks 不能具有值 0(零),则此示例将起作用:
select * from ZMM_TABLE
into CORRESPONDING FIELDS OF table lt_table
where mjahr = isnull(p_mjahr,0) and
werks = isnull(p_werks,0) and