SAP,ABAP自开发批导程序批量维护ME11、ME12信息记录,涉及表EINA、EINE

一、业务需求

  1. 用户点击 模版下载,下载要填的模版。
  2. 选择“请选择批导文件”按钮,将已填写完毕的模板导入系统。
  3. 首先校验数据格式,视图,换算关系,日期等格式是否正确,正确切数据库没有当前物料和工厂绑定关系即为创建,否则为黄灯修改,红灯即为前面的格式或关系不正确,会在错误信息栏抛出。
  4. 按ME11创建与ME12修改逻辑,判断是否已有,如有已有就执行修改,如果没有就执行创建。
  5. 第4步执行成功,即为创建或修改成功,可重复导入,会根据日期区间取新增条件或修改条件。

二、分析

        主要涉及的表:EINA、EINE

        函数:ME_INFORECORD_MAINTAIN、BAPI_TRANSACTION_COMMIT

三、界面

1.批导程序选择屏幕

2.ALV操作页面

三、代码

*&---------------------------------------------------------------------*
*& Report ZRMM_047
*&---------------------------------------------------------------------*
*&  PeterZhang Create
*&---------------------------------------------------------------------*
REPORT ZRMM_047.

TABLES: SSCRFIELDS.
*----------------------------------------------------------------------*
*    TYPES
*----------------------------------------------------------------------*




TYPES:BEGIN OF TY_DATA,
        ZXH     TYPE STRING, "char4,            "序号
        LIFNR   TYPE EINA-LIFNR, "EINA-LIFNR,       "供应商账户
        MATNR   TYPE EINA-MATNR, "EINA-MATNR,       "物料编号
        EKORG   TYPE EINE-EKORG, "EINE-EKORG        "采购组织
        WERKS   TYPE EINE-WERKS, "EINE-WERKS        "工厂
        LMEIN   TYPE EINA-LMEIN, "EINA-LMEIN        "基本单位
        UMREN   TYPE STRING, "EINA-UMREN        "分母
        MEIN1   TYPE RM06I-MEIN1, "RM06I-MEIN1       "转换单位
        UMREZ   TYPE STRING, "EINA-UMREZ        "分子
        APLFZ   TYPE EINE-APLFZ , "EINE-APLFZ        "计划交货天
        UNTTO   TYPE EINE-UNTTO, "EINE-UNTTO        "交货不足容差
        EKGRP   TYPE EINE-EKGRP, "EINE-EKGRP        "采购组
        UEBTO   TYPE EINE-UEBTO, "EINE-UEBTO        "过量交货容差
        NORBM   TYPE EINE-NORBM, "EINE-NORBM        "标准数量           "
        "WEBRE   TYPE EINE-WEBRE, "EINE-WEBRE        "标识:基于收货的发票验证
        MWSKZ   TYPE EINE-MWSKZ, "EINE-MWSKZ        "税码
        NETPR   TYPE STRING, "EINE-NETPR        "净价
        KPEIN   TYPE KONP-KPEIN, "KONP-KPEIN        "价格单位
        DATAB   TYPE RV13A-DATAB, "RV13A-DATAB       "有效起始日
        DATBI   TYPE RV13A-DATBI, "RV13A-DATBI       "有效截止日

        ZCHECK  TYPE ICON-NAME,                 "数据校验
        ZEXEC   TYPE ICON-NAME,                 "执行结果
        MESSAGE TYPE C LENGTH 200,              "消息
        SEL     TYPE FLAG,                      "选择标识
        ZGX     TYPE FLAG,                      "增加的复选框
      END OF TY_DATA.

DATA: GT_DATA TYPE STANDARD TABLE OF TY_DATA,
      GS_DATA TYPE TY_DATA.
FIELD-SYMBOLS:<FS_DATA> TYPE TY_DATA.

*----------------------------------------------------------------------*
*  定义alv数据对象
*----------------------------------------------------------------------*
DATA: GS_FUNCTXT TYPE SMP_DYNTXT.  "功能代码文本
CONSTANTS: CON_TN LIKE T681-KOTABNR VALUE '305'.

DATA: GT_FIELDCAT   TYPE LVC_T_FCAT,
      GS_FIELDCAT   TYPE LVC_S_FCAT,
      GS_LAYOUT     TYPE LVC_S_LAYO,
      GV_REPID      TYPE SY-REPID,
      GT_LISTHEADER TYPE SLIS_T_LISTHEADER,
      GS_SETTING    TYPE LVC_S_GLAY,
      GT_EVENT      TYPE SLIS_T_EVENT.

*----------------------------------------------------------------------*
*     SELECTION-SCREEN                                                 *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001.

  PARAMETERS: P_FILE LIKE RLGRAP-FILENAME . "文件名
*  SELECTION-SCREEN COMMENT /2(50) TEXT-003.
SELECTION-SCREEN END OF BLOCK BLK1.

SELECTION-SCREEN BEGIN OF BLOCK BK2 WITH FRAME TITLE TEXT-002.
  SELECTION-SCREEN:
  COMMENT /2(75) TEXT-003,
  COMMENT /2(75) TEXT-005,
  COMMENT /2(75) TEXT-006,
  COMMENT /2(75) TEXT-007.
SELECTION-SCREEN END OF BLOCK BK2.

SELECTION-SCREEN: FUNCTION KEY 1.
*----------------------------------------------------------------------*
*    INITIALIZATION
*----------------------------------------------------------------------*
INITIALIZATION.
  GS_FUNCTXT-ICON_ID   = ICON_EXPORT.
  GS_FUNCTXT-QUICKINFO = '下载模版'.
  GS_FUNCTXT-ICON_TEXT = '下载模版'.
  SSCRFIELDS-FUNCTXT_01 = GS_FUNCTXT.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
  PERFORM FRM_F4_HELP CHANGING P_FILE.                "导入路径搜索帮助


