欢迎来到萧静默的博客

书山有路勤为径,学海无涯苦作舟。

SAP-MM采购申请批导程序-BAPI_PR_CREATE

使用的函数是BAPI_PR_CREATE没使用PI_REQUISITION_CREATE。

界面

image

 excel

image

 整理好excel模板,使用SMW0进行模板上传

image

 代码如下

*&---------------------------------------------------------------------*
*& Report ZMMR114
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZMMR114.
TABLES:SSCRFIELDS.
TYPE-POOLS: ICON, SLIS.

TYPES:BEGIN OF TY_DATA,
        ZHZDH    TYPE CHAR5,      "汇总单号
        HEAD_TXT TYPE DF32S-TEXT, "抬头注释
        BSART    TYPE EBAN-BSART, "采购申请类型
        KNTTP    TYPE EBAN-KNTTP, "科目分配类别
        PSTYP    TYPE EBAN-PSTYP, "项目分配类别
        MATNR    TYPE EBAN-MATNR, "物料编码
        TXZ01    TYPE EBAN-TXZ01, "短文本
        MENGE    TYPE EBAN-MENGE, "申请数量
        MEINS    TYPE EBAN-MEINS, "单位
        BADAT    TYPE EBAN-BADAT, "交货日期
        MATKL    TYPE EBAN-MATKL, "物料组
        WERKS    TYPE EBAN-WERKS, "工厂
        LGORT    TYPE EBAN-LGORT, "存储地点
        EKGRP    TYPE EBAN-EKGRP, "采购组
        AFNAM    TYPE EBAN-AFNAM, "申请人
        ITEM_TXT TYPE DF32S-TEXT, "项目文本
        LIFNR    TYPE EBAN-LIFNR, "所需供应商
        SAKTO    TYPE EBKN-SAKTO, "总账科目
        KOSTL    TYPE EBKN-KOSTL, "成本中心
        ANLN1    TYPE EBKN-ANLN1, "固定资产
        AUFNR    TYPE EBKN-AUFNR, "内部订单
        ZPURDEP  TYPE EBAN-ZPURDEP, "采购部门
        ZOADJBH  TYPE EBAN-ZOADJBH, "OA单据编号
        BANFN    TYPE EBAN-BANFN, "采购申请编号
        BNFPO    TYPE EBAN-BNFPO, "采购申请的项目编号
        ICON     TYPE ICON_D,
        TYPE     TYPE BAPI_MTYPE,
        MESSAGE  TYPE CHAR255,
      END OF TY_DATA.
DATA:GT_DATA TYPE TABLE OF TY_DATA,
     WA_DATA TYPE   TY_DATA.
DATA GT_MSG TYPE BAPIRETTAB WITH HEADER LINE. ""消息框内表
DATA: C TYPE MARD-LABST.
*       ALV定义
DATA: WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
      IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
      G_LAYOUT    TYPE SLIS_LAYOUT_ALV,
      G_TITLE     TYPE LVC_TITLE,
      POS         TYPE I,
      L_FIELD     TYPE SLIS_FIELDCAT_ALV,   "字段列结构
      L_FIELDCAT  TYPE SLIS_T_FIELDCAT_ALV, "字段列内表
      L_STATUS_01 TYPE SLIS_FORMNAME VALUE 'L_STATUS_01'.

DEFINE ADD_COL.
  CLEAR wa_fieldcat.
  ADD 1 TO pos.
  wa_fieldcat-col_pos = pos.
  wa_fieldcat-fieldname = &1.
  wa_fieldcat-ref_fieldname = &2.
  wa_fieldcat-ref_tabname = &3.
  wa_fieldcat-seltext_m = &4.
  wa_fieldcat-tabname = &5.
  wa_fieldcat-do_sum = &6.
  wa_fieldcat-input = &7.
  wa_fieldcat-edit = &8.
  wa_fieldcat-checkbox = &9.
  APPEND wa_fieldcat TO it_fieldcat.
END-OF-DEFINITION.

