- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为了检查内表lt_itab
的所有条目是否满足条件COND,我想使用REDUCE语句。一旦发生违反 COND 的行,循环当然需要终止。下面的第二个代码块似乎可以工作,但在我看来像是对迭代索引的轻微滥用。 您是否知道 REDUCE 语法中有更好/更透明的解决方案?是否可以使用迭代变量的结构(整数、 bool 值)? INDEX INTO
选项似乎不适用于 REDUCE。与内核版本 753(或更低版本)的兼容性会很好。
这是我的最小可重现示例 (MRE),仅当 lvr_flag_allowed = abap_false OR
被注释掉时才通过语法检查(即 -> "lvr_flag_allowed = abap_false OR
):
DATA: lt_itab TYPE TABLE OF i,
rv_flag_allowed TYPE boole_d.
lt_itab = VALUE #( ( 2 ) ( 1 ) ( -1 ) ( 5 ) ).
IF lt_itab IS NOT INITIAL.
rv_flag_allowed = REDUCE #( INIT lvr_flag_allowed = abap_true
FOR lvf_idx = 1 UNTIL lvr_flag_allowed = abap_false OR
lvf_idx > lines( lt_itab )
NEXT lvr_flag_allowed = xsdbool( lt_itab[ lvf_idx ] < 0 ) ).
ENDIF.
RETURN.
目前它给出了这个语法检查消息(其ID是MESSAGEG[M
):
The variable "LVR_FLAG_ALLOWED" cannot be used here.
您知道这不起作用的技术原因吗? SAP documentation on REDUCE - Reduction Operator仅状态
Usually the expression expr (after THEN) and the termination condition log_exp (after UNTIL or WHILE) depend on the iteration variable var.
因此,在写下此内容时,我想到了一个解决方法 MRE:
DATA: lt_itab TYPE TABLE OF i,
* rv_flag_allowed TYPE boole_d,
rv_last_index TYPE i.
lt_itab = VALUE #( ( 2 ) ( 1 ) ( -22 ) ( 5 ) ( 7 ) ( 4 ) ).
IF lt_itab IS NOT INITIAL.
rv_last_index = REDUCE #( INIT lvr_last_index = 0
FOR lvf_idx = 1 THEN COND #( WHEN lt_itab[ lvf_idx ] < 0
THEN 0
ELSE lvf_idx + 1 )
UNTIL lvf_idx = 0 OR
lvf_idx > lines( lt_itab )
NEXT lvr_last_index = lvr_last_index + 1 ).
ENDIF.
RETURN.
它“双重”使用迭代索引并返回rv_last_index = 3
。我现在返回一个整数而不是 bool 值,以便检查正确的中止结果。您认为这正确吗?
非常感谢您的反馈和改进建议(超越经典的 while/until 循环;-))!
最佳答案
我实际上想用 line_exists
来表达这一点,不幸的是table expressions only support equality comparisons不过(遗憾的是不是 <
):
" invalid syntax v
DATA(some_negative) = xsdbool( line_exists( values[ table_line < 0 ] ) ).
一个稍微详细但有效的变体是使用 LOOP AT
立即 EXIT.
(是的,这不是“现代语法”,尽管在我看来仍然非常可读):
DATA(some_negative) = abap_false.
LOOP AT values WHERE table_line < 0 TRANSPORTING NO FIELDS.
some_negative = abap_true.
EXIT.
ENDLOOP.
我不认为 REDUCE 是适合这项工作的工具,因为它应该将表理解为一个值(在其他语言中也没有短路,例如 JS 中的 .reduce
)他们还有其他方法用于此目的,例如 .some
和 .every
等)。如果真实行的数量较少,则不对其进行短路可能是可以接受的,并且此 REDUCE
语句至少不会通过附加 WHERE ( ... )
clause 访问虚假行。 :
DATA(some_negative) = REDUCE abap_bool(
INIT result = abap_false
FOR entry IN values
WHERE ( table_line < 0 )
NEXT result = abap_true
).
关于loops - 通过 REDUCE 检查 itab 的所有行是否符合条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69836945/
假设我有 2 个内部表: TYPES:BEGIN OF LTY_FILE, SOKEY TYPE CHAR5, SOPONO TYPE CHAR15, SOC
在我的选择屏幕上,您可以使用单选按钮组选择您要选择的信息类型。 ( Material 编号、施工契约(Contract)或客户订单)。 选择种类后,用户必须在相应的选择选项中填写数字。有了这些信息,我
我想获取一个字段说 excep_point来自透明的 table z_accounts为company_code的组合和 account_number .如何在 ABAP SQL 中执行此操作? 假设
我从一个返回约 100 行的函数模块调用中得到一个内部表。大约 40% 的行与我无关,因为我只需要带有 PAR1 = "XYZ" 的条目. 在 SQL 表(透明表)上,我可以使用 select cou
构造了一个动态内部表,其中表名作为用户的输入字符串,如何循环遍历它? 请找到 MWE: DATA W_TABNAME TYPE W_TABNAME. DATA W_DREF TYPE REF TO D
构造了一个动态内部表,其中表名作为用户的输入字符串,如何循环遍历它? 请找到 MWE: DATA W_TABNAME TYPE W_TABNAME. DATA W_DREF TYPE REF TO D
我尝试使用SELECT FROM @itab,如所解释的here in SAP docs . 我从未使用过此功能,但认为这很棒。您可以查询仅存在于解释器 RAM 中的内部数据结构,就像数据库中的真实表
我有一个查询,其中使用FOR ALL ENTRIES。内表lt_customer没有记录。 SELECT * FROM bsid INTO CORRESPONDING FIELDS O
我对ABAP一无所知——但我的同事(也对此一无所知)向我展示了他想出的一些代码,其中包含太多的if语句。在 JavaScript 中我可以改进它,但在 ABAP 中我有点迷失,因为我丢失了我的数组;)
我尝试使用SELECT FROM @itab,如所解释的here in SAP docs . 我从未使用过此功能,但认为这很棒。您可以查询仅存在于解释器 RAM 中的内部数据结构,就像数据库中的真实表
我有一个查询,其中使用FOR ALL ENTRIES。内表lt_customer没有记录。 SELECT * FROM bsid INTO CORRESPONDING FIELDS O
我有这样的选择 DATA lt_data TYPE SORTED TABLE OF T_TYPE1 WITH NON-UNIQUE KEY col1. SELECT col1, col2 INTO C
我想对具有 6 个关键字段的数据库表执行 SELECT 查询,假设它们是 keyA、keyB、...、keyF。 作为我的 ABAP 功能模块的输入参数,我确实收到了一个内部表,该内部表具有与关键字段
我试图从内部表中获取一个字段,如下所示: READ TABLE tbl_peps TRANSPORTING ususap INTO lv_responsable WITH KEY usr03 = wa
为了检查内表lt_itab的所有条目是否满足条件COND,我想使用REDUCE语句。一旦发生违反 COND 的行,循环当然需要终止。下面的第二个代码块似乎可以工作,但在我看来像是对迭代索引的轻微滥用。
我找到了这个用于填充范围表的代码(源已经离线): DATA lr_vkorg TYPE RANGE OF vkorg. TYPES: lr_range_t TYPE RANGE OF vkor
ABAP 7.40 给我们带来了新的语法,我还在摸索。 我想在现有表中添加一个新行 lt_itab .我通过添加一个空行并计算出表的当前长度以按索引进行更新找到了一种解决方法,但是有没有更简单的方法?
为了检查内表lt_itab的所有条目是否满足条件COND,我想使用REDUCE语句。一旦发生违反 COND 的行,循环当然需要终止。下面的第二个代码块似乎可以工作,但在我看来像是对迭代索引的轻微滥用。
我找到了这个用于填充范围表的代码(源已经离线): DATA lr_vkorg TYPE RANGE OF vkorg. TYPES: lr_range_t TYPE RANGE OF vkor
我已经声明了一个内部表: DATA: wa_collectoraction TYPE zcollectoraction, it_collectoraction LIKE STANDARD TABL
我是一名优秀的程序员,十分优秀!