*----------------------------------------------------------------------*
*     AT SELECTION-SCREEN                                              *
AT SELECTION-SCREEN.
  CASE SSCRFIELDS-UCOMM.
    WHEN 'FC01'.
      PERFORM FRM_DOWNLOAD_EXCEL USING 'ZRMM_047_EXCEL'.

    WHEN OTHERS.
      IF P_FILE IS INITIAL.
        MESSAGE S001(00) WITH '批导文件不能为空!' DISPLAY LIKE 'E'.
        STOP.
      ELSE.
        CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
          EXPORTING
            TEXT = '正在读取EXCEL...'.
        PERFORM FRM_READ_EXCEL TABLES GT_DATA[] USING P_FILE 1 2 18 20000 CHANGING GS_DATA.      "导入SAP存放的内表gt_data,读取Excel开始的列行,结束列行,和gt_data相同结构gs_data。
        CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
          EXPORTING
            TEXT = '正在校验EXCEL...'.
        PERFORM FRM_CHECK_DATA TABLES GT_DATA[].     "数据校验
      ENDIF.
  ENDCASE.

START-OF-SELECTION.
  PERFORM FRM_FIELDCAT CHANGING GT_FIELDCAT.      "定义列标题信息
  PERFORM FRM_LAYOUT CHANGING GS_LAYOUT.          "定义alv格式属性

  PERFORM FRM_DISPLAY TABLES GT_DATA[]           "显示数据
  CHANGING GT_FIELDCAT
    GS_LAYOUT
    GT_EVENT
    GS_SETTING.


FORM FRM_DOWNLOAD_EXCEL USING LV_OBJID TYPE WWWDATATAB-OBJID.
  DATA: L_FILENAME  TYPE STRING,
        LV_FILENAME TYPE STRING,
        LV_PATH     TYPE STRING,
        LV_FULLPATH TYPE STRING.

  DATA: LV_OBJ         LIKE WWWDATATAB,
        LV_DESTINATION LIKE RLGRAP-FILENAME.
  DATA: LV_RC  LIKE SY-SUBRC.
  DATA: LV_ERROR TYPE CHAR255.

  SELECT SINGLE * FROM WWWDATA
  INTO CORRESPONDING FIELDS OF LV_OBJ
  WHERE OBJID = LV_OBJID.

  CONCATENATE LV_OBJ-TEXT '.XLSX' INTO L_FILENAME.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    EXPORTING
      DEFAULT_FILE_NAME         = L_FILENAME
      FILE_FILTER               = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
      PROMPT_ON_OVERWRITE       = 'X'
    CHANGING
      FILENAME                  = LV_FILENAME
      PATH                      = LV_PATH
      FULLPATH                  = LV_FULLPATH
    EXCEPTIONS
      CNTL_ERROR                = 1
      ERROR_NO_GUI              = 2
      NOT_SUPPORTED_BY_GUI      = 3
      INVALID_DEFAULT_FILE_NAME = 4
      OTHERS                    = 5.

  IF LV_FULLPATH <> ''.
    LV_DESTINATION = LV_FULLPATH.
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        KEY         = LV_OBJ
        DESTINATION = LV_DESTINATION
      IMPORTING
        RC          = LV_RC.
  ENDIF.


ENDFORM.

FORM FRM_READ_EXCEL TABLES L_TAB
USING PV_FILE TYPE RLGRAP-FILENAME
      LV_I_BEGIN_COL TYPE I
      LV_I_BEGIN_ROW TYPE I
      LV_I_END_COL TYPE I
      LV_I_END_ROW TYPE I
CHANGING L_WA TYPE ANY.

  DATA: LT_EXCEL TYPE TABLE OF ZSALSMEX_TABLINE WITH HEADER LINE.
  FIELD-SYMBOLS <LFS_VALUE> TYPE ANY.

  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      FILENAME                = PV_FILE                 "文件路径
      I_BEGIN_COL             = LV_I_BEGIN_COL          "开始列
      I_BEGIN_ROW             = LV_I_BEGIN_ROW          "开始行
      I_END_COL               = LV_I_END_COL            "结束列
      I_END_ROW               = LV_I_END_ROW            "结束行
    TABLES
      INTERN                  = LT_EXCEL
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.
  IF SY-SUBRC <> 0.
    MESSAGE S001(00) WITH '读取 Excel 文件失败' DISPLAY LIKE 'E'.
    STOP.
  ENDIF.


  "加上行号 ,以这个为主要id号
  DATA:EX_ROW TYPE I VALUE 1.
  DATA: LT_EXCEL_NEW TYPE TABLE OF ZSALSMEX_TABLINE WITH HEADER LINE.
  LOOP AT LT_EXCEL.
    IF LT_EXCEL-COL = 1.
      LT_EXCEL_NEW-ROW = LT_EXCEL-ROW.
      LT_EXCEL_NEW-COL = LT_EXCEL-COL.
      LT_EXCEL_NEW-VALUE = |{ EX_ROW }|.
      EX_ROW += 1.
      APPEND LT_EXCEL_NEW.
    ENDIF.
    LT_EXCEL_NEW-ROW = LT_EXCEL-ROW.
    LT_EXCEL_NEW-COL = LT_EXCEL-COL + 1.
    LT_EXCEL_NEW-VALUE = LT_EXCEL-VALUE.
    APPEND LT_EXCEL_NEW.
  ENDLOOP.

  "赋值
  LOOP AT LT_EXCEL_NEW.
    ASSIGN COMPONENT LT_EXCEL_NEW-COL OF STRUCTURE L_WA TO <LFS_VALUE>.
    "系统将字符串lt_excel-col的组件l_wa分配给字段符号<lfs_value>
    IF SY-SUBRC = 0 .
      <LFS_VALUE> = LT_EXCEL_NEW-VALUE.
      IF LT_EXCEL_NEW-COL = 18 OR LT_EXCEL_NEW-COL = 19.
        SEARCH LT_EXCEL_NEW-VALUE FOR '/'.
        IF SY-SUBRC = 0.
          REPLACE ALL OCCURRENCES OF '/' IN LT_EXCEL_NEW-VALUE  WITH ''.
          <LFS_VALUE> = LT_EXCEL_NEW-VALUE.
        ENDIF.
        SEARCH LT_EXCEL_NEW-VALUE FOR '-'.
        IF SY-SUBRC = 0.
          REPLACE ALL OCCURRENCES OF '-' IN LT_EXCEL_NEW-VALUE  WITH ''.
          <LFS_VALUE> = LT_EXCEL_NEW-VALUE.
        ENDIF.
      ENDIF.
    ENDIF.
    AT END OF ROW.
      APPEND L_WA TO L_TAB.
      CLEAR L_WA.
    ENDAT.

  ENDLOOP.