"选择屏幕"
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001.
  PARAMETERS: P_FILE TYPE RLGRAP-FILENAME.
SELECTION-SCREEN END OF BLOCK BLK1.

SELECTION-SCREEN FUNCTION KEY 1. "下载模板按钮

INITIALIZATION.
  MOVE  '下载上传模板' TO SSCRFIELDS-FUNCTXT_01. "给按钮文本赋值

AT SELECTION-SCREEN.
  CASE SSCRFIELDS-UCOMM.
    WHEN 'FC01'.
      PERFORM FRM_DOWN_TEMPLATE."下载导入模板
  ENDCASE.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
  PERFORM FRM_UP_TEMPLATE."上传模板

AT SELECTION-SCREEN OUTPUT.

START-OF-SELECTION.
  CALL FUNCTION 'ZIT001'.
  IF NOT P_FILE IS INITIAL.
    PERFORM GET_XLS_DATA TABLES GT_DATA    USING P_FILE.                        "获取XLS文件数据到内表
    PERFORM FRM_CHECKDATA.
    PERFORM FRM_DISPLAY.
  ENDIF.

FORM FRM_DOWN_TEMPLATE."下载导入模板
  CALL METHOD ZCL_BC_EXCEL=>DOWNLOAD_TEMPLATE
    EXPORTING
      NAME_OF_TEMPLATE = '期初采购申请导入模板'
      IV_RELID         = 'MI'
      IV_OBJID         = 'ZMMR114'
*    IMPORTING
*     RV_FILEPATH      =
*    EXCEPTIONS
*     DOWNLOAD_ERROR   = 1
*     OTHERS           = 2
    .
  IF SY-SUBRC <> 0.
*   Implement suitable error handling here
  ENDIF.

ENDFORM.

FORM FRM_UP_TEMPLATE .

  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      DEF_FILENAME     = P_FILE
      MASK             = ',*.xlsx,*.XLSX,*.xls,*.XLS,*.txt,*.TXT'
*'',*.xls,*.XLS.'如果读入txt文件,在后边就需要用函数
      MODE             = 'O'
      TITLE            = 'File Name'
    IMPORTING
      FILENAME         = P_FILE
    EXCEPTIONS
      INV_WINSYS       = 1
      NO_BATCH         = 2
      SELECTION_CANCEL = 3
      SELECTION_ERROR  = 4
      OTHERS           = 5.
ENDFORM.

FORM GET_XLS_DATA TABLES P_DATA
                   USING P_FILE1 TYPE RLGRAP-FILENAME.

  DATA:IT_RAW TYPE TRUXS_T_TEXT_DATA.

  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
      I_LINE_HEADER        = 'X' "X表示带抬头行的EXCEL的抬头行不传进内表,否则EXCEL不要带抬头
      I_TAB_RAW_DATA       = IT_RAW            " WORK TABLE
      I_FILENAME           = P_FILE1
    TABLES
      I_TAB_CONVERTED_DATA = P_DATA[]   "ACTUAL DATA
    EXCEPTIONS
      CONVERSION_FAILED    = 1
      OTHERS               = 2.

  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  LOOP AT GT_DATA INTO WA_DATA.
    WA_DATA-ICON = ICON_LIGHT_OUT.
    MODIFY GT_DATA FROM WA_DATA.
    CLEAR:WA_DATA.
  ENDLOOP.
  SORT GT_DATA BY ZHZDH .
  IF GT_DATA[] IS INITIAL.
    MESSAGE '上传文件为空' TYPE 'S'.
    STOP.
  ENDIF.

ENDFORM. " GET_XLS_DATA

