#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.