ABAP 反查BOM

*&---------------------------------------------------------------------*
*& Report ZCOD0046_BOM
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zhf_test2 MESSAGE-ID zfi001.



DATA: gv_bukrs TYPE bseg-bukrs,          ""公司代码
      gv_werks TYPE marc-werks,          ""工厂
      gv_gjahr TYPE bseg-gjahr,          ""会计年度
      gv_monat TYPE bkpf-monat,          ""会计期间
      gv_mat   TYPE marc-matnr.          ""物料编号"

"后面用了INTO TABLE,不要轻易改动
TYPES: BEGIN OF ty_slm,
         werks TYPE werks_d,          ""工厂
         matnr TYPE matnr,            ""物料编号"
         bklas TYPE bklas,            ""评估分类
         beskz TYPE beskz,            ""采购类型
       END OF ty_slm.

"前面的字段需要与ty_slm保持一致
TYPES: BEGIN OF ty_matnr,
         werks TYPE werks_d,          ""工厂
         matnr TYPE matnr,            ""物料编号"
       END OF ty_matnr.

TYPES: BEGIN OF ty_zmatnr,
         idnrk TYPE idnrk,             ""BOM组件物料
         iwerk TYPE werks_d,           ""BOM组件工厂
         matnr TYPE matnr,             ""主件物料
         werks TYPE werks_d,           ""主件工厂        ""物料编号"
       END OF ty_zmatnr.

"后面用了INTO TABLE,不要轻易改动
TYPES: BEGIN OF ty_wultb,
         idnrk  TYPE idnrk,             ""BOM组件物料
         iwerk  TYPE werks_d,           ""BOM组件工厂
         matnr  TYPE matnr,             ""主件物料
         werks  TYPE werks_d,           ""主件工厂
         stlan  TYPE stlan,             ""物料清单用途
         datuv  TYPE datuv,             ""有效起始日期
         zdatuv TYPE datuv,             ""有效截止日期
         bklas  TYPE bklas,             ""评估类
         alpgr  TYPE cs_alpgr,          ""替代组
         ewahr  TYPE ewahr,             ""使用概率
         menge  TYPE kmpmg,             ""组件数量
         bmeng  TYPE basmn,             ""基本数量"
       END OF ty_wultb.

TYPES: BEGIN OF ty_stpo,
         zmatnr TYPE matnr,             ""查询的物料
         zwerks TYPE werks_d,           ""查询的工厂
         matnr  TYPE matnr,             ""主件物料
         werks  TYPE werks_d,           ""主件工厂
         idnrk  TYPE idnrk,             ""BOM组件物料
         iwerk  TYPE werks_d,           ""BOM组件工厂
         stlan  TYPE stlan,             ""物料清单用途
         datuv  TYPE datuv,             ""有效起始日期
         zdatuv TYPE datuv,             ""有效截止日期
         bklas  TYPE bklas,             ""评估类
         alpgr  TYPE cs_alpgr,          ""替代组
         ewahr  TYPE ewahr,             ""使用概率
         menge  TYPE kmpmg,             ""组件数量
         bmeng  TYPE basmn,             ""基本数量"
       END OF ty_stpo.

DATA: gv_matnr     TYPE TABLE OF ty_matnr,
      gv_zmatnr    TYPE TABLE OF ty_zmatnr,
      gv_wultb     TYPE TABLE OF ty_wultb,
      gv_stpo      TYPE TABLE OF ty_stpo,
      gv_loopcount TYPE i. ""循环次数

DATA : BEGIN OF gv_zwultb OCCURS 0,
         idnrk TYPE idnrk,             ""BOM组件物料
         iwerk TYPE werks_d,           ""BOM组件工厂
         datas TYPE STANDARD TABLE OF ty_wultb,
       END OF gv_zwultb.

DATA  gv_ndate2 TYPE d .  "当前日期,期末,确定后不可修改

DATA  lv_content TYPE zsfi0007b.



SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-a01.

