ABAP:PP->MD61创建独立需求计划BAPI

BAPI_REQUIREMENTS_CREATE

*&---------------------------------------------------------------------*
*& Form frm_create_pbdnr_matnr
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_pbdnr_matnr USING pv_versb TYPE versb
                                  pv_zywbklike
                            CHANGING ps_alv TYPE ty_outtab.

  DATA: lt_schedule_in  LIKE TABLE OF bapisshdin WITH HEADER LINE,
        lt__char_in     LIKE TABLE OF bapischarr WITH HEADER LINE,
        lt_requirements LIKE TABLE OF bapisitmeo WITH HEADER LINE,
        lt_return       LIKE TABLE OF bapireturn1 WITH HEADER LINE,
        ls_bapisitemr   TYPE bapisitemr.

  DATA: lv_pbdnr      TYPE pbdnr,
        lv_fname      TYPE fieldname,
        lv_beg        TYPE datum,
        lv_end        TYPE datum,
        lv_monday     TYPE datum,
        lv_monday_end TYPE datum,
        lv_month_beg  TYPE datum,
        lv_matnr      TYPE matnr18,
        lv_bedae      TYPE bedae.

  REFRESH:lt_schedule_in,lt_requirements,lt_return.

  LOOP AT gt_pbed INTO gs_pbed WHERE matnr = ps_alv-matnr.
    lt_schedule_in-date_type = '1'.  "代表天
    lt_schedule_in-req_date = gs_pbed-pdatu.
    lt_schedule_in-req_qty = gs_pbed-plnmg.
    lt_schedule_in-unit = gs_pbed-meins.
    APPEND lt_schedule_in.
    CLEAR:gs_pbed,lt_schedule_in.
  ENDLOOP.

  lv_beg = p_datum + 27. "第28天的日期
*  获取对应的周数
  CALL FUNCTION 'GET_WEEK_INFO_BASED_ON_DATE'
    EXPORTING
      date   = lv_beg
    IMPORTING
      monday = lv_monday.  "第28天所在周对应周一日期

  lv_month_beg = lv_monday + 336. "28天后第48个周周一的日期

*第一个月计划需求
  CLEAR lt_schedule_in.
  lt_schedule_in-date_type = '3'.  "代表月
  lt_schedule_in-req_date = lv_month_beg(6).
  lt_schedule_in-req_date+6(2) = '01'.

  ASSIGN COMPONENT 'M1' OF STRUCTURE ps_alv TO FIELD-SYMBOL(<fs>).
  IF sy-subrc EQ 0 AND <fs> IS ASSIGNED.
    lt_schedule_in-req_qty = <fs>.
  ENDIF.
  lt_schedule_in-unit = ps_alv-meins.
  APPEND lt_schedule_in.



  DO 48 TIMES.
* ***---8个周计划需求
*    8周修改为48周,去掉月
*    IF sy-index LE 8.
    IF sy-index LE 48.
      lv_fname = 'W' && sy-index.
      lv_monday = lv_monday + 7.
      CLEAR lt_schedule_in.
      lt_schedule_in-date_type = '2'.  "代表周
      lt_schedule_in-req_date = lv_monday.
      UNASSIGN <fs>.
      ASSIGN COMPONENT lv_fname OF STRUCTURE ps_alv TO <fs>.
      IF sy-subrc EQ 0 AND <fs> IS ASSIGNED.
        lt_schedule_in-req_qty = <fs>.
      ENDIF.
      lt_schedule_in-unit = ps_alv-meins.
      APPEND lt_schedule_in.

****----8个月计划需求(从第二个月开始的计划需求)
*      获取计划需求日期第9个周周一对应月份的下一月
      CALL FUNCTION 'MONTH_PLUS_DETERMINE'
        EXPORTING
          months  = sy-index
          olddate = lv_month_beg
        IMPORTING
          newdate = lv_end.

      DATA(lv_index) = sy-index + 1.

      lv_fname = 'M' && lv_index.
      CLEAR lt_schedule_in.
      lt_schedule_in-date_type = '3'.  "代表月
      lt_schedule_in-req_date = lv_end(6).
      lt_schedule_in-req_date+6(2) = '01'.
      UNASSIGN <fs>.
      ASSIGN COMPONENT lv_fname OF STRUCTURE ps_alv TO <fs>.
      IF sy-subrc EQ 0 AND <fs> IS ASSIGNED.
        lt_schedule_in-req_qty = <fs>.
      ENDIF.
      lt_schedule_in-unit = ps_alv-meins.
      APPEND lt_schedule_in.
    ENDIF.