FORM FRM_CHECKDATA.
  CLEAR: WA_DATA.
  LOOP AT GT_DATA INTO WA_DATA.
    IF WA_DATA-KNTTP IS INITIAL.
      IF WA_DATA-MATNR IS INITIAL.
        WA_DATA-ICON = ICON_RED_LIGHT.
        WA_DATA-MESSAGE = '物料编码必填'.
        MODIFY GT_DATA FROM WA_DATA.
        CONTINUE.
      ENDIF.
    ENDIF.
    IF WA_DATA-MENGE IS INITIAL.
      WA_DATA-ICON = ICON_RED_LIGHT.
      WA_DATA-MESSAGE = '需求数量必填'.
      MODIFY GT_DATA FROM WA_DATA.
      CONTINUE.
    ENDIF.
    IF WA_DATA-BADAT < '19000101'.
      WA_DATA-ICON = ICON_RED_LIGHT.
      WA_DATA-MESSAGE = '交货日期必填'.
      MODIFY GT_DATA FROM WA_DATA.
      CONTINUE.
    ENDIF.
    IF WA_DATA-WERKS IS INITIAL.
      WA_DATA-ICON = ICON_RED_LIGHT.
      WA_DATA-MESSAGE = '工厂必填'.
      MODIFY GT_DATA FROM WA_DATA.
      CONTINUE.
    ENDIF.
    IF WA_DATA-ZPURDEP IS INITIAL.
      WA_DATA-ICON = ICON_RED_LIGHT.
      WA_DATA-MESSAGE = '申请部门必填'.
      MODIFY GT_DATA FROM WA_DATA.
      CONTINUE.
    ENDIF.
    IF WA_DATA-ZOADJBH IS INITIAL.
      WA_DATA-ICON = ICON_RED_LIGHT.
      WA_DATA-MESSAGE = 'OA单据编号必填'.
      MODIFY GT_DATA FROM WA_DATA.
      CONTINUE.
    ENDIF.
    "物料代码工厂下是否存在
    IF WA_DATA-MATNR IS NOT INITIAL.
      CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
        EXPORTING
          INPUT        = WA_DATA-MATNR
        IMPORTING
          OUTPUT       = WA_DATA-MATNR
        EXCEPTIONS
          LENGTH_ERROR = 1
          OTHERS       = 2.
      IF SY-SUBRC <> 0.
      ENDIF.
      SELECT SINGLE MATNR,WERKS FROM MARC INTO @DATA(LS_MARC) WHERE MATNR = @WA_DATA-MATNR
                                                                 AND WERKS = @WA_DATA-WERKS.
      IF SY-SUBRC <> 0.
        WA_DATA-ICON = ICON_RED_LIGHT.
        WA_DATA-MESSAGE = | 物料代码{ WA_DATA-MATNR }在工厂{ WA_DATA-WERKS }下不存在!| .
        MODIFY GT_DATA FROM WA_DATA.
        CONTINUE.
      ENDIF.
    ENDIF.
    IF WA_DATA-KNTTP = 'K' .
      IF WA_DATA-SAKTO IS INITIAL.
        WA_DATA-MESSAGE = |科目分配类别为K时总账科目必填!| .
        CONTINUE.
      ENDIF.
    ENDIF.
    IF WA_DATA-AFNAM IS INITIAL.
      WA_DATA-ICON = ICON_RED_LIGHT.
      WA_DATA-MESSAGE = '申请人必填'.
      MODIFY GT_DATA FROM WA_DATA.
      CONTINUE.
    ENDIF.

    IF WA_DATA-EKGRP IS INITIAL.
      WA_DATA-ICON = ICON_RED_LIGHT.
      WA_DATA-MESSAGE = '采购组织必填'.
      MODIFY GT_DATA FROM WA_DATA.
      CONTINUE.
    ENDIF.
    IF WA_DATA-MEINS IS INITIAL.
      WA_DATA-ICON = ICON_RED_LIGHT.
      WA_DATA-MESSAGE = '单位必填'.
      MODIFY GT_DATA FROM WA_DATA.
      CONTINUE.
    ENDIF.
    IF WA_DATA-ZHZDH IS INITIAL.
      WA_DATA-ICON = ICON_RED_LIGHT.
      WA_DATA-MESSAGE = '申请分隔号必填'.
      MODIFY GT_DATA FROM WA_DATA.
      CONTINUE.
    ENDIF.

    CLEAR:WA_DATA.
  ENDLOOP.
