Loading



+ Sapforum.Biz » Инструменты » ABAP - Инструментальные средства » SMOD/CMOD - Расширения (Модератор: Dmitriy)Тема:
|- Badi MB_MIGO_BADI



Автор Тема: Badi MB_MIGO_BADI  (Прочитано 3759 раз)

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

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Badi MB_MIGO_BADI
« : Ноябрь 14, 2008, 12:56:59 pm »
В общем сдела метод LINE_MODIFY и в нем соответсвенно изменяю значение одного из полей. При этом получаю ошибку типа:
BAdI: поле GOITEM-UMLGO не готово для ввода (изменение не копируется)
№ сообщения MIGO050
В общем где можно ей/ему сказаь, что поле таки готово к вводу? По коду (LMIGOKL3):

         IF <f1> <> <f2>.
           l_fieldname = <comp>-name.
           CONCATENATE 'GOITEM-' <comp>-name INTO l_fieldname.
           CALL METHOD lcl_migo_screenmodification=>get
             EXPORTING
               i_field          = l_fieldname
               i_global_counter = cs_goitem-global_counter
               i_badi           = x
             RECEIVING
               r_status         = l_status.
           CASE l_status.
     *       Field is 'visible + input' (-> change in BAdI allowed)
             WHEN 6.
               <f1> = <f2>.
               l_change = x.
     *       Field is not used on any screen in MIGO
             WHEN 8.
     ENHANCEMENT-SECTION     lmigokl3_01 SPOTS es_saplmigo.
               MESSAGE w049 WITH l_fieldname.
     END-ENHANCEMENT-SECTION.
     *       Field was not 'on input' (l_status = 0 or 2)
             WHEN OTHERS.
     ENHANCEMENT-SECTION     lmigokl3_02 SPOTS es_saplmigo.
               MESSAGE w050 WITH l_fieldname.
     END-ENHANCEMENT-SECTION.
           ENDCASE.
         ENDIF.
Короче, у этого поля, как и у кучи других статус 2, а надо чтобы был 6. Из кода пока не вкурил где это устанавливается, точнее откуда тянутся эти значения... Из настройки для MIGO, этих полей тоже нет.

Оффлайн №1

  • Administrator
  • Jr. Member
  • *****
  • Сообщений: 511
  • Reputation Power: 1
  • №1 has no influence.
  • Пол: Мужской
  • Самая большая ложь - это неверно понятая правда.
Re: Badi MB_MIGO_BADI
« Ответ #1 : Ноябрь 14, 2008, 01:48:42 pm »
Есть ноты на эту тему:
Note 1020876 - BADI MB_MIGO_ITEM_BADI processed during display mode
Note 1029951 - BAdI MB_MIGO_BADI processed in display mode
Note 1136344 - MB_MIGO_BADI: Method LINE_MODIFY in display mode

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Badi MB_MIGO_BADI
« Ответ #2 : Ноябрь 14, 2008, 02:34:45 pm »
Есть ноты на эту тему:
Note 1020876 - BADI MB_MIGO_ITEM_BADI processed during display mode
Note 1029951 - BAdI MB_MIGO_BADI processed in display mode
Note 1136344 - MB_MIGO_BADI: Method LINE_MODIFY in display mode
Так там про программные ошибки... а к моему вопросу это отношения не имеет... у меня так сказать концептуально, если в программе статусы проверяют, то может сделали все таки что эти статусы где-то ведутся?
« Последнее редактирование: Ноябрь 14, 2008, 02:42:22 pm от Uukrul »

Оффлайн №1

  • Administrator
  • Jr. Member
  • *****
  • Сообщений: 511
  • Reputation Power: 1
  • №1 has no influence.
  • Пол: Мужской
  • Самая большая ложь - это неверно понятая правда.
Re: Badi MB_MIGO_BADI
« Ответ #3 : Ноябрь 14, 2008, 02:51:04 pm »
Так там про программные ошибки... а к моему вопросу это отношения не имеет... у меня так сказать концептуально, если в программе статусы проверяют, то может сделали все таки что эти статусы где-то ведутся?
Я к тому, что может в них подсмотреть: что/почём...

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Badi MB_MIGO_BADI
« Ответ #4 : Ноябрь 14, 2008, 02:53:08 pm »
Я к тому, что может в них подсмотреть: что/почём...
Да смотрел... ничего там нет, там типа ошибку правят при вызове бади, если документ находится в режиме просмотра... в отладчике пока завис. Там зараза динамическая генерация кода используется местами (типа кусок кода создан автоматически другим кодом при изменении чего-то, а вот чего?), короче ничего не ясно пока...

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Badi MB_MIGO_BADI
« Ответ #5 : Ноябрь 14, 2008, 03:11:25 pm »
Ну судя по всему менять можно только поля представленные в настройке... Все остальное тянет за собой получение ключика разработчика на объект, ну если хочется добавить свои поля... ::)

