SAP-PP导入数据批量创建BOM

因博客内容缺失,无法提炼关键信息形成摘要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

(一)页面设计
 
导入模板
 

(二)处理代码
REPORT ZPPD012.
********************************************************************
*&程序名称/PROGRAM NAME         : ZPPD012
*&程序描述/PROGRAM DES.         : 导入数据批量创建BOM
*&摘要:         1、下载BOM计划模板
*&摘要:         2、读取上传的EXCEL数据并显示ALV
*&摘要:         3、点击按钮创建BOM
*&开发日期/DATE OF APP          : 2018-11-14
*&作者/AUTHOR                   : xiaoaman
*&完成日期/COMPLETION DATE      :
*&---------------------------------------------------------------------*


*&---------------------------------------------------------------------*
*     TABLES 声明
*&---------------------------------------------------------------------*
TABLES:SSCRFIELDS.
INCLUDE ZFRM_REPORT_REGISTER.

*&---------------------------------------------------------------------*
*     类型池声明
*&---------------------------------------------------------------------*
TYPE-POOLS: SLIS.

*&---------------------------------------------------------------------*
*     类型定义
*&---------------------------------------------------------------------*

TYPES :BEGIN OF TY_EXCEL,
*         MATNR  TYPE MARC-MATNR,                              "物料号
*         MAKTX  TYPE MAKT-MAKTX,                              "物料描述
*         WERKS  TYPE MARC-WERKS,                              "工厂
*         STLAN  TYPE MAST-STLAN,                              "BOM用途
*         STLAL  TYPE MAST-STLAL,                              "BOM版本
*         DATUV  TYPE STRING,                                  "起始有效日
*         BMENG  TYPE STRING,                                  "基本数量
*         POSNR  TYPE STPO-POSNR,                              "项目号
*         SORTF  TYPE STPO-SORTF,                              "项目文本
*         POSTP  TYPE STPO-POSTP,                              "项目类别
*         IDNRK  TYPE STPO-IDNRK,                              "组件物料号
*         ZMAKTX TYPE MAKT-MAKTX,                              "组件物料描述
*         AUSCH  TYPE STPO-AUSCH,                              "部件报废率
*         LGORT  TYPE STPO-LGORT,                              "生产订单的发货地点
**         MENGE  TYPE STRING,                                 "数量
*         MENGE  TYPE STRING,                                  "数量
*         MEINS  TYPE STPO-MEINS,                              "计量单位
*         ALPGR  TYPE STPO-ALPGR,                              "替代组
*         ALPRF  TYPE STPO-ALPRF,                              "替代优先级
*         EWAHR  TYPE STRING,                                  "使用可能性
         MATNR  TYPE MARC-MATNR,                               "物料号
         MAKTX  TYPE MAKT-MAKTX,                               "物料描述
         WERKS  TYPE MARC-WERKS,                               "工厂
         STLAN  TYPE MAST-STLAN,                               "BOM用途
         STLAL  TYPE MAST-STLAL,                               "BOM版本
         DATUV  TYPE STKO-DATUV,                               "起始有效日
         BMENG  TYPE STKO-BMENG,                               "基本数量
         POSNR  TYPE STPO-POSNR,                               "项目号
         SORTF  TYPE STRING,                                   "项目文本
*         SORTF  TYPE STPO-SORTF,                               "项目文本
         POSTP  TYPE STPO-POSTP,                               "项目类别
         IDNRK  TYPE STPO-IDNRK,                               "组件物料号
         ZMAKTX TYPE MAKT-MAKTX,                               "组件物料描述
         AUSCH  TYPE STPO-AUSCH,                               "部件报废率
         LGORT  TYPE STPO-LGORT,                               "生产订单的发货地点
*         MENGE  TYPE STRING,                                  "数量
         MENGE  TYPE STPO-MENGE,                               "数量
         MEINS  TYPE STPO-MEINS,                               "计量单位
         ALPGR  TYPE STPO-ALPGR,                               "替代组
         ALPRF  TYPE STPO-ALPRF,                               "替代优先级
         EWAHR  TYPE STRING,                                   "使用可能性
*         EWAHR  TYPE STPO-EWAHR,                              "使用可能性
       END OF TY_EXCEL.

TYPES: BEGIN OF TY_ALV,
         ZCBOX   TYPE C,
*         SANKA   TYPE C,                                      "成本核算相关项的标识符 20181203
         MTART   TYPE MARA-MTART,                             "物料类型 20181203
         FLAG    TYPE C,                                      "成功操作的数据
         MESSAGE TYPE C LENGTH 100,                           "消息
         TYPES   TYPE C.                                      "成功失败标识
        INCLUDE TYPE TY_EXCEL.
TYPES:
END OF TY_ALV.
TYPES :BEGIN OF TY_MARC,
         MATNR TYPE MARC-MATNR,                              "物料
         WERKS TYPE MARC-WERKS,                              "工厂


       END OF TY_MARC.
TYPES :BEGIN OF TY_MARA,
         MATNR TYPE MARA-MATNR,                               "物料
         MEINS TYPE MARA-MEINS,                               "单位
         MTART TYPE MARA-MTART,                               "BOM类别

       END OF TY_MARA.
*&---------------------------------------------------------------------*
*     全局变量声明
*&---------------------------------------------------------------------*
DATA: GT_ALV     TYPE TABLE OF TY_ALV,
      GT_ALV_TEM TYPE TABLE OF TY_ALV,
      GS_ALV     LIKE LINE OF  GT_ALV.
FIELD-SYMBOLS :<FS_FIELD> TYPE ANY.

DATA :GT_DATA TYPE STANDARD TABLE OF ALSMEX_TABLINE.
DATA: GT_UPDATA     TYPE TABLE OF TY_EXCEL,
      GT_UPDATA_TEM TYPE TABLE OF TY_EXCEL,
      GS_UPDATA     TYPE          TY_EXCEL.

DATA: GT_MARC  TYPE TABLE OF TY_MARC,              "父件物料是否存在
      GT_MARC1 TYPE TABLE OF TY_MARC,              "子件物料是否存在
      GS_MARC  TYPE          TY_MARC,
      GS_MARC1 TYPE          TY_MARC,
      GT_MEINS TYPE TABLE OF TY_MARA,              "组件单位&用途校验
      GS_MEINS TYPE          TY_MARA.