ENDFORM.
FORM FRM_DISPLAY .
  CLEAR: IT_FIELDCAT, WA_FIELDCAT.
  CLEAR G_LAYOUT.
  ADD_COL 'ICON'        SPACE SPACE '状态'                      'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'MESSAGE'     SPACE SPACE '处理消息'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'BANFN'       SPACE SPACE '采购申请号'                'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'ZHZDH'    SPACE SPACE '汇总单号'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'BSART'    SPACE SPACE '采购申请类型'                      'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'KNTTP'       SPACE SPACE '科目分配类别'                      'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'PSTYP'       SPACE SPACE '项目分配类别'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'MATNR'       SPACE SPACE '物料编码'                    'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'TXZ01'       SPACE SPACE '物料描述'                    'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'MENGE'  SPACE SPACE '申请数量'                'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'MEINS'  SPACE SPACE '单位'                'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'BADAT'     SPACE SPACE '交货日期'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'WERKS'     SPACE SPACE '工厂'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'LGORT'     SPACE SPACE '存储地点'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'EKGRP'     SPACE SPACE '采购组'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'AFNAM'     SPACE SPACE '申请人'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'ITEM_TXT'     SPACE SPACE '项目文本'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'LIFNR'     SPACE SPACE '所需供应商'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'SAKTO'     SPACE SPACE '总账科目'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'KOSTL'     SPACE SPACE '成本中心'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'ANLN1'     SPACE SPACE '固定资产'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'AUFNR'     SPACE SPACE '内部订单'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'MATKL'     SPACE SPACE '物料组'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'ZPURDEP'     SPACE SPACE '采购部门'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'ZOADJBH'     SPACE SPACE 'OA单据编号'                  'GT_DATA' SPACE SPACE SPACE SPACE.
  ADD_COL 'BNFPO'     SPACE SPACE '行号'                  'GT_DATA' SPACE SPACE SPACE SPACE.


  G_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
  G_LAYOUT-ZEBRA = 'X'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_PF_STATUS_SET = 'L_STATUS100'
      I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMAND'
      IS_LAYOUT                = G_LAYOUT
      IT_FIELDCAT              = IT_FIELDCAT
    TABLES
      T_OUTTAB                 = GT_DATA
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
  IF SY-SUBRC <> 0.
  ENDIF.
ENDFORM. " FRM_DISPLAY

FORM L_STATUS100 USING EXTAB TYPE SLIS_T_EXTAB.
  SET  PF-STATUS  'STANDARD_099'.
ENDFORM. "L_STATUS100

"ALV处理事件
FORM FRM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD.
  DATA: REF TYPE REF TO CL_GUI_ALV_GRID.
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = REF.
  CALL METHOD REF->CHECK_CHANGED_DATA.
  "响应事件
  CASE R_UCOMM.
*    WHEN '&IC1'.
*      READ TABLE GT_DATA INTO WA_DATA INDEX RS_SELFIELD-TABINDEX.
*      "单击时触发
*      IF RS_SELFIELD-FIELDNAME = 'SEL'.
*
*        IF WA_DATA-SEL = 'X'.
*          WA_DATA-SEL = ''.
*        ELSE.
*          WA_DATA-SEL = 'X'.
*        ENDIF.
*        MODIFY GT_DATA FROM WA_DATA.
*      ENDIF.
*    WHEN 'ALL'.
*      LOOP AT  GT_DATA INTO WA_DATA WHERE SEL = ''.
*        WA_DATA-SEL = 'X'.
*        MODIFY GT_DATA FROM WA_DATA.
*        CLEAR WA_DATA.
*      ENDLOOP.
*    WHEN 'NOALL'.
*      LOOP AT  GT_DATA INTO WA_DATA WHERE SEL = 'X'.
*        WA_DATA-SEL = ''.
*        MODIFY GT_DATA FROM WA_DATA.
*        CLEAR WA_DATA.
*      ENDLOOP.
    WHEN 'SCRAP'.
      PERFORM SAVE_DATA.
  ENDCASE.
  RS_SELFIELD-REFRESH = 'X'.