Оффлайн printfalex

  • Newbie
  • *
  • Сообщений: 1
  • Reputation Power: 0
  • printfalex has no influence.
Re: Badi MB_MIGO_BADI
« Ответ #6 : Июль 13, 2010, 05:12:08 pm »
Если кого-то ещё интересует данный вопрос..
Я решил эту проблему следующим образом:
  
    assign ('(SAPLMIGO)lcl_migo_screenmodification=>c_input') to <c_input>.
    assign ('(SAPLMIGO)lcl_migo_screenmodification=>t_fieldselection') to <fieldselection>.

  " Выбираем шаблон по i_line_id
    loop at <fieldselection> assigning <fs>.

      assign component 'GLC' of structure <fs> to <id>.
      if <id> = i_line_id.

      " Так как field-symbol не типизирован, для поиска строки по значению name извращаемся через цикл
        assign component 'TABLE' of structure <fs> to <table>.
        loop at <table> assigning <line>.

          assign component 'NAME' of structure <line> to <name>.

          if <name> = '<ИМЯ_ПОЛЯ>'.
            " Наконец-то добрались до нужного поля. Делаем его доступным для ввода.
            assign component 'WORK' of structure <line> to <work>.
            <work> = <c_input>.
            exit.
          endif.

        endloop.
        exit.
      endif.

    endloop.

 " Меняем значение в cs_goitem
    cs_goitem-<ИМЯ_ПОЛЯ> = <ЗНАЧЕНИЕ>.


Коряво, конечно, но работает..
« Последнее редактирование: Июль 13, 2010, 05:20:42 pm от printfalex »

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Badi MB_MIGO_BADI
« Ответ #7 : Август 06, 2010, 06:46:17 pm »
Коряво, конечно, но работает..
Ну почему же коряво.. это единственный метод как добраться до полей из других модулей, если знаешь что делаешь, то очень даже и работает все правильно, но само собой при патчах и апгрейде надо все проверять.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Небольшая инструкция как создавать расширения для MIGO.

Вопрос был в следующем, есть два завода на одно из них материал оцениваемый, на другом не оцениваемый, если делать проводку перемещения с завода где материал без стоимости, на завод где у него стоимость есть, то цена материала будет браться из ОЗМ ракурс БухУчет1 для оцениваемого завода. По условиям же стоимость должна была браться из плановой инфо-записи закупки. Вот для этого и используем BADI, в котором будем подменять цену движения. Из ограничений, цена по стандарту вводится в поле «Внешняя сумма во ВВ», которое было открыто для вида движения перемещения запаса, т.е. пользователь вводит документ а сумма должна быть заполнена правильным значением из инфо-записи, а ограничением является то, что если оценка ведется в нескольких валютах, то данная реализация будет работать не совсем корректно, так как поля для ввода второй валюты в документах ММ нет и вторая валюта будет формироваться из валюты один по курсу на дату проводки документа.

