Меню

Работа с замещениями FI. Часть 1

Уважаемые коллеги!

Я продолжаю публикацию на портале SAPLand цикла статей «Техники расширений стандартной системы SAP».

Все статьи цикла приведены внизу публикации.

Предыдущая статья >>

Технология замещений используется в некоторых модулях системы, например, FI и позволяет автоматически выполнить заполнение параметров документов (финансовый документ) или других объектов системы (карточка основного средства) при сохранении. Например, задачи замещения контрольного счета кредитора при проводке счета логистики, заполнение некоторых полей при создании карточек ОС или сложные алгоритмы замещения объектов контировок. В общем случае, данная техника замещений предназначается для работы без какого-либо кодирования на языке ABAP. Но в одном из вариантов реализации замещений можно использовать программные вставки кода, выполняющего замещения. Такая техника расширений представляет пользователю довольно гибкий механизм управления формированиями значений полей. Замещения позволяют, как выполнять проверки в ходе сохранения документа, так и выполнять изменения в значениях полей. Одним из плюсов данной техники, является то, что после работы замещения, структура сохраняемого документа еще раз проходит функции проверки значений для полей документа. Соответственно если вы некорректно выполните замещение поля, например, подставите в ходе замещения номер счета главной книги, которого нет в системе, то получите стандартное сообщение об ошибке. Это, в некоторой мере, страховка от не правильной реализации кода замещения.

В качестве примера использования замещений, предлагаю рассмотреть вариант задачи, когда в финансовый документ проводки инвентаризационных разниц, в позицию документа FI, которая формируется для оцениваемых материалов, требуется записать номер документа инвентаризации из функциональности управления материальными запасами.

Так как документы FI при создании являются уже третьими в цепочке документов инвентаризации: Документ инвентаризации – Документ движения материалов (количественный приход/расход инвентаризационных разниц – Финансовый документ приход/расход инвентаризационных разниц по суммам), то делать занесение данных в позиции документа FI будет проще именно в замещении, так как в этом момент все предыдущие документы уже созданы.

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

Сначала всегда нужно проверить то, какие поля можно замещать в системе, потому что, не все поля, к которым имеется доступ, можно заместить. Для систем до 4.6, для этого нужно идти в просмотр значений таблицы GB01, Рис.1, там задаем следующие параметры:

  • BOOLCLASS = 9, если проверяем возможность замещения полей для позиций документа FI
  •  BOOLCLASS = 8, если требуется замещать поля в заголовке документа FI.
  • CLASSTYPE = S, (показать замещаемые поля)

Рис.1 GB01-1

Далее увеличиваем количество записей в поле «максимальное количество совпадений» (2000 должно хватить), и выполняем выборку данных. Пример результата приведен на Рис.2. Фактически это - список полей таблицы BSEG. Теперь можно найти по имени поле, требующее замещения.

Рис.2 GB01-2

В более старших версиях системы, чем 4.6 существует специальный ракурс ведения – VWTYGB01, который позволяет не только просматривать таблицу замещаемых полей, но и модифицировать данные таблицы, Рис.3.

Рис 3 VWTYGB01

Далее смотрим на признак в поле BEXCLUDE. Если там ничего не стоит, значит поле можно замещать, но если там стоит значение Х, то это значит, что данное поле не рекомендуется к замещению пользователем, например, поле текста позиции документа BSEG-SGTXT разрешено к замещению, а вот счет главной книги BSEG-HKONT – нет. Однако, если очень хочется сделать замещение поля счета главной книги, то это сделать можно, но только в том случае, если Вы понимаете возможные последствия своих действий. При этом поля суммы, я вам очень не рекомендую замещать. Для «нерекомендованного» замещения нужно сбросить признак Х в поле BEXCLUDE (напротив замещаемого поля). Если этого не сделать, то после вызова замещения, система вернет все значения полей со статусом BEXCLUDE = "Х" такими, какими они были до вызова вашего замещения.

Далее (так как мы изменили набор полей, подлежащих замещению) надо перегенерировать программы обработки замещений, чтобы они «узнали» о том, что появились новые поля для замещения. Если этого не сделать, то замещения для новых полей работать не будут. Для этого нужно через транзакцию SE38, выполнить программу RGUGBR00 – Генерация ABAP-кодировки для проверок/замещений/правил. Причем, если измененную запись в таблице GB01 можно перенести транспортом в продуктивную систему, то программу генерации данных для замещения желательно выполнить в каждой системе, куда будет переноситься транспорт вашего замещения. Выполнять программу надо для области FI и для всех «моментов использования», галочки ставим все, как на Рис.4. Стандартно, при импорте запроса, содержащего изменения замещаемых полей и новых текстов замещений, система сама вызывает генерацию замещений, но иногда (почему-то!) этого не происходит, поэтому ручной запуск программы RGUGBR00 может гарантировать вас от (правильно непонятых!) ошибок при работе замещения.