ENDFORM."FRM_USER_COMMAND

FORM SAVE_DATA.
  READ TABLE GT_DATA INTO WA_DATA WITH  KEY ICON = ICON_RED_LIGHT.
  IF SY-SUBRC = 0.
    MESSAGE | 导入数据中存在不完整,请检查数据!| TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

*-- 定义
  DATA:LS_MESSAGE TYPE ZTCMS008-ZMESSAGE.
  DATA: LT_EXT TYPE TABLE OF BAPIPAREX,
        LS_EXT TYPE BAPIPAREX,
        LS_TE  TYPE BAPI_TE_MEREQITEM.   "<— 增强结构
  DATA:LT_EXTX TYPE TABLE OF BAPIPAREX,
       LS_EXTX TYPE BAPIPAREX,
       LS_TEX  TYPE BAPI_TE_MEREQITEMX.   "<— 增强结构更新
  DATA: C_MATERIAL TYPE BAPIEBANC-MATERIAL.
  DATA: C_LIFNR TYPE BAPIEBANC-DES_VENDOR.
  DATA: I_COUNT TYPE I VALUE 10.
  DATA: I_COUNT_KM TYPE I VALUE 1.
  DATA:L_ERROR TYPE REF TO CX_SY_OPEN_SQL_DB.
  DATA:LV_MSEHI TYPE T006A-MSEHI.
  DATA:LV_BANFN      TYPE EBAN-BANFN.                   "定义变量
  DATA:LV_BNFPO      TYPE EBAN-BNFPO.                   "定义变量
  DATA:LS_PRITEM     TYPE BAPIMEREQITEMIMP.             "定义工作区
  DATA:LS_PRITEMX    TYPE BAPIMEREQITEMX.               "定义工作区
  DATA:LT_PRITEM     TYPE TABLE OF BAPIMEREQITEMIMP.    "定义内表
  DATA:LT_PRITEMX    TYPE TABLE OF BAPIMEREQITEMX.      "定义内表
  DATA:LS_PRITEMTEXT     TYPE  BAPIMEREQITEMTEXT.    "行文本定义内表
  DATA:LS_PRHEADERTEXT    TYPE  BAPIMEREQHEADTEXT.      "行文本定义内表
  DATA:LT_PRITEMTEXT     TYPE TABLE OF BAPIMEREQITEMTEXT.    "定义内表
  DATA:LT_PRHEADERTEXT    TYPE TABLE OF BAPIMEREQHEADTEXT.      "定义内表
  DATA:LS_HEAD       TYPE BAPIMEREQHEADER.              "定义工作区
  DATA:LS_HEADX      TYPE BAPIMEREQHEADERX.             "定义工作区
  DATA:LT_RETURN TYPE TABLE OF BAPIRET2 WITH HEADER LINE.            "定义内表
  DATA:LS_PRACCOUNT  TYPE BAPIMEREQACCOUNT.             "定义工作区
  DATA:LS_PRACCOUNTX TYPE BAPIMEREQACCOUNTX.            "定义工作区
  DATA:LT_PRACCOUNT  TYPE TABLE OF BAPIMEREQACCOUNT.    "定义内表
  DATA:LT_PRACCOUNTX TYPE TABLE OF BAPIMEREQACCOUNTX.   "定义内表
  DATA:LV_STRING TYPE STRING.
  DATA:LV_MESSAGE TYPE STRING.
  DESCRIBE TABLE GT_DATA LINES DATA(LV_LINES).
  LOOP AT GT_DATA  ASSIGNING FIELD-SYMBOL(<FS01>)
                      GROUP BY ( ZHZDH = <FS01>-ZHZDH ).

*-- 显示导入进度
    LV_STRING = '导入进度' && SY-TABIX && '/' && LV_LINES.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        PERCENTAGE = SY-TABIX
        TEXT       = LV_STRING.

    LOOP AT GT_DATA ASSIGNING FIELD-SYMBOL(<GRP01>) WHERE ZHZDH = <FS01>-ZHZDH .
  I_COUNT = I_COUNT + 10.