****--- 28天天计划需求
    IF sy-index LE 28.
      lv_fname = 'T' && sy-index.
      CLEAR lt_schedule_in.
      lt_schedule_in-date_type = '1'.  "代表天
      lt_schedule_in-req_date = p_datum + sy-index - 1.
      UNASSIGN <fs>.
      ASSIGN COMPONENT lv_fname OF STRUCTURE ps_alv TO <fs>.
      IF sy-subrc EQ 0 AND <fs> IS ASSIGNED.
        lt_schedule_in-req_qty = <fs>.
      ENDIF.
      lt_schedule_in-unit = ps_alv-meins.
      READ TABLE gt_pbed TRANSPORTING NO FIELDS
                         WITH KEY matnr = ps_alv-matnr
                                  pdatu = lt_schedule_in-req_date.
      IF sy-subrc NE 0.
        APPEND lt_schedule_in.
      ENDIF.

    ENDIF.
  ENDDO.

  CLEAR ls_bapisitemr.
  lv_matnr = ps_alv-matnr.
  ls_bapisitemr-material = lv_matnr.
  ls_bapisitemr-plant  = ps_alv-werks.
  ls_bapisitemr-version  = '00'.
  ls_bapisitemr-vers_activ  = 'X'.
  ls_bapisitemr-req_number  = ps_alv-pbdnr.
  ls_bapisitemr-mrp_area  = ps_alv-berid.

  CALL FUNCTION 'BAPI_REQUIREMENTS_CREATE'
    EXPORTING
      requirements_item        = ls_bapisitemr
    TABLES
      requirements_schedule_in = lt_schedule_in
      return                   = lt_return.

  IF lt_return[] IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    ps_alv-icon = icon_led_green.
    ps_alv-msg = '物料' && ps_alv-matnr && '工厂' && ps_alv-werks && '主计划创建成功!'.

  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ps_alv-icon = icon_led_red.
    LOOP AT lt_return.
      CONCATENATE ps_alv-msg lt_return-message INTO ps_alv-msg SEPARATED BY '/'.
      CLEAR lt_return.
    ENDLOOP.
  ENDIF.
ENDFORM.

MD63读取需求计划-->BAPI:BAPI_MATERIAL_STOCK_REQ_LIST

*&---------------------------------------------------------------------*
*& Form frm_get_history_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_history_data .
******工厂级别4周前forecast获取
  DATA:lv_datum    TYPE sy-datum,
       ls_ztpp0033 TYPE ztpp0033,
       lt_ztpp0033 TYPE TABLE OF ztpp0033.
  DATA:lt_mrp_ind_lines TYPE TABLE OF bapi_mrp_ind_lines.
  DATA:lt_mrp_ind_lines_werks TYPE TABLE OF bapi_mrp_ind_lines.
  DATA:lt_mrp_ind_lines_mrp TYPE TABLE OF bapi_mrp_ind_lines.
  DATA:lv_str TYPE string.
  DATA:lv_matnr TYPE bapi_mrp_mat_param-material,
       lv_mrp   TYPE bapi_mrp_mat_param-mrp_area.

  lv_datum = p_datum + 21.
  DATA(lv_len) = strlen( gs_ywbk-ywbk ).
  "根据导入模版-工厂PBIM- WERKS并且PBIM~loevr NE 'D'(没有删除标识)取:PBIM-MATNR(物料编号);
  SELECT matnr
    FROM pbim
    INTO TABLE @DATA(lt_pbim)
   WHERE werks = @gs_ywbk-werks
     AND loevr NE 'D'.
  "根据导入模版-工厂PBID-WERKS 并且PBID ~loevr NE 'D'(没有删除标识),取:PBIM-MATNR(物料编号);
  SELECT matnr
    FROM pbid
  APPENDING TABLE @lt_pbim
  WHERE werks = @gs_ywbk-werks
    AND loevr NE 'D'.
  SORT lt_pbim BY matnr.
  DELETE ADJACENT DUPLICATES FROM lt_pbim COMPARING matnr.