ENDFORM.

*引用标准函数选择电脑文件内容打开
FORM FRM_F4_HELP CHANGING O_FNAME TYPE RLGRAP-FILENAME.
  DATA: L_FILETAB TYPE FILETABLE,
        L_WAFTAB  LIKE LINE OF L_FILETAB,
        L_RC      TYPE I.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      FILE_FILTER             = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
      WINDOW_TITLE            = '打开文件'
      INITIAL_DIRECTORY       = 'C:/'
    CHANGING
      FILE_TABLE              = L_FILETAB
      RC                      = L_RC
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      NOT_SUPPORTED_BY_GUI    = 4
      OTHERS                  = 5.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    EXIT.
  ELSE.
    READ TABLE L_FILETAB INTO L_WAFTAB INDEX 1.
    O_FNAME = L_WAFTAB-FILENAME.
    CLEAR: L_FILETAB,
    L_WAFTAB.
  ENDIF.

ENDFORM. " frm_f4_help

*&---------------------------------------------------------------------*
*& Form FRM_BUILD_FIELD
*&---------------------------------------------------------------------*
*& 构建ALV Fieldcat
*&---------------------------------------------------------------------*
*&      <-- GT_FIELDCAT
*&---------------------------------------------------------------------*
FORM FRM_FIELDCAT CHANGING VALUE(OT_FIELDCAT) TYPE LVC_T_FCAT.
  DATA: L_POS       TYPE I,
        LS_FIELDCAT TYPE LVC_S_FCAT.
  DEFINE ALV_APPEND_FIELD.
    CLEAR LS_FIELDCAT.
    LS_FIELDCAT-COL_POS  = L_POS.
    LS_FIELDCAT-FIELDNAME  = &1.
    LS_FIELDCAT-REPTEXT = &2.
    LS_FIELDCAT-SCRTEXT_L = &2.
    LS_FIELDCAT-SCRTEXT_M = &2.
    LS_FIELDCAT-SCRTEXT_S = &2.
    LS_FIELDCAT-KEY = &3.
    LS_FIELDCAT-REF_TABLE = &4.
    LS_FIELDCAT-REF_FIELD = &5.
    LS_FIELDCAT-HOTSPOT = &6.
    LS_FIELDCAT-EDIT = &7.
    LS_FIELDCAT-OUTPUTLEN = &8.

    APPEND LS_FIELDCAT TO OT_FIELDCAT.
    L_POS = L_POS + 1.
  END-OF-DEFINITION.

  REFRESH OT_FIELDCAT.
  L_POS = 1.

  ALV_APPEND_FIELD 'ZGX'            '勾选'            '' ''      ''         ''   'X ' 'X'.
  ALV_APPEND_FIELD 'ZCHECK'         '数据校验'        '' ''      'ZCHECK'   ''   ''   'X'.
  ALV_APPEND_FIELD 'ZEXEC'          '执行结果'        '' ''      'ZEXEC'    ''   ' '  'X'.
  ALV_APPEND_FIELD 'MESSAGE'        '消息'        '' 'ICON'  'MESSAGE'  ''   ' '  'X'.
  ALV_APPEND_FIELD 'ZXH'          '序号'                       '' ''  ''    ''   ' ' 'X'.

  ALV_APPEND_FIELD 'LIFNR'        '供应商账户'                 '' 'EINA'  'LIFNR'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'MATNR'        '物料编号'                   '' 'EINA'  'MATNR'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'EKORG'        '采购组织'                   '' 'EINE'  'EKORG'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'WERKS'        '工厂'                       '' 'EINE'  'WERKS'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'LMEIN'        '基本单位'                   '' 'EINA'  'PLNNR'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'UMREN'        '分母'                       '' 'EINA'  'UMREN'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'MEIN1'        '转换单位'                   '' 'RM06I' 'VORNR'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'UMREZ'        '分子'                       '' 'EINA'  'UMREZ'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'APLFZ'        '计划交货天'         '' 'EINE'  'APLFZ'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'UNTTO'        '交货不足容差'               '' 'EINE'  'UNTTO'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'EKGRP'        '采购组'                     '' 'EINE'  'EKGRP'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'UEBTO'        '过量交货容差'               '' 'EINE'  'UEBTO'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'NORBM'        '标准数量'           '' 'EINE'  'NORBM'    ''   ' ' 'X'.
  "ALV_APPEND_FIELD 'WEBRE'        '标识:基于收货的发票验证'   '' 'EINE'  'WEBRE'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'MWSKZ'        '税码'            '' 'EINE'  'MWSKZ'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'NETPR'        '净价'       '' 'EINE'  'NETPR'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'KPEIN'        '价格单位'                   '' 'KONP'  'KPEIN'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'DATAB'        '有效起始日'         '' 'RV13A' 'DATAB'    ''   ' ' 'X'.
  ALV_APPEND_FIELD 'DATBI'        '有效截止日'       '' 'RV13A' 'DATBI'    ''   ' ' 'X'.


  OT_FIELDCAT[ FIELDNAME = 'ZGX' ]-CHECKBOX = 'X'.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- GS_LAYOUT
*&---------------------------------------------------------------------*
FORM FRM_LAYOUT  CHANGING VALUE(OS_LAYOUT) TYPE LVC_S_LAYO.
  CLEAR OS_LAYOUT.
  OS_LAYOUT-ZEBRA = 'X'.             "斑马线
  OS_LAYOUT-CWIDTH_OPT = 'X'.        "自动调整列宽
  OS_LAYOUT-BOX_FNAME = 'SEL'.       "选择列
ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_display
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> gt_data1[]
*&      <-- GT_FIELDCAT
*&      <-- GS_LAYOUT
*&      <-- GT_EVENT
*&      <-- GS_SETTING
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY  TABLES   PT_OTAB TYPE STANDARD TABLE
CHANGING PT_FIELDCAT TYPE LVC_T_FCAT
  PS_LAYOUT   TYPE LVC_S_LAYO
  PT_EVENTS   TYPE SLIS_T_EVENT
  PS_SETTING  TYPE LVC_S_GLAY.
