Как проверить, есть ли в отчете переводы или нет? - PullRequest
3 голосов
/ 02 мая 2019

У меня есть отчет, в котором я написал переводы на разные языки, но теперь я переместил его в систему, в которой у меня нет прав для написания переводов.

Таким образом, отчет работает только вАнглийский: все текстовые символы не работают, если пользователь обращается к системе на другом языке.

Имея это в виду, можно ли написать что-то в событии load-of-program, чтобы проверить, существуют переводы или нети если нет, установите SY-LANGU на английский?

К настоящему времени у меня есть простой if sy-langu <> 'E'. sy-langu = 'E'. endif. ("E" для английского)

Он работает нормально, но независимо от того, я 'Я все еще хотел бы узнать, есть ли переводы, и только потом установить его на английский.

1 Ответ

6 голосов
/ 02 мая 2019

Текстовые символы являются частью Текстовых элементов , которые являются частью многоязычных текстовых пулов программы.

1) Используйте READ TEXTPOOL, чтобы получить текстовые элементы на другом языке:

" READ TEXTPOOL . Этот оператор считывает текстовые элементы из текстового пула языка, указанного в lang, и программы, указанной в prog, из репозитория и помещает их во внутренний Table itab. "

data itab type standard table of textpool.
READ TEXTPOOL prog INTO itab LANGUAGE lang.

2) Либо используйте дополнительный язык, либо используйте SET LANGUAGE, чтобы изменить язык текстовых элементов, как описано в документации ABAP :

"Когда программа загружается во внутренний сеанс, текстовые элементы текстового пула языка входа в систему импортируются по умолчанию. Если этот текстовый пул не существует, текстовый пул вторичного элемента в AS ABAP используется язык . Если ни один из этих текстовых пулов не существует, загружается пустой текстовый пул без текстовых элементов. "

"Когда программа выполняется, текстовый пул другого языка может быть загружен с помощью оператора SET LANGUAGE ."

Решение

Если использование дополнительного языка неудовлетворительно, используйте этот код:

LOAD-OF-PROGRAM.
  constants lc_english    type sylangu value `E`.
  data lt_text_symbols    type standard table of textpool.

  read textpool sy-repid into lt_text_symbols language sy-langu.

  if sy-subrc <> 0.
    SET LANGUAGE lc_english.
  endif.

PS:

  • Параметры профиля можно просмотреть с помощью кода транзакции RZ11 (дополнительный язык zcsa/second_language).
  • Привыкайте с if sy-subrc <> 0 вместо if lines( lt_text_symbols ) = 0., потому что в некоторых других ситуациях, если lt_text_symbols содержит что-то до READ TEXTPOOL, его содержимое не очищается, если на запрошенном языке нет текстового пула.

  • Внутри события LOAD-OF-PROGRAM предпочитайте использовать sy-repid вместо sy-cprog, хотя технически они содержат то же самое в тот момент, потому что у последнего есть еще значение :

    "В вызываемых извне процедурах - имя вызывающей программы; в противном случае имя текущей программы. Если вызываемая извне процедура вызывает другую внешнюю процедуру, sy-cprog содержит имя главной программы и не имеет значения имя главной программы последующей вызывающей программы. "

  • Не изменяйте значение sy-langu, dixit Системные поля :

    "они должны использоваться только для чтения"

  • Если вы хотите изменить sy-langu, используйте SET LOCALE LANGUAGE . Это имеет другие последствия, внимательно прочитайте документацию. Не путайте с SET SET LANGUAGE.

...