MIGO 行项目屏幕增强创建实例

 本人诚心接ABAP远程开发任务,价格公道,有需要的联系我,欢迎个人,甲方爸爸,乙方私信联系。

1.首先创建一张自建表用于存放客制化信息

2.建立结构,在屏幕数据交换时使用

3.建立表类型

4.给之前创建的表类型设置主键

5.创建函数组和屏幕

从客制化屏幕读取录入的值

FUNCTION migo_badi_example_get_data.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  EXPORTING
*"     REFERENCE(ES_MIGO_BADI_SCREEN_FIELDS) TYPE
*"        MIGO_BADI_EXAMPLE_SCREEN_FIELD
*"----------------------------------------------------------------------

* Get all data from fields of external screen
* First move all customer-fields
  MOVE-CORRESPONDING migo_badi_exampl TO es_migo_badi_screen_fields.
* Second move all GOITEM-fields (displayed on external screen)
  es_migo_badi_screen_fields-sgtxt = goitem-sgtxt.

ENDFUNCTION.
FUNCTION migo_badi_example_put_data .
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(IS_MIGO_BADI_SCREEN_FIELDS) TYPE
*"        MIGO_BADI_EXAMPLE_SCREEN_FIELD
*"----------------------------------------------------------------------

* Put all data from fields to external screen
* First fill all customer-fields
  MOVE-CORRESPONDING is_migo_badi_screen_fields TO migo_badi_exampl.
* second fill all GOITEM-fields (displayed on external screen)
  goitem-sgtxt = is_migo_badi_screen_fields-sgtxt.

ENDFUNCTION.
FUNCTION MIGO_BADI_EXAMPLE_UPATE_DATA.
*"----------------------------------------------------------------------
*"*"Verbuchungsfunktionsbaustein:
*"
*"*"Lokale Schnittstelle:
*"  TABLES
*"      IT_MIGO_BADI_EXAMPLE STRUCTURE  MIGO_BADI_EXAMPL
*"----------------------------------------------------------------------

* Databse update:
  INSERT MIGO_BADI_EXAMPL FROM TABLE IT_MIGO_BADI_EXAMPLE.
  IF sy-subrc <> 0.
    MESSAGE a398(00) WITH 'Error update MIGO_BADI_EXAMPL'.
  ENDIF.

ENDFUNCTION.

创建屏幕的时候注意设置成子屏幕

函数组top中的声明

FUNCTION-POOL migo_badi_example.            "MESSAGE-ID ..

TABLES: migo_badi_exampl,
        migo_badi_examp2,
        goitem.

TYPES:
  BEGIN OF ty_s_exdata_header,
    line_id       TYPE mb_line_id,
    mandt         TYPE mandt,
    mblnr         TYPE mblnr,
    mjahr         TYPE mjahr,
    badi_nummer   TYPE num10,
  END OF ty_s_exdata_header.

6.SE19创建实现

7.激活以下方法并添加代码

  method IF_EX_MB_MIGO_BADI~INIT.
    APPEND gf_class_id TO ct_init.
  endmethod.

pbo_detail这个方法中的0001屏幕是可以编辑的

                                      0002屏幕是不可以编辑

如果不想画两个屏幕就将if g_no_input is initial.这个判断删除

并将g_no_input 作为参数传入 函数,然后在画的屏幕的PBO里面根据 参数loop屏幕设置是否可以输入

METHOD if_ex_mb_migo_badi~pbo_detail.
  DATA: ls_extdata TYPE migo_badi_example_screen_field.
* This check is obligatory, otherwise the program flow is incorrect
* (If there would be more than one implementation of BAdI MB_MIGO_BADI,
*  only one subscreen would be displayed).
  CHECK i_class_id = gf_class_id.
* Show screen only if there is an item
  CHECK i_line_id <> 0.
* External subscreen:
* The content of global field G_NO_INPUT (set in method MODE_SET) will
* influence the number of external subsreen:
  if g_no_input is initial.
    e_cprog   = 'SAPLMIGO_BADI_EXAMPLE'.
    e_dynnr   = '0001'.                     "External fields: Input
    e_heading = 'MIGO BAdI Example'(004).
  else.
    e_cprog   = 'SAPLMIGO_BADI_EXAMPLE'.
    e_dynnr   = '0002'.                     "External fields: Display
    e_heading = 'MIGO BAdI EXAMPLE'(004).
  endif.
* Set G_LINE_ID (= line_id of item displayed on detail-tabstrip)
  g_line_id = i_line_id.
* Read data
  READ TABLE gt_extdata INTO ls_extdata
     WITH TABLE KEY line_id = i_line_id.
* Export data to function group (for display on subscreen)
  CALL FUNCTION 'MIGO_BADI_EXAMPLE_PUT_DATA'
    EXPORTING
      is_migo_badi_screen_fields = ls_extdata.

ENDMETHOD.                    "IF_EX_MB_MIGO_BADI~PBO_DETAIL
METHOD if_ex_mb_migo_badi~pai_detail.
*-----------------------------------------------------------------------
* Changing parameter E_FORCE_CHANGE can be set to 'X'. In this case
* method LINE_MODIFY is called.
* ATTENTION:
* DO NOT SET parameter E_FORCE_CHANGE = ' '. In this case you might
* overwrite parameter E_FORCE_CHANGE of another BAdI implementation.
*-----------------------------------------------------------------------
  DATA: ls_extdata_new TYPE migo_badi_example_screen_field,
        ls_extdata_old TYPE migo_badi_example_screen_field.

* Only if a line exists
  CHECK i_line_id <> 0.
* Get data from external screen
  CALL FUNCTION 'MIGO_BADI_EXAMPLE_GET_DATA'
    IMPORTING
      es_migo_badi_screen_fields = ls_extdata_new.
* Compare new data with old data
  READ TABLE gt_extdata INTO ls_extdata_old
     WITH TABLE KEY line_id = i_line_id.
  ls_extdata_new-line_id = i_line_id.
  IF ls_extdata_old <> ls_extdata_new.
*   If there were any changes, it's obligatory to force MIGO to trigger
*   method LINE_MODIFY.
    e_force_change = 'X'.
  ENDIF.

ENDMETHOD.                    "IF_EX_MB_MIGO_BADI~PAI_DETAIL
METHOD if_ex_mb_migo_badi~line_modify.
  DATA: ls_extdata_old      TYPE migo_badi_example_screen_field,
        ls_extdata_new      TYPE migo_badi_example_screen_field,
        ls_migo_badi_exampl TYPE migo_badi_exampl,
        l_subrc             TYPE sy-subrc.

* Get external data from internal table:
  READ TABLE gt_extdata INTO ls_extdata_old
    WITH TABLE KEY line_id = i_line_id.
  l_subrc = sy-subrc.

* Update data in internal table:
  IF l_subrc <> 0.
*   Line is new: If GOITEM has a reference to a material document,
*                the already existing external data can be read.
   IF NOT cs_goitem-mblnr IS INITIAL AND NOT cs_goitem-mjahr IS INITIAL
      AND NOT cs_goitem-zeile IS INITIAL.
      SELECT SINGLE * FROM migo_badi_exampl INTO ls_migo_badi_exampl
             WHERE mblnr = cs_goitem-mblnr
               AND mjahr = cs_goitem-mjahr
               AND zeile = cs_goitem-zeile.
      IF sy-subrc = 0.
        MOVE-CORRESPONDING ls_migo_badi_exampl TO ls_extdata_new.
      ENDIF.
    ENDIF.
    ls_extdata_new-sgtxt  = cs_goitem-sgtxt.
    ls_extdata_new-line_id = i_line_id.
    INSERT ls_extdata_new INTO TABLE gt_extdata.
  ELSE.
*   Line exists: Get external data entered on BAdI-subscreeen, but only
*                if line_modify was called for the item displayed in the
*                'detail tabstrip'.
    check g_line_id = i_line_id.
    CALL FUNCTION 'MIGO_BADI_EXAMPLE_GET_DATA'
      IMPORTING
        es_migo_badi_screen_fields = ls_extdata_new.
    ls_extdata_new-line_id = i_line_id.
    if ls_extdata_new-sgtxt <> ls_extdata_old-sgtxt.
*     Field was changed on external screen
      cs_goitem-sgtxt = ls_extdata_new-sgtxt.
    else.
*     Take data from GOITEM
      ls_extdata_new-sgtxt = cs_goitem-sgtxt.
    endif.
    MODIFY TABLE gt_extdata FROM ls_extdata_new.
  ENDIF.

ENDMETHOD.                    "IF_EX_MB_MIGO_BADI~LINE_MODIFY
METHOD if_ex_mb_migo_badi~line_delete.
  DELETE TABLE gt_extdata WITH TABLE KEY line_id = i_line_id.
ENDMETHOD.         
METHOD if_ex_mb_migo_badi~reset.
* Clear all internal data:
  CLEAR: gt_extdata,
         g_no_input,
         gs_exdata_header,
         g_cancel,
         g_line_id.

ENDMETHOD.                    "IF_EX_MB_MIGO_BADI~RESET

post_document这个方法中

   CALL FUNCTION 'MIGO_BADI_EXAMPLE_UPATE_DATA' IN UPDATE TASK

update task 这个关键字 是无法debug的,这个是将这个函数模块放入待执行队列

直到commit work语句时候一起提交执行

如果想debug 就将此关键字注释

