Изменение значения параметра импорта функционального модуля abap

#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
  • Имя переменной разрешается во время выполнения, поэтому проверка синтаксиса при его неправильном написании не выполняется.
  • Он ломается, когда переменная в вызывающей программе переименовывается, и вы не узнаете об этом, пока она не выйдет из строя во время выполнения.
  • Вам необходимо заранее знать название вызывающей программы. Когда функциональный модуль вызывается из другой программы, он больше не будет работать.

Поэтому я бы рекомендовал это только в качестве крайней меры.