Автор Тема: 5 - А3_Замещения  (Прочитано 10171 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
5 - А3_Замещения
« : Апрель 22, 2016, 12:22:49 am »
Работа с замещениями FI

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

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

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

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

В начале всегда нужно проверить то, какие поля можно замещать в системе, потому что, не все поля, к которым имеется доступ, можно заместить. Для систем до 4.6, для этого нужно идти в просмотр значений таблицы GB01, рисунок 1: GB01-1.png, там задаем следующие параметры:
  • BOOLCLASS = 9, если проверяем возможность замещения полей для позиций документа FI или 8 -  если требуется замещать поля в заголовке документа FI.
  • CLASSTYPE = S, типа показать замещаемые поля

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

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

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

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

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

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

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

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

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

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

Теперь выполняем сохранение. При сохранении необходимо ввести имя запроса для транспорта изменений и система выполнит синтаксическую проверку заданной вами программы. Если ошибок не обнаружено и генерация кода пройдет успешно, то система позволит вам сохранить изменения. В нашем случае программа свежая, мы в нее «своими ручками не лезли», так что теоретически все будет сохранено без проблем. Затем идем в изменение программы и добавляем свою подпрограмму замещения. Имя подпрограммы можно использовать любое, длина имени - 4 символа. По стандарту имена начинаются на U*, традиция хорошая можно ее продолжить. Для этого надо в программе ZGGBS000, найти следующую подпрограмму:
Код: You are not allowed to view links. Register or Login
*----------------------------------------------------------------------*
*       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  и создать свою подпрограмму с именем U777:
Код: You are not allowed to view links. Register or Login
*---------------------------------------------------------------------*
*       FORM U777                                                     *
*---------------------------------------------------------------------*
*       Моя прогрмма замещения                                        *
*---------------------------------------------------------------------*
FORM U777.

ENDFORM.

Если вы сделали все правильно, то ошибок генерации быть не должно. Само замещение будем писать позже, а пока займемся следующим шагом: оформлением вызова замещения.

Для проверки работы в дальнейшем можете вставить в подпрограмму оператор прерывания BREAK <имя пользователя>. А пока запоминаем имя программки ZGGBS000, она нам понадобиться в дальнейшем и имя своей подпрограммы U777.

Оформление замещения.

Теперь займемся собственно самим замещением. В общем виде замещение FI не обязательно должно приводить к написанию программы замещения, так как очень часто само замещение может выступать как проверка на допустимость операции. Например, можно просто без всякого программирования написать замещение с такой функциональностью: если будет использоваться счет затрат ХХХ, то контировка должна быть обязательно только на МВЗ с кодом ZZZ, а если это условие не соблюдается, то выдается сообщение пользователю и запрещается проводка документа. Это все можно сделать, используя редактор замещений без кодирования на ABAP.

Для работы редактора замещения нужно перейти в настройку SPRO: Финансы - Бухгалтерия дебиторов и кредиторов - Бизнес-операции - Проводка по альтернативному контрольному счету - Прочие операции особой главной книги - Выполнение и проверка настройки для документа - Замещение в бухгалтерских документах,  или осуществить прямой вызов транзакции OBBH (так как для версий младше 6.0 путь может быть другой). После вызова настройки вы попадете в таблицу как на рисунке 7: OBBH-1.png, данные в таблицы зависят от количества БЕ ).

Основное правило – замещения работают и настраиваются для балансовой единицы. В принципе если две БЕ работают по одинаковым правилам, то для них можно и нужно использовать один код замещения. Если для вашей БЕ в списке уже присвоен какой-то код замещения, то вы должны использовать уже созданный код, так как возможно, что группа FI уже использует замещения в своих целях, следовательно, вы должны будете добавить свой шаг в уже созданный код замещения. Если замещения для БЕ не использовались, то нажмите кнопку "Новые записи" затем введите код БЕ и выберите момент замещения. Так как мы как бы замещаем поле BSEG-SGTXT, то это -  строка документа FI, значит, нас интересует замещение на уровне позиции документа. Вообще если исходить из рисунка 8: OBBH-2.png, то часто будут актуальны моменты 0001 - заголовок документа, 0002 - позиция документа и 0003 - весь документ полностью, при этом, если нужно использовать моменты 1 и 2 то вы должны будете добавить 2 записи в таблицу.