DATA: P_PATH TYPE LOCALFILE.
DATA: GS_FUNCTXT TYPE SMP_DYNTXT.
DATA :GV_ERROR TYPE C,
      GV_FLAG  TYPE C.                                  "以保存的数据不允许再次保存

*按钮生成
SELECTION-SCREEN FUNCTION KEY 1.

*&---------------------------------------------------------------------*
*     ALV 变量声明
*&---------------------------------------------------------------------*
DATA: GT_FCAT TYPE LVC_T_FCAT,
      GS_FCAT TYPE LVC_S_FCAT,
      GS_LAYO TYPE LVC_S_LAYO.
*&---------------------------------------------------------------------*
* 选择屏幕
*&---------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
PARAMETERS:   P_FILE1 TYPE RLGRAP-FILENAME,  "上载文件路径
              P_WERKS LIKE MARC-WERKS .
SELECTION-SCREEN END OF BLOCK B1.

*&---------------------------------------------------------------------*
* 初始化处理
*&---------------------------------------------------------------------*
INITIALIZATION.
**-----初始化数据
* 模板下载按钮信息
  GS_FUNCTXT-ICON_ID = ICON_CREATE.               "图标
  GS_FUNCTXT-ICON_TEXT = TEXT-002.                "模板下载
  SSCRFIELDS-FUNCTXT_01 = GS_FUNCTXT.
**&--------------------------------------------------------------------*
* 选择屏幕输出事件 (PBO)
**&--------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
*&----更改选择屏幕
  PERFORM FRM_CHANGE_SCREEN.
*&---------------------------------------------------------------------*
* 参数输入检查 (PAI)
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
*&----下载模板路径选择
  CASE SSCRFIELDS-UCOMM.
    WHEN'FC01'.
      PERFORM FRM_TEMP_EXCEL_GET USING 'ZPPD012_BOM'    "
                                   1.
    WHEN OTHERS.
  ENDCASE.

*&----上传文件选择
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE1.
  PERFORM FRM_GET_PC_FILENAME USING P_FILE1.
*&---------------------------------------------------------------------*
* 程序开始处理(GET DATA)
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM SAVE_REPORT_REGISTER.

**-----在此对选择条件进行判断
  PERFORM FRM_CHECK_SCREEN.
  CHECK GV_ERROR IS INITIAL.
*&----清空参数变量
  PERFORM FRM_CLEAR_DATA.
*&----数据上传&格式装换
  PERFORM FRM_UPLOAD_DATA .
*&----数据获取&ALV数据整理
  PERFORM FRM_GET_DATA.

  IF GT_ALV IS NOT INITIAL.
    PERFORM FRM_SET_FIELDCAT.  "设置ALV所要显示的列的相关设置
    PERFORM FRM_LAYOUT.     "设置ALV所要显示的样式
    PERFORM FRM_DISPLAY.  "ALV显示数据

  ELSE.
    MESSAGE S000(ZZZ01) WITH '没有有效处理的数据,请检查上传的模板!' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.


*&------------------------------------------------------------------
****END OF SELECTION(输出)
*&------------------------------------------------------------------
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*&      Form  FRM_GETDATA
*&---------------------------------------------------------------------*
*       text  获取整合数据
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
  DATA:LV_NUM_Y TYPE C,
       LV_SCOR  TYPE CHAR10.
*&----检验父件物料是否在工厂中存在
  CLEAR:GT_ALV_TEM.
  APPEND LINES OF GT_ALV TO GT_ALV_TEM.
  SORT GT_ALV_TEM BY WERKS MATNR.
  DELETE ADJACENT DUPLICATES FROM GT_ALV_TEM COMPARING WERKS MATNR.
  IF GT_ALV_TEM IS   NOT INITIAL.
    SELECT WERKS MATNR INTO CORRESPONDING FIELDS OF TABLE GT_MARC
      FROM MARC
      FOR ALL ENTRIES IN GT_ALV_TEM
      WHERE MATNR = GT_ALV_TEM-MATNR
      AND WERKS = GT_ALV_TEM-WERKS.
    SORT GT_MARC BY WERKS  MATNR  .
  ENDIF.
*&----检验子件物料是否在工厂中存在
  CLEAR:GT_ALV_TEM.
  APPEND LINES OF GT_ALV TO GT_ALV_TEM.
  SORT GT_ALV_TEM BY WERKS IDNRK.
  DELETE ADJACENT DUPLICATES FROM GT_ALV_TEM COMPARING WERKS IDNRK.
  IF GT_ALV_TEM IS   NOT INITIAL.
    SELECT WERKS MATNR  INTO CORRESPONDING FIELDS OF TABLE GT_MARC1
      FROM MARC
      FOR ALL ENTRIES IN GT_ALV_TEM
      WHERE MATNR = GT_ALV_TEM-IDNRK
      AND WERKS = GT_ALV_TEM-WERKS.
    SORT GT_MARC1 BY WERKS  MATNR  .
  ENDIF.
*&---子件单位的校验
  CLEAR:GT_ALV_TEM.
  APPEND LINES OF GT_ALV TO GT_ALV_TEM.
  SORT GT_ALV_TEM BY IDNRK .
  DELETE ADJACENT DUPLICATES FROM GT_ALV_TEM COMPARING IDNRK.
  IF GT_ALV_TEM IS NOT INITIAL.
    SELECT MATNR  MEINS MTART INTO TABLE GT_MEINS
      FROM MARA
      FOR ALL ENTRIES IN GT_ALV_TEM
      WHERE MATNR = GT_ALV_TEM-IDNRK.
    SORT GT_MEINS BY MATNR MEINS.
  ENDIF.
*&---S数据校验

  LOOP AT GT_ALV INTO GS_ALV.
    CLEAR:GS_ALV-MESSAGE.
