Badi MB_MIGO_BADI

Автор Uukrul, Листопад 14, 2008, 12:56:59 ПП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

Uukrul

Цитата: alexey11 від Липень 10, 2012, 06:07:47 ПП
Поэтому в заказ записываем тип оценки = "*", а уже в документе прихода с помощью расширения после создания партии меняем звезду на конкретное значение (равное партии).
Так ясно, а что предложенный вариант: http://sapforum.biz/index.php/topic,375.msg10866.html#msg10866 тоже не работает?

alexey11

Цитата: Sed0Y від Липень 09, 2012, 05:21:08 ПП
Именно код "<work> = <c_input>." не работает - тоже валиться в дамп.

А если сделать ASSIGN <c_input> TO  <work>. - то все ок


Дамп в этом месте не вылазит. Значение поля типОценки в расширении меняется,
но на экране всеравно вылазит то же сообщение MIGO050 что поле не готово для ввода.
Т.е взлом не работает.


Информация по версии сапа

Uukrul

Цитата: alexey11 від Липень 11, 2012, 10:50:14 ДП
но на экране всеравно вылазит то же сообщение MIGO050 что поле не готово для ввода.
Т.е взлом не работает.
Из этого делаем вывод, что операции доступа к атрибутам объектов через FIELD-SYMBOLS работают, что не может не радовать. Далее значит место замен вида оценки выбрано не правильно и надо искать другие точки включения.

alexey11

при более детальном дебаге обнаружено что в нашем lineModify код ASSIGN <c_input> TO  <work> вообще ничего не меняет в <fieldselection>.  :-\

т.е. для GOITEM-BWTAR как было work = 2 так и осталось хотя должно было стать 6(<C_INPUT> = 6).

После выхода из IF_EX_MB_MIGO_BADI~LINE_MODIFY в индуском коде  идет как раз таки проверка на эту шестерку и только тогда изменения принимаются сапом. А оно натыкается на 2.  :(



*Note 1079123 ->Method item_modify to be used for country INDIA


* Call BAdI
  ls_goitem_badi = cs_goitem.
  CALL METHOD lcl_migo_globals=>if_badi->line_modify
    EXPORTING
      i_line_id = ls_goitem_badi-global_counter
    CHANGING
      cs_goitem = ls_goitem_badi.

* Are there any changes?
* - If NO:  Leave this method.
* - If YES: Check fieldselection, whether field is 'visible + input'.
  CHECK cs_goitem <> ls_goitem_badi.

  descr_ref ?= cl_abap_typedescr=>describe_by_data( ls_goitem_badi ).
  LOOP AT descr_ref->components ASSIGNING <comp>.
*   Following fields are checked in method line_badi_special_fields
    CHECK NOT <comp>-name = 'LGORT'.
    CHECK NOT <comp>-name = 'LGOBE'.
    CHECK NOT <comp>-name = 'WERKS'.
    CHECK NOT <comp>-name = 'NAME1'.
    CHECK NOT <comp>-name = 'MATNR'.
    CHECK NOT <comp>-name = 'MAKTX'.
    CHECK NOT <comp>-name = 'LIFNR'.
    CHECK NOT <comp>-name = 'VENDORNAME'.
    CHECK NOT <comp>-name = 'KUNNR'.
    CHECK NOT <comp>-name = 'CUSTNAME'.
    CONCATENATE 'CS_GOITEM-'      <comp>-name INTO l_name1.
    CONCATENATE 'LS_GOITEM_BADI-' <comp>-name INTO l_name2.
    ASSIGN (l_name1) TO <f1>.
    ASSIGN (l_name2) TO <f2>.
    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.
  ENDLOOP.



PS. можно конечно сделать дикий enchncement после отработки METHOD lcl_migo_screenmodification=>get  ;D

Uukrul

Цитата: printfalex від Липень 13, 2010, 05:12:08 ПП
Если кого-то ещё интересует данный вопрос..
В общем исходя из написанного ранее printfalex решения, реализовал аналогичную штуку через метод класса, для удобства использования, так сказать. Можно возвращать структуру параметров, чтобы возвращать сразу все статусы. Ну это уже как кому будет проще.


CLASS zcl_migo_check DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    CONSTANTS cn_invisible TYPE migo_fs_status VALUE 0 ##NO_TEXT.
    CONSTANTS cn_visible TYPE migo_fs_status VALUE 2 ##NO_TEXT.
    CONSTANTS cn_input TYPE migo_fs_status VALUE 6 ##NO_TEXT.
    CONSTANTS cn_not_valid TYPE migo_fs_status VALUE 8 ##NO_TEXT.

    CLASS-METHODS class_constructor .
    CLASS-METHODS check_mode
      IMPORTING
        !iv_line_id    TYPE mb_line_id
        !iv_name       TYPE migo_fieldname
      RETURNING
        VALUE(rv_mode) TYPE migo_fs_status .
  PROTECTED SECTION.
  PRIVATE SECTION.

ENDCLASS.

CLASS zcl_migo_check IMPLEMENTATION.

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_MIGO_CHECK=>CHECK_MODE
* +-------------------------------------------------------------------------------------------------+
* | [--->] IV_LINE_ID                     TYPE        MB_LINE_ID
* | [--->] IV_NAME                        TYPE        MIGO_FIELDNAME
* | [<-()] RV_MODE                        TYPE        MIGO_FS_STATUS
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD check_mode.
    FIELD-SYMBOLS: <fs_fieldselection_t> TYPE ANY TABLE,
                   <fs_fieldselection_s> TYPE any,
                   <fs_line_id>          TYPE mb_line_id,
                   <fs_table_t>          TYPE ANY TABLE,
                   <fs_table_s>          TYPE any,
                   <fs_name>             TYPE migo_fieldname,
                   <fs_mode>             TYPE migo_fs_status.

    ASSIGN ('(SAPLMIGO)lcl_migo_screenmodification=>t_fieldselection') TO <fs_fieldselection_t>.
    LOOP AT <fs_fieldselection_t> ASSIGNING <fs_fieldselection_s>.
      ASSIGN COMPONENT 'GLC' OF STRUCTURE <fs_fieldselection_s> TO <fs_line_id>.
      IF <fs_line_id> = iv_line_id.
        ASSIGN COMPONENT 'TABLE' OF STRUCTURE <fs_fieldselection_s> TO <fs_table_t>.
        LOOP AT <fs_table_t> ASSIGNING <fs_table_s>.
          ASSIGN COMPONENT 'NAME' OF STRUCTURE <fs_table_s> TO <fs_name>.
          IF <fs_name> = iv_name.
            ASSIGN COMPONENT 'MODE' OF STRUCTURE <fs_table_s> TO <fs_mode>.
            rv_mode = <fs_mode>.
            EXIT.
          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.

* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD class_constructor.
  ENDMETHOD.


Вызываем для проверки очень просто:

  IF zcl_migo_check=>check_mode( iv_line_id = i_line_id iv_name = 'GOITEN-LSMEH' ) = zcl_migo_check=>cn_visible.
*   Поле видимое на экране MIGO
  ENDIF.

SMF spam blocked by CleanTalk