PARAMETERS p_bukrs LIKE gv_bukrs.   ""公司代码
PARAMETERS pn_gjahr LIKE gv_gjahr . ""当前年份
PARAMETERS pn_monat LIKE gv_monat.  ""当前月份

SELECT-OPTIONS:
s_matnr FOR gv_mat,   "物料编号
s_werks FOR gv_werks.  "工厂

SELECTION-SCREEN END OF BLOCK b1.


INITIALIZATION.

AT SELECTION-SCREEN OUTPUT.

AT SELECTION-SCREEN.

START-OF-SELECTION.

  PERFORM edit_main.

END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form EDIT_MAIN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM edit_main .

  PERFORM frm_authority_check. "检查权限

  PERFORM frm_selection_check_p3. "屏幕检查


  PERFORM frm_get_finished_product. "查找成品料号



  lv_content-mtype = 'S'.
  lv_content-msg = '执行成功'(e05).
  "PERFORM frm_give_msg.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_AUTHORITY_CHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_authority_check .

  DATA:BEGIN OF lt_bukrs OCCURS 0,
         bukrs LIKE t001-bukrs,
       END OF lt_bukrs.

  SELECT bukrs INTO TABLE lt_bukrs FROM t001 WHERE bukrs = p_bukrs.

  IF sy-subrc <> 0.
    lv_content-mtype = 'E'.
    lv_content-msg = '公司代码不存在'(e01).
    PERFORM frm_give_msg.
  ENDIF.

  LOOP AT lt_bukrs.
    AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'" 'F_SKA1_BUK'
    ID 'BUKRS' FIELD lt_bukrs-bukrs"检查字段
    ID 'ACTVT' FIELD '03'.
    IF sy-subrc <> 0.
      lv_content-mtype = 'E'.
      lv_content-msg = '未授权的公司代码'(e02) && lt_bukrs-bukrs.
      PERFORM frm_give_msg.
    ENDIF.
  ENDLOOP.
  CLEAR:lt_bukrs,lt_bukrs[].


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SELECTION_CHECK_P3
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_selection_check_p3 .

  DATA: lv_ndate1 TYPE d ,  "当前日期,期初,确定后不可修改
        lv_ndate2 TYPE d ,  "当前日期,期末,确定后不可修改
        lv_nrq(6) TYPE c,   "当前日期 年月,确定后不可修改
        lv_fdate1 TYPE d ,  "未来日期,期初,确定后不可修改
        lv_fdate2 TYPE d ,  "未来日期,期末,确定后不可修改
        lv_frq(6) TYPE c.   "未来日期 年月,确定后不可修改

  IF p_bukrs IS INITIAL.
    MESSAGE s000 WITH '“公司代码”为空!'(e06) DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  IF pn_gjahr IS INITIAL.
    MESSAGE s000 WITH '“当前年份”为空!'(e03) DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  IF pn_monat IS INITIAL.
    MESSAGE s000 WITH '“当前月份”为空!'(e04) DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.


  lv_nrq = pn_gjahr && pn_monat.
  lv_ndate1 = pn_gjahr && pn_monat && '01'.

  "获取当前期末日期
  CALL FUNCTION 'LAST_DAY_OF_MONTHS'
    EXPORTING
      day_in            = lv_ndate1
    IMPORTING
      last_day_of_month = lv_ndate2.


  gv_ndate2 = lv_ndate2.

*  CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
*    EXPORTING
*      date      = lv_ndate1
*      days      = '00'
*      months    = '01'
*      signum    = '-'
*      years     = '03'
*    IMPORTING
*      calc_date = lv_del_date.
*
*  lv_del_gjahr = lv_del_date+0(4).
*  lv_del_monat = lv_del_date+4(2).


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_FINISHED_PRODUCT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_finished_product .

  DATA: gt_slm   TYPE TABLE OF ty_slm,
        lt_slm   TYPE TABLE OF ty_slm,
        gs_slm   TYPE ty_slm,
        gt_matnr TYPE TABLE OF ty_matnr,
        gs_matnr TYPE ty_matnr,
        gs_wultb TYPE ty_wultb,
        gt_stpo  TYPE TABLE OF ty_stpo,
        gs_stpo  TYPE ty_stpo,
        wa_stpo  TYPE ty_stpo,
        lt_bom   TYPE TABLE OF ztco0043b_bom,
        gt_bom   TYPE TABLE OF ztco0043b_bom.