*  MESSAGE |本次导入有{ gv_index }条数据| TYPE 'S'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMAND'
      I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'
      IS_LAYOUT_LVC            = PS_LAYOUT
      IT_FIELDCAT_LVC          = PT_FIELDCAT  "传入fieldcat
      IT_EVENTS                = PT_EVENTS
      I_GRID_SETTINGS          = PS_SETTING
      I_SAVE                   = 'A'         "standard and user-specific saving
    TABLES
      T_OUTTAB                 = PT_OTAB[]    "传入输出内表
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
  IF SY-SUBRC NE 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.

*报表按钮事件
FORM SET_PF_STATUS USING PT_EXCLUDE TYPE KKBLO_T_EXTAB.   "ALV报表按钮事件代码

  DATA:LT_EXCLUDE TYPE KKBLO_T_EXTAB WITH HEADER LINE.

  SET PF-STATUS '100' EXCLUDING LT_EXCLUDE[].

ENDFORM.


*&--------------------------------------------------------------------*
*&      Form  FRM_USER_COMMAND
*&--------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
FORM FRM_USER_COMMAND USING PV_UCOMM LIKE SY-UCOMM
      PS_SELFIELD TYPE SLIS_SELFIELD.
  "  DATA:gd_repid LIKE sy-repid,ref_grid TYPE REF TO cl_gui_alv_grid.
  "刷新"ALV输出表"数据
  DATA: LO_GRID TYPE REF TO CL_GUI_ALV_GRID.
  "稳定刷新ALV
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' "获取ALV对象的函数
    IMPORTING
      E_GRID = LO_GRID.
  CALL METHOD LO_GRID->CHECK_CHANGED_DATA.
  CALL METHOD LO_GRID->REFRESH_TABLE_DISPLAY. "刷新alv


  "用户触发功能码响应逻辑
  CASE PV_UCOMM.
    WHEN 'SELECT'. "批量选择
      LOOP AT GT_DATA ASSIGNING <FS_DATA> WHERE SEL = 'X'.
        <FS_DATA>-ZGX = 'X'.
      ENDLOOP.

    WHEN 'NOSELECT'. "批量取消

      LOOP AT GT_DATA ASSIGNING <FS_DATA> WHERE SEL = 'X'.
        <FS_DATA>-ZGX = ''.
      ENDLOOP.


    WHEN 'ANTI'. "反选

      LOOP AT GT_DATA ASSIGNING <FS_DATA>." WHERE sel = 'X'.
        IF <FS_DATA>-ZGX = ''.
          <FS_DATA>-ZGX = 'X'.
        ELSE.
          <FS_DATA>-ZGX = ''.
        ENDIF.
      ENDLOOP.

    WHEN 'ALL'. "全选

      LOOP AT GT_DATA ASSIGNING <FS_DATA> WHERE ZGX <> 'X'.
        <FS_DATA>-ZGX = 'X'.
      ENDLOOP.



    WHEN 'NONE'. "全不选

      LOOP AT GT_DATA ASSIGNING <FS_DATA> WHERE ZGX = 'X'.
        <FS_DATA>-ZGX = ''.
      ENDLOOP.


    WHEN 'EXECUTE'. "执行导入

      IF LINE_EXISTS( GT_DATA[ ZGX = 'X' ] ).
        IF LINE_EXISTS( GT_DATA[ ZGX = 'X' ZCHECK = ICON_LED_RED ]  ).
          MESSAGE '存在校验不通过的数据,请取消勾选后再执行' TYPE 'S' DISPLAY LIKE 'E'.
        ELSE.

          DATA:LT_DATA TYPE STANDARD TABLE OF TY_DATA.
          LOOP AT GT_DATA INTO GS_DATA WHERE ZGX = 'X'.
            APPEND GS_DATA TO LT_DATA.
            AT END OF ZXH.
              PERFORM FRM_ME11_RUN TABLES LT_DATA.
              LOOP AT LT_DATA INTO DATA(LS_DATA).
                CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
                  EXPORTING
                    TEXT = |序号{ LS_DATA-ZXH }正在执行导入...|.
                READ TABLE GT_DATA ASSIGNING <FS_DATA> WITH KEY ZXH = LS_DATA-ZXH.
                IF SY-SUBRC = 0.
                  <FS_DATA>-ZEXEC = LS_DATA-ZEXEC.
                  <FS_DATA>-MESSAGE = LS_DATA-MESSAGE.
                ENDIF.
              ENDLOOP.
              CLEAR:LT_DATA[].
            ENDAT.
          ENDLOOP.
          MESSAGE '操作完成!' TYPE 'S'.
        ENDIF.
      ELSE.
        MESSAGE '请至少勾选一条要执行的数据' TYPE 'S' DISPLAY LIKE 'E'.
      ENDIF.

  ENDCASE.


  "稳定刷新ALV
  DATA:STBL TYPE LVC_S_STBL.
  STBL-ROW = 'X'." 基于行的稳定刷新
  STBL-COL = 'X'." 基于列稳定刷新
  CALL METHOD LO_GRID->REFRESH_TABLE_DISPLAY
    EXPORTING
      IS_STABLE = STBL.
ENDFORM.                    "FRM_user_command




*&---------------------------------------------------------------------*
*& Form frm_check_data
*&---------------------------------------------------------------------*
FORM FRM_CHECK_DATA  TABLES   P_GT_DATA STRUCTURE GS_DATA.
  LOOP AT P_GT_DATA ASSIGNING <FS_DATA>.
*    CONDENSE <FS_DATA>-PLNNR NO-GAPS.
*    CONDENSE <FS_DATA>-MASSEINHSW NO-GAPS.
    PERFORM FRM_CHECK_DATA_ITEM CHANGING <FS_DATA>.
  ENDLOOP.