*&---必输校验
    IF GS_ALV-MATNR IS INITIAL .
      GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入抬头物料编码'  .
    ENDIF.
    IF GS_ALV-WERKS IS INITIAL .
      GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入工厂'  .
    ENDIF.
    IF GS_ALV-STLAN IS INITIAL .
      GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入BOM用途'  .
    ELSEIF GS_ALV-STLAN = '1'.
*&---物料类型ZROH不支持BOM项目
      READ TABLE GT_MEINS INTO GS_MEINS WITH KEY MATNR = GS_ALV-IDNRK
                                                   MTART = 'ZROH'.
      IF SY-SUBRC = 0.
        GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'物料类型ZROH不支持BOM项目'  .
      ENDIF.
    ENDIF.
*&---财务核算标识 ADD BY HANDKF01 20181203 S
    READ TABLE GT_MEINS INTO GS_MEINS WITH KEY MATNR = GS_ALV-IDNRK.
    IF SY-SUBRC = 0 .
      GS_ALV-MTART = GS_MEINS-MTART.
    ENDIF.
    IF GS_ALV-STLAL IS INITIAL .
      GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入BOM版本'  .
    ENDIF.
    IF GS_ALV-DATUV IS INITIAL .
      GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入起始有效日'  .
    ELSE.
*----检查导入的开始日期是否正确
      DATA LV_DATE_INTERNAL TYPE SY-DATUM.
      TRY .
          CLEAR:LV_DATE_INTERNAL .
          LV_DATE_INTERNAL = GS_ALV-DATUV.
          CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
            EXPORTING
              DATE                      = LV_DATE_INTERNAL
            EXCEPTIONS
              PLAUSIBILITY_CHECK_FAILED = 1
              OTHERS                    = 2.
          IF SY-SUBRC <> 0.
            CONCATENATE GS_ALV-MESSAGE '导入的有效开始日期格式不正确' INTO GS_ALV-MESSAGE.
          ENDIF.
        CATCH CX_ROOT.
          CONCATENATE GS_ALV-MESSAGE '导入的有效开始日期格式不正确' INTO GS_ALV-MESSAGE.
      ENDTRY.
    ENDIF.
    IF GS_ALV-BMENG IS INITIAL .
      GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输基本数量'  .
    ELSE.
*----导入数量是否是数字的
      TRY .

          CLEAR:LV_NUM_Y.
          LV_SCOR =  GS_ALV-BMENG.
          IF LV_SCOR IS NOT INITIAL.
            PERFORM FRM_CHECK_NUMBER  USING LV_SCOR CHANGING LV_NUM_Y .
            IF LV_NUM_Y IS INITIAL.
              CONCATENATE GS_ALV-MESSAGE '导入的基本数量不是数字' INTO GS_ALV-MESSAGE.
*            ELSE.
*              GS_ALV-BMENG = GS_ALV-BMENG.
            ENDIF.
          ENDIF.
        CATCH CX_ROOT.
          CONCATENATE GS_ALV-MESSAGE '导入的基本数量不是数字' INTO GS_ALV-MESSAGE.
      ENDTRY.
    ENDIF.
    IF GS_ALV-POSNR IS INITIAL .
      GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入项目号'  .
    ENDIF.
    IF GS_ALV-SORTF IS INITIAL .
*      GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入项目文本'  .  "20191209 by rsz
      GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入"排序字符串"'.
    ENDIF.
    IF GS_ALV-POSTP IS INITIAL .
      GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入项目类别'  .
    ENDIF.
    IF GS_ALV-IDNRK IS INITIAL .
      GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入组件物料号'  .
    ENDIF.
    IF GS_ALV-MENGE IS INITIAL .
      GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入组件数量'  .
    ELSE.
*----导入数量是否是数字的
      TRY .

          CLEAR:LV_NUM_Y.
          LV_SCOR =  GS_ALV-MENGE.
          IF LV_SCOR IS NOT INITIAL.
            PERFORM FRM_CHECK_NUMBER  USING LV_SCOR CHANGING LV_NUM_Y .
            IF LV_NUM_Y IS INITIAL.
              CONCATENATE GS_ALV-MESSAGE '导入的基本数量不是数字' INTO GS_ALV-MESSAGE.
*            ELSE.
*              GS_ALV-BMENG = GS_ALV-BMENG.
            ENDIF.
          ENDIF.
        CATCH CX_ROOT.
          CONCATENATE GS_ALV-MESSAGE '导入的基本数量不是数字' INTO GS_ALV-MESSAGE.
      ENDTRY.
    ENDIF.

    READ TABLE GT_MARC INTO GS_MARC WITH KEY  WERKS = GS_ALV-WERKS
                                              MATNR = GS_ALV-MATNR
                                              BINARY SEARCH.
    IF SY-SUBRC NE 0.
      GS_ALV-MESSAGE = GS_ALV-MESSAGE && '父件物料在工厂' && GS_ALV-WERKS  && '中不存在'.
    ENDIF.
    READ TABLE GT_MARC1 INTO GS_MARC1 WITH KEY WERKS = GS_ALV-WERKS
                                               MATNR = GS_ALV-IDNRK
                                               BINARY SEARCH.
    IF SY-SUBRC NE 0.
      GS_ALV-MESSAGE = GS_ALV-MESSAGE && '组件物料在工厂' && GS_ALV-WERKS  && '中不存在'.
    ENDIF.
    IF GS_ALV-MESSAGE IS NOT INITIAL.
      GV_ERROR  = 'X'.
    ENDIF.

    IF GS_ALV-MEINS IS INITIAL .
      GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入计量单位'  .
    ELSE.
      READ TABLE GT_MEINS INTO GS_MEINS WITH KEY MATNR = GS_ALV-IDNRK
                                                 MEINS  = GS_ALV-MEINS
                                                   BINARY SEARCH.
      IF SY-SUBRC NE 0.
        GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'计量单位' && GS_ALV-MEINS && '在工厂' && GS_ALV-WERKS &&'中不存在'  .

      ENDIF.
    ENDIF.
    IF GS_ALV-ALPGR IS   NOT  INITIAL .    "替代组

      IF GS_ALV-ALPRF IS INITIAL .
        GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入替代优先级'  .
      ENDIF.
      IF GS_ALV-EWAHR IS INITIAL .
        GS_ALV-MESSAGE =  GS_ALV-MESSAGE &&'请输入使用可能性'  .
      ENDIF.
    ENDIF.