"抬头数据 LS_HEAD-PR_TYPE = <GRP01>-BSART. "直接给BAPI入参赋值-采购申请类型 LS_HEADX-PR_TYPE = 'X'. "直接给BAPI入参赋值-采购申请类型-标记 " 明细行项目数据 LS_PRITEM-PREQ_ITEM = I_COUNT. "直接给BAPI入参赋值-采购申请类型行项目号 * IF WA_ZTCMS008-ERNAM IS NOT INITIAL. * LS_PRITEM-PREQ_NAME = WA_ZTCMS008-ERNAM. "直接给BAPI入参赋值-采购申请创建人取系统ID * ENDIF. LS_PRITEM-PREQ_NAME = <GRP01>-AFNAM. "申请人 IF <GRP01>-MATNR IS NOT INITIAL. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = <GRP01>-MATNR IMPORTING OUTPUT = C_MATERIAL. LS_PRITEM-MATERIAL = C_MATERIAL. "物料 ELSE. LS_PRITEM-MATERIAL = ''. ENDIF. IF <GRP01>-WERKS IS NOT INITIAL. LS_PRITEM-PLANT = <GRP01>-WERKS. ELSE. LS_PRITEM-PLANT = <GRP01>-WERKS. "直接给BAPI入参赋值-工厂 ENDIF. LS_PRITEM-STORE_LOC = <GRP01>-LGORT."存储地点 LS_PRITEM-QUANTITY = <GRP01>-MENGE. "数量 "单位内外码转换 CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT' EXPORTING INPUT = <GRP01>-MEINS "外码 LANGUAGE = SY-LANGU IMPORTING OUTPUT = LV_MSEHI. "内码 LS_PRITEM-UNIT = LV_MSEHI. "单位 LS_PRITEM-DELIV_DATE = <GRP01>-BADAT. "交货日期 * LS_PRITEM-PREQ_DATE = <GRP01>-ERDAT. "需求日期 LS_PRITEM-SHORT_TEXT = <GRP01>-TXZ01. "文本 LS_PRITEM-PUR_GROUP = <GRP01>-EKGRP. "直接给BAPI入参赋值-采购组 LS_PRITEM-MATL_GROUP = <GRP01>-MATKL. "物料组 LS_PRITEM-DEL_DATCAT_EXT = 'D'. "交货日期种类 LS_PRITEM-ACCTASSCAT = <GRP01>-KNTTP. "直接给BAPI入参赋值-科目分配类别 LS_PRITEM-ITEM_CAT = <GRP01>-PSTYP."项目分配类别 CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = <GRP01>-LIFNR IMPORTING OUTPUT = C_LIFNR. LS_PRITEM-DES_VENDOR = C_LIFNR."所需供应商 APPEND LS_PRITEM TO LT_PRITEM. "将工作区ls_pritem赋值给内表lt_pritem LS_PRITEMX-PREQ_ITEM = I_COUNT. "直接给BAPI入参赋值-标记 * LS_PRITEMX-ERNAM = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-MATERIAL = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-PREQ_NAME = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-PLANT = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-STORE_LOC = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-QUANTITY = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-UNIT = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-DELIV_DATE = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-SHORT_TEXT = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-PUR_GROUP = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-MATL_GROUP = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-DEL_DATCAT_EXT = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-ACCTASSCAT = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-ITEM_CAT = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-DES_VENDOR = 'X'. "直接给BAPI入参赋值-标记 APPEND LS_PRITEMX TO LT_PRITEMX. "将工作区ls_pritemx赋值给内表lt_pritemx "行项目文本 LS_PRITEMTEXT-PREQ_ITEM = I_COUNT. LS_PRITEMTEXT-TEXT_ID = 'B01'. LS_PRITEMTEXT-TEXT_LINE = <GRP01>-ITEM_TXT. APPEND LS_PRITEMTEXT TO LT_PRITEMTEXT. "科目分配 LS_PRACCOUNT-PREQ_ITEM = I_COUNT. "直接给BAPI入参赋值-采购申请类型行项目号 LS_PRACCOUNT-SERIAL_NO = I_COUNT_KM. "直接给BAPI入参赋值-科目分配的序号 LS_PRACCOUNT-GL_ACCOUNT = |{ <GRP01>-SAKTO ALPHA = IN }|. LS_PRACCOUNT-COSTCENTER = |{ <GRP01>-KOSTL ALPHA = IN }|. "直接给BAPI入参赋值-成本中心 SPLIT <GRP01>-ANLN1 AT '-' INTO <GRP01>-ANLN1 DATA(A). "根据OA报文,资产自带-0,需要截取 LS_PRACCOUNT-ASSET_NO = |{ <GRP01>-ANLN1 ALPHA = IN }|. "直接给BAPI入参赋值-资产编号 LS_PRACCOUNT-ORDERID = |{ <GRP01>-AUFNR ALPHA = IN }|. "直接给BAPI入参赋值-订单编号 APPEND LS_PRACCOUNT TO LT_PRACCOUNT. "将工作区ls_pracccount赋值给内表lt_praccount LS_PRACCOUNTX-PREQ_ITEM = I_COUNT. "直接给BAPI入参赋值-采购申请类型行项目号 LS_PRACCOUNTX-SERIAL_NO = I_COUNT_KM. "直接给BAPI入参赋值-科目分配的序号 LS_PRACCOUNTX-GL_ACCOUNT = 'X'. "直接给BAPI入参赋值-科目编号 LS_PRACCOUNTX-COSTCENTER = 'X'. "直接给BAPI入参赋值-成本中心 LS_PRACCOUNTX-ASSET_NO = 'X'. "直接给BAPI入参赋值-资产编号 LS_PRACCOUNTX-ORDERID = 'X'. "直接给BAPI入参赋值-订单编号 APPEND LS_PRACCOUNTX TO LT_PRACCOUNTX. "将工作区ls_praccountx赋值给内表lt_accountx " 增强字段赋值 LS_TE-PREQ_ITEM = I_COUNT. LS_TE-ZOADJBH = <GRP01>-ZOADJBH. "<— 自定义字段 * LS_TE-ZOAHEADERID = <GRP01>-ZOAHEADERID. "<— 自定义字段 * LS_TE-ZOAITEMID = <GRP01>-ZOAITEMID. "<— 自定义字段 LS_TE-ZPURDEP = <GRP01>-ZPURDEP. "<— 自定义字段 * LS_EXT-STRUCTURE = 'BAPI_TE_REQUISITION_ITEM'. "BAPI_REQUISITION_CREATE用的这个 LS_EXT-STRUCTURE = 'BAPI_TE_MEREQITEM'."BAPI_PR_CREATE用到的是这个 LS_EXT-VALUEPART1 = LS_TE. APPEND LS_EXT TO LT_EXT. " 增强字段赋值更新 LS_TEX-PREQ_ITEM = I_COUNT. LS_TEX-ZOADJBH = 'X'. "<— 自定义字段 * LS_TEX-ZOAHEADERID = 'X'. "<— 自定义字段 * LS_TEX-ZOAITEMID = 'X'. "<— 自定义字段 LS_TEX-ZPURDEP = 'X'. "<— 自定义字段 LS_EXT-STRUCTURE = 'BAPI_TE_MEREQITEMX'."BAPI_PR_CREATE用到的是这个 LS_EXT-VALUEPART1 = LS_TEX. APPEND LS_EXT TO LT_EXT. <GRP01>-BNFPO = I_COUNT. CLEAR:LS_PRITEM,LS_PRITEMX,LS_PRACCOUNT,LS_PRACCOUNTX,LS_TE,LS_EXT,LS_TEX. ENDLOOP. "-------------------------------------------------- " 调用 BAPI "-------------------------------------------------- CALL FUNCTION 'BAPI_PR_CREATE' EXPORTING "BAPI入参 PRHEADER = LS_HEAD PRHEADERX = LS_HEADX IMPORTING "BAPI出参 NUMBER = LV_BANFN TABLES "表参数(入参) RETURN = LT_RETURN PRITEM = LT_PRITEM PRITEMX = LT_PRITEMX PRACCOUNT = LT_PRACCOUNT PRACCOUNTX = LT_PRACCOUNTX PRITEMTEXT = LT_PRITEMTEXT EXTENSIONIN = LT_EXT EXTENSIONOUT = LT_EXTX. LOOP AT LT_RETURN WHERE TYPE = 'E' OR TYPE = 'A'. CONCATENATE LT_RETURN-MESSAGE LV_MESSAGE INTO LV_MESSAGE SEPARATED BY ';'. ENDLOOP. IF SY-SUBRC = 0. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. <FS01>-TYPE = 'E'. <FS01>-ICON = ICON_LED_RED. <FS01>-MESSAGE = LV_MESSAGE. ELSE. IF LV_BANFN IS NOT INITIAL. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING WAIT = 'X'. <FS01>-TYPE = 'S'. <FS01>-ICON = ICON_LED_GREEN. <FS01>-BANFN = LV_BANFN. <FS01>-MESSAGE = '导入成功'. "抬头文本写入 PERFORM FRM_GET_TEXT CHANGING <FS01>. <FS01>-BANFN = |{ <FS01>-BANFN ALPHA = OUT }|. <FS01>-MATNR = |{ <FS01>-MATNR ALPHA = OUT }|. ENDIF. ENDIF. CLEAR:LV_BANFN,LS_HEAD,LS_HEADX,LT_RETURN,LT_RETURN[],LT_PRITEM,LT_PRITEMX,LT_PRACCOUNT,LT_PRACCOUNTX,LT_PRITEMTEXT,LT_EXT,LT_EXTX,LV_MESSAGE,LV_STRING. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form frm_get_text *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& <-- <FS01> *&---------------------------------------------------------------------* FORM FRM_GET_TEXT CHANGING C_DATA TYPE TY_DATA. ""文本定义 DATA:LS_HEAD_TXT TYPE THEAD, LT_TEXT TYPE TABLE OF TLINE WITH HEADER LINE, LV_TEXT TYPE STRING. LS_HEAD_TXT-TDID = 'B01'. LS_HEAD_TXT-TDNAME = C_DATA-BANFN. LS_HEAD_TXT-TDOBJECT = 'EBANH'. LS_HEAD_TXT-TDSPRAS = SY-LANGU. LV_TEXT = C_DATA-HEAD_TXT. DO . IF STRLEN( LV_TEXT ) > 132. LT_TEXT-TDFORMAT = '*'. LT_TEXT-TDLINE = LV_TEXT+0(132). APPEND LT_TEXT. CLEAR LT_TEXT. SHIFT LV_TEXT BY 132 PLACES LEFT. ELSE. LT_TEXT-TDLINE = LV_TEXT . LT_TEXT-TDFORMAT = '*'. APPEND LT_TEXT. CLEAR LT_TEXT. EXIT. ENDIF. ENDDO. "补充采购申请抬头文本 CALL FUNCTION 'SAVE_TEXT' EXPORTING HEADER = LS_HEAD_TXT SAVEMODE_DIRECT = 'X' TABLES LINES = LT_TEXT EXCEPTIONS ID = 1 LANGUAGE = 2 NAME = 3 OBJECT = 4 OTHERS = 5. IF SY-SUBRC <> 0. C_DATA-TYPE = 'E'. C_DATA-ICON = ICON_LED_RED. C_DATA-MESSAGE = ';但抬头文本导入失败!'. ELSE. COMMIT WORK AND WAIT. ENDIF. ENDFORM.

结果

image

 点击导入

image

 

posted @ 2025-12-12 16:02  萧静默  阅读(0)  评论(0)    收藏  举报