ENDFORM.

*  校验数据层
FORM FRM_CHECK_DATA_ITEM CHANGING PS_DATA STRUCTURE GS_DATA.

  DATA: LV_MEINS TYPE MARA-MEINS.   "基本单位  物料匹配
  DATA: LV_MEINS1 TYPE MARA-MEINS.   "基本单位 函数后
  DATA: LV_MEIN1 TYPE MARA-MEINS.   "转换单位  物料匹配
  DATA: LV_MEIN11 TYPE MARA-MEINS.   "转换单位 函数后


  CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
    EXPORTING
      INPUT        = PS_DATA-MATNR
    IMPORTING
      OUTPUT       = PS_DATA-MATNR
    EXCEPTIONS
      LENGTH_ERROR = 1
      OTHERS       = 2.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      INPUT  = PS_DATA-LIFNR
    IMPORTING
      OUTPUT = PS_DATA-LIFNR.

  IF PS_DATA-LIFNR IS INITIAL.
    PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/供应商不能为空|.
  ELSE.
    SELECT * INTO TABLE @DATA(LV_BUT000) FROM BUT000 WHERE PARTNER = @PS_DATA-LIFNR.
    IF SY-SUBRC <> 0.
      PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/供应商不存在|.
    ENDIF.
  ENDIF.

  IF PS_DATA-MATNR IS INITIAL.
    PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/物料编码不能为空|.
  ELSE.
    SELECT SINGLE MEINS INTO LV_MEINS FROM MARA WHERE MATNR = PS_DATA-MATNR.
    IF SY-SUBRC NE 0.
      PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/没有该物料编码{ PS_DATA-MATNR }|.
    ELSE.
      DATA: LV_PSTAT TYPE MARA-PSTAT.
      IF PS_DATA-MATNR IS NOT INITIAL .
        SELECT SINGLE PSTAT INTO LV_PSTAT FROM MARA
        WHERE MATNR = PS_DATA-MATNR.
        IF SY-SUBRC = 0.
          SEARCH LV_PSTAT FOR 'B'.
          IF SY-SUBRC <> 0.
            PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/请维护会计视图|.
          ENDIF.
        ELSE.
          PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/物料{ PS_DATA-MATNR }基本视图未维护| .
        ENDIF.
      ENDIF.

      DATA: LV_XCHAR TYPE MARC-XCHAR.
      SELECT SINGLE XCHAR INTO LV_XCHAR FROM MARC WHERE MATNR = PS_DATA-MATNR AND WERKS = PS_DATA-WERKS.
      IF LV_XCHAR <> 'X'.
        PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/物料{ PS_DATA-MATNR }在工厂{ PS_DATA-WERKS }中未被维护| .
      ENDIF.

      IF PS_DATA-LMEIN IS INITIAL.
        "PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/基本单位不能为空|.
      ELSE.
        CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
          EXPORTING
            INPUT          = PS_DATA-LMEIN
            LANGUAGE       = '1'
          IMPORTING
            OUTPUT         = LV_MEINS1
          EXCEPTIONS
            UNIT_NOT_FOUND = 1
            OTHERS         = 2.
        IF LV_MEINS <> LV_MEINS1.
          PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/基本单位不一致|.
        ELSE.
          IF PS_DATA-MEIN1 IS INITIAL.
            "PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/转换单位不能为空|.
          ELSE.
            CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
              EXPORTING
                INPUT          = PS_DATA-MEIN1
                LANGUAGE       = '1'
              IMPORTING
                OUTPUT         = LV_MEIN11
              EXCEPTIONS
                UNIT_NOT_FOUND = 1
                OTHERS         = 2.
            SELECT * INTO TABLE @DATA(LV_MARM) FROM MARM WHERE MATNR = @PS_DATA-MATNR AND MEINH = @LV_MEIN11.
            IF LV_MARM IS NOT INITIAL.
              "换算关系start
              DATA: LV_FM_UMREZ TYPE MARM-UMREZ.   "分母的值
              DATA: LV_FZ_UMREZ TYPE MARM-UMREZ.   "分子的值
              SELECT SINGLE UMREZ INTO LV_FM_UMREZ FROM MARM WHERE MATNR = PS_DATA-MATNR AND MEINH = LV_MEINS1.
              SELECT SINGLE UMREZ INTO LV_FZ_UMREZ FROM MARM WHERE MATNR = PS_DATA-MATNR AND MEINH = LV_MEIN11.

              IF PS_DATA-UMREN IS NOT INITIAL AND PS_DATA-UMREZ IS NOT INITIAL AND LV_FM_UMREZ > 0 AND LV_FZ_UMREZ > 0.

                IF ( LV_FZ_UMREZ / LV_FM_UMREZ ) <> ( PS_DATA-UMREZ / PS_DATA-UMREN ).
                  PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/分子与分母的比值与系统不一致|.
                ENDIF.
              ENDIF.
              "换算关系end
            ELSE.
              PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/换算单位不一致|.
            ENDIF.
          ENDIF.

        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.


  IF PS_DATA-WERKS IS INITIAL.
    PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/工厂不能为空|.
  ELSE.
    SELECT * INTO TABLE @DATA(LV_T001W) FROM T001W WHERE VKORG = @PS_DATA-WERKS.
    IF SY-SUBRC <> 0.
      PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/工厂不存在|.
    ELSE.
      IF PS_DATA-MATNR IS NOT INITIAL.
        SELECT * INTO TABLE @DATA(LV_MARC) FROM MARC WHERE MATNR = @PS_DATA-MATNR AND WERKS = @PS_DATA-WERKS .
        IF SY-SUBRC <> 0.
          PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/采购视图未维护|.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.



  IF PS_DATA-EKORG IS INITIAL.
    PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/采购组织不能为空|.
  ELSE.
    IF PS_DATA-EKORG <> 'P101'.
      PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/采购组织必须为P101|.
    ENDIF.
  ENDIF.



  IF PS_DATA-EKGRP IS INITIAL.
    PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/采购组不能为空|.
  ELSE.
    SELECT * INTO TABLE @DATA(LV_T024) FROM T024 WHERE EKGRP = @PS_DATA-EKGRP.
    IF SY-SUBRC <> 0.
      PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/采购组不存在|.
    ENDIF.
  ENDIF.
  IF PS_DATA-MWSKZ IS INITIAL.
    PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/税码不能为空|.
  ELSE.
    SELECT * INTO TABLE @DATA(LV_T007S) FROM T007S WHERE MWSKZ = @PS_DATA-MWSKZ.
    IF SY-SUBRC <> 0.
      PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/税码不存在|.
    ENDIF.
  ENDIF.
  IF PS_DATA-NETPR <= 0 OR PS_DATA-NETPR IS INITIAL.
    PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/净价不能为空或小于等于0|.
  ELSE.
    DATA: LV_1(10)       TYPE C,
          LV_DECIMAL(10) TYPE C,
          LV_LEN         TYPE I.
    SPLIT PS_DATA-NETPR AT '.' INTO LV_1 LV_DECIMAL.
    LV_LEN = STRLEN( LV_DECIMAL ).
    IF LV_LEN > 2.
      PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/净价最多两位小数|.
    ENDIF.
  ENDIF.




  IF PS_DATA-DATAB IS INITIAL OR PS_DATA-DATBI IS INITIAL.
    PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/有效起始、截止日期不能为空|.
  ELSE.
    CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
      EXPORTING
        DATE                      = PS_DATA-DATAB
      EXCEPTIONS
        PLAUSIBILITY_CHECK_FAILED = 1
        OTHERS                    = 2.
    IF SY-SUBRC <> 0.
      PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/有效起始日格式有误|.
    ENDIF.
    CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
      EXPORTING
        DATE                      = PS_DATA-DATBI
      EXCEPTIONS
        PLAUSIBILITY_CHECK_FAILED = 1
        OTHERS                    = 2.
    IF SY-SUBRC <> 0.
      PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/有效截止日格式有误|.
    ENDIF.

    IF PS_DATA-DATBI < PS_DATA-DATAB.
      PS_DATA-MESSAGE = |{ PS_DATA-MESSAGE }/起始日期不可大于截止日期|.
    ENDIF.

  ENDIF.



  IF PS_DATA-MESSAGE IS INITIAL .
    PS_DATA-ZCHECK = ICON_LED_GREEN.
    PS_DATA-MESSAGE = '数据正确:待创建'.
    "查询
    DATA: WA_EINA     TYPE EINA.
    WA_EINA-LIFNR = PS_DATA-LIFNR. "供应商
    WA_EINA-MATNR = PS_DATA-MATNR. "物料号
    DATA: LINT_INDEX TYPE I.
    LINT_INDEX = STRLEN( WA_EINA-LIFNR ).
    DATA: ZERO(1) VALUE 0.
    LINT_INDEX = 10 - LINT_INDEX.
    IF STRLEN( WA_EINA-LIFNR ) < 10.
      DO LINT_INDEX TIMES.
        CONCATENATE ZERO WA_EINA-LIFNR INTO WA_EINA-LIFNR.
      ENDDO.
    ENDIF.

    SELECT * INTO TABLE @DATA(LV_EINA) FROM EINA WHERE MATNR = @WA_EINA-MATNR AND LIFNR = @WA_EINA-LIFNR .
    IF SY-SUBRC = 0.
      IF LV_EINA IS NOT INITIAL.
        PS_DATA-ZCHECK = ICON_LED_YELLOW.
        PS_DATA-MESSAGE = '数据正确:待覆盖'.
      ENDIF.
    ENDIF.
    "查询 END
  ELSE.
    SHIFT PS_DATA-MESSAGE LEFT DELETING LEADING '/'.
    PS_DATA-ZCHECK = ICON_LED_RED.
    PS_DATA-MESSAGE = |数据有误:{ PS_DATA-MESSAGE }|.
  ENDIF.
