在字符串表中搜索子字符串


  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>中看到的,在OFFER/之后直到-符号都有相同的代码005056B467AE1ED9B1962F12360477E9

现在,我想通过比较V1的值和<fs_content>中的每一行,将<fs_content>中的行分配给字段Symbol<fs_my_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!?

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.

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

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.

非常感谢大家提供的各种解决方案。这对我很有帮助。

这是我问题的解决办法。

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

我们重复这个操作,以找到lv_slash_position之后的第一个-的位置,并将该值放入lv_dash_position中。

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

最后,我们将比较lv_attr_val_stringv1,如果lv_attr_val_string <> v1,我们不会将其放入最终的itabitab_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.

相关内容

  • 没有找到相关文章

最新更新