*取LCM料号
  SELECT DISTINCT
      werks,                             ""工厂
      matnr,                             ""物料编号
      bklas,                             ""评估分类
      beskz                             ""采购类型
  FROM ztco0043_slm
   WHERE bukrs = @p_bukrs
    AND lfgja = @pn_gjahr "当前年度
    AND lfmon = @pn_monat "当前月份
    AND bklas IN ('3000','7900','7920')
    AND matnr IN @s_matnr "物料
    AND werks IN @s_werks "工厂
  INTO TABLE @lt_slm.

  DELETE lt_slm[] WHERE werks IS INITIAL.
  DELETE lt_slm[] WHERE matnr IS INITIAL.
  DELETE lt_slm[] WHERE werks+0(2) = 'NV'."无价工厂不需要计算成品料号

  LOOP AT lt_slm INTO gs_slm.
    IF gs_slm-bklas = '7920' AND gs_slm-beskz = 'F'.
      APPEND gs_slm TO gt_slm.
    ELSEIF gs_slm-bklas = '3000' OR gs_slm-bklas = '7900'.
      APPEND gs_slm TO gt_slm.
    ENDIF.
  ENDLOOP.
  CLEAR:gs_slm.


*START ----------------- 仅提供IT测试使用 -------------------------------*
  DATA lv_test TYPE c VALUE ''.

  IF lv_test = 'X'.

    CLEAR gt_slm[].

    SELECT
        werks,                             ""工厂
        matnr                             ""物料编号
    FROM marc
     WHERE matnr IN @s_matnr "物料
      AND werks IN @s_werks "工厂
    INTO TABLE @gt_slm.

  ENDIF.
*END -------------------  仅提供IT测试使用 -------------------------------*

  gt_matnr[] = gt_slm[].

  IF gt_matnr[] IS INITIAL.
    lv_content-mtype = 'E'.
    lv_content-msg = 'SLM中没有符号条件的料号'(e03).
    PERFORM frm_give_msg.
  ENDIF.

  SORT gt_matnr BY werks matnr.

*用SQL递归
  CLEAR:gv_matnr[],gv_wultb[]."公共变量初始化
  gv_loopcount = 0. "循环次数初始化
  PERFORM frm_getdata_bom_sql TABLES gt_matnr. "反查BOM
  gv_loopcount = 0.


  CHECK gv_wultb[] IS NOT INITIAL.

*构造 组件物料 对应 多个主件物料
  LOOP AT gv_wultb INTO gs_wultb
       GROUP BY ( idnrk = gs_wultb-idnrk
                  iwerk = gs_wultb-iwerk )
                ASCENDING ASSIGNING FIELD-SYMBOL(<group_zwultb>).
    LOOP AT GROUP <group_zwultb> ASSIGNING FIELD-SYMBOL(<fs_zwultb>).
      gv_zwultb-idnrk = <fs_zwultb>-idnrk."组件物料
      gv_zwultb-iwerk = <fs_zwultb>-iwerk."组件工厂
      APPEND <fs_zwultb> TO gv_zwultb-datas.
    ENDLOOP.
    APPEND gv_zwultb.
    CLEAR gv_zwultb. "是清除工作区,不是内表
  ENDLOOP.
  CLEAR gs_wultb.

  SORT gv_zwultb[] BY idnrk iwerk.