ENDFORM.


*正式批导逻辑层
FORM FRM_ME11_RUN TABLES PT_DATA STRUCTURE GS_DATA.

  " 定义 start

  DATA: LV_MEINS LIKE MARA-MEINS.
  DATA: LV_INFNR TYPE EINA-INFNR.
  DATA OREF TYPE REF TO CX_ROOT.


  DATA:
    LS_EINA          TYPE MEWIEINA,
    LS_EINAX         TYPE MEWIEINAX,
    LS_EINE          TYPE MEWIEINE,
    LS_EINEX         TYPE MEWIEINEX,
    LT_COND_VALIDITY TYPE TABLE OF MEWIVALIDITY,
    LT_CONDITION     TYPE TABLE OF MEWICONDITION,
    LT_RETURN        TYPE MEWI_T_RETURN,
    LV_MESSAGE       TYPE STRING.
  "定义 end




  CLEAR:GS_DATA.
  READ TABLE PT_DATA INTO GS_DATA INDEX 1.
  IF SY-SUBRC <> 0.
    EXIT.
  ENDIF.

  CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
    EXPORTING
      INPUT        = GS_DATA-MATNR
    IMPORTING
      OUTPUT       = GS_DATA-MATNR
    EXCEPTIONS
      LENGTH_ERROR = 1
      OTHERS       = 2.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      INPUT        = GS_DATA-LIFNR
    IMPORTING
      OUTPUT       = GS_DATA-LIFNR
    EXCEPTIONS
      LENGTH_ERROR = 1
      OTHERS       = 2.


  DATA: LINT_INDEX TYPE I.
  LINT_INDEX = STRLEN( GS_DATA-LIFNR ).
  DATA: ZERO(1) VALUE 0.
  LINT_INDEX = 10 - LINT_INDEX.
  IF STRLEN( GS_DATA-LIFNR ) < 10.
    DO LINT_INDEX TIMES.
      CONCATENATE ZERO GS_DATA-LIFNR INTO GS_DATA-LIFNR.
    ENDDO.
  ENDIF.


  IF GS_DATA-MEIN1 IS NOT INITIAL.
    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
      EXPORTING
        INPUT          = GS_DATA-MEIN1
        LANGUAGE       = '1'
      IMPORTING
        OUTPUT         = GS_DATA-MEIN1
      EXCEPTIONS
        UNIT_NOT_FOUND = 1
        OTHERS         = 2.
  ENDIF.

  IF GS_DATA-LMEIN IS NOT INITIAL.
    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
      EXPORTING
        INPUT          = GS_DATA-LMEIN
        LANGUAGE       = '1'
      IMPORTING
        OUTPUT         = GS_DATA-LMEIN
      EXCEPTIONS
        UNIT_NOT_FOUND = 1
        OTHERS         = 2.
  ENDIF.


  SELECT SINGLE MEINS INTO LV_MEINS FROM MARA WHERE MATNR = GS_DATA-MATNR.
  IF SY-SUBRC = 0.
    IF GS_DATA-LMEIN IS INITIAL.
      GS_DATA-LMEIN = LV_MEINS.
    ENDIF.
    IF GS_DATA-MEIN1 IS INITIAL.
      GS_DATA-MEIN1 = LV_MEINS.
    ENDIF.
  ENDIF.

  IF GS_DATA-UMREN IS INITIAL.
    GS_DATA-UMREN = 1.
  ENDIF.
  IF GS_DATA-UMREZ IS INITIAL.
    GS_DATA-UMREZ = 1.
  ENDIF.

  SELECT SINGLE INFNR INTO LV_INFNR FROM EINA WHERE MATNR = GS_DATA-MATNR AND LIFNR = GS_DATA-LIFNR .
