為了檢查內部表的所有條目是否lt_itab滿足條件 COND,我想使用 REDUCE 陳述句。一旦發生違反 COND 的行,回圈當然需要終止。進一步向下的第二個代碼塊似乎有效,但在我看來像是對迭代索引的輕微濫用。您是否知道 REDUCE 語法中更好/更透明的解決方案?是否可以使用迭代變數的結構(整數、布林值)?該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):
此處不能使用變數“LVR_FLAG_ALLOWED”。
你知道這不起作用的技術原因嗎?關于 REDUCE - Reduction Operator的SAP 檔案僅說明
通常運算式 expr(在 THEN 之后)和終止條件 log_exp(在 UNTIL 或 WHILE 之后)取決于迭代變數 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。我現在回傳一個整數而不是一個布林值,以檢查正確的中止結果。這對你來說是正確的嗎?
非常感謝您的反饋和改進建議(除了經典的 while/until 回圈 ;-))!
uj5u.com熱心網友回復:
我實際上想用 來表達這一點line_exists,不幸的是,表運算式只支持相等比較(遺憾的是不支持<):
" invalid syntax v
DATA(some_negative) = xsdbool( line_exists( values[ table_line < 0 ] ) ).
稍微冗長但有效的變體將使用LOOP AT帶有立即數的 a EXIT.(是的,這不是“現代語法”,盡管 IMO 仍然非常可讀):
DATA(some_negative) = abap_false.
LOOP AT values WHERE table_line < 0 TRANSPORTING NO FIELDS.
some_negative = abap_true.
EXIT.
ENDLOOP.
我不認為 REDUCE 是適合這項作業的工具,因為它應該將表格理解為一個值(在其他語言中也沒有短路,例如.reduce在 JS 中,盡管他們有其他方法可以做到這一點目的類似.some和.every類似)。如果真實行的數量很少,則不為它們短路可能是可以接受的,并且該REDUCE陳述句至少不會通過附加WHERE ( ... )子句訪問虛假行:
DATA(some_negative) = REDUCE abap_bool(
INIT result = abap_false
FOR entry IN values
WHERE ( table_line < 0 )
NEXT result = abap_true
).
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/351542.html
上一篇:forEach回圈中的event.addEventListener()
下一篇:s3fs和fsspec版本的作業組合是什么?匯入錯誤:無法從“fsspec.asyn”匯入名稱“maybe_sync”