*递归,找到具体料号的BOM
  LOOP AT gt_matnr INTO gs_matnr.
    CLEAR:gv_zmatnr[],gv_stpo[]. "公共变量初始化
    PERFORM frm_getdata_bom_recursion USING gs_matnr-matnr gs_matnr-werks.
    "  PERFORM frm_getdata_bom_value TABLES gv_stpo USING gs_matnr-matnr gs_matnr-werks.
    PERFORM frm_give_ztco0043b_bom TABLES gv_stpo lt_bom USING gs_matnr-matnr gs_matnr-werks.
    APPEND LINES OF lt_bom[] TO gt_bom[].
  ENDLOOP.
  CLEAR:gs_matnr.
  CLEAR:gv_matnr[],gv_zmatnr[],gv_stpo[],gv_wultb[],gv_zwultb[],lt_bom[].
  FREE:gv_matnr[],gv_zmatnr[],gv_stpo[],gv_wultb[],gv_zwultb[]."释放内存

*删除底表
  PERFORM frm_delete_ztco0043b_bom.

*更新底表
  PERFORM frm_update_ztco0043b_bom TABLES gt_bom.



ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_GETDATA_BOM_RECURSION
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LT_STPO
*&      --> GS_MATNR_MATNR
*&      --> GS_MATNR_WERKS
*&---------------------------------------------------------------------*
FORM frm_getdata_bom_recursion  USING pv_matnr TYPE matnr
                                      pv_werks TYPE werks_d.
  "此处不能和SQL一样卡控循环次数

  CHECK gv_zwultb[] IS NOT INITIAL.
  CHECK pv_matnr IS NOT INITIAL.
  CHECK pv_werks IS NOT INITIAL.


  DATA :lv_recursion TYPE c,
        lv_matnr     TYPE matnr,
        lv_werks     TYPE werks_d,
        gs_wultb     TYPE ty_wultb,
        pt_zmatnr    TYPE TABLE OF ty_zmatnr,
        gs_zmatnr    TYPE ty_zmatnr,
        gs_stpo      TYPE ty_stpo.


  lv_matnr = pv_matnr.
  lv_werks = pv_werks.

  READ TABLE gv_zwultb[] INTO DATA(wa_zwultb) WITH KEY idnrk = lv_matnr iwerk = lv_werks BINARY SEARCH.
  IF sy-subrc = 0.
    LOOP AT wa_zwultb-datas INTO gs_wultb.

      READ TABLE gv_zmatnr TRANSPORTING NO FIELDS WITH KEY idnrk = gs_wultb-idnrk          ""BOM组件物料
                                                           iwerk = gs_wultb-iwerk          ""BOM组件工厂
                                                           matnr = gs_wultb-matnr          ""主件物料
                                                           werks = gs_wultb-werks          ""主件工厂
                                                           BINARY SEARCH.
      IF sy-subrc NE 0."获取不匹配的
        gs_zmatnr-idnrk = gs_wultb-idnrk.          ""BOM组件物料
        gs_zmatnr-iwerk = gs_wultb-iwerk.          ""BOM组件工厂
        gs_zmatnr-matnr = gs_wultb-matnr.          ""主件物料
        gs_zmatnr-werks = gs_wultb-werks.          ""主件工厂"
        COLLECT gs_zmatnr INTO pt_zmatnr.

        MOVE-CORRESPONDING gs_wultb TO gs_stpo.
        APPEND gs_stpo TO gv_stpo.

        PERFORM frm_getdata_bom_recursion USING gs_zmatnr-matnr gs_zmatnr-werks.
      ELSE.
        lv_recursion = 'X'."如果重复则可能是出现了递归,暂时不提醒
      ENDIF.

    ENDLOOP.
  ENDIF.
  CLEAR:gs_wultb,wa_zwultb,gs_wultb,gs_zmatnr,gs_stpo.

  CHECK pt_zmatnr[] IS NOT INITIAL.

  APPEND LINES OF pt_zmatnr[] TO gv_zmatnr[]."传值给公共变量

  SORT gv_zmatnr BY idnrk iwerk matnr werks.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GETDATA_BOM_VALUE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LT_STPO