******获取物料单位及物料描述
  SELECT a~matnr,a~meins,b~maktx
    FROM @lt_pbim AS c
    LEFT JOIN mara AS a
      ON c~matnr EQ a~matnr
    LEFT JOIN makt AS b
      ON b~matnr EQ c~matnr
     AND b~spras EQ @sy-langu
    INTO TABLE @DATA(lt_mara).
  SORT lt_mara BY matnr.
  CLEAR:gt_pbed,gs_pbed.
  "将‘1)’、‘2)’取出的物料合并去除重复项,调用BAPI_MATERIAL_STOCK_REQ_LIST
  LOOP AT lt_pbim INTO DATA(ls_pbim).
    CLEAR:lv_matnr,lt_mrp_ind_lines,lt_mrp_ind_lines_werks,lt_mrp_ind_lines_mrp.
    lv_matnr = ls_pbim-matnr.
    "MRP范围不等于公司代码时,执行两次:一次根据公司代码查询 一次根据MRP范围查询
    IF gs_ywbk-mrp NE gs_ywbk-werks.

      CLEAR:lv_mrp.
      lv_mrp = gs_ywbk-werks.
      CALL FUNCTION 'BAPI_MATERIAL_STOCK_REQ_LIST'
        EXPORTING
          material      = lv_matnr
          plant         = gs_ywbk-werks
          mrp_area      = lv_mrp
          get_ind_lines = 'X'
        TABLES
          mrp_ind_lines = lt_mrp_ind_lines_werks.

      CLEAR:lv_mrp.
      lv_mrp = gs_ywbk-mrp.
      CALL FUNCTION 'BAPI_MATERIAL_STOCK_REQ_LIST'
        EXPORTING
          material      = lv_matnr
          plant         = gs_ywbk-werks
          mrp_area      = lv_mrp
          get_ind_lines = 'X'
        TABLES
          mrp_ind_lines = lt_mrp_ind_lines_mrp.

      APPEND LINES OF lt_mrp_ind_lines_werks TO lt_mrp_ind_lines.
      APPEND LINES OF lt_mrp_ind_lines_mrp TO lt_mrp_ind_lines.
    ELSE.
      CLEAR:lv_mrp.
      lv_mrp = gs_ywbk-werks.
      CALL FUNCTION 'BAPI_MATERIAL_STOCK_REQ_LIST'
        EXPORTING
          material      = lv_matnr
          plant         = gs_ywbk-werks
          mrp_area      = lv_mrp
          get_ind_lines = 'X'
        TABLES
          mrp_ind_lines = lt_mrp_ind_lines_werks.

      APPEND LINES OF lt_mrp_ind_lines_werks TO lt_mrp_ind_lines.
    ENDIF.

    IF lt_mrp_ind_lines IS NOT INITIAL.
      "MRP_IND_LINES保留MRP元素为PP(独立需求)的记录MRP_ELEMENT_IND=' PP'
      "SORT_DATE(需求日期)< =T-21(计划开始日期+21天)
      DELETE lt_mrp_ind_lines WHERE mrp_element_ind <> 'PP'
                                OR sort_date >= lv_datum.
      "ELEMNT_DATA(MRP元素数据)= 业务版块 ‘-’  前字符 匹配MRP元素字符 (例如:PS-公共销售、BSF /PS240129,PS匹配PS)
      LOOP AT lt_mrp_ind_lines ASSIGNING FIELD-SYMBOL(<fs_lines>).
        IF <fs_lines>-elemnt_data IS NOT INITIAL.
          TRY .
              "取ELEMNT_DATA(MRP元素数据)'/'后作为业务板块
              lv_str = segment( val = <fs_lines>-elemnt_data index = 2 sep = '/' ).
              IF lv_str(lv_len) NE gs_ywbk-ywbk.
                DELETE lt_mrp_ind_lines.
              ENDIF.
            CATCH cx_sy_strg_par_val INTO DATA(exc).
              DELETE lt_mrp_ind_lines.
          ENDTRY.
        ELSE.
          DELETE lt_mrp_ind_lines.
        ENDIF.
      ENDLOOP.

      LOOP AT lt_mrp_ind_lines INTO DATA(ls_lines).
        gs_pbed-matnr = ls_pbim-matnr.
        gs_pbed-werks = gs_ywbk-werks.
        gs_pbed-zywbk = gs_ywbk-ywbk.
        gs_pbed-pdatu = ls_lines-sort_date.
        gs_pbed-plnmg = abs( ls_lines-rec_reqd_qty )."数量绝对值

        READ TABLE lt_mara INTO DATA(ls_mara)
                           WITH KEY matnr = ls_pbim-matnr
                           BINARY SEARCH.
        IF sy-subrc EQ 0.
          gs_pbed-meins = ls_mara-meins.
        ENDIF.
        APPEND gs_pbed TO gt_pbed.
      ENDLOOP.
    ENDIF.
  ENDLOOP.
  CLEAR:ls_ztpp0033,lt_ztpp0033.
  "导入周次forecast(作为前3周滚动历史数据) 。
  LOOP AT gt_pbed INTO DATA(ls_pbed).
    "获取seq_key
    PERFORM frm_get_seq_key CHANGING ls_ztpp0033-seq_key.

    "物料
    ls_ztpp0033-matnr = ls_pbed-matnr.

    READ TABLE lt_mara INTO ls_mara
                       WITH KEY matnr = ls_pbed-matnr
                       BINARY SEARCH.
    IF sy-subrc EQ 0.
      "物料描述
      ls_ztpp0033-matnr = ls_pbed-matnr.
    ENDIF.
    "开始日期
    ls_ztpp0033-datve = p_datum.
    "计划日期
    ls_ztpp0033-pdatu = ls_pbed-pdatu.
    "数量
    ls_ztpp0033-plnmg = ls_pbed-plnmg.
    "工厂
    ls_ztpp0033-werks = ls_pbed-werks.
    "业务板块
    ls_ztpp0033-zywbk = ls_pbed-zywbk.
    "时间戳赋值
    ls_ztpp0033-erdat = sy-datum.
    ls_ztpp0033-erzet = sy-uzeit.
    ls_ztpp0033-ernam = sy-uname.
    ls_ztpp0033-aedat = sy-datum.
    ls_ztpp0033-aenam = sy-uname.
    ls_ztpp0033-aezet = sy-uzeit.

    APPEND ls_ztpp0033 TO lt_ztpp0033.
    CLEAR:gs_pbed,ls_ztpp0033.
  ENDLOOP.

  IF lt_ztpp0033 IS NOT INITIAL.
    MODIFY ztpp0033 FROM TABLE lt_ztpp0033.
  ENDIF.
