0
  1. 我有一个包含以下数据(<fs_content>)的内部表:
OFFER/005056B467AE1ED9B1962F12360477E9-A
OFFER/005056B467AE1ED9B1962F12360477E9-B
OFFER/005056B467AE1ED9B1962F12360477E9-C
OFFER/005056B467AE1ED9B1962F12360477E9-D
OFFER/005056B467AE1ED9B1962F12360477E9-E
  1. 我必须重复搜索这样的值(V1):
OFFER-A
OFFER-B
OFFER-C
OFFER-M
OFFER-L
  1. 我希望识别出以下值,它们与内部表 ( ) 中的一行匹配itab_v1_result
OFFER-A
OFFER-B
OFFER-C

但正如您所见,在直到符号之后<fs_content>有相同的代码。005056B467AE1ED9B1962F12360477E9OFFER/-

现在,我想通过将值与中的每一行进行比较来将行从<fs_content>字段分配给符号,但问题是值与行不完全相同。<fs_my_content>V1<fs_content>V1<fs_content>

我试图做这样的事情,但它不工作,<fs_my_content>总是空的:

READ TABLE <fs_content> ASSIGNING <fs_my_content> WITH KEY ('ATTR_NAME') = V1.

我怎样才能itab_v1_result控制我的期望?

我最小的可重现示例:

TYPES:
  BEGIN OF ty_content,
    attr_name TYPE string,
  END OF ty_content.
FIELD-SYMBOLS:
  <fs_my_content> TYPE any,
  <fs_content>    TYPE ANY TABLE.
DATA:
  itab_content   TYPE STANDARD TABLE OF ty_content,
  itab_v1        TYPE STANDARD TABLE OF string,
  itab_v1_result TYPE STANDARD TABLE OF string,
  v1             TYPE string.

itab_content = VALUE #(
( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-A' )
( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-B' )
( attr_name = 'OFFER/005056B467AE1ED9B1962F123604D7E9-C' )
( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-D' )
( attr_name = 'OFFER/005056B467AE1ED9B1962F12360477E9-E' ) ).

itab_v1 = VALUE #(
( `OFFER-A` )
( `OFFER-B` )
( `OFFER-C` )
( `OFFER-M` )
( `OFFER-L` ) ).

ASSIGN itab_content TO <fs_content>.
LOOP AT itab_v1 INTO v1.
  READ TABLE <fs_content> ASSIGNING <fs_my_content> WITH KEY ('ATTR_NAME') = v1.
  IF sy-subrc = 0.
    APPEND v1 TO itab_v1_result.
  ENDIF.
ENDLOOP.

" Here, itab_v1_result is empty unfortunately!?
4

3 回答 3

2

您不能使用除 in 以外=的任何运算符READ TABLE。但是您可以在LOOP.

首先,您必须以CS可以识别的方式安排您的 V1,因此只需使用“-X”,这似乎是独一无二的。然后你可以在LOOP子句中使用你的条件。

offset = STRLEN( v1 ) - 2.
v2 = v1+offset(2).

LOOP AT itab1 ASSIGNING <fs_itab1> WHERE attribute_name CS v2.
  " do something
  " if you only want to do it for the first entry you find, then just EXIT afterwards
ENDLOOP.
于 2019-09-06T14:50:38.870 回答
1

您使解决方案过于复杂。为什么不只使用子字符串访问

LOOP AT itab_v1 INTO v1.
  LOOP AT itab_content ASSIGNING FIELD-SYMBOL(<content>).
    CHECK v1(5) = <content>-attr_name(5) AND substring( val = v1 off = strlen( v1 ) - 1 len = 1 ) = substring( val = <content>-attr_name off = strlen( <content>-attr_name ) - 1 len = 1 ).
    APPEND v1 TO itab_v1_result.
  ENDLOOP.
ENDLOOP.
于 2020-12-08T11:45:48.513 回答
0

非常感谢你们所有人的解决方案。这对我很有帮助。

这是我的问题的解决方案。

  1. 首先,我们应该循环<fs_content>并将其分配给新的 field-symbol <dynamic_content>
  2. 然后,我们应该从中获取ATTR_NAME字段<dynamic_content>并将其分配给另一个字段符号<contact_attribute_name>
  3. 我们将使用一些函数来处理STRING类型值,因此我们将分配<contact_attribute_name>lv_attr_name.
  4. 正如我们所知(根据任务描述),lv_attr_name其中的值将是:OFFER/005056B467AE1ED9B1962F12360477E9-A等等。正因为如此,我们将/通过find()方法从开头找到 first 的位置,lv_attr_name并将值放入lv_slash_position.

我们重复此操作以找到 first -after的位置lv_slash_position并将值放入lv_dash_position.

在这两个操作之后,我们将使用replace()方法并替换lv_dash_position - lv_slash_positionempty值。最后我们会得到OFFER/-A并将其放入lv_attr_val_string.

最后我们会比较lv_attr_val_stringand v1,如果lv_attr_val_string <> v1我们不把它放到最后的 itab itab_v1_result,否则我们会做。

LOOP AT <fs_content> ASSIGNING <dynamic_content>.
    ASSIGN COMPONENT 'ATTR_NAME' OF STRUCTURE <dynamic_content> TO <contact_attribute_name>.

    DATA(lv_attr_name) = CONV string( <contact_attribute_name> ).

    DATA(lv_slash_position) = find( val = lv_attr_val_string
                                    sub = '/'
                                    off = 0 ).

    IF lv_slash_position <> '1-'.
        DATA(lv_dash_position) = find( val = lv_attr_val_string
                                       sub = '-'
                                       off = lv_slash_position ).

        lv_attr_val_string = replace( val = lv_attr_val_string
                                      off = lv_slash_position
                                      len = ( lv_dash_position - lv_slash_position )
                                      with = '' ).
    ENDIF.

    IF lv_attr_val_string <> v1.
        APPEND v1 TO itab_v1_result.
        CONTINUE.
    ENDIF.
ENDLOOP.
于 2019-09-23T18:06:11.383 回答