Примечание: Событие 0003 – документ полностью, не отрабатывает при формировании финансового документа из других модулей системы, т.е. в приведенном примере, использовать замещение типа 0003 не имеет смысла, система не будет инициировать этот тип замещения. Как вариант предлагается использовать технику BTE –  Business Transaction Events, и событие 1120: SAMPLE_PROCESS_00001120.

Выбираем момент 0002 для позиции документа и затем нажимаем ввод. Внизу система сообщит, что выбрана одна запись. Теперь нужно создать код замещения, в поле замещение. В данном поле работает вызов допустимых значений ввода по F4, система вам предложит выбрать значение из уже введенных кодов замещений, которые присвоены другим БЕ. В нашем случае, для БЕ 2000 мы создаем новый код. Для этого вводим любой текст, например MYEXT, после чего делаем двойной клик мышью на введенном имени, в противном случае, если вы нажмете ввод, то система выдаст ошибку, с уведомлением, что замещение не существует. При клике мышью, вам будет предложено создать новое замещение, пример на рисунке 9: OBBH-3.png. Подтверждаем желание создать новое замещение, после чего попадаем в редактор замещений.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
5 - А3_Замещения
« Ответ #1 : Апрель 22, 2016, 12:34:27 am »
Редактор замещений.

Редактор замещений выглядит достаточно серьезно, но ничего особо сложного при работе с ним нет; как видно на рисунке 10: OBBH-4.png новый код замещения MYEXT для момента позиция документа добавлен в дерево замещений, в котором уже присутствуют другие коды для момента 0002.

Один из кодов REG_SUB я раскрыл, и видно, что в нем уже существует 5 этапов. Фактически этап это - отдельный шаг проверки для строки документа. На каждом шаге вы можете менять любое из допустимых полей позиции документа. При этом учтите, что если на каком-то шаге с порядковым номером, большим относительно вашего этапа, будет изменение того же поля, которое меняете вы, то само собой, система сохранит последнее изменение. При этом вам, как пользователю, ничего не будет сообщено о том, что поле было переопределено несколько раз на разных этапах. Так что, если вы сделали свой этап, а таких этапов уже - «целый вагон», желательно пройтись по всем и посмотреть: не использует ли кто-то уже поле, то же что и вы,   для каких-то своих целей? В данном случае, замещение новое, так что этап будет только наш. Для примера, желательно бы конечно назвать наше замещение слева от дерева замещений, например "Замещение MM-IV". Теперь надо добавить свой шаг в замещение. Вопрос почему в дереве оно называется "Этап", а кнопка на панели инструментов называется "Шаг", наверное следует адресовать переводчикам, тем не менее, чтобы создать этап замещения, надо нажать кнопку "Шаг". Система выведет экран, рисунок 11: OBBH-5.png, со списком полей, которые можно замещать.

В принципе можно выбрать первое пустое значение, что значит: хотим создать только экзит без привязки к полям, что замещать решим по ходу дальше, но в данном случае, мы знаем, что хотим замещать текст позиции документа, поэтому, выберем ниже по списку, позицию BSEG-SGTXT и нажмем ОК. Система, спросит: какой тип операции замещения для поля мы хотим использовать? Пример на рисунке 12: OBBH-6.png. Как видим вариантов 3:
  • Константа, вариант реализации, когда полю всегда будет присваиваться какое-то определенное значение. Это - весьма полезный вариант, очень часто используется присвоение именно констант: это  делается путем создания разных этапов, для каждого этапа определяется свое условие срабатывания, например, по виду документа. Таким образом, можно создать набор соответствующих постоянных присвоений в зависимости от какого-то конечного набора правил. Для поля «текст позиции» это не актуально, но, к примеру, какие-то объекты контировки типа МВЗ/СПП-элементы/Финансовые позиции, очень часто именно так и замещают, в автоматическом режиме.
  • Программа пользователя. Обратите внимание: два  первых шага, описанные выше, как раз и были подготовкой для работы замещения через программу пользователя.
  • Присвоение поле-поле, позволяет копировать значение из любого поля документа в замещаемое поле, например, можно сделать при определенных условиях копирование поля текст заголовка в поле текста позиции.

В данном случае выбираем "программа пользователя" и система вставляет значение в наше замещение (первый этап), рисунок 13: OBBH-7.png.