Используем транзакцию SE19 – Badi Builder, в нем у нас есть два вариант новый BADI Badi или классический, берем новый, так как даже если вы выберите классический, на следующем шаге придется пройти по пути миграции его в новый BADI. Причина в том, что все BADI с версии 6.0, кажется, сделаны уже через так называемые энхансменты (подробнее написано тут: http://sapforum.biz/index.php/topic,546.0.html), а поэтому, чем делать лишние шаги, лучше сразу идем по правильной новой дороге. Нас интересует BADI для MIGO, ищем его само собой по маске *MIGO*, будет найдена одна запись MB_MIGO_BADI, которая нас и интересует. Рисунок SE19-0.png.

Выбираем режим создания, после чего появится диалог, где надо будет сказать, какое будет название у нашего расширения и описание, рисунок SE19-1.png.  Я рекомендую оставлять в названии, если это возможно имя внедрения, например как в этом случае, потом проще будет искать, какие уже сделаны расширения к интересующей BADI.

Затем нажимаем ОК и переходим к следующему экрану где спросят имя реализации, имя класса реализации и к какому определению BADI все это будем создавать. В нашем случае у нас одно определение BADI, поэтому имя реализации оставляем такое же как и на предыдущем шаге, класс реализации, ну я назвал как на рисунке  SE19-2.png, а определение BADI получено из выпадающего списка, оно там одно.

После чего жмем снова ОК и переходим к следующему шагу, где нам будет предложено то, как создавать наше определение, вариантов три, унаследовать из примере класса, скопировать пример класса и просто создать чистый класс. Чтобы не тянуть весь пример я выбрал режим «Пустой класс». А примеры, ну это когда изучаешь, то можно копировать пример класса реализации, рисунок SE19-3.png.

После копирования/создания попадаем в саму реализацию нашего расширения, должно быть похожее что-то на рисунке ниже. Собственно говоря, практически реализация класса с методами, рисунок SE19-4.png. Открываем дерево слева и делаем клик мышью на ветке «Реализующий класс», после чего откроются все методы класса которые мы можем начать реализовывать и которые определены нам в классе, рисунок SE19-5.png.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Так как задача подставить правильную сумму в поле позиции документа материала, то нас интересуют метод LINE_MODIFY, выделено на рисунке, делаем по этому методу двойной клик мышью и система сообщит, что типа реализация не найдена и тут же по дружески предложит ее создать, рисунок SE19-6.png.

Соглашаемся на создание внедрения и попадаем в редактор где можем уже писать наш код, объявление будет такое:
method if_ex_mb_migo_badi~line_modify.
endmethod.
Но перед тем как что-то писать, не плохо бы узнать что нам передают на вход и что хотя узнать на выходе. Для этого идем на закладку Technical Details и там находим наш класс и делаем двойной клик мышью на имени класса, рисунок SE19-7.png. Попадаем в привычную реализацию классов, находим наш метод, ставим на него курсор и нажимаем кнопку «Параметры», рисунок SE19-8.png. Как видим два параметра номер строки и изменяемый параметр сама строка позиции документа, рисунок SE19-9.png.

Саму структуру можно посмотреть сделав клик мышью на поле ссылочного типа… полей там много, в общем типа все что есть в MSEG и еще даже больше. Нас интересует поле EXBWR – Сумма проводки внешний ввод. Вот его то мы и будем заполнять из инфо-записи, рисунок SE19-10.png.

В коде будет что-то такое как на рисунке ниже, однако по правильному конечно надо бы проверить заводы, вид движения и там уже определять нужно или нет выполнять замещение поля суммы. Как минимум поставьте там точку останова и посмотрите что передается в структурах, рисунок SE19-11.png.

После ввода кода надо еще бы все это активировать. Количество объектов само собой будет большим, поэтому выбираем выделить все после чего жмем кнопку активации. Если ошибок нет, а я рекомендую, прежде чем что-то писать в коде, сделать общую активацию, то наше расширение будет рабочим и система начнет туда каждый раз заходить как только что-то будет изменяться в позиции документа при вводе через транзакцию MIGO, рисунок SE19-12.png.

PS: Собственно говоря все, и это о хорошем, а еще немного о плохом. Как видим, полей передается много, но вот изменять значения в них можно не во всех, если поле изменять нельзя, то будет выдаваться сообщение, что-то типа изменение поля запрещено, и ваши правки будут сбрасываться после выхода из метода. Какое есть решение этой проблемы, ну можно воспользоваться решением от такого человека как printfalex (http://sapforum.biz/index.php?action=profile;u=358), на форуме он показал как можно сбросить флаги запрета модификации полей для расширения: http://sapforum.biz/index.php/topic,375.msg7311.html#msg7311.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Ну и как обычно предыдущих два поста в виде одного файла Badi MB_MIGO_BADI MIGO.pdf

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Badi MB_MIGO_BADI
« Ответ #11 : Октябрь 03, 2010, 09:07:05 pm »
Кстати, если нужно в методе LINE_MODIFY получить данные из заголовка документа, кстати какого индусы не передают этих данных в этот метод, можно воспользоваться таким кодом:
* Данные
  DATA: ls_gohead TYPE gohead.
  FIELD-SYMBOLS: <fs_gohead> TYPE ANY.

* Код
  ASSIGN ('(SAPLMIGO)GOHEAD') TO <fs_gohead>.

  ls_gohead = <fs_gohead>.

  UNASSIGN <fs_gohead>.
В переменной ls_gohead, будут данные заголовка документа.

Оффлайн SCORPION_Z

  • Newbie
  • *
  • Сообщений: 12
  • Reputation Power: 0
  • SCORPION_Z has no influence.
Re: Badi MB_MIGO_BADI
« Ответ #12 : Февраль 21, 2011, 11:59:54 am »
Если кого-то ещё интересует данный вопрос..
Я решил эту проблему следующим образом:
  
    assign ('(SAPLMIGO)lcl_migo_screenmodification=>c_input') to <c_input>.
    assign ('(SAPLMIGO)lcl_migo_screenmodification=>t_fieldselection') to <fieldselection>.

  " Выбираем шаблон по i_line_id
    loop at <fieldselection> assigning <fs>.

      assign component 'GLC' of structure <fs> to <id>.
      if <id> = i_line_id.

      " Так как field-symbol не типизирован, для поиска строки по значению name извращаемся через цикл
        assign component 'TABLE' of structure <fs> to <table>.
        loop at <table> assigning <line>.

          assign component 'NAME' of structure <line> to <name>.

          if <name> = '<ИМЯ_ПОЛЯ>'.
            " Наконец-то добрались до нужного поля. Делаем его доступным для ввода.
            assign component 'WORK' of structure <line> to <work>.
            <work> = <c_input>.
            exit.
          endif.

        endloop.
        exit.
      endif.

    endloop.

 " Меняем значение в cs_goitem
    cs_goitem-<ИМЯ_ПОЛЯ> = <ЗНАЧЕНИЕ>.


Коряво, конечно, но работает..

А у меня дамп в том месте, где  <work> = <c_input>.
... из-за того, что в защищенное поле пытаюсь писать данные

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Badi MB_MIGO_BADI
« Ответ #13 : Февраль 21, 2011, 01:03:34 pm »
А у меня дамп в том месте, где  <work> = <c_input>.
... из-за того, что в защищенное поле пытаюсь писать данные
Ну похоже SAP прикрыл эту дырку в изоляции с какого-то обновления, кстати параметры системы и пакеты не подскажете какие у вас стоят?

Оффлайн SCORPION_Z

  • Newbie
  • *
  • Сообщений: 12
  • Reputation Power: 0
  • SCORPION_Z has no influence.
Re: Badi MB_MIGO_BADI
« Ответ #14 : Февраль 21, 2011, 01:35:21 pm »
SAP ECC 6.0 , но возможно и дело в поле, которое я обрабатываю .
Это 'GOITEM-EXBWR'  для 101 вдв, которое при 101 всегда блокируется/скрывается.
Уважаемый, Uukrul, можешь выслать в личку кусок кода, где описаны объявления
FIELD-SYMBOLS процедурки "открытия" доступа для поля.
Дело в том, что мы циклим loop at <fieldselection> assigning <fs>. ..., а
в локальном классе lcl_migo_screenmodification для неё такое объявление
  CLASS-DATA:
*   Main fieldselection table with global counter. Public to be
*   visibe in the debugger every time.
    t_fieldselection TYPE ty_t_fst READ-ONLY
И у меня большие сомнения, что можно делать в ней изменения. Или я что-то путаю?!

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.151
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Badi MB_MIGO_BADI
« Ответ #15 : Февраль 21, 2011, 04:30:10 pm »
Это 'GOITEM-EXBWR'  для 101 вдв, которое при 101 всегда блокируется/скрывается.
Вечером гляну... что с этим полем не так...

Оффлайн Паганель

  • blogger
  • Full Member
  • *
  • Сообщений: 1.319
  • Reputation Power: 0
  • Паганель has no influence.
  • Пол: Мужской
Re: Badi MB_MIGO_BADI
« Ответ #16 : Февраль 21, 2011, 11:04:53 pm »
И у меня большие сомнения, что можно делать в ней изменения. Или я что-то путаю?!
Ссори, что встряю в Вашу дискуссию, но эксперименты с полем о котором Вы говорите, чреваты... помнится, Уукрул сильно уж ругалcя.. да и по опыту чревато, в 101 еще не сталкивался, а 301 – да, в копиях 261  и 101

Оффлайн SCORPION_Z

  • Newbie
  • *
  • Сообщений: 12
  • Reputation Power: 0
  • SCORPION_Z has no influence.
Re: Badi MB_MIGO_BADI
« Ответ #17 : Февраль 21, 2011, 11:23:54 pm »
Ссори, что встряю в Вашу дискуссию, но эксперименты с полем о котором Вы говорите, чреваты... помнится, Уукрул сильно уж ругалcя.. да и по опыту чревато, в 101 еще не сталкивался, а 301 – да, в копиях 261  и 101

Я многократно обращал на это внимание "постановщика задачи". Сошлись на том, что необходимо завести поле подобное тому, о котором мы говорим (чтоб и на 200м и на 305м экране). Поле денежное, в которое юзер вносит "Цену". Потом нужно сделать проверку этой цены с той , что в заказе (EKPO-NETPR). Если она будет больше "заказной", то блокируем такой ввод.
Полагаю, что для "своего" поля тоже будет такой же месседже
BAdI: поле GOITEM-ZZXXXX не готово для ввода (изменение не копируется)
№ сообщения MIGO050

Как лучше это сделать? Как впихнуть своё поле? Достаточно ли сделать проверку условия в if_ex_mb_migo_badi~check_item ?


 


Facebook Comments