如主题中所述,我希望在另一个内部表中拥有一个内部表的条件子集。
\n\n让我们首先看看老式的方式是什么样子的。
\n\nDATA: lt_hugeresult TYPE tty_mytype,\n lt_reducedresult TYPE tty_mytype. \n\nSELECT "whatever" FROM "wherever" \n INTO CORRESPONDING FIELDS OF TABLE lt_hugeresult \n WHERE "any_wherecondition".\nIF sy-subrc = 0.\n lt_reducedresult[] = lt_hugeresult[].\n DELETE lt_reducedresult WHERE col1 EQ \'a value\'\n AND col2 NE \'another value\'\n AND col3 EQ \'third value\'.\n .\n .\n .\n\n\nENDIF.\n
Run Code Online (Sandbox Code Playgroud)\n\n我们大家可能都知道这一点。
\n\n现在我正在阅读有关表减少的内容,这是在 abap 7.40(似乎是 SP8)中引入的。
\n\n表推导式 \xe2\x80\x93 按功能构建表
\n\n表驱动:
\n\nVALUE 表类型( FOR line IN tab WHERE ( \xe2\x80\xa6 )
\n\n( \xe2\x80\xa6 行-\xe2\x80\xa6 \xe2\x80\xa6 …
我有一个表的名称DATA lv_tablename TYPE tabname VALUE 'xxxxx'
,以及一个FIELD-SYMBOLS: <lt_table> TYPE ANY TABLE.
包含从相应表中选择的条目的泛型。
我已经定义了我FIELD-SYMBOLS: <ls_line> TYPE ANY.
用于从表中读取的行结构。
有没有办法在<lt_table>
完全指定关键字段时创建 READ 语句?
我知道 statement/addition READ TABLE xxxx WITH KEY (lv_field_name) = 'asdf'.
,但是这对于动态数量的关键字段不起作用(afaik),并且我不想创建大量READ TABLE
具有越来越多的关键字段规范的语句。
这能做到吗?
我有一个 ABAP 内部表。结构化,具有多个列(例如 25 个)。名称和类型无关紧要。该表可能会变得非常大(例如 5,000 条记录)。
| A | B | ... |
| --- | --- | --- |
| 7 | X | ... |
| 2 | CCC | ... |
| 42 | DD | ... |
Run Code Online (Sandbox Code Playgroud)
现在我想将其中一列(例如 B)设置为特定的常量值(例如“Z”)。
执行此操作的最短、最快和最节省内存的方法是什么?
我最好的猜测是LOOP REFERENCE INTO
. 这是非常有效的,因为它就地更改了表,而不会浪费新的内存。但它占用了三个语句,这让我想知道是否可以缩短:
LOOP AT lt_table REFERENCE INTO DATA(ls_row).
ls_row->b = 'Z'.
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)
然后是VALUE
运算符将其简化为一个语句,但效率不高,因为它会创建新的内存区域。对于大量列,它也会变得冗长,因为它们必须一一列出:
lt_table = VALUE #( FOR ls_row in lt_table ( a = ls_row-a
b = 'Z' ) …
Run Code Online (Sandbox Code Playgroud) 如何使用 FOR 循环根据另一个字段中的相同值添加一个字段中的值?
\nTypes:\nBegin of ty_final,\n doctype type char5,\n posnr type char5,\n total type quan5,\nEnd of ty_final.\n\nDATA(lt_final)\xc2\xa0=\xc2\xa0VALUE\xc2\xa0ty_final( \n FOR\xc2\xa0line\xc2\xa0IN\xc2\xa0lt_history\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 WHERE\xc2\xa0(\xc2\xa0hist_type\xc2\xa0=\xc2\xa0'U'\xc2\xa0)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 (\xc2\xa0doctype\xc2\xa0=\xc2\xa0line-hist_type \n total\xc2\xa0 =\xc2\xa0line-quantity\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 posnr \xc2\xa0 =\xc2\xa0line-po_item \xc2\xa0)\xc2\xa0). \n
Run Code Online (Sandbox Code Playgroud)\n我在 LT_HISTORY 中有什么:
\nHIST_TYPE POSNR QUANTITY\n U 10 5\n U 10 2\n U 20 3\n U 20 -3\n
Run Code Online (Sandbox Code Playgroud)\n我在 LT_FINAL 中需要什么:
\nDOCTYPE POSNR QUANTITY\n U 10 7\n U 20 0\n
Run Code Online (Sandbox Code Playgroud)\n我试图用来获取基于和字段的字段GROUP BY
中的值的总和。只是我不确定我到底需要在循环中添加什么。让我头晕。所以我尝试尽可能简单。TOTAL
POSNR
DOCTYPE
GROUP BY
FOR
REDUCE
在我的选择屏幕上,您可以使用单选按钮选择要选择信息的编号类型。(材料编号、施工合同或客户订单)。
选择种类后,用户必须在相应的选择选项中填写数字。有了这些信息,我选择了我需要将它们移动到 itab 的信息t_marc
。此表具有与 相同的字段marc
。
当用户在选择屏幕上选择材料编号时,一切正常,用户记下的每个编号的值都显示在 ALV 列表中。
When selecting by one of the other numbers, the values in output are also right, but only the information to the last denoted number will be edited.
如何将所有数字移动到我的 itabs?
PARAMETERS: p_mat RADIOBUTTON GROUP radi.
PARAMETERS: p_auf RADIOBUTTON GROUP radi.
PARAMETERS: p_vbl RADIOBUTTON GROUP radi.
SELECT-OPTIONS: s_matnr FOR marc-matnr.
SELECT-OPTIONS: s_aufnr FOR aufk-aufnr.
SELECT-OPTIONS: s_vbeln FOR vbap-vbeln.
Run Code Online (Sandbox Code Playgroud)
选择开始
IF p_mat = 'X'.
SELECT * FROM marc
INTO …
Run Code Online (Sandbox Code Playgroud) DATA: BEGIN OF line,
CUOBJ TYPE CUOBJ,
tab_atinn TYPE STANDARD TABLE OF ATINN WITH DEFAULT KEY,
END OF line.
DATA:
CUBOBJ_TABLE LIKE STANDARD TABLE OF line WITH DEFAULT KEY.
...
DATA(table) = CUBOBJ_TABLE[ CUOBJ = value-instance ]-tab_atinn.
IF NOT line_exists( table[ currentatinn ] ).
INSERT currentatinn INTO table INDEX 1.
ENDIF.
Run Code Online (Sandbox Code Playgroud)
我正在尝试将新行添加到 CUOBJ_TABLE [..]-tab_atinn 中。执行代码后,表变量将有一个新行,但 CUBOBJ_TABLE[ CUOBJ = value-instance ]-tab_atinn 表不会有它。
如何使用引用或其他内容将其直接添加到 CUBOBJ_TABLE[ CUOBJ = value-instance ]-tab_atinn 中?
我有一个这样的选择
DATA lt_data TYPE SORTED TABLE OF T_TYPE1 WITH NON-UNIQUE KEY col1.
SELECT col1, col2 INTO CORRESPONDING FIELDS OF TABLE lt_data where...
Run Code Online (Sandbox Code Playgroud)
我的问题是:排序操作是在DB上进行还是在应用服务器端进行?我的数据库是 Hana DB (S/4 Hana)。
Suppose I have 2 internal tables:
TYPES:BEGIN OF LTY_FILE,
SOKEY TYPE CHAR5,
SOPONO TYPE CHAR15,
SOCONO TYPE CHAR15,
FLAG TYPE C,
END OF LTY_FILE.
data:IT_ARCHIVE TYPE TABLE OF LTY_FILE,
IT_SAP TYPE TABLE OF LTY_FILE.
it_archive = VALUE #(
( sokey = 'Key1' sopono = 'PO#12' socono = 'Three' flag = 'A' )
( sokey = 'Key2' sopono = 'PO#34' socono = 'Four' flag = 'B' ) ).
it_sap = VALUE #(
( sokey = 'Key1' sopono = 'PO#12' socono = …
Run Code Online (Sandbox Code Playgroud) 我需要一个带有散列键的内部表,但每个键有多个行。我认为深表是解决我的问题的正确解决方案,但我如何定义它?
我想要基于字段名称从到 的MOVE
字段。我尝试过以下操作:itab1
itab2
CLEAR itab2.
MOVE-CORRESPONDING itab1 TO itab2.
Run Code Online (Sandbox Code Playgroud)
这是可行的,但前提是FIELDS
名称相同。
现在我想做类似的事情:
CLEAR itab2.
MOVE-CORRESPONDING itab1-field1 TO itab2-field2.
MOVE-CORRESPONDING itab1-field3 TO itab2-field4.
Run Code Online (Sandbox Code Playgroud)
等等..但是每次我尝试这样做时都会出现以下错误"itab1-field1" is not a structure or an internal table.
我也尝试过这样写,MOVE-CORRESPONDING <itab1>-field1
但这也行不通。
我怎样才能实现我想要的?感谢您尝试帮助我..