生产投料的物料凭证过账

1. 依据MAKT-MATNR=发料编码 AND MAKT-SPRAS=ZH 获取MAKT-MAKTX

2. 根据MARA-MATNR=发料编码获取MARA-MEINS

3. 移动类型:若发料数量>0,显示261,若发料数量<0,显示262,若发料数量=0,此处显示空值

4. 根据T001L-WERKS=工厂 AND T001L-LGORT=库存地点 获取T001L-LGOBE库存地点描述

5. 若订单状态为空 或 发料数量=0 则分别显示E,否则通过测试模式调用BAPI获取反馈消息类型。

6. 若订单状态为空 或 发料数量=0 则分别显示“订单状态不允许发料”“发料数量不得为空”,否则通过测试模式调用BAPI获取反馈消息文本。

7.读取生产订单状态,若状态为REL(I0002)和TECO(I00045)两个状态存在且激活,

若状态为REL,直接导入

若状态为TECO,判断生产订单技术性关闭日期:AUFK-IDAT2,若日期与当前系统日期在同一自然月,调BAPI取消生产订单技术性关闭,执行投料创建物料凭证,完成后调BAPI重新技术性关闭;若日期与系统当前日期不在同一自然月,报消息:该生产订单于“AUFK-IDAT2”关闭,不可投料。

 

    1. 示例代码

*&---------------------------------------------------------------------*
*& Report ZMMF039
*&---------------------------------------------------------------------*
*&*描述: 生产投料(计划外)物料凭证导入
*作者:  HANDZK
*日期:  2017/10/09
*&---------------------------------------------------------------------*
REPORT ZMMF039 NO STANDARD PAGE HEADING.

*&---------------------------------------------------------------------*
*& TYPE-POOLS
*&---------------------------------------------------------------------*
TYPE-POOLSSLIS,TRUXS,ABAP.

*&---------------------------------------------------------------------*
*& TABLES
*&---------------------------------------------------------------------*
TABLESSSCRFIELDS.

*&---------------------------------------------------------------------*
*& EXCEL TYPES
*&---------------------------------------------------------------------*
TYPESBEGIN OF TY_EXCEL,
         AUFNR TYPE AUFK-AUFNR"订单号
         MATNR TYPE MARA-MATNR"发料编码
         MENGE TYPE MSEG-MENGE"发料数量
         LGORT TYPE T001L-LGORT"库存地点
       END OF TY_EXCEL.

DATAGT_EXCEL TYPE TABLE OF TY_EXCEL,
      GS_EXCEL LIKE LINE OF GT_EXCEL.

