我有一个非常简单的选择:
select * from ZMM_TABLE
into CORRESPONDING FIELDS OF table lt_table
where mjahr = p_mjahr and
werks = p_werks and
...
当出现p_values时 - 一切正常。它有六个,所以问题 - 如何只使用那些由用户填充的问题。而且我不能强制要求并且要求填补所有这些领域。 我考虑了案例陈述,但可能有太多的组合。我应该如何尽可能简单地解决这个问题?
答案 0 :(得分:1)
我假设您要对某些字段进行过滤,如果过滤器为空,则该字段的任何值都有效。
最好的选择是根据需要构建查询。例如,如果用户输入“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
的其他过滤器将按预期工作。
答案 1 :(得分:1)
首先:请注意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.
答案 2 :(得分:1)
抱歉,我找到了另一种方法来实现这一目标。使用过的语句如下:
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.
答案 3 :(得分:-1)
请改用selection tables' syntax。要使用它们,您必须声明范围表,如下所示:
public class BaseCar : IEquatable<ICar>, IComparable<ICar>
{
/// [...]
}
public void Test(BaseCar car1, BaseCar car2)
{
car1.Equals(car2);
car2.CompareTo(car2);
}
他们将被这样填充:
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.
始终为真。
答案 4 :(得分:-2)
什么数据类型是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