Если в замещениях нет синтаксических ошибок, то генерация должна пройти без проблем. Если никто до вас ничего не трогал, то ошибок генерации вы получить не должны, зато теперь система знает, что было добавлено новое поле для замещения. Если же поле изначально позволяет выполнять свое замещение, то запускать генерацию не нужно. Например, поле BSEG-SGTXT может быть замещено изначально.

Рис.4 RGUGBR00

Создание программы замещения.

Как и user-exits замещение это - фактически abap-программа, выполняющаяся в контексте работы стандартной транзакции системы. При этом система генерирует вам обработчик (блок PERFORM / ENDFORM), в котором вы должны написать логику определения данных замещения, однако, в отличии от user-exits, вам не нужно получать ключ разработчика на программу в которой следует реализовать замещение, так как:

  • Во-первых, программа замещения указывается в настройке для прикладной области, причем прикладные области системой определены заранее;
  • Во-вторых, SAP предлагает вам шаблон программы, который вы должны скопировать в свою программу, начинающуюся на Z*, после чего для нужной вам прикладной области следует заменить стандартную программу на вновь вами созданную.
  • В-третьих, все замещения для прикладной области «живут» в одной программе, т.е. если для прикладной области уже стоит программа, начинающаяся на Z*, то это значит, что кто-то уже использует замещения в вашей системе. Вы должны будете вставить ваш код замещения в эту уже существующую программу, ну и само собой, ваш код должен быть, как минимум, без синтаксических ошибок, а иначе вы «завалите» работу всех замещений для прикладной области.

Итак, идем в настройку системы: SPRO: Финансы - Специальные регистры - Основные параметры настройки - Программы пользователя - Ведение пользовательских программ, зависящих от манданта. Для версии 4.6 и ниже, возможно путь будет немного другим, но где-то в районе настройки спецрегистров. Пример для ECC 6.0 на Рис.5. Если зайти в настройку для замещения документов FI на уровне заголовка и позиции, нас будет интересовать строка прикладной области = GBLS.

Рис.5 GBLS-1

Если замещения не использовались, то там будет стоять программа RGGBS000. Считаем, что так и есть, поэтому копируем эту программу в свою, например, с именем ZGGBS000. Копируем только текст этой программы без инклудов, т.е. именно текст этой   программы, для чего в SE38 вводим имя этой программы и выбираем копирование Ctrl+F5. После чего вставляем имя своей программы для прикладной области, как на Рис.6.

Рис.6 GBLS-2

Теперь выполняем сохранение. При сохранении необходимо ввести имя запроса для транспорта изменений, и система выполнит синтаксическую проверку заданной вами программы. Если ошибок не обнаружено и генерация кода пройдет успешно, то система позволит вам сохранить изменения. В нашем случае, программа «свежая», мы в нее «своими ручками не лезли», так что теоретически все будет сохранено без проблем. Затем идем в изменение программы и добавляем свою подпрограмму замещения. Имя подпрограммы можно использовать любое, длина имени - 4 символа. По стандарту имена начинаются на U*, традиция хорошая, можно ее продолжить. Для этого надо в программе ZGGBS000, найти следующую подпрограмму:

*----------------------------------------------------------------------*
*       FORM GET_EXIT_TITLES                                           *
*----------------------------------------------------------------------*
*       returns name and title of all available standard-exits         *
*       every exit in this formpool has to be added to this form       *
*----------------------------------------------------------------------*
*  -->  EXIT_TAB  table with exit-name and exit-titles                 *
*                 structure: NAME(5), PARAM(1), TITEL(60)
*----------------------------------------------------------------------*
FORM GET_EXIT_TITLES TABLES ETAB.

И где-то в конце этой подпрограммы GET_EXIT_TITLES, но перед командами:

  REFRESH ETAB.
  LOOP AT EXITS.
    ETAB = EXITS.
    APPEND ETAB.
  ENDLOOP.

Вставьте свой код:

  EXITS-NAME  = 'U777.
  EXITS-PARAM = C_EXIT_PARAM_NONE.
  EXITS-TITLE = TEXT-777.
  APPEND EXITS.

U777 - имя нашего замещения, оно, кстати, не должно пересекаться с уже существующими именами. Вместо TEXT-777 можно просто написать комментарий

Затем нужно перейти ниже по тексту программы, например, сразу после подпрограммы GET_EXIT_TITLES, и создать свою подпрограмму

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти