修改计划协议计划行 BAPI_SCHEDULE_MAINTAIN

1.固定标识默认是X,需要通过增强写进去

2.删除delete_ind传L,EKET物理删除,如果lt_schedulex-sched_linex = 'X' 不传,删了之后BAPI可能会重新计算sched_line,传了之后按传输的值

3.extension的增强结构名可以通过BAPI_SAG_GETDETAIL先取出来,测试没写进去,update了,应该是漏了增强

4.如果已经收过货,修改其他计划行会报错 MEOUT 200 转包组件对 5500006237 00010 不再可更改,前台可以修改,直接隐式增强跳过报错

5.报错 61 781 确定物料部件时出错,可能是组件需求日期大于计划行日期

 

 

DEMO 1

at end of ebeln.

      read table gt_alv index lv_tabix.

扫描二维码关注公众号,回复: 12509688 查看本文章

 

 

*      call function 'BAPI_SAG_GETDETAIL'

*        exporting

*          purchasingdocument = gt_alv-ebeln

*          item_data          = 'X'

*          schedule_data      = 'X'

*        tables

*          item               = lt_item

*          schedule           = lt_schedule

**         extensionout       = extensionout

**         return             = lt_return

*        .

 

      call function 'BAPI_SCHEDULE_MAINTAIN'

        exporting

          purchasingdocument = gt_alv-ebeln

        tables

          schedule           = lt_schedule

          schedulex          = lt_schedulex

*         EXTENSIONIN        = EXTENSIONIN

*         EXTENSIONOUT       = EXTENSIONOUT

          return             = lt_return.

 

 

      loop at lt_return where type ca 'AEX'.

        message id lt_return-id type lt_return-type number lt_return-number

          with lt_return-message_v1 lt_return-message_v2

               lt_return-message_v3 lt_return-message_v4

               into  data(lv_msg).

        gt_alv-rtmsg = gt_alv-rtmsg && lv_msg && ';'.

      endloop.

      if sy-subrc = 0.

        call function 'BAPI_TRANSACTION_ROLLBACK'.

        gt_alv-led = 1.

*      lt_ekko-rtmsg = 1.

      else.

        call function 'BAPI_TRANSACTION_COMMIT'

          exporting

            wait = 'X'.

        gt_alv-led = 3.

        gt_alv-rtmsg = '成功'.

      endif.

 

      modify gt_alv transporting led rtmsg where ebeln = gt_alv-ebeln.

      clear:lt_item,lt_item[],lt_schedule,lt_schedule[],lt_return,lt_return[].

    endat.

 

DEMO 2

form frm_data_import .

*BAPI

  data :

    lt_return        type bapiret2 occurs 0 with header line.

  data lt_item                  type standard table of bapimeoutitem with header line.

  data lt_schedule              type standard table of bapimeoutschedule with header line.

  data lt_schedulex          type standard table of bapimeoutschedulex with header line.

 

  data:begin of lt_ekko occurs 0,

         ebeln like ekpo-ebeln,

*         ebelp like ekpo-ebelp,

         led,

         rtmsg type bapi_msg,

       end of lt_ekko.

  data:

        lv_eindt like eket-eindt.

  data: begin of ls_zmmr007,

          ebeln type eket-ebeln,

          ebelp type eket-ebelp,

          etenr type eket-etenr,

          fixkz type eket-fixkz,

        end of ls_zmmr007.

  data lt_zmmr007 like table of ls_zmmr007.

 

  loop at <gt_out> into <gs_out>.

    move-corresponding <gs_out> to lt_ekko.

    collect lt_ekko.

  endloop.

  select ebeln,ebelp,etenr,eindt,fixkz,glmng

    into table @data(lt_eket)

    from eket

    for all entries in @lt_ekko

    where ebeln = @lt_ekko-ebeln.

  sort lt_eket by ebeln ebelp etenr descending.

  data(lt_eket2) = lt_eket.

  sort lt_eket2 by ebeln ebelp etenr fixkz.

 

  loop at lt_ekko.

    clear:lt_item,lt_item[],lt_schedule,lt_schedule[],lt_return,lt_return[],ls_zmmr007,lt_zmmr007.

 

    call function 'BAPI_SAG_GETDETAIL'

      exporting

        purchasingdocument = lt_ekko-ebeln

        item_data          = 'X'

        schedule_data      = 'X'

      tables

        item               = lt_item

        schedule           = lt_schedule

*       extensionout       = extensionout

*       return             = lt_return

      .

    data(lt_schedule2) = lt_schedule[].

    sort lt_schedule2 by item_no sched_line descending.

    loop at lt_item.

      clear lv_eindt. "一个po行清一次,是为了后面一行删一次

      read table lt_schedule2 into data(ls_schedule2) with key item_no = lt_item-item_no.

      read table <gt_out> into <gs_out> with key ('EBELN') = lt_ekko-ebeln ('EBELP') = lt_item-item_no binary search.

      if sy-subrc = 0.

        loop at <gt_out> into <gs_out> from sy-tabix.

          assign component 'EBELN' of structure <gs_out> to field-symbol(<lv_ebeln>).

          assign component 'EBELP' of structure <gs_out> to field-symbol(<lv_ebelp>).

          if <lv_ebeln> ne lt_ekko-ebeln or <lv_ebelp> ne lt_item-item_no.

            exit.

          endif.

          loop at gt_fieldcat into data(ls_fieldcat).

            if sy-tabix >= 11 and sy-tabix <= gv_counts.

              assign component ls_fieldcat-fieldname of structure <gs_out> to field-symbol(<lv_menge>).

              split ls_fieldcat-coltext at '-' into data(lv_date) data(lv_type) data(lv_week).

              if lv_type = '02'. "建新的计划行

 

              elseif lv_type = '03'.

                if lv_eindt is initial. "一个po行删一次

                  lv_eindt = lv_date. "预测的最早日期

                  if lt_item-plant = '2031' or lt_item-plant = '2041'.

                    loop at lt_schedule

*                      where delivery_date >= lv_eindt "delivery_date居然是c

                      . "最早预测日期之后的预测计划行都覆盖,

                      data lv_datum like sy-datum.

                      lv_datum = lt_schedule-delivery_date(4) && lt_schedule-delivery_date+5(2) && lt_schedule-delivery_date+8(2).

                      if lv_datum >= lv_eindt.

                        read table lt_eket2 into data(ls_eket2) with key ebeln = lt_ekko-ebeln ebelp = lt_schedule-item_no etenr = lt_schedule-sched_line fixkz = 'X' binary search.

                        if sy-subrc = 0 and ls_eket2-glmng is initial. "已经交货的不能删

                          lt_schedulex-item_no = lt_schedule-item_no.

                          lt_schedulex-sched_line = lt_schedule-sched_line .

                          lt_schedulex-delete_ind = 'X'.

                          append lt_schedulex.

                          lt_schedule-delete_ind = 'L'.

                          modify lt_schedule.

                        endif.

                      endif.

                    endloop.

                  else.

                    loop at lt_schedule . "删全部预测

                      read table lt_eket2 into ls_eket2 with key ebeln = lt_ekko-ebeln ebelp = lt_schedule-item_no etenr = lt_schedule-sched_line fixkz = 'X' binary search.

                      if sy-subrc = 0 and ls_eket2-glmng is initial. "已经交货的不能删

                        lt_schedulex-item_no = lt_schedule-item_no.

                        lt_schedulex-sched_line = lt_schedule-sched_line .

                        lt_schedulex-delete_ind = 'X'.

                        append lt_schedulex.

                        lt_schedule-delete_ind = 'L'.

                        modify lt_schedule.

                      endif.

                    endloop.

                  endif.

                endif.

              endif.

              if <lv_menge> is not initial.

                clear:lt_schedule,lt_schedulex.

                ls_schedule2-sched_line = ls_schedule2-sched_line + 1.

                lt_schedule-item_no = lt_item-item_no.

                lt_schedule-sched_line = ls_schedule2-sched_line.

                lt_schedule-delivery_date = lv_date.

                lt_schedule-quantity = <lv_menge>.

                append lt_schedule.

                lt_schedulex-item_no = lt_schedule-item_no.

                lt_schedulex-sched_line = lt_schedule-sched_line .

                lt_schedulex-delivery_date = 'X'.

                lt_schedulex-quantity = 'X'.

                append lt_schedulex.

 

                clear ls_zmmr007.

                ls_zmmr007-ebeln = lt_ekko-ebeln.

                ls_zmmr007-ebelp = lt_schedule-item_no.

                ls_zmmr007-etenr = lt_schedule-sched_line.

                if lv_type = '02'.

                  ls_zmmr007-fixkz = ''.

                elseif lv_type = '03'.

                  ls_zmmr007-fixkz = 'X'.

                endif.

                append ls_zmmr007 to lt_zmmr007.

              endif.

            endif.

          endloop.

          clear:ls_schedule2.

        endloop.

      endif.

 

    endloop.

 

    export lt_zmmr007 = lt_zmmr007 to memory id 'ZMMR007'.

    call function 'BAPI_SCHEDULE_MAINTAIN'

      exporting

        purchasingdocument = lt_ekko-ebeln

      tables

        schedule           = lt_schedule

        schedulex          = lt_schedulex

*       EXTENSIONIN        = EXTENSIONIN

*       EXTENSIONOUT       = EXTENSIONOUT

        return             = lt_return.

 

 

    loop at lt_return where type ca 'AEX'.

      message id lt_return-id type lt_return-type number lt_return-number

        with lt_return-message_v1 lt_return-message_v2

             lt_return-message_v3 lt_return-message_v4

             into  data(lv_msg).

      lt_ekko-rtmsg = lt_ekko-rtmsg && lv_msg && ';'.

    endloop.

    if sy-subrc = 0.

      call function 'BAPI_TRANSACTION_ROLLBACK'.

      lt_ekko-led = 1.

*      lt_ekko-rtmsg = 1.

    else.

      call function 'BAPI_TRANSACTION_COMMIT'

        exporting

          wait = 'X'.

      lt_ekko-led = 3.

      lt_ekko-rtmsg = '成功'.

    endif.

    modify lt_ekko.

  endloop.

 

  loop at <gt_out> into <gs_out>.

    assign component 'EBELN' of structure <gs_out> to <lv_ebeln>.

    assign component 'LED' of structure <gs_out> to field-symbol(<lv_led>).

    assign component 'RTMSG' of structure <gs_out> to field-symbol(<lv_rtmsg>).

    read table lt_ekko with key ebeln = <lv_ebeln> binary search.

    <lv_led> = lt_ekko-led.

    <lv_rtmsg> = lt_ekko-rtmsg.

    modify <gt_out> from <gs_out>.

  endloop.

 

*存表

  data:

        lt_ztmm007a like table of ztmm007a with header line.

  loop at <gt_out> into <gs_out>.

    move-corresponding <gs_out> to lt_ztmm007a.

    lt_ztmm007a-version = gv_version.

    assign component 'LED' of structure <gs_out> to <lv_led>.

    if <lv_led> = 3.

      loop at gt_fieldcat into ls_fieldcat from 11 to gv_counts.

        lt_ztmm007a-zjhrq = ls_fieldcat-fieldname.

        assign component ls_fieldcat-fieldname of structure <gs_out> to <lv_menge>.

        lt_ztmm007a-menge = <lv_menge>.

        split ls_fieldcat-coltext at '-' into lv_date lv_type lv_week.

        lt_ztmm007a-type = lv_type.

        lt_ztmm007a-erdat = sy-datum.

        lt_ztmm007a-erzet = sy-uzeit.

        lt_ztmm007a-ernam = sy-uname.

        lt_ztmm007a-aedat = sy-datum.

        lt_ztmm007a-aezet = sy-uzeit.

        lt_ztmm007a-aenam = sy-uname.

        append lt_ztmm007a.

      endloop.

    endif.

  endloop.

  if lt_ztmm007a is not initial.

    modify ztmm007a from table lt_ztmm007a.

    commit work and wait.

    message s001(00) with '版本数据已保存'.

  endif.

 

 

*  perform frm_alv_styl.

  perform frm_alv_refresh using go_alvgrid.

endform.

 

猜你喜欢

转载自blog.csdn.net/cylcylcylcylwo/article/details/114015060
今日推荐