Целесообразно дать имя этапу, это не обязательно, но очень «кошерно» и впоследствии упростит работу: все ходы записаны и комментированы. Называем эту процедуру, например, "Проводка документа инвентаризации" и переходим к шагу формирования предпосылки и написания самого замещения.

Предпосылки замещений.

Предпосылка представляет собой фактически фильтр, по которому будет вызываться ваша программа замещения. Можно работать без предпосылок, но тогда следует учесть, что любая проводка документа FI будет попадать в ваше замещение и вам, во-первых, потребуется рисовать сложную логику фильтрации, чтобы отбирать только интересующие позиции, а во-вторых справляться с ситуацией когда: 50 000 документов FI в месяц это - даже не очень много, а есть системы, где их за сотни тысяч проводится.

Вопрос: Вы уверены, что сделали все правильно?
Вывод: Лучше сделать правильную предпосылку, а уже на уровне программы дописать то, что не получится сделать с помощью редактора предпосылок.

Переходим на ветку дерева "Предпосылка". Справа будет открыто окно создания предпосылки + визуальный редактор, которым можно сделать почти все, а если не все, то всегда можно переключиться на режим эксперта, по меню: "Параметры настройки" - "Экспертный режим" и ввести условия на языке, похожем на ABAP; однако это не совсем ABAP, так что синтаксис все - таки надо поучить в документации. В общем, внешний вид как на рисунке 14: OBBH-8.png, где суть работы заключается в том, что выбирается структура и поле структуры, затем проводится операция с этим полем.

Операция обычно представляет сравнение выбранного поля с чем-то и т.д. Для работы предложены три структуры: заголовок документа, позиции документа и системная структура словаря SYST («абаперам», наверное, объяснять не надо, «неабаперы» могут зайти в SE11 и посмотреть на поля и описание, либо обратиться к «абаперу» это более разумно). Теперь вернемся к фильтру: что надо фильтровать и как, предлагаю начать с исследования документа инвентаризации (вроде как замещение договорились делать для таких типов документов). Порядок формирования документов в системе в принципе следующий: Документ инвентаризации – Документа материала ММ – Финансовый документ FI, значит начинать надо с документа инвентаризации. Для примера нашел документ как на рисунке 15: MI06.png. Транзакция просмотра документов инвентаризации MI06.

Как видим, после подсчета был проведен уже документ материала 4900031463, перейдем к просмотру документа материала, рисунок 16: MB03.png. Транзакция просмотра документов материала MB03, а в ней уже выбираем кнопку RW-Документы.

От документа материала можно перейти к документам FI, пример на рисунке 17: FB03.png. Из данного документа можно сказать, что фильтр будет следующим:
  • Вид документа нас будет интересовать WI - Документ инвентаризации. Однако этого мало, так как если человек в FI ошибется, то может и случайно провести в ручном режиме такой документ.
  • Ссылочная операция MKPF - Ее мы тоже включим в фильтр, так как это значит, что документ проведен как ссылочный к операции из ММ.
  • Код транзакции MI07? Если у вас используется только стандарт и ведомости не проводятся программно (тогда код транзакции может быть другой), то можно включить и код транзакции. В данном случае я код транзакции включу в фильтр.

Примечание: Код транзакции при проводке разниц будет со ссылкой на документы инвентаризации MI07 (на рисунках стоит MI10, это инвентаризация без ссылки).

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

Итак, возвращаемся в конструктор предпосылок. Все поля, которые мы отобрали для фильтра, находятся в заголовке документа. Значит, нам нужна из трех структур именно таблица заголовка. Как видим "Структура BKPF" , Заголовок документа для бухгалтерии, -  то что нам нужно, рисунок 18: OBBH-9.png.

Делаем двойной клик мышью на имени структуры BKPF и попадаем в просмотр полей заголовка документа FI. Наши поля выделены на рисунке 19: OBBH-10.png и ниже по списку, еще есть поле кода транзакции.

Теперь – двойной клик мышью на поле BKPF-BLART - Вид документа, и поле будет скопировано в верхний экран, рисунок 20: OBBH-11.png.

Затем кликаете мышью на знаке равно справа от списка полей и в окне ввода условия появится фраза: "Вид документа =", рисунок 21: OBBH-12.png, после чего у вас к выбору из кнопок справа доступными будут кнопки "Константа" и "Комментарий".

