Изменение SDATA сегмента IDoc с помощью символов полей?

#abap

Вопрос:

Мой сценарий заключается в том, что я получаю данные сегмента IDOC в символ поля и изменяю некоторые поля на основе некоторых проверок.

Мой код:

 READ TABLE idoc_data ASSIGNING FIELD-SYMBOL(<idocdata>) with key = 'E1EDK01'
IF sy-subrc = 0.

    lcl_struc ?= cl_abap_typedescr=>describe_by_name( 'E1EDK01' ).
    CREATE DATA dref TYPE HANDLE lcl_struc.
    ASSIGN dref->* TO FIELD-SYMBOL(<sdata>).

    IF <sdata> IS ASSIGNED.
      <sdata> = <idocdata>-sdata. 
      ....
      <idocdata>-sdata = <sdata>.
    ENDIF. 
ENDIF. 
 

Хотя приведенный выше фрагмент работает нормально, непрерывность символов полей нарушена, и теперь я должен передать обратно измененные данные. Как я могу использовать ASSIGN символы полей и позволить им позаботиться об изменениях, а не о явном заявлении?

Что-то похожее на приведенный ниже фрагмент, хотя это не сработает, так <IDOC_DATA>-SDATA <SDATA> как они несовместимы.

 READ TABLE idoc_data ASSIGNING FIELD-SYMBOL(<idocdata>) with key = 'E1EDK01'
IF sy-subrc = 0.
    FIELD-SYMBOLS: <sdata> TYPE E1EDK01.
    ASSIGN <idocdata>-sdata TO <sdata>.
    ....
ENDIF.
 

Я ожидаю , что, когда я изменяю данные <SDATA>-FIELD1 , я хочу, чтобы изменения происходили <IDOCDATA>-SDATA без использования <idocdata>-sdata = <sdata> .

Комментарии:

1. Я не уверен, что вы имеете в виду, говоря «непрерывность символов полей нарушена». Можете ли вы объяснить это по-другому и подробнее объяснить, почему это проблема?

2. Я думаю, что второй фрагмент будет работать, если вы используете нетипизированный символ поля (просто FIELD-SYMBOLS <sdata>. ). Но теперь у вас есть символ поля без типа, который может вызвать другие проблемы с набором текста в дальнейшем. В зависимости от того, что "Logic goes here означает, это может быть или не быть проблемой, которую можно или нельзя легко решить.

3. Я думаю, что в вашем 2-м примере есть точная синтаксическая ошибка <IDOCDATA>-SDATA" and "<SDATA>" have incompatible types . Для этого просто нужен КАСТИНГ: ASSIGN <idocdata>-sdata TO <sdata> CASTING.

4. @SandraRossi всегда приходит на помощь. Да, именно то, что я искал. Я никогда по-настоящему не понимал, в чем польза CAST . Есть ли что-нибудь, с чем я должен быть осторожен CAST в этом сценарии?

5. В вашем сценарии ПРИВЕДЕНИЕ должно работать без каких-либо проблем, поскольку структуры сегментов IDoc должны содержать только символьные поля (C, N, D, T).

Ответ №1:

Как упоминала @Sandra выше, несовместимость символов полей может быть решена с помощью их использования CASTING при их назначении. Это заставило бы второй фрагмент работать.

 ...
IF sy-subrc = 0.
   FIELD-SYMBOLS: <sdata> TYPE E1EDK01.
   ASSIGN <idocdata>-sdata TO <sdata> CASTING.
   ...
ENDIF.