*    READ TABLE GT_MARC INTO GS_MARC WITH KEY  WERKS = GS_ALV-WERKS
*                                              MATNR = GS_ALV-MATNR
*                                              BINARY SEARCH.
*    IF SY-SUBRC NE 0.
*      GS_ALV-MESSAGE = GS_ALV-MESSAGE && '父件物料在工厂' && GS_ALV-WERKS  && '中不存在'.
*    ENDIF.
*    READ TABLE GT_MARC1 INTO GS_MARC1 WITH KEY WERKS = GS_ALV-WERKS
*                                               MATNR = GS_ALV-IDNRK
*                                               BINARY SEARCH.
*    IF SY-SUBRC NE 0.
*      GS_ALV-MESSAGE = GS_ALV-MESSAGE && '组件物料在工厂' && GS_ALV-WERKS  && '中不存在'.
*    ENDIF.
*    IF GS_ALV-MESSAGE IS NOT INITIAL.
*      GV_ERROR  = 'X'.
*    ENDIF.
    MODIFY GT_ALV FROM GS_ALV.
  ENDLOOP.
ENDFORM.                    " FRM_GET_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_EDIT_DATA
*&---------------------------------------------------------------------*
*       ALV 报表数据展示
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_EDIT_DATA .

ENDFORM.                    " FRM_EDIT_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SET_FIELDCAT .

*----------------------------------------------------------------------*
*字段名 字段描述 可编辑 关联字段 关联表 初始长度 NO_ZERO 选择框 初始长度
*----------------------------------------------------------------------*
  CLEAR: GT_FCAT,GS_FCAT.

  PERFORM SET_FEILDCAT USING :   'MATNR  '  '物料号       '  ''  ' MATNR   '  'MAST'  ''  'X'  '' '' .
  PERFORM SET_FEILDCAT USING :   'MAKTX  '  '物料描述     '  ''  ' MAKTX   '  'MAKT'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'WERKS  '  '工厂         '  ''  ' WERKS   '  'MAST'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'STLAN  '  'BOM用途      '  ''  ' STLAN   '  'MAST'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'STLAL  '  'BOM版本      '  ''  ' STLAL   '  'MAST'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'DATUV  '  '起始有效日   '  ''  ' DATUV   '  'STKO'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'BMENG  '  '基本数量     '  ''  ' BMENG   '  'STKO'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'POSNR  '  '项目号       '  ''  ' POSNR   '  'STPO'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'SORTF  '  '排序字符串     '  ''  ' SORTF   '  'STPO'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'POSTP  '  '项目类别     '  ''   'POSTP   '  'STPO'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'IDNRK  '  '组件物料号   '  ''  ' IDNRK   '  'STPO'  ''  'X'  '' '' .
  PERFORM SET_FEILDCAT USING :   'ZMAKTX '  '组件物料描述 '  ''  ' MAKTX   '  'MAKT'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'AUSCH '    '部件废品率 '  ''  ' AUSCH   '  'STPO'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'LGORT '  '生产仓储地点 '  ''  ' LGORT   '  'STPO'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'MENGE  '  '数量         '  ''  '    '  ''  ''  ''  '' '' .
*  PERFORM SET_FEILDCAT USING :   'MENGE  '  '数量         '  ''  ' MENGE   '  'STPO'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'MEINS  '  '计量单位     '  ''  ' MEINS   '  'STPO'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'ALPGR  '  '替代组       '  ''  ' ALPGR   '  'STPO'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'ALPRF  '  '替代优先级   '  ''  ' ALPRF   '  'STPO'  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'EWAHR  '  '使用可能性   '  ''  '    '  ''  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'MTART  '  '组件物料类型   '  ''  'MTART'  'MARA'  ''  ''  '' '' .


  PERFORM SET_FEILDCAT USING :   'TYPES'   '成功失败标识  '  ''  ''  ''  ''  ''  '' '' .
  PERFORM SET_FEILDCAT USING :   'MESSAGE' '消息文本'  ''  ''  ''  ''  ''  ''  ''.


ENDFORM.                    " FRM_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  FRM_LAYOUT
*&---------------------------------------------------------------------*
*       text  设置ALV所要显示的样式
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_LAYOUT .
  GS_LAYO-BOX_FNAME  = 'ZCBOX'."选择字段
  GS_LAYO-ZEBRA = 'X'.        " 设置每行的背景色为交替显示
  GS_LAYO-CWIDTH_OPT = 'X'.   " ALV输出时自动优化宽度
  GS_LAYO-SEL_MODE   = 'D'.   "行列可选
  GS_LAYO-NO_ROWINS  = 'X'.    "屏蔽键盘DELETE键
ENDFORM.                    " FRM_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY
*&---------------------------------------------------------------------*
*       text  ALV显示数据
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DISPLAY .
  DATA: LDF_GRID_SETTINGS TYPE LVC_S_GLAY.

  LDF_GRID_SETTINGS-EDT_CLL_CB = 'X'.    "刷新

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_GRID_SETTINGS          = LDF_GRID_SETTINGS
      I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
      I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'
*     IT_EVENTS                = GT_EVENT
      IS_LAYOUT_LVC            = GS_LAYO
      IT_FIELDCAT_LVC          = GT_FCAT
      I_SAVE                   = 'A'
    TABLES
      T_OUTTAB                 = GT_ALV.    "输出内容内表

  IF SY-SUBRC <> 0.
    "* Implement suitable error handling here
  ENDIF.

ENDFORM.                    " FRM_DISPLAY
*&---------------------------------------------------------------------*
*& FORM PF_STATUS_SET
*&---------------------------------------------------------------------*
*& TEXT 状态栏
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.

  SET TITLEBAR  'TITLE' .
  SET PF-STATUS 'STANDARD'.


ENDFORM.
*&---------------------------------------------------------------------*
*& FORM USER_COMMAND
*&---------------------------------------------------------------------*
*& TEXT 用户命令响应
*&---------------------------------------------------------------------*
*& -->  P1        TEXT
*& <--  P2        TEXT
*&---------------------------------------------------------------------*
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
                        RS_SELFIELD TYPE SLIS_SELFIELD .
  DATA: G_GRID TYPE REF TO CL_GUI_ALV_GRID.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = G_GRID.