*&---------------------------------------------------------------------*
*& ALV TYPES
*&---------------------------------------------------------------------*
TYPESBEGIN OF TY_ALV,
         AUFNR      TYPE AUFK-AUFNR"订单号
         WERKS      TYPE AUFK-WERKS"工厂
         NAME1      TYPE T001W-NAME1"工厂名称
         ZCPWL      TYPE AFPO-MATNR"成品物料
         ZCPMC      TYPE MAKT-MAKTX"成品名称
         TXT04      TYPE TJ02T-TXT04"订单状态
         MATNR      TYPE MSEG-MATNR"发料编码
         MAKTX      TYPE MAKT-MAKTX"发料名称
         MENGE      TYPE MSEG-MENGE"发料数量
         MEINS      TYPE MARA-MEINS"单位
         ZYDLX(3)   TYPE C"移动类型
         LGORT      TYPE T001L-LGORT"库位
         LGOBE      TYPE T001L-LGOBE"库位地点描述
         IDAT2      TYPE AUFK-IDAT2,
         OBJNR      TYPE JEST-OBJNR,
         STATU      TYPE JEST-STAT,
         MSGTP      TYPE C"消息类型
         MSGTX(100TYPE C"消息文本
       END OF TY_ALV.

DATA:      GT_ALV TYPE TABLE OF TY_ALV,
      GS_ALV LIKE LINE OF GT_ALV.

*&---------------------------------------------------------------------*
*& MAKT 物料描述
*&---------------------------------------------------------------------*
TYPESBEGIN OF TY_MAKT,
         MATNR TYPE MAKT-MATNR,
         MAKTX TYPE MAKT-MAKTX,
       END OF TY_MAKT.

DATAGT_MAKT TYPE TABLE OF TY_MAKT,
      GS_MAKT LIKE LINE OF GT_MAKT.

*&---------------------------------------------------------------------*
*& T001W 工厂名称   T001L  库位名称
*&---------------------------------------------------------------------*
TYPESBEGIN OF TY_T001W,
         WERKS TYPE T001W-WERKS,
         NAME1 TYPE T001W-NAME1,
       END OF TY_T001W.

DATAGT_T001W TYPE TABLE OF TY_T001W,
      GS_T001W LIKE LINE OF GT_T001W.

*&---------------------------------------------------------------------*
*& MARA 单位
*&---------------------------------------------------------------------*
TYPESBEGIN OF TY_MARA,
         MATNR TYPE MARA-MATNR,
         MEINS TYPE MARA-MEINS,
       END OF TY_MARA.

DATAGT_MARA TYPE TABLE OF TY_MARA,
      GS_MARA LIKE LINE OF GT_MARA.

*&---------------------------------------------------------------------*
*& WERKS
*&---------------------------------------------------------------------*
TYPESBEGIN OF TY_AUFK,
         AUFNR TYPE AUFK-AUFNR,
         OBJNR TYPE AUFK-OBJNR,
         WERKS TYPE AUFK-WERKS,
         IDAT2 TYPE AUFK-IDAT2,
       END OF TY_AUFK.

DATAGT_AUFK TYPE TABLE OF TY_AUFK,
      GS_AUFK LIKE LINE OF GT_AUFK.

*&---------------------------------------------------------------------*
*& AFPO-MATNR 成品物料
*&---------------------------------------------------------------------*
TYPESBEGIN OF TY_AFPO,
         AUFNR TYPE AFPO-AUFNR,
         POSNR TYPE AFPO-POSNR,
         MATNR TYPE AFPO-MATNR,
       END OF TY_AFPO.

DATAGT_AFPO TYPE TABLE OF TY_AFPO,
      GS_AFPO LIKE LINE OF GT_AFPO.

*----------------------------------------------------------------------*
定义ALV数据
*----------------------------------------------------------------------*
DATA:
  FUNCTXT         TYPE SMP_DYNTXT,
  GS_LAYOUT_ALV   TYPE SLIS_LAYOUT_ALV,
  GT_FIELDCAT_ALV TYPE SLIS_T_FIELDCAT_ALV,
  GS_FIELDCAT_ALV TYPE SLIS_FIELDCAT_ALV,
  GV_REF_GRID     TYPE REF TO CL_GUI_ALV_GRID"定义引用

*----------------------------------------------------------------------*
是否重复执行的标志
*----------------------------------------------------------------------*
DATAFLAG TYPE C.

*----------------------------------------------------------------------*
定义BAPI参数
*----------------------------------------------------------------------*
DATAGT_HEAD     TYPE TABLE OF BAPI2017_GM_HEAD_01"物料凭证抬头
      GS_MODE     TYPE BAPI2017_GM_CODE,
      GS_HEAD     TYPE BAPI2017_GM_HEAD_01,
      GV_MAT_DOC  TYPE BAPI2017_GM_HEAD_RET-MAT_DOC,
      GV_DOC_YEAR TYPE BAPI2017_GM_HEAD_RET-DOC_YEAR,
      GT_ITEM     TYPE TABLE OF BAPI2017_GM_ITEM_CREATE"物料凭证行项目
      GS_ITEM     TYPE BAPI2017_GM_ITEM_CREATE,
      GT_RETURN   TYPE TABLE OF BAPIRET2"接收返回数据
      GS_RETURN   TYPE BAPIRET2.
FIELD-SYMBOLS<FS_ALV> TYPE TY_ALV.
*&---------------------------------------------------------------------*
选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREENFUNCTION KEY 1."在屏幕定义功能码
SELECTION-SCREEN BEGIN OF BLOCK BLK1  WITH FRAME TITLE TEXT-001.
PARAMETERS:P_FILE TYPE LOCALFILE MODIF ID M1 "文件名
SELECTION-SCREEN END OF BLOCK BLK1 .

*&---------------------------------------------------------------------*
*&      INITIALIZATION.
*&---------------------------------------------------------------------*
INITIALIZATION.
  FUNCTXT-ICON_ID   ICON_EXPORT.
  FUNCTXT-QUICKINFO '下载模板'.
  FUNCTXT-ICON_TEXT '下载模板'.
  SSCRFIELDS-FUNCTXT_01 FUNCTXT.

*----------------------------------------------------------------------*
*       At Selection Screen Value Request
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
  CALL FUNCTION 'F4_FILENAME'
    IMPORTING
      FILE_NAME P_FILE.

*&---------------------------------------------------------------------*
*&      AT SELECTION-SCREEN
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
  CASE SSCRFIELDS-UCOMM.
    WHEN 'FC01'."系统预留的功能码
      "下载模板文件
      PERFORM FRM_DOWNLOAD_EXCEL.
    WHEN OTHERS.
  ENDCASE.

*&---------------------------------------------------------------------*
*&      START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  IF P_FILE IS INITIAL.
    MESSAGE '请输入文件路径!' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  PERFORM FRM_UPLOAD_DATA.
  PERFORM FRM_DATA_SEL.

*&---------------------------------------------------------------------*
*&     END-OF-SELECTION
*&---------------------------------------------------------------------*
END-OF-SELECTION.
  PERFORM FRM_SHOW_ALV.

*&---------------------------------------------------------------------*
*&      Form  frm_download_excel
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD_EXCEL .
  DATA:
    L_FULLPATH TYPE STRING,
    L_PATH     TYPE STRING,
    L_NAME     TYPE STRING.

  DATALD_SEPARATOR TYPE C.

用户选择保存路径
  PERFORM FRM_GET_FULLPATH CHANGING L_FULLPATH L_PATH L_NAME.

路径为空则退出
  IF L_FULLPATH IS INITIAL.
    MESSAGE '用户取消操作' TYPE 'S'.
    RETURN.
  ENDIF.

  "下载模板
  PERFORM FRM_DOWNLOAD_EXCEL_FROM_SERVER USING L_FULLPATH.

ENDFORM.                    "frm_download_excel

*&---------------------------------------------------------------------*
*&      Form  frm_get_fullpath
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_FULLPATH text
*      -->P_PATH     text
*      -->P_NAME     text
*----------------------------------------------------------------------*
FORM FRM_GET_FULLPATH  CHANGING P_FULLPATH
                                P_PATH
                                P_NAME
.

  DATAL_INIT_PATH  TYPE STRING,
        L_INIT_FNAME TYPE STRING,
        L_PATH       TYPE STRING,
        L_FILENAME   TYPE STRING,
        L_FULLPATH   TYPE STRING.

初始名称(输出的文件名称)
*  L_INIT_FNAME = '物料凭证导入模板' && '.xlsx'.
  CONCATENATE '物料凭证导入模板' '.xlsx' INTO L_INIT_FNAME.

获取桌面路径
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_DESKTOP_DIRECTORY
    
CHANGING
      DESKTOP_DIRECTORY    L_INIT_PATH
    
EXCEPTIONS
      CNTL_ERROR           1
      ERROR_NO_GUI         2
      NOT_SUPPORTED_BY_GUI 3
      OTHERS               4.
  IF SY-SUBRC <> 0.
    EXIT.
  ENDIF.
用户选择名称、路径
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    
EXPORTING
*     window_title         = '指定保存文件名'
      DEFAULT_EXTENSION    'XLSX'
      DEFAULT_FILE_NAME    L_INIT_FNAME
      FILE_FILTER          
CL_GUI_FRONTEND_SERVICES=>FILETYPE_ALL "文件类型 all代表全部类型,但是下载输出时必须指明文件类型,不然是白的
      INITIAL_DIRECTORY    L_INIT_PATH
      PROMPT_ON_OVERWRITE  
'X'
    CHANGING
      FILENAME             L_FILENAME
      PATH                 
L_PATH
      FULLPATH             
L_FULLPATH
*     USER_ACTION          =
*     FILE_ENCODING        =
    EXCEPTIONS
      CNTL_ERROR           1
      ERROR_NO_GUI         2
      NOT_SUPPORTED_BY_GUI 3
      OTHERS               4.
  IF SY-SUBRC 0.
    P_FULLPATH L_FULLPATH.
    P_PATH     L_PATH.
  ENDIF.

ENDFORM.                    "frm_get_fullpath

*&---------------------------------------------------------------------*
*&      Form  frm_download_excel_from_server
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_FILENAME text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD_EXCEL_FROM_SERVER  USING    P_FILENAME.

  DATAL_OBJDATA     LIKE WWWDATATAB,
        L_MIME        LIKE W3MIME,
        L_DESTINATION LIKE RLGRAP-FILENAME,
        L_OBJNAM      TYPE STRING,
        L_RC          LIKE SY-SUBRC,
        L_ERRTXT      TYPE STRING.

  DATAL_FILENAME TYPE STRING,
        L_RESULT,
        L_SUBRC    TYPE SY-SUBRC.

  DATAL_OBJID TYPE WWWDATATAB-OBJID .

  L_OBJID 'ZMMF040'.  "上传的模版名称      需要下载的模板名称

  "查找文件是否存在。
  SELECT SINGLE RELID OBJID
    
FROM WWWDATA
    
INTO CORRESPONDING FIELDS OF L_OBJDATA
    
WHERE SRTF2    0
    AND   RELID    'MI'
    AND   OBJID    L_OBJID.

  "判断模版不存在则报错
  IF SY-SUBRC NE OR L_OBJDATA-OBJID EQ SPACE.
    CONCATENATE '模板文件:' L_OBJID '不存在,请用TCODE:SMW0进行加载'
    INTO L_ERRTXT.
    MESSAGE E000(SUWITH L_ERRTXT.
  ENDIF.

  L_FILENAME P_FILENAME.

  "判断本地地址是否已经存在此文件。
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
    
EXPORTING
      FILE                 L_FILENAME
    RECEIVING
      RESULT               
L_RESULT
    
EXCEPTIONS
      CNTL_ERROR           1
      ERROR_NO_GUI         2
      WRONG_PARAMETER      3
      NOT_SUPPORTED_BY_GUI 4
      OTHERS               5.
  IF L_RESULT EQ 'X'.  "如果存在则删除原始文件,重新覆盖
    CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_DELETE
      
EXPORTING
        FILENAME             L_FILENAME
      
CHANGING
        RC                   L_SUBRC
      
EXCEPTIONS
        FILE_DELETE_FAILED   1
        CNTL_ERROR           2
        ERROR_NO_GUI         3
        FILE_NOT_FOUND       4
        ACCESS_DENIED        5
        UNKNOWN_ERROR        6
        NOT_SUPPORTED_BY_GUI 7
        WRONG_PARAMETER      8
        OTHERS               9.
    IF L_SUBRC <> 0"如果删除失败,则报错。
      CONCATENATE '同名EXCEL文件已打开' '请关闭该EXCEL后重试。'
      INTO L_ERRTXT.
      MESSAGE E000(SUWITH L_ERRTXT.
    ENDIF.
  ENDIF.

  L_DESTINATION   P_FILENAME.

  "下载模版。
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      KEY         L_OBJDATA
      DESTINATION 
L_DESTINATION
    
IMPORTING
      RC          L_RC.
  IF L_RC NE 0.
    CONCATENATE '模板文件' '下载失败' INTO L_ERRTXT.
    MESSAGE E000(SUWITH L_ERRTXT.
  ENDIF.

ENDFORM.                    "frm_download_excel_from_server

*&---------------------------------------------------------------------*
*&      Form  FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_UPLOAD_DATA .

  DATAL_DATA     TYPE TRUXS_T_TEXT_DATA,
        LV_MATNR   TYPE MARA-MATNR,
        LV_AUFNR   TYPE AFKO-AUFNR,
        LV_LGORT   TYPE T001L-LGORT,
        LV_MSG(50TYPE C.

  CLEAR GT_EXCEL.

  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
      I_LINE_HEADER        'X'
      I_TAB_RAW_DATA       L_DATA
      I_FILENAME           
P_FILE
    
TABLES
      I_TAB_CONVERTED_DATA GT_EXCEL[].

  IF GT_EXCEL[] IS NOT INITIAL.

    LOOP AT GT_EXCEL INTO GS_EXCEL.

      MOVE-CORRESPONDING GS_EXCEL TO GS_ALV.

      IF GS_ALV-MATNR SPACE.
        MESSAGE '物料号不能为空' TYPE 'E'.
      ENDIF.

      IF GS_ALV-AUFNR SPACE.
        MESSAGE '生产订单号不能为空' TYPE 'E'.
      ENDIF.

      IF GS_ALV-LGORT SPACE.
        MESSAGE '库存地点不能为空' TYPE 'E'.
      ENDIF.

      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          INPUT  GS_ALV-MATNR
        
IMPORTING
          OUTPUT GS_ALV-MATNR.

      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  GS_ALV-AUFNR
        
IMPORTING
          OUTPUT GS_ALV-AUFNR.
      "检查物料编码是否存在
      SELECT SINGLE MATNR
        
INTO LV_MATNR
        
FROM MARA
        
WHERE MATNR GS_ALV-MATNR.

      IF SY-SUBRC <> 0.
        CONCATENATE '物料号' GS_ALV-MATNR '不存在,请检查!' INTO LV_MSG.
        MESSAGE LV_MSG TYPE 'E'.
      ENDIF.

      "检查订单号是否存在
      SELECT SINGLE AUFNR
        
INTO LV_AUFNR
        
FROM AFKO
        
WHERE AUFNR GS_ALV-AUFNR.

      IF SY-SUBRC <> 0.
        CONCATENATE '订单号' GS_ALV-AUFNR '不存在,请检查!' INTO LV_MSG.
        MESSAGE LV_MSG TYPE 'E'.
      ENDIF.


      "检查库存地点是否存在
      SELECT SINGLE LGORT
          
INTO LV_LGORT
          
FROM T001L
          
WHERE LGORT GS_ALV-LGORT.

      IF SY-SUBRC <> 0.
        CONCATENATE '库存地点' GS_ALV-LGORT '不存在,请检查!' INTO LV_MSG.
        MESSAGE LV_MSG TYPE 'E'.
      ENDIF.

      "检查数量,給值移动类型
      IF GS_ALV-MENGE 0.
        GS_ALV-ZYDLX ''.
      ELSEIF GS_ALV-MENGE < 0.
        GS_ALV-ZYDLX '262'.
        GS_ALV-MENGE ABSGS_ALV-MENGE ).
      ELSEIF GS_ALV-MENGE > 0.
        GS_ALV-ZYDLX '261'.
      ENDIF.

      APPEND GS_ALV TO GT_ALV.
      CLEAR GS_ALV.

    ENDLOOP.
  ELSE.
    MESSAGE '上传文件不包含任何有效数据!' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

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

  DATALV_MSG(100TYPE C,
        LT_JEST     TYPE TABLE OF JEST,
        LS_JEST     LIKE LINE  OF LT_JEST.

  DATALV_DATE TYPE CHAR2,
        L_DATE  TYPE CHAR2.
  IF GT_ALV IS INITIAL.
    MESSAGE 'GT_ALV 数据为空,请检查!' TYPE 'S' DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

  "取物料描述
  SELECT MATNR
         MAKTX
    
INTO TABLE GT_MAKT
    
FROM MAKT
    
FOR ALL ENTRIES IN GT_ALV
    
WHERE MATNR GT_ALV-MATNR AND
          SPRAS '1'.

  "取工厂
  SELECT AUFNR
         OBJNR
         WERKS
         IDAT2
    
INTO TABLE GT_AUFK
    
FROM AUFK
    
FOR ALL ENTRIES IN GT_ALV
    
WHERE AUFNR GT_ALV-AUFNR.

  "取成品物料
  SELECT AUFNR
         POSNR
         MATNR
    
INTO TABLE GT_AFPO
    
FROM AFPO
    
FOR ALL ENTRIES IN GT_ALV
    
WHERE AUFNR GT_ALV-AUFNR AND
          POSNR 1.

  "取单位
  SELECT MATNR
         MEINS
  
INTO TABLE GT_MARA
  
FROM MARA
  
FOR ALL ENTRIES IN GT_ALV
  
WHERE MATNR GT_ALV-MATNR.

  SORT GT_MAKT BY MATNR.
  SORT GT_AUFK BY AUFNR.
  SORT GT_MARA BY MATNR.
  SORT GT_AFPO BY AUFNR.

  LOOP AT GT_ALV INTO GS_ALV.

    CLEARLV_DATE,L_DATE.
    "读取发料名称
    READ TABLE GT_MAKT INTO GS_MAKT WITH KEY MATNR GS_ALV-MATNR
                                    
BINARY SEARCH.
    IF SY-SUBRC 0.
      GS_ALV-MAKTX GS_MAKT-MAKTX.
    ENDIF.

    "读取工厂
    READ TABLE GT_AUFK INTO GS_AUFK WITH KEY AUFNR GS_ALV-AUFNR
                                    
BINARY SEARCH.
    IF SY-SUBRC 0.
      GS_ALV-WERKS GS_AUFK-WERKS.
      GS_ALV-IDAT2 GS_AUFK-IDAT2.
      GS_ALV-OBJNR GS_AUFK-OBJNR.

      L_DATE SY-DATUM+4(2).
      LV_DATE GS_ALV-IDAT2+4(2).

      "取工厂名称
      SELECT SINGLE NAME1
        
INTO GS_ALV-NAME1
        
FROM T001W
        
WHERE WERKS GS_ALV-WERKS.

      "读取库位名称
      SELECT SINGLE LGOBE
        
INTO GS_ALV-LGOBE
        
FROM T001L
        
WHERE WERKS GS_ALV-WERKS AND
              LGORT GS_ALV-LGORT.
      "检查订单状态
      SELECT *
        
INTO TABLE LT_JEST
        
FROM JEST
        
WHERE OBJNR GS_AUFK-OBJNR AND
              STAT  'I0002' AND
              INACT ''.

      IF SY-SUBRC 0.
        GS_ALV-TXT04 'REL'.
      ELSE.
        GS_ALV-TXT04 SPACE.
      ENDIF.

      IF GS_ALV-TXT04 SPACE.
        SELECT *
          
INTO TABLE LT_JEST
          
FROM JEST
          
WHERE OBJNR GS_AUFK-OBJNR AND
          STAT  'I0045' AND
          INACT ''.

        IF SY-SUBRC 0.
          GS_ALV-TXT04 'TECO'.
          IF LV_DATE <> L_DATE.
            GS_ALV-MSGTP 'E'.
            GS_ALV-MSGTX '该生产订单于' && GS_ALV-IDAT2 && '关闭,不可投料'.
          ENDIF.
*        ELSE.
*          gs_alv-txt04 = ''.
        ENDIF.
      ENDIF.
    ENDIF.

    "读取对象状态
    READ TABLE LT_JEST INTO LS_JEST WITH KEY OBJNR GS_ALV-OBJNR.
    IF SY-SUBRC 0.
      GS_ALV-STATU LS_JEST-STAT.
    ENDIF.

    "读取单位
    READ TABLE GT_MARA INTO GS_MARA WITH KEY MATNR GS_ALV-MATNR
                                    
BINARY SEARCH.
    IF SY-SUBRC 0.
      GS_ALV-MEINS GS_MARA-MEINS.
    ENDIF.

    "读取成品物料
    READ TABLE GT_AFPO INTO GS_AFPO WITH KEY AUFNR GS_ALV-AUFNR
                                    
BINARY SEARCH.
    IF SY-SUBRC 0.
      GS_ALV-ZCPWL GS_AFPO-MATNR.
      "读取成品名称
      SELECT SINGLE MAKTX
        
INTO GS_ALV-ZCPMC
        
FROM MAKT
        
WHERE MATNR GS_AFPO-MATNR AND
              SPRAS '1'.
    ENDIF.

    IF GS_ALV-TXT04 SPACE.
      GS_ALV-MSGTP 'E'.
      GS_ALV-MSGTX '订单状态不允许发料!' && '/' && GS_ALV-MSGTX.
    ENDIF.

    IF GS_ALV-MENGE 0.
      GS_ALV-MSGTP 'E'.
      GS_ALV-MSGTX '发料数量不能为零!' && '/' && GS_ALV-MSGTX.
    ENDIF.

    "单位转换
    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
      EXPORTING
        INPUT  GS_ALV-MEINS
      
IMPORTING
        OUTPUT GS_ALV-MEINS.

    IF GS_ALV-MSGTP SPACE.
      GS_ALV-MSGTP 'S'.
      GS_ALV-MSGTX '数据无误,可执行导入!'.
    ENDIF.

    MODIFY GT_ALV FROM GS_ALV.
  ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_PROCESS_DATA .

  IF FLAG 'X'.
    MESSAGE '已经执行过一次后需要退出alv界面才能再次导入!' TYPE 'E'.
  ENDIF.

  FLAG 'X'.

  DATA ZSTONR TYPE TJ30-STONR.
  DATALT_RETURN  TYPE TABLE OF BAPIRET2,
        LS_RETURN  TYPE BAPIRET2,
        LT_METHODS TYPE TABLE OF BAPI_ALM_ORDER_METHOD,
        LS_METHODS TYPE BAPI_ALM_ORDER_METHOD,
        ET_NUMBERS TYPE TABLE OF BAPI_ALM_NUMBERS,
        LT_AUFNR   TYPE TABLE OF BAPI_ORDER_KEY,
        LS_AUFNR   TYPE BAPI_ORDER_KEY,
        LT_DETAIL  TYPE TABLE OF BAPI_ORDER_RETURN,
        LS_DETAIL  TYPE BAPI_ORDER_RETURN.

  DATALT_JSTAT               TYPE TABLE OF JSTAT,
        LS_JSTAT               TYPE JSTAT,
        LV_ERROR               TYPE STRING,
        LV_OBJECT_NOT_FOUND    TYPE STRING,
        LV_STATUS_INCONSISTENT TYPE STRING,
        LV_STATUS_NOT_ALLOWED  TYPE STRING.

  DATALV_MENGE(17TYPE C,
        LV_MSG(50)   TYPE C,
        LV_AUFNR     TYPE AUFK-AUFNR.

  READ TABLE GT_ALV INTO GS_ALV WITH KEY MSGTP 'E'.
  IF SY-SUBRC 0.
    MESSAGE '请处理所有错误消息后重新执行导入!' TYPE 'E'.
  ENDIF.

  SORT GT_ALV BY AUFNR.
  LOOP AT GT_ALV ASSIGNING <FS_ALV> WHERE MSGTP <> 'E'.
    CLEARGS_HEAD,
           GS_ITEM,
           GS_RETURN.
    LV_AUFNR <FS_ALV>-AUFNR.
    AT NEW AUFNR.
      GS_MODE-GM_CODE '03'.
      GS_HEAD-PSTNG_DATE SY-DATUM.
      GS_HEAD-DOC_DATE SY-DATUM.
      APPEND GS_HEAD TO GT_HEAD.

      IF <FS_ALV>-TXT04 'REL'.
        GS_ITEM-ORDERID <FS_ALV>-AUFNR.
        LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR LV_AUFNR.
          WRITE GS_ALV-MENGE TO LV_MENGE.
          CONDENSE LV_MENGE NO-GAPS.
          GS_ITEM-MOVE_TYPE  GS_ALV-ZYDLX."移动类型
          GS_ITEM-MATERIAL   GS_ALV-MATNR."物料编码
          GS_ITEM-PLANT      GS_ALV-WERKS."工厂
          GS_ITEM-STGE_LOC   GS_ALV-LGORT."库位
          GS_ITEM-ENTRY_QNT   LV_MENGE."数量
          APPEND GS_ITEM TO GT_ITEM.
        ENDLOOP.
        "调用创建物料凭证BAPI
        CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
          EXPORTING
            GOODSMVT_HEADER  GS_HEAD
            GOODSMVT_CODE    
GS_MODE
          
IMPORTING
            MATERIALDOCUMENT GV_MAT_DOC
            MATDOCUMENTYEAR  
GV_DOC_YEAR
          
TABLES
            GOODSMVT_ITEM    GT_ITEM
            
RETURN           GT_RETURN.
        "判断是否存在错误信息
        LOOP AT GT_RETURN INTO GS_RETURN WHERE TYPE 'A' OR TYPE 'E'.
        ENDLOOP.

        IF SY-SUBRC <> 0.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              WAIT 'X'.

          COMMIT WORK.
          LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR LV_AUFNR.
            GS_ALV-MSGTP 'S'.
            GS_ALV-MSGTX '数据导入成功!'.
            MODIFY GT_ALV FROM GS_ALV.
          ENDLOOP.
          CONCATENATE '物料凭证号' GV_MAT_DOC '已保存' INTO LV_MSG.
          MESSAGE LV_MSG TYPE 'S'.
        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

          ROLLBACK WORK.

          LOOP AT GT_RETURN INTO GS_RETURN WHERE TYPE 'A' OR TYPE 'E'.
            LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR LV_AUFNR.
              GS_ALV-MSGTP 'E'.
              GS_ALV-MSGTX GS_RETURN-MESSAGE.
              MODIFY GT_ALV FROM GS_ALV.
            ENDLOOP.
          ENDLOOP.
        ENDIF.
      ELSE.
        LS_AUFNR-ORDER_NUMBER <FS_ALV>-AUFNR.
        APPEND LS_AUFNR TO LT_AUFNR.
        CLEAR LS_AUFNR.

        LS_JSTAT-STAT <FS_ALV>-STATU.
        LS_JSTAT-INACT 'X'.
        APPEND LS_JSTAT TO LT_JSTAT.
        CLEAR LS_JSTAT.

        LS_JSTAT-STAT 'I0002'.
        LS_JSTAT-INACT ''.
        APPEND LS_JSTAT TO LT_JSTAT.
        CLEAR LS_JSTAT.

        CALL FUNCTION 'STATUS_CHANGE_INTERN'
          EXPORTING
*           CHECK_ONLY          = ' '
            CLIENT              SY-MANDT
            OBJNR               
<FS_ALV>-OBJNR
*           ZEILE               = ' '
*           SET_CHGKZ           =
          IMPORTING
            ERROR_OCCURRED      LV_ERROR
            OBJECT_NOT_FOUND    
LV_OBJECT_NOT_FOUND
            STATUS_INCONSISTENT 
LV_STATUS_INCONSISTENT
            STATUS_NOT_ALLOWED  
LV_STATUS_NOT_ALLOWED
          
TABLES
            STATUS              LT_JSTAT
          
EXCEPTIONS
            OBJECT_NOT_FOUND    1
            STATUS_INCONSISTENT 2
            STATUS_NOT_ALLOWED  3
            OTHERS              4.
        IF SY-SUBRC EQ 0.
          GS_ITEM-ORDERID <FS_ALV>-AUFNR.
          LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR LV_AUFNR.
            WRITE GS_ALV-MENGE TO LV_MENGE.
            CONDENSE LV_MENGE NO-GAPS.
            GS_ITEM-MOVE_TYPE  GS_ALV-ZYDLX."移动类型
            GS_ITEM-MATERIAL   GS_ALV-MATNR."物料编码
            GS_ITEM-PLANT      GS_ALV-WERKS."工厂
            GS_ITEM-STGE_LOC   GS_ALV-LGORT."库位
            GS_ITEM-ENTRY_QNT   LV_MENGE."数量
            APPEND GS_ITEM TO GT_ITEM.
          ENDLOOP.
          "执行投料创建物料凭证操作
          CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
            EXPORTING
              GOODSMVT_HEADER  GS_HEAD
              GOODSMVT_CODE    
GS_MODE
            
IMPORTING
              MATERIALDOCUMENT GV_MAT_DOC
              MATDOCUMENTYEAR  
GV_DOC_YEAR
            
TABLES
              GOODSMVT_ITEM    GT_ITEM
              
RETURN           GT_RETURN.

          LOOP AT GT_RETURN INTO GS_RETURN WHERE TYPE 'A' OR TYPE 'E'.
          ENDLOOP.

          IF SY-SUBRC <> 0.
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                WAIT 'X'.

            COMMIT WORK.

            LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR LV_AUFNR.
              GS_ALV-MSGTP 'S'.
              GS_ALV-MSGTX '数据导入成功!'.
              MODIFY GT_ALV FROM GS_ALV.
            ENDLOOP.
            CONCATENATE '物料凭证号' GV_MAT_DOC '已保存' INTO LV_MSG.
            MESSAGE LV_MSG TYPE 'S'.
            "生产订单技术性关闭
            CALL FUNCTION 'BAPI_PRODORD_COMPLETE_TECH'
*          EXPORTING
*            scope_compl_tech = '1'
*           WORK_PROCESS_GROUP       = 'COWORK_BAPI'
*           WORK_PROCESS_MAX = 99
              IMPORTING
                RETURN        LS_RETURN
              
TABLES
                ORDERS        LT_AUFNR
                DETAIL_RETURN 
LT_DETAIL.

            LOOP AT LT_DETAIL INTO LS_DETAIL WHERE TYPE 'A' OR TYPE 'E'.
            ENDLOOP.
            IF SY-SUBRC <> 0.
              CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
                EXPORTING
                  WAIT 'X'.
              COMMIT WORK.
            ELSE.
              CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

              ROLLBACK WORK.
              LOOP AT LT_DETAIL INTO LS_DETAIL WHERE TYPE 'A' OR TYPE 'E'.
                LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR LV_AUFNR.
                  GS_ALV-MSGTP LS_DETAIL-TYPE.
                  GS_ALV-MSGTX LS_DETAIL-MESSAGE.
                  MODIFY GT_ALV FROM GS_ALV.
                ENDLOOP.
              ENDLOOP.
            ENDIF.
          ELSE.
            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

            ROLLBACK WORK.

            LOOP AT GT_RETURN INTO GS_RETURN WHERE TYPE 'A' OR TYPE 'E'.
              LOOP AT GT_ALV INTO GS_ALV WHERE AUFNR LV_AUFNR.
                GS_ALV-MSGTP GS_RETURN-TYPE.
                GS_ALV-MSGTX GS_RETURN-MESSAGE.
                MODIFY GT_ALV FROM GS_ALV.
              ENDLOOP.
            ENDLOOP.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDAT.
    CLEARGT_HEAD[],GT_ITEM[],GT_RETURN[],LV_AUFNR,LT_AUFNR,LT_JSTAT,LT_DETAIL.
  ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_SHOW_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SHOW_ALV .

  PERFORM FRM_SET_FIELDCAT USING 'AUFNR'  'L' 'K' '生产订单号' 'X'.
  PERFORM FRM_SET_FIELDCAT USING 'WERKS'  'L' 'K' '工厂' ''.
  PERFORM FRM_SET_FIELDCAT USING 'NAME1'  'L' 'K' '工厂名称' ''.
  PERFORM FRM_SET_FIELDCAT USING 'ZCPWL'  'L' 'K' '成品物料' 'X'.
  PERFORM FRM_SET_FIELDCAT USING 'ZCPMC'  'L' 'K' '成品名称' ''.
  PERFORM FRM_SET_FIELDCAT USING 'TXT04'  'L' 'K' '订单状态' ''.
  PERFORM FRM_SET_FIELDCAT USING 'MATNR'  'L' 'K' '发料编码' 'X'.
  PERFORM FRM_SET_FIELDCAT USING 'MAKTX'  'L' 'K' '发料名称' ''.
  PERFORM FRM_SET_FIELDCAT USING 'MENGE'  'L' 'K' '发料数量' ''.
  PERFORM FRM_SET_FIELDCAT USING 'MEINS'  'L' 'K' '单位' ''.
  PERFORM FRM_SET_FIELDCAT USING 'ZYDLX'  'L' 'K' '移动类型' ''.
  PERFORM FRM_SET_FIELDCAT USING 'LGORT'  'L' 'K' '库位' ''.
  PERFORM FRM_SET_FIELDCAT USING 'LGOBE'  'L' 'K' '库位名称' ''.
  PERFORM FRM_SET_FIELDCAT USING 'MSGTP'  'L' 'K' '消息类型' ''.
  PERFORM FRM_SET_FIELDCAT USING  'MSGTX'  'L' 'K' '消息文本' ''.

  GS_LAYOUT_ALV-COLWIDTH_OPTIMIZE 'X'.
  GS_LAYOUT_ALV-ZEBRA             'X'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_USER_COMMAND  'USER_COMMAND' "自定义按钮响应事件
      I_CALLBACK_PF_STATUS_SET 'SET_PF_STATUS' "设定ALV的自定义按钮'
      I_CALLBACK_PROGRAM       SY-REPID      "当前程序名
      IT_FIELDCAT              GT_FIELDCAT_ALV   "字段定义描述表
      IS_LAYOUT                GS_LAYOUT_ALV     "输出样式
    TABLES
      T_OUTTAB                 GT_ALV    "内表输出名称
    EXCEPTIONS
      PROGRAM_ERROR            1
      OTHERS                   2.


ENDFORM.                    " FRM_SHOW_ALV


*&---------------------------------------------------------------------*
*&      Form  FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PV_COL_POS    text
*      -->PV_FIELDNAME  text
*      -->PV_JUST       text
*      -->PV_KEY        text
*      -->PV_SELTEXT_L  text
*----------------------------------------------------------------------*
FORM FRM_SET_FIELDCAT USING  PV_FIELDNAME
                                 PV_JUST
                                 PV_KEY
                                 PV_SELTEXT_L
                                 P_ZERO
.

  CLEAR:GS_FIELDCAT_ALV.

  GS_FIELDCAT_ALV-FIELDNAME     PV_FIELDNAME.        "字段名
  GS_FIELDCAT_ALV-JUST          PV_JUST.             "Just  L/R/C
  GS_FIELDCAT_ALV-KEY           PV_KEY.              "主键
  GS_FIELDCAT_ALV-SELTEXT_L     PV_SELTEXT_L.        "Lable
  GS_FIELDCAT_ALV-NO_ZERO       P_ZERO.

  APPEND GS_FIELDCAT_ALV TO GT_FIELDCAT_ALV.

ENDFORM.                    " FRM_SET_FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  SET_PF_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.

  SET PF-STATUS 'STANDARD_FULLSCREEN'.

ENDFORM.                    "FRM_STATUS_SET

*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
                        RS_SELFIELD 
TYPE SLIS_SELFIELD.
  DATAGV_GRID TYPE REF TO CL_GUI_ALV_GRID.

  CASE R_UCOMM.
    WHEN 'ZIMPORT'.
      PERFORM FRM_PROCESS_DATA."导入并传输数据
  ENDCASE.
  RS_SELFIELD-REFRESH 'X'.
ENDFORM.          

猜你喜欢

转载自blog.csdn.net/z_x_xing_/article/details/90077978