ENDFORM.

MD62删除需求计划->BDC

*&---------------------------------------------------------------------*
*& Form frm_maintenance
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> <FS_ALV>_WERKS
*&      --> LV_VERSBDEL_PBDNR
*&      --> <FS_ALV>_BERID
*&---------------------------------------------------------------------*
FORM frm_maintenance USING p_lv_matnr
                            p_lv_werks.

  DATA:lv_message TYPE string.
  DATA:lv_mon(2).

  PERFORM bdc_dynpro      USING 'SAPMM60X' '0106'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'AM60X-MATNR'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=ANF1'.
  PERFORM bdc_field       USING 'AM60X-MATAW'
                                'X'.
  PERFORM bdc_field       USING 'AM60X-MATNR'
                                p_lv_matnr.
  PERFORM bdc_field       USING 'AM60X-WERKS'
                                p_lv_werks.
  PERFORM bdc_field       USING 'AM60X-VERAK'
                                'X'.
  PERFORM bdc_dynpro      USING 'SAPLM60E' '0200'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=ALMK'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'PBPT-MATNR(01)'.
  PERFORM bdc_dynpro      USING 'SAPLM60E' '0200'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=POLO'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'PBPT-MATNR(01)'.
  PERFORM bdc_dynpro      USING 'SAPLSPO1' '0500'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=OPT1'.
  PERFORM bdc_dynpro      USING 'SAPLM60E' '0200'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '=SICH'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
                                'PBPT-MATNR(01)'.
  gs_opt-dismode = 'N'.
  gs_opt-updmode = 'S'.

  CALL TRANSACTION 'MD62' USING bdcdata
                          OPTIONS FROM gs_opt
                          MESSAGES INTO gt_messtab.
  CLEAR:gt_messtab[],gt_messtab,bdcdata[],bdcdata.

ENDFORM.
posted @ 2024-02-18 17:08  阿胖的阿多  阅读(292)  评论(0编辑  收藏  举报