METHOD if_ex_mb_migo_badi~post_document.
  DATA: ls_migo_badi_example TYPE migo_badi_exampl,
        lt_migo_badi_example TYPE TABLE OF migo_badi_exampl,
        ls_extdata           TYPE migo_badi_example_screen_field,
        ls_xmseg             TYPE mseg.
  FIELD-SYMBOLS: <gt_extdata> TYPE migo_badi_example_screen_field.
* Transaction MIGO will now post a material document.
* Any errors here MUST be issued as A-message (better: X-message)

  IF gt_extdata_maa IS NOT INITIAL.                    "Begin of 1987428
*   Table gt_extdata_maa is setup in method MAA_LINE_ID_ADJUST.
*   Copy data from material document into internal table
    LOOP AT gt_extdata_maa INTO ls_extdata.
      IF g_cancel IS INITIAL.
        READ TABLE it_mseg INTO ls_xmseg
           WITH KEY line_id = ls_extdata-line_id.
      ELSE.
        READ TABLE it_mseg INTO ls_xmseg
           WITH KEY smbln = ls_extdata-mblnr
                    smblp = ls_extdata-zeile
                    sjahr = ls_extdata-mjahr.
      ENDIF.
      IF sy-subrc IS INITIAL.
        MOVE-CORRESPONDING ls_extdata TO ls_migo_badi_example.
        MOVE-CORRESPONDING ls_xmseg   TO ls_migo_badi_example.
        IF ls_xmseg-maa_urzei IS NOT INITIAL.
          ls_migo_badi_example-zeile = ls_xmseg-maa_urzei.
        ENDIF.
        APPEND ls_migo_badi_example TO lt_migo_badi_example.
      ENDIF.
    ENDLOOP.                                             "End of 1987428
  ELSE.                                                         "1987428
*   Copy data from material document into internal table
    LOOP AT gt_extdata INTO ls_extdata.
      IF g_cancel IS INITIAL.
        READ TABLE it_mseg INTO ls_xmseg
           WITH KEY line_id = ls_extdata-line_id.
      ELSE.
        READ TABLE it_mseg INTO ls_xmseg
           WITH KEY smbln = ls_extdata-mblnr
                    smblp = ls_extdata-zeile
                    sjahr = ls_extdata-mjahr.
      ENDIF.
      IF sy-subrc IS INITIAL.
        MOVE-CORRESPONDING ls_extdata TO ls_migo_badi_example.
        MOVE-CORRESPONDING ls_xmseg   TO ls_migo_badi_example.
        APPEND ls_migo_badi_example TO lt_migo_badi_example.
      ENDIF.
    ENDLOOP.
  ENDIF.                                                        "1987428

* The data from external detail screen can be saved now:
  CHECK gt_extdata IS NOT INITIAL.
  CALL FUNCTION 'MIGO_BADI_EXAMPLE_UPATE_DATA' IN UPDATE TASK
    TABLES
      it_migo_badi_example = lt_migo_badi_example.
* The data from external header screen can be saved now:
  MOVE-CORRESPONDING is_mkpf TO gs_exdata_header.
  CALL FUNCTION 'MIGO_BADI_EXAMPLE_UPDATE_HEAD' IN UPDATE TASK
    EXPORTING
      is_migo_badi_header_fields = gs_exdata_header.

ENDMETHOD.                    "IF_EX_MB_MIGO_BADI~POST_DOCUMENT
METHOD if_ex_mb_migo_badi~mode_set.
* ACTION and REFDOC will discribe the mode of transaction MIGO.
* ----------------------------------------------------------------------
* i_action:
* A01 = Goods receipt
* A02 = Return delivery
* A03 = Cancellation
* A04 = Display
* A05 = Release GR bl.st.
* A06 = Subsequent deliv.
* A07 = Goods issue
*
* i_refdoc:
* R01 = Purchase order
* R02 = Material document
* R03 = Delivery note
* R04 = Inbound delivery
* R05 = Outbound delivery
* R06 = Transport
* R07 = Transport ID code
* R08 = Order
* R09 = Reservation
* R10 = Other GR
*-----------------------------------------------------------------------

* In case of 'DISPLAY' the global field G_NO_INPUT will be set to 'X'.
* The result is that a different external subscreen will be choosen in
* method PBO_DETAIL.
  IF i_action = 'A04' OR i_action = 'A03'.
    g_no_input = 'X'.
  ENDIF.
* In case of 'CANCEL' the global field G_CANCEL will be set to 'X'.
* The result is that in method POST_DOCUMENT a different handling is
* used
  IF i_action = 'A03'.
    g_cancel = 'X'.
  ENDIF.

ENDMETHOD.                    "IF_EX_MB_MIGO_BADI~MODE_SET

激活所有,然后进MIGO就可以实现了

以上所有的代码均可以在SAP标准实例中查看,查看方法如下

SE18-->MB_MIGO_BADI-->显示

 

点击转到 --->显示---->示例代码

其中也有MIGO 表头屏幕增强

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值