SAP 多料号展BOM

************************************************************************
*程式代號:ZPP0031R
*程式名稱:多料號展 BOM
*         -------- -----------------------------------------------------
*         20160204 程式建立                              By Bruce
************************************************************************
REPORT  zpp0031r MESSAGE-ID ok.

TABLES: stpox,mara,marc,sktext,afko,stko,makt,plmz,mapl,
        plpo,drat,mast.

TYPE-POOLS: slis.
DATA: layout TYPE slis_layout_alv.
DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.

DATA: selpool TYPE TABLE OF cstmat WITH HEADER LINE.
DATA: dstst_flg LIKE csdata-xfeld.
DATA: matcat TYPE TABLE OF cscmat WITH HEADER LINE.
DATA: stb TYPE STANDARD TABLE OF stpox WITH HEADER LINE.
DATAreturn TYPE TABLE OF bapireturn WITH HEADER LINE.
DATA: return1 TYPE TABLE OF bapiret1 WITH HEADER LINE.

TYPES:BEGIN OF itabs,
        matnr      LIKE mara-matnr,
        stufe      LIKE stb-stufe,      "LEVEL
        posnr      LIKE stb-posnr,      "ITEM
        matkl      LIKE mara-matkl,
        idnrk      LIKE stb-idnrk,      "METERIAL
        chname     LIKE sktext-maktx,  "CHINESE NAME
        en_name    LIKE sktext-maktx"ENGLISH NAME
        maktx      LIKE stb-ojtxp,
        maktx2(80TYPE c,
        potx1      LIKE stb-potx1,      "SIZE
        meins      LIKE stb-meins,      "UNIT
        mmein      LIKE stb-meins,      "Base Unit
        quan       TYPE p DECIMALS 4,   "QUANTITY
        datuv      LIKE stb-datuv,
        bmeng      LIKE stko-bmeng,
        alpgr      LIKE stpo-alpgr,
        aennr      LIKE stb-aennr,
        stlkn      LIKE stb-stlkn,
        mtart      LIKE mara-mtart"Material Type
        nfmat      LIKE marc-nfmat,
        ewahr      LIKE stb-ewahr,
        ltxa1      LIKE plpo-ltxa1,
        wegxx      LIKE stb-wegxx,
        mstae      LIKE stpox-mstae,
        dismm      LIKE stpox-dismm,
        ktext      LIKE stpox-potx1,
      END OF itabs.
DATA: itab TYPE itabs OCCURS WITH HEADER LINE.

DATA: t_stlnr         LIKE stpo-stlnr,
      p_name          LIKE makt-maktx,
      old_stlst       LIKE stko-stlst,
      t_datuv         LIKE stb-datuv,
      p_maktx         LIKE stb-ojtxp,
      p_plnkn         LIKE plmz-plnkn,
      p_ltxa1         LIKE plpo-ltxa1,
      t_idnrk         LIKE stb-idnrk,
      t_maktx         LIKE sktext-maktx,
      t_stufe         LIKE stb-stufe VALUE 0,
      amount_internal LIKE wmto_s-amount,
      amount_display  LIKE wmto_s-amount,
      foreign_amount  LIKE bapieine-net_price,
      p_matnr         LIKE mara-matnr,
      m_text(70)      TYPE c.

DATABEGIN OF ritab OCCURS 0,
        stufe LIKE stb-stufe,
        plnnr LIKE mapl-plnnr,
        plnal LIKE mapl-plnal,
      END OF ritab.

DATAid     LIKE thead-tdid,
      name   LIKE thead-tdname,
      langw  LIKE thead-tdspras,
      object LIKE thead-tdobject.
DATAlines LIKE TABLE OF tline WITH HEADER LINE.

SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-001.
PARAMETERS:p_werks LIKE marc-werks OBLIGATORY MEMORY ID wrk.
SELECT-OPTIONS:s_matnr FOR mara-matnr OBLIGATORY NO INTERVALS.
*PARAMETERS:p_matnr LIKE mara-matnr OBLIGATORY DEFAULT 'T07SN0707054A'.
PARAMETERS:p_app    LIKE tc04-capid DEFAULT 'PP01' OBLIGATORY,
           p_altbom LIKE stpox-stlal DEFAULT '01',
           p_stlan  LIKE stpox-stlan DEFAULT '1' OBLIGATORY,
           p_datuv  LIKE stko-datuv DEFAULT sy-datum OBLIGATORY,
           p_reqm   LIKE stpox-menge  DEFAULT 1.
PARAMETERS p_scrap LIKE csdata-xfeld.
SELECTION-SCREEN COMMENT /1(79) text2.
*SELECTION-SCREEN COMMENT /1(60) text1.
SELECTION-SCREEN END OF BLOCK block1.

DEFINE alv_spec.
  fieldcat-fieldname = &1.
  fieldcat-seltext_l = &2.
  APPEND fieldcat.
  CLEAR fieldcat.
END-OF-DEFINITION.

AT SELECTION-SCREEN.

AT SELECTION-SCREEN OUTPUT.
*  text1 ='注意:畫面參數不同的 BOM, 請勿一起下載, 以免下載資料有錯.'.
  IF SY-langu ='M'.
    text2 ='效能:一次下載過多 BOM, 會造成報表逾時, 無法產生下載資料.'.
  ELSE.
    text2 ='Performance:Download too BOM, the report will timeout.'.
  ENDIF.

START-OF-SELECTION.
  LOOP AT s_matnr.
    p_matnr = s_matnr-low.
    CLEAR:m_text,t_stlnr.
*--check material number plant exist?
    SELECT SINGLE * FROM marc WHERE matnr = p_matnr AND werks = p_werks.
    IF sy-subrc <> 0.
      CONCATENATE p_matnr ' Not material exist, check your input !'
        INTO m_text.
      MESSAGE m_text TYPE 'I'.
      CONTINUE.
    ENDIF.
*--check material number status?
    SELECT SINGLE * FROM mara WHERE matnr = p_matnr AND lvorm 'X'.
    IF sy-subrc 0.
      CONCATENATE p_matnr ' This material number has been deleted.'
        INTO m_text.
      MESSAGE m_text TYPE 'I'.
      CONTINUE.
    ENDIF.
*-- check bom use and get out record
    SELECT SINGLE * FROM mast WHERE matnr = p_matnr AND werks  = p_werks
                               AND stlan = p_stlan AND stlal = p_altbom.
    IF sy-subrc <> 0.
      CONCATENATE p_matnr
      ' Input data errors or mismatched, please re-enter.' INTO m_text.
      MESSAGE m_text TYPE 'I'.
      CONTINUE.
    ENDIF.
    MOVE mast-stlnr TO t_stlnr.

    SELECT SINGLE stlst INTO old_stlst FROM stko WHERE stlnr EQ t_stlnr.
    IF old_stlst '02'.
      UPDATE stko SET stlst '01' WHERE stlnr = t_stlnr.
      MESSAGE 'Note! This is not active BOM.' TYPE 'I'.
    ENDIF.
    PERFORM exp_bom.       "展BOM
    PERFORM append_result"資料彙總
    IF old_stlst '02'.
      SELECT SINGLE stlnr INTO t_stlnr FROM mast
       WHERE matnr = p_matnr AND werks = p_werks
        AND stlan = p_stlan AND stlal = p_altbom.
      UPDATE stko SET stlst '02' WHERE stlnr = t_stlnr.
    ENDIF.
  ENDLOOP.
*------------------------OUTPUT START-----------------------------------
END-OF-SELECTION.
  PERFORM output_alv TABLES itab.
  PERFORM free_itab.

TOP-OF-PAGE.

*&---------------------------------------------------------------------*
*&      Form  APPEND_RESULT
*&---------------------------------------------------------------------*
FORM append_result.
  itab-stufe 0.
  itab-posnr ''.
  itab-idnrk = p_matnr.
  SELECT SINGLE maktx INTO itab-maktx
  FROM makt WHERE matnr = p_matnr AND spras 'E'.
  APPEND itab.
  CLEAR itab.
  SELECT SINGLE plnnr plnal INTO (ritab-plnnr,ritab-plnalFROM mapl
    WHERE matnr = p_matnr AND werks = p_werks AND plnty 'N'
    AND loekz <> 'X'.
  ritab-stufe 1.
  APPEND ritab.
  CLEAR ritab.

  LOOP AT stb.
    t_stufe = itab-stufe + 1"往下展時才做插入半成品標示紀錄
    IF itab-idnrk <> ''"跳開迴圈第一次
      IF t_stufe = stb-stufe.
* WEGXX是多層 BOM 展開時,半成品未展開前的項目序號
        IF itab-wegxx = stb-vwegx.
          t_idnrk = itab-idnrk.
          t_maktx = itab-maktx.
          CLEAR itab"清除其他欄位
          itab-idnrk = t_idnrk.
          itab-maktx = t_maktx.
*          APPEND itab."插入半成品標示紀錄
* 紀錄 Routing 查詢物料分配的站別用
          SELECT SINGLE plnnr plnal INTO (ritab-plnnr,ritab-plnal)
            FROM mapl WHERE matnr = t_idnrk AND werks = p_werks
            AND plnty 'N' AND loekz <> 'X'.
          ritab-stufe = stb-stufe.
          APPEND ritab.
          CLEAR ritab.
          CLEAR:t_idnrk,t_maktx.
        ENDIF.
      ENDIF.
    ENDIF.
    CLEAR:itab,t_stufe.
    MOVE:stb-stufe TO itab-stufe,
         stb-posnr TO itab-posnr,
         stb-idnrk TO itab-idnrk,
         stb-ojtxp TO itab-maktx,
         stb-mngko TO itab-quan,
         stb-meins TO itab-meins,
         stb-mmein TO itab-mmein,
         stb-alpgr TO itab-alpgr,
         stb-nfmat TO itab-nfmat,
         stb-ewahr TO itab-ewahr,
         stb-wegxx TO itab-wegxx,
         stb-mstae TO itab-mstae,
         stb-dismm TO itab-dismm,
         p_matnr   TO itab-matnr.
    PERFORM long_desc.
    PERFORM comp_alloc"查 Routing 物料分配的站別
    IF itab-idnrk ='' AND stb-postp 'T'.
      itab-ktext = stb-potx1.
    ENDIF.

*    IF stb-aennr IS NOT INITIAL.
*      MOVE : '加'      TO itab-matkl,
*             stb-datuv TO itab-datuv.
*    ENDIF.
*    IF stb-aenra IS NOT INITIAL.
*      MOVE : stb-aenra TO itab-aennr,
*             '刪'      TO itab-matkl,
*             stb-datub TO itab-datuv.
*    ENDIF.

    APPEND itab.
  ENDLOOP.
  REFRESH ritab.
  CLEAR itab.
ENDFORM.                    " APPEND_RESULT
*&---------------------------------------------------------------------*
*&      Form  COMP_ALLOC
*&---------------------------------------------------------------------*
FORM comp_alloc.
  CLEAR p_plnkn.
  READ TABLE ritab WITH KEY stufe = stb-stufe.
* stb-stlkn不要用,跟 plmz 的 stlkn 不一致
  SELECT SINGLE plnkn INTO p_plnkn FROM plmz "Routing 物料分配的站別
    WHERE stlty = stb-stlty AND stlnr = stb-stlnr AND stlal = p_altbom
    AND werk_stl = p_werks AND  plnty 'N' AND plnnr = ritab-plnnr
    AND plnal = ritab-plnal AND stlkn = stb-stvkn.
  SELECT SINGLE ltxa1 INTO itab-ltxa1 FROM plpo "站別名稱
    WHERE werks = p_werks AND  plnty 'N'
    AND plnnr = ritab-plnnr AND plnkn = p_plnkn.
ENDFORM.               " EOMP_ALLOC
*&---------------------------------------------------------------------*
*&      Form  EXP_BOM
*&---------------------------------------------------------------------*
FORM exp_bom.
  TRANSLATE p_matnr TO UPPER CASE.
  CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
    EXPORTING
      capid                 = p_app
      datuv                 = p_datuv
      ehndl                 '2'
      mtnrv                 = p_matnr
      mehrs                 'X'
      mmory                 '1'
      stlal                 = p_altbom
      stlan                 = p_stlan
      werks                 = p_werks
      emeng                 = p_reqm  "DEFAULT 0 則 FM 不會將數量除以基礎數量
      auskz                 = p_scrap
    IMPORTING
      topmat                = selpool
      dstst                 = dstst_flg
    TABLES
      stb                   = stb
      matcat                = matcat
    EXCEPTIONS
      alt_not_found         1
      call_invalid          2
      material_not_found    3
      missing_authorization 4
      no_bom_found          5
      no_plant_data         6
      no_suitable_bom_found 7
      conversion_error      8
      OTHERS                9.
ENDFORM.               " EXPORT_BOM
*&---------------------------------------------------------------------*
*&      Form  LONG_DESC
*----------------------------------------------------------------------*
FORM long_desc.
  id 'GRUN'.
  langw 'EN'.
  name = stb-idnrk.
  object 'MATERIAL'.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      id                      id
      language                = langw
      name                    = name
      object                  = object
    TABLES
      lines                   lines
    EXCEPTIONS
      id                      1
      language                2
      name                    3
      not_found               4
      object                  5
      reference_check         6
      wrong_access_to_archive 7
      OTHERS                  8.

  READ TABLE lines INDEX 1.
  itab-maktx2 lines-tdline.
  REFRESH lines.
  CLEAR lines.
ENDFORM.                " LONG_DESC
*&---------------------------------------------------------------------*
*&      Form  OUTPUT_ALV
*&---------------------------------------------------------------------*
FORM output_alv TABLES itab.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = sy-repid
      i_inclname             = sy-repid
      i_internal_tabname     'itab'
      i_client_never_display 'X'
      i_bypassing_buffer     'X'
      i_buffer_active        ' '
    CHANGING
      ct_fieldcat            = fieldcat[]
    EXCEPTIONS
      inconsistent_interface 1
      program_error          2
      OTHERS                 3.

  alv_spec'MATNR' 'Product'.
  alv_spec'STUFE' 'Level'.
  alv_spec'POSNR' 'Item'.
  alv_spec'IDNRK' 'Materials'.
  alv_spec'KTEXT' 'BOM Comp DESC '.
  alv_spec'MSTAE' 'Status'.
  alv_spec'dismm' 'MRP'.
  alv_spec'MAKTX' 'Description'.
  alv_spec'MAKTX2' 'Long Description'.
  alv_spec'LTXA1' 'Operation'.
  alv_spec'ALPGR' 'ALT Group'.
  alv_spec'EWAHR' 'Percentage'.
  alv_spec'QUAN' 'QTY'.
  fieldcat-fieldname 'MMEIN'.
  fieldcat-qfieldname 'MMEIN'.
  fieldcat-seltext_l 'BasicU'.
  APPEND fieldcat.
  CLEAR:fieldcat.
  fieldcat-fieldname 'MEINS'.
  fieldcat-qfieldname 'MEINS'.
  fieldcat-seltext_l 'UM'.
  APPEND fieldcat.
  CLEAR:fieldcat.

  layout-zebra             'X'.
  layout-detail_popup      'X'.
  layout-colwidth_optimize 'X'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = sy-repid
      it_fieldcat        = fieldcat[]
      is_layout          = layout
      i_save             'X'
    TABLES
      t_outtab           = itab
    EXCEPTIONS
      program_error      1
      OTHERS             2.
ENDFORM.                   " OUTPUT_ALV
*----------------
* FORM free_itab
*----------------
FORM free_itab.
  FREE:itab,selpool,ritab,dstst_flg,stb,return,return1.
ENDFORM.       "free_itab

posted @ 2020-07-31 11:05  年轻的小菜鸟  阅读(803)  评论(0)    收藏  举报