*&      --> WA_MATNR_MATNR
*&      --> WA_MATNR_WERKS
*&---------------------------------------------------------------------*
FORM frm_getdata_bom_value TABLES p_lt_stpo
                             USING pv_matnr TYPE matnr
                                   pv_werks TYPE werks_d.

  CHECK gv_zwultb[] IS NOT INITIAL.
  CHECK pv_matnr IS NOT INITIAL.
  CHECK pv_werks IS NOT INITIAL.

  DATA lt_stpo  TYPE TABLE OF ty_stpo.

  FIELD-SYMBOLS <fs_stpo> LIKE LINE OF lt_stpo.


  lt_stpo[] = p_lt_stpo[].

  LOOP AT lt_stpo ASSIGNING <fs_stpo>.
    <fs_stpo>-zmatnr = pv_matnr.          ""查询的物料
    <fs_stpo>-zwerks = pv_werks.          ""查询的工厂"
  ENDLOOP.

  p_lt_stpo[] = lt_stpo[].

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GETDATA_BOM_SQL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> GT_MATNR
*&---------------------------------------------------------------------*
*测试:料:31MULAN00125N-MB-B 工厂:ML10
*测试:料: 151-18A-0002-N 工厂: 05K1  主件:817-07178ZS001A-N
FORM frm_getdata_bom_sql TABLES p_lt_matnr.

  gv_loopcount = gv_loopcount + 1.
  IF gv_loopcount > 100. "上个保险,避免死循环
    RETURN.
  ENDIF.

  CHECK p_lt_matnr[] IS NOT INITIAL.


  DATA: kt_matnr TYPE HASHED TABLE OF ty_matnr WITH UNIQUE KEY werks matnr,
        lt_matnr TYPE TABLE OF ty_matnr,
        pt_matnr TYPE TABLE OF ty_matnr,
        gs_matnr TYPE ty_matnr,
        wa_matnr TYPE ty_matnr.

  DATA: gt_wultb TYPE TABLE OF ty_wultb,
        gs_wultb TYPE ty_wultb,
        lt_wultb TYPE TABLE OF ty_wultb,
        wa_wultb TYPE ty_wultb. "


  lt_matnr[] = p_lt_matnr[].

  LOOP AT lt_matnr INTO gs_matnr.
    wa_matnr-werks = gs_matnr-werks.          ""工厂
    wa_matnr-matnr = gs_matnr-matnr.          ""物料
    INSERT wa_matnr INTO TABLE kt_matnr.
  ENDLOOP.
  CLEAR:gs_matnr,wa_matnr.

  WITH +wta AS ( SELECT werks,matnr FROM @kt_matnr AS zdata )
  SELECT
      stpo~idnrk,                     ""BOM组件物料
      mast~werks AS iwerk,            ""BOM组件工厂
      mast~matnr,                     ""主件物料
      mast~werks,                     ""主件工厂
      mast~stlan,                     ""物料清单用途
      stas~datuv,                     ""有效起始日期
      zstas~datuv AS zdatuv,          ""有效截止日期
      mbew~bklas,                     ""评估类
      stpo~alpgr,                     ""替代组
      stpo~ewahr,                     ""使用概率
      stpo~menge,                     ""组件数量
      stko~bmeng                      ""基本数量"
  FROM mast "BOM 链接物料
  INNER JOIN stko "BOM 表头
          ON stko~stlty = 'M' "物料清单类别
         AND mast~stlnr = stko~stlnr"物料清单
         AND mast~stlal = stko~stlal"备选物料清单
         AND stko~lkenz IS INITIAL   "删除标识:取空值
         AND stko~stlst = '01'  "物料清单状态:取01,激活的
         AND stko~datuv LE @gv_ndate2 "有效期自小于等于当前月末日期
  INNER JOIN stas  "BOMs - 项选择 :BOM表头与BOM项目的关联关系
          ON stko~stlty = stas~stlty"物料清单类别
         AND stko~stlnr = stas~stlnr"物料清单
         AND stko~stlal = stas~stlal"备选物料清单
         AND stas~lkenz IS INITIAL "删除标识为空!
  LEFT JOIN stas AS zstas  "左链接 删除日期
          ON stas~stlty = zstas~stlty"物料清单类别
         AND stas~stlnr = zstas~stlnr"物料清单
         AND stas~stlal = zstas~stlal"备选物料清单
         AND stas~stlkn = zstas~stlkn"BOM 项目节点号
         AND zstas~lkenz IS NOT INITIAL "删除标识不为空!
  INNER JOIN stpo "BOM 项目
          ON stas~stlty = stpo~stlty"物料清单类别
         AND stas~stlnr = stpo~stlnr"物料清单
         AND stas~stlkn = stpo~stlkn"BOM 项目节点号
         AND stpo~datuv LE @gv_ndate2 "有效期自小于等于当前月末日期
         AND stpo~postp = 'L' " 条目类别、项目类别
         AND stpo~idnrk IS NOT INITIAL "组件
  INNER JOIN +wta AS a
          ON mast~werks = a~werks
         AND stpo~idnrk = a~matnr
  LEFT JOIN mbew "昆山立铠有BOM的料号不一定有评估分类
        ON mast~matnr = mbew~matnr ""主件物料
       AND mast~werks = mbew~bwkey "工厂
  WHERE mast~andat LE @gv_ndate2   ""创建日期小于等于当前月末日期
  INTO TABLE @lt_wultb.

  DELETE lt_wultb[] WHERE menge = 0."组件数量
  DELETE lt_wultb[] WHERE bmeng = 0."基本数量
  "如果不是失效,则有效截止日期是空。 删除  有效截止日期 小于等于 当前月末日期
  DELETE lt_wultb[] WHERE zdatuv IS NOT INITIAL AND zdatuv LE gv_ndate2.

  CHECK lt_wultb[] IS NOT INITIAL.


  SORT lt_wultb BY idnrk werks matnr werks stlan "BOM组件物料 BOM组件工厂 主件物料 主件工厂 物料清单用途
                   datuv DESCENDING "有效起始日期 降序
                   ewahr DESCENDING "使用概率 降序
                   menge bmeng."组件数量 基本数量

  "按照键值去除重复值
  LOOP AT lt_wultb INTO gs_wultb.
    wa_wultb = gs_wultb.
    AT NEW werks. "声明顺序:idnrk werks matnr werks
      APPEND wa_wultb TO gt_wultb.
    ENDAT.
  ENDLOOP.
  CLEAR:gs_wultb,wa_wultb.

  APPEND LINES OF gt_wultb[] TO gv_wultb[]."传值给公共变量

  "过滤掉重复查找的部分
  LOOP AT gt_wultb INTO gs_wultb.
    READ TABLE gv_matnr TRANSPORTING NO FIELDS WITH KEY werks = gs_wultb-werks
                                                        matnr = gs_wultb-matnr
                                                        BINARY SEARCH.
    IF sy-subrc NE 0."获取不匹配的
      gs_matnr-werks = gs_wultb-werks.          ""工厂
      gs_matnr-matnr = gs_wultb-matnr.          ""物料
      COLLECT gs_matnr INTO pt_matnr.
    ENDIF.
  ENDLOOP.
  CLEAR:gs_wultb,gs_matnr.

  SORT pt_matnr BY werks matnr.

  APPEND LINES OF pt_matnr[] TO gv_matnr[]."传值给公共变量

  SORT gv_matnr BY werks matnr.

  PERFORM frm_getdata_bom_sql TABLES pt_matnr. "反查BOM


ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_GIVE_MSG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_give_msg .

  CHECK lv_content-mtype IS NOT INITIAL.
  EXPORT lv_content TO MEMORY ID 'ZCOD0046B_BOM'.
  IF sy-tcode = 'SE38'."此程序主要还是给ZCOD0046调用,本身并没有T-code
    MESSAGE lv_content-msg TYPE lv_content-mtype.
  ENDIF.
  CLEAR lv_content.
  LEAVE LIST-PROCESSING.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GIVE_ZTCO0043B_BOM
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> GT_STPO
*&      --> GT_ZTCO0043B_BOM
*&      --> P_
*&---------------------------------------------------------------------*
FORM frm_give_ztco0043b_bom TABLES p_lt_stpo p_lt_bom
                              USING pv_matnr TYPE matnr
                                    pv_werks TYPE werks_d.

  CHECK p_lt_stpo[] IS NOT INITIAL.
  CLEAR p_lt_bom[].


  DATA: ls_gjahr TYPE bseg-gjahr,          ""会计年度
        ls_monat TYPE bkpf-monat,          ""会计期间
        ls_bukrs TYPE bseg-bukrs,          ""公司代码
        lt_stpo  TYPE TABLE OF ty_stpo,
        ls_stpo  TYPE ty_stpo,
        lt_bom   TYPE TABLE OF ztco0043b_bom,
        ls_bom   TYPE ztco0043b_bom.


  lt_stpo[] = p_lt_stpo[].
  ls_gjahr = pn_gjahr.
  ls_monat = pn_monat.
  ls_bukrs = p_bukrs.

  LOOP AT lt_stpo INTO ls_stpo WHERE bklas = '7900' OR bklas = '7920'.

    ls_bom-gjahr = ls_gjahr.            ""当前期间的会计年度
    ls_bom-monat = ls_monat.            ""当前期间(过账期间)
    ls_bom-bukrs = ls_bukrs.            ""公司代码
    ls_bom-zmatnr = pv_matnr.          ""查询的物料
    ls_bom-zwerks = pv_werks.          ""查询的工厂"
    ls_bom-werks = ls_stpo-werks.            ""工厂
    ls_bom-matnr = ls_stpo-matnr.            ""物料编号
    "ls_bom-QPA2 = ls_stpo-QPA2.              ""BOM表用量(QPA)
    APPEND ls_bom TO lt_bom.
  ENDLOOP.
  CLEAR:ls_stpo,ls_bom.

  "年度 月份 公司代码 查询工厂 查询物料 主件工厂 主件物料
  SORT lt_bom BY gjahr monat bukrs zwerks zmatnr werks matnr.

  "去重
  DELETE ADJACENT DUPLICATES FROM lt_bom COMPARING gjahr monat bukrs zwerks zmatnr werks matnr.

  p_lt_bom[] = lt_bom[].

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DELETE_ZTCO0043B_BOM
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_delete_ztco0043b_bom .

  DATA: ls_gjahr TYPE bseg-gjahr,          ""会计年度
        ls_monat TYPE bkpf-monat,          ""会计期间
        ls_bukrs TYPE bseg-bukrs.          ""公司代码

  ls_gjahr = pn_gjahr.
  ls_monat = pn_monat.
  ls_bukrs = p_bukrs.

  SELECT COUNT(*)
  FROM ztco0043b_bom
  WHERE bukrs = @ls_bukrs
   AND gjahr = @ls_gjahr
   AND monat = @ls_monat.

  CHECK sy-subrc = 0."先判断有值再删

  DELETE
  FROM ztco0043b_bom
  WHERE bukrs = @ls_bukrs
   AND gjahr = @ls_gjahr
   AND monat = @ls_monat.

  IF sy-subrc = 0.
    COMMIT WORK AND WAIT.
    MESSAGE s017(zfi01) ."执行成功
  ELSE.
    ROLLBACK WORK .
    MESSAGE s018(zfi01) DISPLAY LIKE 'E'."执行失败
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPDATE_ZTCO0043B_BOM
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> GT_ZTCO0043B_BOM
*&---------------------------------------------------------------------*
FORM frm_update_ztco0043b_bom  TABLES  p_lt_bom.

  CHECK p_lt_bom[] IS NOT INITIAL.

  DATA lt_bom TYPE TABLE OF ztco0043b_bom.

  lt_bom[] = p_lt_bom[].

  MODIFY ztco0043b_bom FROM TABLE lt_bom.

  IF sy-subrc = 0.
    COMMIT WORK AND WAIT.
    MESSAGE s017(zfi01) ."执行成功
  ELSE.
    ROLLBACK WORK .
    MESSAGE s018(zfi01) DISPLAY LIKE 'E'."执行失败
  ENDIF.

ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值