#import #structure #abap
Вопрос:
У меня есть FM со структурой при импорте. Когда я пытаюсь изменить значение поля ( wa_str-data = '31129999'
например), изменение работает, но когда я выхожу из FM, значение поля сбрасывается.
Можно ли изменить значение поля параметра импорта функционального модуля, который имеет структурированный тип?
Спасибо всем.
Комментарии:
1. Почему бы вам не определить свой параметр «импорт» как параметр «изменение»? (импорт означает, что это просто входной параметр, экспорт означает, что это просто выходной параметр, а изменение означает, что это как входной, так и выходной параметр)
2. Привет,спасибо за ответ. Функция, которую я должен изменить, вносит в нее только внутренние изменения.
3. Так что ты не можешь. Ваш единственный шанс-тоже изменить вызывающую программу и передать значение, которое нужно изменить, так, как вы хотите. Будьте осторожны с побочными эффектами, поскольку изменение официального кода программного обеспечения SAP означает, что в случае ошибок целостности данных помощь SAP не включена в лицензию SAP.
4. Вы называете это как ИМПОРТ или определено в FM как импорт? Первый параметр является выходным, второй-входным
Ответ №1:
Нет, вы не можете изменить значение IMPORTING
параметра (если только это не a TYPE REF TO
, и в этом случае вы можете изменить значение объекта/данных, на которые ссылается ссылка). Вы можете изменять только значения CHANGING
параметров. Однако здесь есть один грязный трюк, который вы, возможно, сможете использовать. Если вы хотите получить доступ к переменной foo
в вызывающей программе Z_BAR
, вы можете сделать это:
FIELD-SYMBOLS <foo>.
ASSIGN ('(Z_BAR)FOO-DATA') TO <foo>.
IF sy-subrc = 0.
<foo> = newValue.
ENDIF.
(Кстати, Z_BAR
даже не обязательно быть прямым вызывающим модулем функции. Это просто должно быть где-то в стеке вызовов.)
Почему я называю это «грязным» трюком?
- Это создает «жуткие эффекты на расстоянии».
Z_BAR
Любой исследователь никогда не ожидал бы, что функциональный модуль изменится, если его нет в списке параметров.foo
- Имя переменной разрешается во время выполнения, поэтому проверка синтаксиса при его неправильном написании не выполняется.
- Он ломается, когда переменная в вызывающей программе переименовывается, и вы не узнаете об этом, пока она не выйдет из строя во время выполнения.
- Вам необходимо заранее знать название вызывающей программы. Когда функциональный модуль вызывается из другой программы, он больше не будет работать.
Поэтому я бы рекомендовал это только в качестве крайней меры.