Комментировать пока нечего, а вот константу мы знаем, это код вида документа "WI", поэтому выбираем кнопку "Константа" и в появившемся окне или выбираем, или вводим код WI, после чего жмем ОК, и в результате должны получить нечто похожее на рисунке 22: OBBH-13.png. Аналогично добавим ограничения на два других поля.

Между этими полями в качестве условия соединения используется операция AND, т.е. когда совпадут все три условия, то фильтр зафиксирует, что предпосылка сработала и вызовет нашу программу замещения. Общий результат должен быть как на рисунке 23: OBBH-14.png. Обратите внимание, что если вы все правильно сделали, то статус должен быть в виде зеленого светофора.

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

Примечание. Кнопка информации, рядом со статусом, выдает краткую справку по вводу формул для написания предпосылок.


Замещения.

Замещения – это то, что произойдет в результате срабатывания фильтра:  если предпосылка будет выполнена, система перейдет к ветке замещения и значит, или выполнит нашу программу, или выдаст сообщение и т.д. Так как мы выбрали, что замещением будет программа пользователя, то экран будет представлен как на рисунке 24: OBBH-15.png. Вся работа с этим экраном, состоит в том, чтобы задать имя нашей подпрограммы замещения. Так как подпрограмма нами уже создана, то нажав в поле "ПользПрограмма" кнопку допустимых значений F4, в появившемся окне находим свой код U777 или вводим его руками. После чего сохраняем работу.

Необходимо удовлетворить запрос для переноса, который нужно будет или создать в этом момент, или выбрать из созданных ранее. Затем возвращаемся из экрана конструктора в таблицу БЕ, рисунок 25: OBBH-16.png (или по F3 несколько раз или Shift+F3), и активируем замещение путем задания статуса = 1, в поле "СтепАктивир". В принципе, там может быть еще значение 2 - активировано без пакетного ввода, т.е. при выполнении пакетных вводов наша предпосылка никогда не будет выполняться. Иногда это - источник ошибок, когда в диалоге у пользователя все работает, а при пакетном вводе замещение не срабатывает.

Теперь уже окончательно все сохраняем. Замещение работает и вызывается. Для проверки этого можно провести документ инвентаризации и какой-то простой отпуск или перемещение материала. Мы попадем в точку останова, только при проводке инвентаризационных разниц (можете это проверить у себя в системе).

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

Примечание: Так как на шаге 4, мы выбрали конкретное поле, рисунок 10: OBBH-5.PNG, то нам нужно модифицировать подпрограмму U777, путем добавления параметра P_SGTXT, т.е. теперь подпрограмма должна выглядеть так:
Код: You are not allowed to view links. Register or Login
*{   INSERT         &$&$&$&$                                          1
*---------------------------------------------------------------------*
*       FORM U777                                                     *
*---------------------------------------------------------------------*
*       Моя прогрмма замещения                                        *
*---------------------------------------------------------------------*
FORM U777 USING p_sgtxt.

ENDFORM.
*
*}   INSERT
Если этого не сделать, то в момент проводки инвентаризационных разниц, будет получен дамп, типа не соответствия количества вызываемых параметров. Ну и соответственно надо сказать, что мы замещаем и каким значением. Кстати, если бы мы не указали значение BSEG-SGTXT, тогда параметр указывать было бы не нужно, ну а значение присваивать напрямую в структуру BSEG-SGTXT, которая доступна как глобальная для подпрограммы U777.

Список всех доступных структур для подпрограммы U777 во время работы можно посмотреть в заголовке текста программы ZGGBS000, например, у меня, -  это следующие структуры:
Код: You are not allowed to view links. Register or Login
TABLES: CSKS,
        GLU1,
        BKPF,
        BSEG,
        ACCIT,
        ACCHD,