*  CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY.
  CALL METHOD G_GRID->CHECK_CHANGED_DATA.
  RS_SELFIELD-REFRESH = 'X'.
  RS_SELFIELD-COL_STABLE = 'X'.
  RS_SELFIELD-ROW_STABLE = 'X'.

  CASE R_UCOMM.
    WHEN 'ZKEEP'.  "调用BAPI创建BOM
      IF GV_ERROR IS  INITIAL.
        PERFORM FRM_CREATE_BOM.
      ELSE.
        MESSAGE E001(00) WITH '请查看消息文本,更改模板数据后,重新上传数据!' .
      ENDIF.
    WHEN OTHERS.
  ENDCASE.
*  MESSAGE ' ' TYPE 'S'.
  RS_SELFIELD-REFRESH = 'X'.
ENDFORM.                    "user_command

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_PC_FILENAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_P_FILE  text
*----------------------------------------------------------------------*
FORM FRM_GET_PC_FILENAME  USING    P_P_FILE.

  DATA: LT_FILE TYPE FILETABLE,
        L_RC    TYPE I.
* 打开文件夹
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    CHANGING
      FILE_TABLE              = LT_FILE
      RC                      = L_RC
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      NOT_SUPPORTED_BY_GUI    = 4
      OTHERS                  = 5.
  IF L_RC = 1.
*   路径取得
    READ TABLE LT_FILE INTO P_P_FILE INDEX 1.
  ENDIF.
ENDFORM.                    " FRM_GET_PC_FILENAME

*&---------------------------------------------------------------------*
*&      Form  FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*      将EXCEL数据转换至内表中
*----------------------------------------------------------------------*
*      -->P_GT_DATA  text
*----------------------------------------------------------------------*

FORM FRM_UPLOAD_DATA  .

  DATA: LS_DATA TYPE ALSMEX_TABLINE.                  "导入数据结构

  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      FILENAME                = P_FILE1
      I_BEGIN_COL             = 2
      I_BEGIN_ROW             = 5
      I_END_COL               = '26'
      I_END_ROW               = '65535'
    TABLES
      INTERN                  = GT_DATA
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.

*&----内表数据填充
  LOOP AT  GT_DATA INTO LS_DATA .
    CASE  LS_DATA-COL.
      WHEN '0001'.
        GS_UPDATA-MATNR = LS_DATA-VALUE.          "物料
      WHEN '0002'.
        GS_UPDATA-MAKTX = LS_DATA-VALUE.          "物料描述
      WHEN '0003'.
        GS_UPDATA-WERKS = LS_DATA-VALUE.          "工厂
      WHEN '0004'.
        GS_UPDATA-STLAN = LS_DATA-VALUE.          "BOM用途
      WHEN '0005'.
        GS_UPDATA-STLAL = LS_DATA-VALUE.          "BOM版本
      WHEN '0006'.
        GS_UPDATA-DATUV = LS_DATA-VALUE.          "起始有效日
      WHEN '0007'.
        GS_UPDATA-BMENG = LS_DATA-VALUE.          "基本数量
      WHEN '0008'.
        GS_UPDATA-POSNR = LS_DATA-VALUE.          "项目号
      WHEN '0009'.

        GS_UPDATA-SORTF = LS_DATA-VALUE.          "项目文本

        REPLACE '"'  IN GS_UPDATA-SORTF WITH ''.
        REPLACE '“'  IN GS_UPDATA-SORTF WITH ''.
        REPLACE '"'  IN GS_UPDATA-SORTF WITH ''.
        REPLACE '“'  IN GS_UPDATA-SORTF WITH ''.
        CONDENSE GS_UPDATA-SORTF NO-GAPS.
      WHEN '0010'.
        GS_UPDATA-POSTP = LS_DATA-VALUE.          "项目类别
      WHEN '0011'.
        GS_UPDATA-IDNRK = LS_DATA-VALUE.          "组件物料号
      WHEN '0012'.
        GS_UPDATA-ZMAKTX = LS_DATA-VALUE.          "组件物料描述
      WHEN '0013'.
        GS_UPDATA-AUSCH = LS_DATA-VALUE.          "部件报废率
      WHEN '0014'.
        GS_UPDATA-LGORT = LS_DATA-VALUE.          "生产仓储地点
      WHEN '0015'.
        GS_UPDATA-MENGE = LS_DATA-VALUE.          "数量
      WHEN '0016'.
        GS_UPDATA-MEINS = LS_DATA-VALUE.          "计量单位
      WHEN '0017'.
        GS_UPDATA-ALPGR = LS_DATA-VALUE.          "替代组
      WHEN '0018'.
        GS_UPDATA-ALPRF = LS_DATA-VALUE.          "替代优先级
      WHEN '0019'.
        GS_UPDATA-EWAHR = LS_DATA-VALUE.          "使用可能性

      WHEN OTHERS.
    ENDCASE.
    AT END OF ROW.

      APPEND GS_UPDATA TO GT_UPDATA.
      CLEAR:GS_UPDATA.
    ENDAT.

  ENDLOOP.
*  *&---数据格式处理
  LOOP AT  GT_UPDATA INTO GS_UPDATA.
*&---加0
    GS_UPDATA-MATNR = |{ GS_UPDATA-MATNR ALPHA = IN  } | .
    GS_UPDATA-POSNR = |{ GS_UPDATA-POSNR ALPHA = IN  } | .
    GS_UPDATA-IDNRK = |{ GS_UPDATA-IDNRK ALPHA = IN  } | .
*&---单位转化
    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
      EXPORTING
        INPUT          = GS_UPDATA-MEINS
        LANGUAGE       = SY-LANGU
      IMPORTING
        OUTPUT         = GS_UPDATA-MEINS
      EXCEPTIONS
        UNIT_NOT_FOUND = 1
        OTHERS         = 2.
    IF SY-SUBRC <> 0.