*  IF SY-SUBRC = 0.
*    WA_EINA-INFNR = LV_INFNR.
*  ENDIF.

  LS_EINA-INFO_REC  = LV_INFNR.
  LS_EINA-MATERIAL  = GS_DATA-MATNR.
  LS_EINA-VENDOR    = GS_DATA-LIFNR.
  LS_EINA-BASE_UOM  = GS_DATA-LMEIN.     "box  基本单位
  LS_EINA-PO_UNIT   = GS_DATA-MEIN1.     "car  转换单位
  LS_EINA-CONV_NUM1 = GS_DATA-UMREZ.     "转换分子
  LS_EINA-CONV_DEN1 = GS_DATA-UMREN.     "转换分母

  IF GS_DATA-ZCHECK = ICON_LED_GREEN.
    LS_EINAX-INFO_REC = 'X'.
  ENDIF.
  LS_EINAX-MATERIAL  = 'X'.
  LS_EINAX-VENDOR    = 'X'.
  LS_EINAX-BASE_UOM  = 'X'.
  LS_EINAX-PO_UNIT   = 'X'.
  LS_EINAX-CONV_NUM1 = 'X'.
  LS_EINAX-CONV_DEN1 = 'X'.

  LS_EINE-INFO_REC   = LV_INFNR.
  LS_EINE-PURCH_ORG  = GS_DATA-EKORG.    "采购组织
  LS_EINE-PLANT      = GS_DATA-WERKS.    "工厂
  LS_EINE-NRM_PO_QTY = GS_DATA-NORBM.    "标准数量  标准采购订单数量
  LS_EINE-UNDER_TOL  = GS_DATA-UNTTO.    "交货不足容差
  LS_EINE-OVERDELTOL = GS_DATA-UEBTO.    "过量交货容差
  LS_EINE-CONV_NUM1  = GS_DATA-UMREZ.    "转换分子
  LS_EINE-CONV_DEN1  = GS_DATA-UMREN.    "转换分母
  LS_EINE-PLND_DELRY = GS_DATA-APLFZ.    "计划交货时间(天)
  LS_EINE-PUR_GROUP  = GS_DATA-EKGRP.    "采购组
  LS_EINE-TAX_CODE   = GS_DATA-MWSKZ.    "销售/购买税代码

  LS_EINE-INFO_TYPE  = '0'.  "默认标准  0 标准  2 寄售    3 分包合同   P  管道   1  可记帐

  IF GS_DATA-ZCHECK = ICON_LED_GREEN.
    LS_EINEX-INFO_REC = 'X'.
  ENDIF.
  LS_EINEX-PURCH_ORG  = 'X'.
  LS_EINEX-PLANT      = 'X'.
  LS_EINEX-NRM_PO_QTY = 'X'.
  LS_EINEX-UNDER_TOL  = 'X'.
  LS_EINEX-OVERDELTOL = 'X'.
  LS_EINEX-CONV_NUM1  = 'X'.
  LS_EINEX-CONV_DEN1  = 'X'.
  LS_EINEX-PLND_DELRY = 'X'.
  LS_EINEX-PUR_GROUP  = 'X'.
  LS_EINEX-TAX_CODE   = 'X'.

  LS_EINEX-INFO_TYPE  = 'X'.

  LS_EINE-NET_PRICE  = GS_DATA-NETPR.     "采购信息记录中的净价
  LS_EINE-PRICE_UNIT = GS_DATA-KPEIN.     "价格单位
  LS_EINE-CURRENCY   = 'CNY'.             "货币码
  LS_EINE-ORDERPR_UN = GS_DATA-LMEIN.     "订单价格单位(采购)
*
  LS_EINEX-NET_PRICE    = 'X'.
  LS_EINEX-PRICE_UNIT   = 'X'.
  LS_EINEX-CURRENCY     = 'X'.
  LS_EINEX-ORDERPR_UN   = 'X'.

  "开始处理
  TRY.
      CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
        EXPORTING
          I_EINA  = LS_EINA
          I_EINAX = LS_EINAX
          I_EINE  = LS_EINE
          I_EINEX = LS_EINEX
*         TESTRUN =
*       IMPORTING
*         E_EINA  =
*         E_EINE  =
        TABLES