*{   INSERT         IDTK911943                                        1
        fila_valsup,
        zzprctr,
        COBL,
        PRPS.                                          "for form U901
*       zzper.
TYPE-POOLS: GB002.
Итак, переходим к самому написанию подпрограммы U777. В настоящий момент программа выглядит как:
Код: You are not allowed to view links. Register or Login
FORM U777 using p_SGTXT.
    break-point.
ENDFORM.
Наша задача теперь присвоить строке комментария позиции документа FI номер документа инвентаризации. В общем виде данная задача решается через доступы к переменным документа инвентаризации, используя технику работы с FIELD-SYMBOLS.

Список доступных структур в подпрограмме U777 приведен выше и видно, что в этом списке отсутствует вообще какое-либо упоминание о документах инвентаризации, однако можно попробовать «добыть» эти данные. Я предлагаю делать это так:
Код: You are not allowed to view links. Register or Login
FORM u777 USING p_sgtxt.
  DATA: ls_ikpf LIKE ikpf.
  FIELD-SYMBOLS: <fs_ikpf> TYPE ANY.

  BREAK-POINT. 

  ASSIGN ('(SAPMM07I)IKPF') TO <fs_ikpf>.
  CHECK sy-subrc = 0.
  ls_ikpf = <fs_ikpf>.
  p_sgtxt = ls_ikpf-iblnr.

  UNASSIGN <fs_ikpf>.
ENDFORM.                                                    "U777
Так как все работает по цепочке: Документ инвентаризации – Документ материала – Документа FI, то пока транзакция не будет завершена, все данные программ отвечающих за документ материала, документ инвентаризации, с большой вероятностью находятся в памяти, а это значит, что к ним можно попробовать получить доступ. Возможно, кто-то назовет это дыркой в изоляции данных, но я назову это большим благом для разработчика.

Имя главной программы инвентаризации можно получить, просмотрев имя программы к транзакции MI07. Для этого заходим в транзакцию SE93 и там вводим код MI07 и кнопку «Просмотреть», рисунок 26: SE93.png, как видим имя программы SAPMM07I.

Теперь, надо узнать, какие структуры нам нужны, т.е. найти глобальные переменные этой программы, в которых находится номер документа инвентаризации. Я нашел имя структуры через отладчик,  это заняло пару минут. Отладка транзакции MI07 с экрана 701. Однако часто имена глобальных структур совпадают с именами таблиц, где хранятся документы порождаемые транзакцией. Таблица заголовка документа инвентаризации это - IKPF, так что другой метод это - поискать имя этой таблицы по тексту программы. Иногда может оказаться, что таблица будет, например MSEG,, а структура будет называться XMSEG. В общем, «есть варианты».

Дальше делаем проводку документа инвентаризационных разниц и попадаем в отладку. Переходим в отладчике к полю ввода просмотра значений переменных и там вводим в скобках имя программы и далее имя структуры, пример на рисунке 27: ABAP.png. Кстати, если мы неправильно нашли структуру, то будет выведено сообщение об ошибке, если же структура доступна, то система покажет значения, находящие в этой структуре. В данном случае это то, что нам надо, а дальше, используя технику работы с ссылками получаем ссылку на эту структуру. Проверяем, удалось ли это сделать. Если удалось, присваиваем ссылку внутренней переменной того же типа, что и структура, и дальше присваиваем в p_sgtxt номер документа инвентаризации. Задача решена, в позиции текста документа FI будет находится номер документа инвентаризации.

Пример на рисунке 28: 4900000000.png - ниже. При таком коде, все позиции будут содержать номер документа инвентаризации. Возможно, мы захотим, чтобы этот номер содержала только позиция документа с уровня счета доход от инвентаризации, тогда все просто, надо проверить, не счет главной книги, а вид операции к позиции. Для счета запаса это будет BSX, а для счета дохода GBB, т.е. можно было бы вставить первой строкой процедуры, что-то типа: CHECK BSEG-KTOSL = ‘GBB’, и тогда номер документа инвентаризации был бы только во второй строке проводки.  Можно добавить проверку условия в предпосылки, тогда в самой программе ничего проверять уже не нужно.

В справке по "Проверки, замещения и правила", расписаны операции сравнения и т.д. что большой плюс, на русском... хотя некоторые переводы заставили при чтении задуматься над тем, что имеется в виду. См. ссылку:  You are not allowed to view links. Register or Login

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
5 - А3_Замещения
« Ответ #2 : Апрель 22, 2016, 12:36:00 am »
Как обычно кто дочитал до конца, того ждет бонус клуба  8) все в одном файле...

Sapforum.Biz

5 - А3_Замещения
« Ответ #2 : Апрель 22, 2016, 12:36:00 am »