* Implement suitable error handling here
    ENDIF.
    MOVE-CORRESPONDING GS_UPDATA TO GS_ALV.
    APPEND GS_ALV TO GT_ALV.
  ENDLOOP.

ENDFORM. " FRM_UPLOAD_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_CLEAR_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CLEAR_DATA .
*
  CLEAR:GT_ALV_TEM,
        GT_ALV,
        GS_ALV,
        GT_DATA,
        GT_UPDATA,
        GT_UPDATA_TEM,
        GS_UPDATA,
        GV_ERROR,
        GT_MARC ,
        GT_MARC1,
        GS_MARC ,
        GS_MARC1,
        GT_MEINS,
        GS_MEINS.

ENDFORM.                    " FRM_CLEAR_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_PATH
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GET_PATH CHANGING P_P_PATH .
  DATA: OBJFILE TYPE REF TO CL_GUI_FRONTEND_SERVICES.
  DATA: PICKEDFOLDER TYPE STRING.
  DATA: INITIALFOLDER TYPE STRING.

  IF SY-BATCH IS INITIAL.
    CREATE OBJECT OBJFILE.

    IF NOT P_P_PATH IS INITIAL.
      INITIALFOLDER = P_P_PATH.
    ELSE.
      OBJFILE->GET_TEMP_DIRECTORY( CHANGING TEMP_DIR = INITIALFOLDER
                                   EXCEPTIONS CNTL_ERROR = 1
                                             ERROR_NO_GUI = 2
                                             NOT_SUPPORTED_BY_GUI = 3 ).
    ENDIF.

    OBJFILE->DIRECTORY_BROWSE( EXPORTING INITIAL_FOLDER = INITIALFOLDER
                               CHANGING SELECTED_FOLDER = PICKEDFOLDER
                               EXCEPTIONS CNTL_ERROR = 1
                                          ERROR_NO_GUI = 2
                                          NOT_SUPPORTED_BY_GUI = 3 ).

    IF SY-SUBRC = 0.
      P_P_PATH = PICKEDFOLDER.
    ELSE.
      WRITE: / 'An error has occured picking a folder'.
    ENDIF.

  ENDIF.
ENDFORM.                    " FRM_GET_PATH
*&---------------------------------------------------------------------*
*&      Form  FRM_DOWN_EXCEL
*&---------------------------------------------------------------------*
*       模板下载
*----------------------------------------------------------------------*
*  -->  P_OBJID      程序ID
*  <--  P_FLG        模板标示
*----------------------------------------------------------------------*
FORM FRM_TEMP_EXCEL_GET USING P_OBJID TYPE WWWDATA-OBJID
                              P_FLG   TYPE I.
  DATA:
    LV_OBJDATA  TYPE WWWDATATAB,
    LV_RC       TYPE SY-SUBRC,                    "返回值
    LV_FULLPATH TYPE STRING,                      "文件路径
    LV_FNAME    TYPE RLGRAP-FILENAME.             "文件路径

* 下载路径取得
  PERFORM FRM_GET_FILE_NAME USING P_FLG           "模板标示
                         CHANGING LV_FULLPATH.    "文件路径

  CONCATENATE LV_FULLPATH '' INTO LV_FNAME.
  SELECT SINGLE
         RELID                                    "IMPORT/EXPORT 记录中的区域
         OBJID
    FROM WWWDATA
    INTO CORRESPONDING FIELDS OF LV_OBJDATA
   WHERE RELID = 'MI'
     AND OBJID = P_OBJID .

  IF SY-SUBRC <> 0 OR LV_OBJDATA-OBJID = SPACE.
    MESSAGE '文件不存在!' TYPE 'S' DISPLAY LIKE 'E'.
  ELSE.
*   模板下载
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        KEY         = LV_OBJDATA                  "
        DESTINATION = LV_FNAME                    "文件路径
      IMPORTING
        RC          = LV_RC                       "返回值
      CHANGING
        TEMP        = LV_FNAME.                   "文件路径
    IF LV_RC <> 0.
      MESSAGE '文件下载失败!' TYPE 'S' DISPLAY LIKE 'E' .
    ENDIF.
  ENDIF.

ENDFORM.                    " TEMP_EXCEL_GET
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FILE_NAME
*&---------------------------------------------------------------------*
*       下载路径取得
*----------------------------------------------------------------------*
*      -->P_FLG           模板标示
*      <--P_L_FULLPATH    文件路径
*----------------------------------------------------------------------*
FORM FRM_GET_FILE_NAME  USING P_FLG
                     CHANGING P_FULLPATH.
  DATA: L_FILENAME TYPE STRING,                   "文件路径名
        L_NAME     TYPE STRING,                   "文件名
        L_PATH     TYPE STRING,                   "文件路径
        L_FULLPATH TYPE STRING.                   "文件路径

  CLEAR P_FULLPATH.

  CASE P_FLG.
    WHEN  1.
      L_NAME = 'BOM批量导入模板'.
*    WHEN  2.
*      L_NAME = '组件分配模板'.
    WHEN OTHERS.
  ENDCASE.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    EXPORTING
      DEFAULT_EXTENSION    = '.xls'
      DEFAULT_FILE_NAME    = L_NAME
      PROMPT_ON_OVERWRITE  = 'X'
      FILE_FILTER          = 'Excel|*.xls;'
    CHANGING
      FILENAME             = L_FILENAME
      PATH                 = L_PATH
      FULLPATH             = L_FULLPATH
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
          WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  P_FULLPATH = L_FULLPATH.
ENDFORM.                    " FRM_GET_FILE_NAME

*&---------------------------------------------------------------------*
*&      Form  SET_FEILDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0001   字段名称
*      -->P_0002   字段描述
*      -->P_0003   可编辑
*      -->P_0004   关联字段
*      -->P_0005   关联表
*      -->P_0006   初始长度
*      -->P_0007   NO_ZERO
*      -->P_0008   选择框
*----------------------------------------------------------------------*