*         TXT_LINES     =
*         COND_VALIDITY = LT_COND_VALIDITY
*         CONDITION     = LT_CONDITION
*         COND_SCALE_VALUE       =
*         COND_SCALE_QUAN        =
          RETURN  = LT_RETURN.
      CLEAR: LV_MESSAGE.
      LOOP AT LT_RETURN INTO DATA(LS_RETURN) WHERE TYPE CA 'AEX'.
        IF LV_MESSAGE IS INITIAL.
          LV_MESSAGE = |{ '导入失败!' }/{ LS_RETURN-MESSAGE }|.
        ELSE.
          LV_MESSAGE = |{ LV_MESSAGE }/{ LS_RETURN-MESSAGE }|.
        ENDIF.
      ENDLOOP.

      IF LV_MESSAGE IS INITIAL.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.

*  "条件
        IF GS_DATA-NETPR IS NOT INITIAL.

          SELECT SINGLE INFNR INTO LV_INFNR FROM EINA WHERE MATNR = GS_DATA-MATNR AND LIFNR = GS_DATA-LIFNR .
          LS_EINA-INFO_REC  = LV_INFNR.
          LS_EINEX-INFO_REC = ''.
          LS_EINE-INFO_REC   = LV_INFNR.
          LS_EINEX-INFO_REC  = ''.

          LS_EINE-NET_PRICE  = ''.     "采购信息记录中的净价
          LS_EINEX-NET_PRICE    = ''.

          SELECT SINGLE *
          INTO @DATA(LS_A017)
                FROM A017
                WHERE KAPPL = 'M'
                AND   KSCHL = 'PB00'
                AND   LIFNR = @GS_DATA-LIFNR
                AND   MATNR = @GS_DATA-MATNR
                AND   EKORG = @GS_DATA-EKORG
                AND   WERKS = @GS_DATA-WERKS
                AND   ESOKZ = '0'
                AND DATAB <= @GS_DATA-DATAB
                AND DATBI >= @GS_DATA-DATBI.

          DATA:LS_KONP TYPE KONP.

          IF LS_A017 IS NOT INITIAL.
            CHECK LS_A017-KNUMH IS NOT INITIAL.
            SELECT SINGLE  *
            INTO CORRESPONDING FIELDS OF @LS_KONP
            FROM KONP
            WHERE KNUMH = @LS_A017-KNUMH
            AND LOEVM_KO = ''
            AND   KSCHL = 'PB00'.
          ENDIF.

          IF LS_KONP IS NOT INITIAL.
            DATA(LV_FLAG) = 'U'.
          ELSE.
            LV_FLAG = 'I'.
          ENDIF.
          LT_CONDITION = VALUE #( ( SERIAL_ID = LS_KONP-KNUMH       "条件记录编号
          COND_COUNT = LS_KONP-KOPOS                                "条件的序列号
          COND_TYPE  = 'PB00'                                       "条件类型
*          SCALE_TYPE = 'A'                                         "等级类型
*          SCALE_BASE_TY = 'C'                                      "等级基础类型
*          CALCTYPCON = 'C'                                         "条件的计算类型
          COND_VALUE = GS_DATA-NETPR                                "条件金额 净价
          CURRENCY   = 'CNY'                                        "货币码 条件货币
*          SCALE_CURR = 'CNY'                                       "货币码
          COND_P_UNT = GS_DATA-KPEIN                                "条件的定价单位
          COND_UNIT  = GS_DATA-MEIN1                                "条件单位 box
*          SCALE_UNIT = GS_DATA-MEIN1                               "条件等级计量单位
          CHANGE_ID  = LV_FLAG ) ).

          LT_COND_VALIDITY = VALUE #( ( SERIAL_ID = LS_KONP-KNUMH
          PLANT     = GS_DATA-WERKS                                  "工厂
*          BASE_UOM  = GS_DATA-LMEIN                                 "基本计量单位
          VALID_FROM = GS_DATA-DATAB                                 "开始日期
          VALID_TO = GS_DATA-DATBI ) ).                              "结束日期
        ENDIF.


        CALL FUNCTION 'ME_INFORECORD_MAINTAIN'
          EXPORTING
            I_EINA        = LS_EINA
            I_EINAX       = LS_EINAX
            I_EINE        = LS_EINE
            I_EINEX       = LS_EINEX
*           TESTRUN       =
*       IMPORTING
*           E_EINA        =
*           E_EINE        =
          TABLES
*           TXT_LINES     =
            COND_VALIDITY = LT_COND_VALIDITY
            CONDITION     = LT_CONDITION
*           COND_SCALE_VALUE       =
*           COND_SCALE_QUAN        =
            RETURN        = LT_RETURN.
        CLEAR: LV_MESSAGE.
        LOOP AT LT_RETURN INTO DATA(LS_RETURN1) WHERE TYPE CA 'AEX'.
          IF LV_MESSAGE IS INITIAL.
            LV_MESSAGE = |{ '导入失败:' }{ LS_RETURN1-MESSAGE }|.
          ELSE.
            LV_MESSAGE = |{ LV_MESSAGE }/{ LS_RETURN1-MESSAGE }|.
          ENDIF.
        ENDLOOP.

      ENDIF.

      IF LV_MESSAGE IS INITIAL.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.

        LOOP AT PT_DATA ASSIGNING <FS_DATA>.
          <FS_DATA>-ZEXEC = ICON_LED_GREEN.
          <FS_DATA>-MESSAGE = |{ '导入成功:' }采购信息记录号:{ LV_INFNR }|.
        ENDLOOP.

      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        LOOP AT PT_DATA ASSIGNING <FS_DATA>.
          <FS_DATA>-ZEXEC = ICON_LED_RED.
          <FS_DATA>-MESSAGE = LV_MESSAGE.
        ENDLOOP.
      ENDIF.

    CATCH CX_ROOT INTO OREF.

      LOOP AT PT_DATA ASSIGNING <FS_DATA>.
        <FS_DATA>-ZEXEC = ICON_LED_RED.
        <FS_DATA>-MESSAGE += '导入失败:' + OREF->GET_TEXT( ).
      ENDLOOP.

  ENDTRY.

ENDFORM.

四、效果

1.EXCEL模板

2.批导程序

 3.标准程序

 备注:

原创不易,转载请注明出处!

原创不易,转载请注明出处!

原创不易,转载请注明出处!

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Peter_章小宇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值