FORM SET_FEILDCAT USING VALUE(P_0001)
                            VALUE(P_0002)
                            VALUE(P_0003)
                            VALUE(P_0004)
                            VALUE(P_0005)
                            VALUE(P_0006)
                            VALUE(P_0007)
                            VALUE(P_0008)
                            VALUE(P_0009).
  GS_FCAT-JUST      = 'L'."左对齐
  GS_FCAT-FIELDNAME = P_0001.
  GS_FCAT-COLTEXT   = P_0002.
  GS_FCAT-SELTEXT   = P_0002.
  GS_FCAT-EDIT      = P_0003.
  GS_FCAT-REF_FIELD = P_0004.
  GS_FCAT-REF_TABLE = P_0005.
  GS_FCAT-INTLEN    = P_0006.
  GS_FCAT-NO_ZERO   = P_0007.
  GS_FCAT-CHECKBOX  = P_0008.
  GS_FCAT-OUTPUTLEN = P_0009.
  APPEND GS_FCAT TO GT_FCAT.
ENDFORM. " SET_FEILDCAT
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_ZPLNMG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GS_ALV_ZDATE+6(2)  text
*----------------------------------------------------------------------*
FORM FRM_GET_ZPLNMG  USING    P_DATA
      P_LW_ALV_STRUCT TYPE ANY
     P_MENGE .

  DATA : LV_FIELD TYPE STRING.
  LV_FIELD = 'ZPLNMG' && P_DATA.
  ASSIGN COMPONENT  LV_FIELD OF STRUCTURE P_LW_ALV_STRUCT  TO <FS_FIELD>.
  IF <FS_FIELD> IS ASSIGNED.
*    <FS_FIELD> =
    <FS_FIELD> = P_MENGE.
  ENDIF.
ENDFORM.                    " FRM_GET_ZPLNMG
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CHECK_SCREEN .
  DATA:LV_STRING TYPE STRING.
  IF P_WERKS IS INITIAL.
    LV_STRING =  '请输入工厂!!'.
  ENDIF.

  IF LV_STRING IS NOT INITIAL.
    GV_ERROR = 'X'.
    MESSAGE S000(ZZZ01) WITH LV_STRING DISPLAY LIKE 'E'.
  ENDIF.
ENDFORM.                    " FRM_CHECK_SCREEN
*&---------------------------------------------------------------------*
*&      Form  FRM_CHANGE_SCREEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CHANGE_SCREEN .
  LOOP AT SCREEN.

    IF SCREEN-NAME = 'P_WERKS'.
      SCREEN-REQUIRED = 2.
    ENDIF.

    MODIFY SCREEN.
  ENDLOOP.
ENDFORM.                    " FRM_CHANGE_SCREEN
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_BOM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CREATE_BOM .
  DATA :LS_ECSIN  TYPE          CSIN,
        LS_ESTKOB TYPE          STKOB,
        LS_ESTZUB TYPE          STZUB,
        LS_ASTLNR TYPE          STZUB-STLNR,
        LT_STPOB  TYPE TABLE OF STPOB,
        LS_STPOB  TYPE          STPOB.
  DATA : LT_HEAD TYPE TABLE OF TY_ALV,
         LS_HEAD TYPE          TY_ALV,
         LT_ITEM TYPE TABLE OF TY_ALV,
         LS_ITEM TYPE          TY_ALV.
  DATA:  LV_SORTF   TYPE SORTP,
         LV_MESSAGE TYPE STRING.
  APPEND LINES OF GT_ALV TO LT_HEAD.
  SORT LT_HEAD BY MATNR WERKS STLAN  STLAL DATUV .
  DELETE ADJACENT DUPLICATES FROM LT_HEAD COMPARING MATNR WERKS STLAN  STLAL DATUV .
  APPEND LINES OF GT_ALV TO LT_ITEM.
  LOOP AT  LT_HEAD INTO LS_HEAD WHERE FLAG IS INITIAL .
*    IF LS_HEAD-FLAG = 'X'.
*        MESSAGE S000(ZZZ01) WITH '已创建成功的数据不允许再次操作' DISPLAY LIKE 'E'.
*    ENDIF.
    CLEAR: LS_ECSIN,LS_ESTKOB,LS_ESTZUB,LS_ASTLNR,LT_STPOB, LS_STPOB,LV_MESSAGE.
*&----BAPI头信息
    LS_ECSIN-DATUV       =     LS_HEAD-DATUV.                 "有效起始日期
    LS_ECSIN-EMENG       =     LS_HEAD-BMENG.                 "需求数量/BOM基本数量
    LS_ECSIN-MATNR       =     LS_HEAD-MATNR.                 "物料号
    LS_ECSIN-WERKS       =     LS_HEAD-WERKS.                 "工厂
    LS_ECSIN-STLAN       =     LS_HEAD-STLAN.                 "BOM用途
    LS_ECSIN-STLAL       =     LS_HEAD-STLAL.                 "可选BOM/BOM版本
    LS_ECSIN-STLTY       =     'M'.                           "M:物料BOM  S:标准BOM E:设备BOM  K:订单 BOM

    LS_ESTKOB-STLTY      =     'M'.                           "M:物料BOM  S:标准BOM E:设备BOM  K:订单 BOM

*    LS_ESTKOB-DATUV      =     LS_ITEM-DATUV.                 "有效起始日期
*    LS_ESTKOB-ANDAT      =     SY-DATUM.                      "更改日期
*    LS_ESTKOB-AENAM      =     SY-UNAME.                      "对象更改人员的名称
**
*    SELECT SINGLE MEINS INTO  LS_ESTKOB-BMEIN FROM MARA WHERE MATNR = LS_HEAD-MATNR.
*    LS_ESTKOB-BMEIN      =    LV_MEINS  .                     "BOM基本单位
    LS_ESTKOB-BMENG       =    LS_HEAD-BMENG.                  "BOM基本数量
    LS_ESTZUB-STLAN       =    LS_HEAD-STLAN.                  "BOM类别
*    LS_ESTZUB-ZTEXT          =     'testsld'.                  "BOM文本
    LOOP AT LT_ITEM INTO LS_ITEM WHERE MATNR = LS_HEAD-MATNR
                                    AND WERKS = LS_HEAD-WERKS
                                   AND STLAL = LS_HEAD-STLAL
                                    AND STLAN = LS_HEAD-STLAN
                                    AND DATUV = LS_HEAD-DATUV.
      CLEAR:LS_STPOB.
      LV_SORTF = LS_ITEM-SORTF.
*      LS_STPOB-STLTY       =    'M'.
      LS_STPOB-DATUV       =    LS_ITEM-DATUV.
      LS_STPOB-IDNRK       =    LS_ITEM-IDNRK.                "组件物料
      LS_STPOB-POSTP       =    LS_ITEM-POSTP.                "项目类别
      LS_STPOB-POSNR       =    LS_ITEM-POSNR.                "项目行号
      LS_STPOB-SORTF       =    LV_SORTF.                     "排序字符串/项目文本
      LS_STPOB-MEINS       =    LS_ITEM-MEINS.                "单位
      LS_STPOB-MENGE       =    LS_ITEM-MENGE.                "数量
      IF LS_ITEM-ALPGR IS NOT INITIAL .                       "替代组
        LS_STPOB-STLTY       =    'M'.
        LS_STPOB-ALPGR       =    LS_ITEM-ALPGR.               "替代组
        LS_STPOB-ALPST       =    '2'.                         "1、手工维护/按用途可能性;2、100% 检查
        LS_STPOB-ALPRF       =    LS_ITEM-ALPRF.               "替代优先级
        LS_STPOB-EWAHR       =    LS_ITEM-EWAHR.               "使用可能性
      ELSE.
        CLEAR:LS_STPOB-EWAHR.
      ENDIF.


      LS_STPOB-AUSCH       =    LS_ITEM-AUSCH.                "部件报废率
      LS_STPOB-LGORT       =    LS_ITEM-LGORT.                "生产订单的发货地点
*&---财务成本核算相关 ADD BY HANDKF01 20181203 S
*     物料类型为Z006取消成本核算
      IF LS_ITEM-MTART = 'Z006' .
        LS_STPOB-SANKA = ' '.
        LS_STPOB-SANFE = 'X'.
      ELSE.
        LS_STPOB-SANKA = 'X'.
        LS_STPOB-SANFE = 'X'.                               "20190116
      ENDIF.

*&---财务成本核算相关 ADD BY HANDKF01 20181203 E

      APPEND LS_STPOB TO LT_STPOB.
    ENDLOOP.

    IF LT_STPOB IS NOT INITIAL .
      DO 100 TIMES.
        CALL FUNCTION 'ENQUEUE_ECMASTE'
          EXPORTING
            MODE_MAST      = 'X'
*           MANDT          = SY-MANDT
            MATNR          = LS_ECSIN-MATNR
            WERKS          = LS_ECSIN-WERKS
            STLAN          = LS_ECSIN-STLAN
          EXCEPTIONS
            FOREIGN_LOCK   = 1
            SYSTEM_FAILURE = 2
            OTHERS         = 3.
        IF SY-SUBRC <> 0.
          WAIT UP TO '0.1' SECONDS.
        ELSE.
          CALL FUNCTION 'DEQUEUE_ECMASTE'
            EXPORTING
              MODE_MAST = 'X'
*             MANDT     = SY-MANDT
              MATNR     = LS_ECSIN-MATNR
              WERKS     = LS_ECSIN-WERKS
              STLAN     = LS_ECSIN-STLAN.
          EXIT.
        ENDIF.
      ENDDO.

      CALL FUNCTION 'CSAI_BOM_CREATE'
        EXPORTING
          ECSIN   = LS_ECSIN
          ESTKOB  = LS_ESTKOB
          ESTZUB  = LS_ESTZUB
*         FL_NO_CHANGE_DOC         = ' '
*         FL_COMMIT_AND_WAIT       = ' '
*         FL_NO_COMMIT_WORK        = ' '
*         FL_ALE  = ' '
*         FL_DEFAULT_VALUES        = 'X'
        IMPORTING
*         FL_WARNING               =
          ASTLNR  = LS_ASTLNR
        TABLES
          T_STPOB = LT_STPOB
        EXCEPTIONS
          ERROR   = 1
          OTHERS  = 2.
      IF SY-SUBRC <> 0.
        CALL FUNCTION 'MESSAGE_TEXT_BUILD'
          EXPORTING
            MSGID               = SY-MSGID
            MSGNR               = SY-MSGNO
            MSGV1               = SY-MSGV1
            MSGV2               = SY-MSGV2
            MSGV3               = SY-MSGV3
            MSGV4               = SY-MSGV4
          IMPORTING
            MESSAGE_TEXT_OUTPUT = LV_MESSAGE.
      ELSE.
        LV_MESSAGE = 'BOM单号:' && LS_ASTLNR && '创建成功'.
        COMMIT WORK AND WAIT .
      ENDIF.
    ENDIF.
*&----更新ALV界面
    LOOP AT  GT_ALV INTO GS_ALV WHERE MATNR = LS_HEAD-MATNR
                                   AND WERKS = LS_HEAD-WERKS
                                  AND STLAL = LS_HEAD-STLAL
                                   AND STLAN = LS_HEAD-STLAN
                                   AND DATUV = LS_HEAD-DATUV.

      GS_ALV-MESSAGE = LV_MESSAGE.
      IF LS_ASTLNR IS NOT INITIAL .
        GS_ALV-TYPES = 'S'.
        GS_ALV-FLAG = 'X'.
      ELSE.
        GS_ALV-TYPES = 'E'.
      ENDIF.
      MODIFY GT_ALV FROM GS_ALV.
    ENDLOOP.
  ENDLOOP.
ENDFORM.                    " FRM_CREATE_BOM
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_NUMBER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LV_SCOR  text
*      <--P_LV_NUM_Y  text
*----------------------------------------------------------------------*
FORM FRM_CHECK_NUMBER USING LV_SCORE TYPE CHAR10 CHANGING LV_NUM TYPE C.


  CLEAR LV_NUM.
  CALL FUNCTION 'HRIQ_CHECK_IS_NUMBER'
    EXPORTING
      IP_SCORE  = LV_SCORE
    IMPORTING
      EP_IS_NUM = LV_NUM.
ENDFORM.                    " FRM_CHECK_NUMBER

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小啊曼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值