创建采购订单(订购单)

 

 

*&---------------------------------------------------------------------*
*& Report ZMM015
*&---------------------------------------------------------------------*
*& 抬头     : 采购凭证批导程序                                          *
*& 模块     : MM                                                       *
*& 作者     : ZHANGS                                                   *
*& 创建日期 : 2019/02/27                                               *
*& 修改记录 :                                                          *
*& 日期        修改人           修改内容                               *
*& YYYY/MM/DD  修改人员名       说明                                   *
*&---------------------------------------------------------------------*
REPORT ZMM015.

TYPES: BEGIN OF TY_UPLOAD,

*         TABIX TYPE STRING, "采购订单序号
         EBELN       TYPE STRING, " 采购订单号 及是 采购订单序号
         PO_ITEM     TYPE STRING, "行项目号
         BSART       TYPE STRING, " 采购凭证类型
         KNTTP       TYPE STRING, "科目分配类别
         PSTYP       TYPE STRING, "项目类别
         BEDAT       TYPE STRING, " 采购凭证日期
         BUKRS       TYPE STRING, " 公司代码
         EKORG       TYPE STRING, " 采购组织
         EKGRP       TYPE STRING, " 采购组
         LIFNR       TYPE STRING, " 供应商帐户号
         EBELP       TYPE STRING, " 采购订单的项目编号
         MATNR       TYPE STRING, " 物料编号
         TXZ01       TYPE STRING, "短文本
         WERKS       TYPE STRING, " 工厂
         SUPPL_STLOC TYPE STRING, "储存地点、库存地点
         MATKL       TYPE STRING, " 物料组
         MENGE       TYPE STRING, " 数量
         MEINS       TYPE STRING, " 订单单位
         EINDT       TYPE STRING, " 交货日期
         SLFDT       TYPE STRING, "交货日期的相关统计
         WAERS       TYPE STRING,
         NETPR       TYPE STRING, "单价
*EKPO-BRTWR/EKPO-MENGE   " 价格(PBXX/PB00含税价)
         PEINH       TYPE STRING, " 价格单位
         BPRME       TYPE STRING, "订单价格单位(采购)
         MWSKZ       TYPE STRING, " 税码
         BEDNR       TYPE STRING, "需求跟踪号
         FREE        TYPE STRING, "免费       ----------
         JHFLG       TYPE STRING, "交货已完成 -----------------
         RET_ITEM    TYPE STRING, "退货
         UEBTO       TYPE STRING, " 过量交货限度(%)
         UNTTO       TYPE STRING, " 交货不足限度(%)
         AUFNR       TYPE STRING, " 生产订单
         KOSTL       TYPE STRING, "成本中心
         GL_ACCOUNT  TYPE STRING, "总账科目
         ZBZXX       TYPE STRING, "备注信息
       END OF TY_UPLOAD.

DATA: GS_UPLOAD TYPE TY_UPLOAD,
      GT_UPLOAD TYPE TABLE OF TY_UPLOAD.

TYPES: BEGIN OF TY_OUTPUT,
         CHK_LIGHTS  TYPE CHAR1, "-- 数据检查指示灯 -
*         TABIX      LIKE SYST-TABIX, "采购订单序号
         EBELN       TYPE EKKO-EBELN, " 采购订单号
         PO_ITEM     TYPE BAPIMEPOITEM-PO_ITEM, "行项目号
         BSART       TYPE EKKO-BSART, " 采购凭证类型
         KNTTP       TYPE EKPO-KNTTP, "科目分配类别
         PSTYP       TYPE EKPO-PSTYP, "项目类别
         BEDAT       TYPE EKKO-BEDAT, " 采购凭证日期
         BUKRS       TYPE EKKO-BUKRS, " 公司代码
         EKORG       TYPE EKKO-EKORG, " 采购组织
         EKGRP       TYPE EKKO-EKGRP, " 采购组
         LIFNR       TYPE EKKO-LIFNR, " 供应商帐户号
         EBELP       TYPE EKPO-EBELP, " 采购订单的项目编号
         MATNR       TYPE EKPO-MATNR, " 物料编号
         TXZ01       TYPE EKPO-TXZ01, " 物料短描述
         WERKS       TYPE EKPO-WERKS, " 工厂
         SUPPL_STLOC TYPE LGOBE,      "储存地点、库存地点-------
         MATKL       TYPE EKPO-MATKL, " 物料组
         MENGE       TYPE EKPO-MENGE, " 数量
         MEINS       TYPE EKPO-MEINS, " 订单单位
         EINDT       TYPE EKET-EINDT, " 交货日期
         SLFDT       TYPE EKET-SLFDT, "交货日期的相关统计
         WAERS       TYPE EKKO-WAERS, "货币码
         NETPR       TYPE EKPO-NETPR, " 单价
*EKPO-BRTWR/EKPO-MENGE   " 价格(PBXX/PB00含税价)
         PEINH       TYPE EKPO-PEINH, " 价格单位
         BPRME       TYPE EKPO-BPRME, "订单价格单位(采购)
         MWSKZ       TYPE EKPO-MWSKZ, " 税码
         BEDNR       TYPE EKPO-BEDNR, "需求跟踪号
         FREE        TYPE UMSON,      "免费       ----------
         JHFLG       TYPE BAPIMEPOITEM-NO_MORE_GR,   "交货完成标识----------
         RET_ITEM    TYPE BAPIMEPOITEM-RET_ITEM, "退货
         UEBTO       TYPE EKPO-UEBTO, " 过量交货限度(%)
         UNTTO       TYPE EKPO-UNTTO, " 交货不足限度(%)
         AUFNR       TYPE EBKN-AUFNR, " 生产订单
         KOSTL       TYPE EKKN-KOSTL, "成本中心
         GL_ACCOUNT  TYPE BAPIMEPOACCOUNT-GL_ACCOUNT, "总账科目
         ZBZXX       TYPE CHAR40, "备注信息

         STATU       TYPE BAPIRET2-TYPE,
         MSG         TYPE BAPIRET2-MESSAGE,

       END OF TY_OUTPUT.

DATA: GS_OUTPUT TYPE TY_OUTPUT,
      GT_OUTPUT TYPE TABLE OF TY_OUTPUT.

DATA: GT_FCAT TYPE LVC_T_FCAT,
      GA_FCAT TYPE LVC_S_FCAT,
      LC_GRID TYPE REF TO CL_GUI_ALV_GRID.

DEFINE ADD_FIELDS.
  ga_fcat-fieldname = &1.
  ga_fcat-scrtext_m = &2.
  APPEND ga_fcat TO gt_fcat.
  CLEAR ga_fcat.
END-OF-DEFINITION.


SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001 .
PARAMETERS : P_FILE LIKE RFPDO1-FEBUMSF .
SELECTION-SCREEN END OF BLOCK B1 .


SELECTION-SCREEN BEGIN OF BLOCK B3 WITH FRAME TITLE TEXT-002 .
PARAMETERS : R1 RADIOBUTTON GROUP RAD2,
             R2 RADIOBUTTON GROUP RAD2.
SELECTION-SCREEN END OF BLOCK B3 .

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.

  "路径选择
  DATA: L_FILES TYPE FILETABLE,
        H_FILES TYPE FILE_TABLE,
        L_RC    LIKE SY-SUBRC.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    CHANGING
      FILE_TABLE              = L_FILES
      RC                      = L_RC
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      OTHERS                  = 4.
  IF SY-SUBRC <> 0 OR L_RC < 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  READ TABLE L_FILES INDEX 1 INTO H_FILES.
  P_FILE = H_FILES-FILENAME.


START-OF-SELECTION .
  CASE 'X' .
    WHEN R1 .
      IF P_FILE IS INITIAL .
        MESSAGE '请选择导入文件路径' TYPE 'S' DISPLAY LIKE 'E' .
        EXIT.
      ENDIF .
      PERFORM FRM_UPLOAD_DATA .
      PERFORM FRM_CHECK_DATA .
      PERFORM FRM_DISPLAY_ALV.
    WHEN R2 .
      PERFORM FRM_DOWNLOAD_TEMP .
  ENDCASE.


*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_TEMP
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD_TEMP .
  DATA : LC_FILE  TYPE  STRING , "rlgrap-filename,
         LC_OBJID TYPE WWWDATATAB-OBJID VALUE 'ZMM015',
         LC_KEY   TYPE WWWDATATAB,
         LC_DESC  TYPE RLGRAP-FILENAME,
         LC_SUBRC TYPE SY-SUBRC,
         LC_TEMP  TYPE C.

  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      DEF_FILENAME     = '采购订单批量创建模板.xls'      "设置前文件名
      DEF_PATH         = 'C:\'                                "设置前路径
      MASK             = ',Excel Files,*.xls;All Files,*.*.'
      MODE             = 'S'                                 "S = 保存,O = 打开
      TITLE            = 'Save File'
    IMPORTING
      FILENAME         = LC_FILE
    EXCEPTIONS
      INV_WINSYS       = 1
      NO_BATCH         = 2
      SELECTION_CANCEL = 3
      SELECTION_ERROR  = 4
      OTHERS           = 5.
  IF SY-SUBRC = 0.
    LC_DESC = LC_FILE.
    SELECT SINGLE * INTO CORRESPONDING FIELDS OF LC_KEY
      FROM WWWDATA WHERE SRTF2 = 0 AND RELID = 'MI' AND OBJID = LC_OBJID .

    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        KEY         = LC_KEY
        DESTINATION = LC_DESC
      IMPORTING
        RC          = LC_SUBRC
      CHANGING
        TEMP        = LC_TEMP.

    IF LC_SUBRC <> 0 .
      MESSAGE '没有相应的数据模板下载' TYPE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDIF.

ENDFORM.

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

  DATA: V_RAW(4096) OCCURS 0,
        LV_FILE     TYPE RLGRAP-FILENAME.

*&---------------------------------------------

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      TEXT = '正在打开EXCEL文件'.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      TEXT = '数据上载中....'.

  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
      I_LINE_HEADER        = 'X'
      I_TAB_RAW_DATA       = V_RAW
      I_FILENAME           = P_FILE
    TABLES
      I_TAB_CONVERTED_DATA = GT_UPLOAD
    EXCEPTIONS
      CONVERSION_FAILED    = 1
      OTHERS               = 2.

  IF SY-SUBRC = 1.
    MESSAGE E893(UX) WITH LV_FILE RAISING CONVERSION_FAILED.
  ENDIF.
  IF SY-SUBRC = 2.
*    message e000 with '读取文件时发生错误!'.
  ENDIF.
  DELETE GT_UPLOAD INDEX 1.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV .

  DATA: LS_LAYOUT TYPE LVC_S_LAYO,
        LS_REPID  TYPE SY-REPID.

  CLEAR:LS_LAYOUT.
  LS_LAYOUT-ZEBRA      = 'X'.
  LS_LAYOUT-SEL_MODE   = 'A'.
  LS_LAYOUT-CWIDTH_OPT   = 'X'.
  LS_LAYOUT-EXCP_FNAME = 'CHK_LIGHTS'.
*  ls_layout-box_fieldname = 'SEL'."不用做选中,直接点前面的行号就代表选中
*  ls_repid = sy-repid.
  PERFORM FRM_GET_FIELDCAT.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
*     i_grid_title             = lv_grid_title
*     I_BUFFER_ACTIVE          = 'X'
      I_DEFAULT                = 'X'
      I_SAVE                   = 'X'
      I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'
      I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'
      IT_FIELDCAT_LVC          = GT_FCAT[]
      IS_LAYOUT_LVC            = LS_LAYOUT
*     it_events                = lt_event
    TABLES
      T_OUTTAB                 = GT_OUTPUT
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.

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

*  add_fields 'TABIX      '   '序号        '.
  ADD_FIELDS 'STATU'   '状态'.
  ADD_FIELDS 'MSG'     '消息'.
  ADD_FIELDS 'EBELN      '   '采购订单号 '.
  ADD_FIELDS 'PO_ITEM    '   '行项目号'.
  ADD_FIELDS 'BSART      '   '采购订单类型'.
  ADD_FIELDS 'KNTTP      '   '科目分配类别'.
  ADD_FIELDS 'PSTYP      '   '项目类别'.
  ADD_FIELDS 'BEDAT      '   '采购凭证日期  '.
  ADD_FIELDS 'BUKRS      '   '公司代码    '.
  ADD_FIELDS 'EKORG      '   '采购组织    '.
  ADD_FIELDS 'EKGRP      '   '采购组      '.
  ADD_FIELDS 'LIFNR      '   '供应商帐户号 '.
  ADD_FIELDS 'EBELP      '   '采购订单行项'.
  ADD_FIELDS 'MATNR      '   '物料号      '.
  ADD_FIELDS 'TXZ01      '   '物料短描述  '.
  ADD_FIELDS 'WERKS      '   '工厂        '.
  ADD_FIELDS 'SUPPL_STLOC'   '库存地点        '."-------------
  ADD_FIELDS 'MATKL      '   '物料组        '.
  ADD_FIELDS 'MENGE      '   '采购数量    '.
  ADD_FIELDS 'MEINS      '   '单位        '.
  ADD_FIELDS 'EINDT      '   '交货日期    '.
  ADD_FIELDS 'SLFDT      '   '统计交货日期    '.
  ADD_FIELDS 'WAERS      '   '货币码    '.
  ADD_FIELDS 'NETPR      '   '单价        '.
  ADD_FIELDS 'PEINH      '   '价格单位        '.
  ADD_FIELDS 'BPRME      '   '订单价格单位        '.
  ADD_FIELDS 'MWSKZ      '   '税码        '.
  ADD_FIELDS 'BEDNR      '   '跟踪编号'.
  ADD_FIELDS 'NETPR      '   '价格(PBXX/PB00含税价) '."--------------------
  ADD_FIELDS 'FREE       '   '免费'."--------------------
  ADD_FIELDS 'JHFLG      '   '交货已完成'."--------------------
  ADD_FIELDS 'RET_ITEM   '   '退货'."--------------------
  ADD_FIELDS 'UEBTO      '   '过量交货限度(%)'.
  ADD_FIELDS 'UNTTO      '   '交货不足限度(%)'.
  ADD_FIELDS 'AUFNR      '   '生产订单'.
  ADD_FIELDS 'KOSTL      '   '成本中心'.
  ADD_FIELDS 'GL_ACCOUNT '   '总账科目'."---------
  ADD_FIELDS 'ZBZXX      '   '项目文本'.

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

  CLEAR GS_UPLOAD.
  LOOP AT GT_UPLOAD INTO GS_UPLOAD.
*    GS_OUTPUT-TABIX = SY-TABIX.
    MOVE-CORRESPONDING GS_UPLOAD TO GS_OUTPUT.
    GS_OUTPUT-CHK_LIGHTS = 3.
    APPEND GS_OUTPUT TO GT_OUTPUT.

  ENDLOOP.

ENDFORM.
FORM SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB."调用SAP标准功能的工具栏图标,例排序、筛选、小计等功能
  SET PF-STATUS 'ZMM015'.   "双击单引号里面的,新建一个同名的状态,也可以去在别的reportcopy一个标准的
  "                "再加上自己定义的按钮。比如program name :   RM07MLBS
ENDFORM.


FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
               RS_SELFIELD TYPE SLIS_SELFIELD.

  DATA: LV_EBELN TYPE EBELN.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LC_GRID.
  CALL METHOD LC_GRID->CHECK_CHANGED_DATA.
  RS_SELFIELD-REFRESH = 'X'.

  CASE R_UCOMM.
    WHEN 'UPLOAD'.
      PERFORM FRM_CREAT_CGDD.

    WHEN 'BACK' OR 'CANCEL'.
      LEAVE TO SCREEN 0.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
*    WHEN 'ALL'.
    WHEN '&IC1'.
      CASE RS_SELFIELD-FIELDNAME.
        WHEN 'EBELN'.
          LV_EBELN = RS_SELFIELD-VALUE.
          SET PARAMETER ID 'BES' FIELD  LV_EBELN.
          CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.

      ENDCASE.


*      PERFORM frm_selectall.
*    WHEN 'DLL'.
*      PERFORM frm_selectdll.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CREAT_CGDD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CREAT_CGDD .
  DATA: WA_OUTPUT TYPE TY_OUTPUT.
  DATA: WA_POHEADER TYPE BAPIMEPOHEADER.
  DATA: WA_POHEADERX TYPE BAPIMEPOHEADERX.
  DATA: WA_RETURN TYPE BAPIRET2,
        LT_RETURN TYPE TABLE OF BAPIRET2.
  DATA: PO_NO TYPE EKKO-EBELN.

  DATA: WA_MEPOHEADER  TYPE BAPI_TE_MEPOHEADER.
  DATA: WA_MEPOHEADERX TYPE BAPI_TE_MEPOHEADERX.
  DATA: WA_EXTENSIONIN TYPE BAPIPAREX,
        LT_EXTENSIONIN TYPE TABLE OF BAPIPAREX.

  DATA:WA_POITEM      TYPE BAPIMEPOITEM .
  DATA:WA_POITEMX     TYPE BAPIMEPOITEMX.
  DATA:WA_POSCHEDULE  TYPE BAPIMEPOSCHEDULE.
  DATA:WA_POSCHEDULEX TYPE BAPIMEPOSCHEDULX.
  DATA:WA_POCOND      TYPE BAPIMEPOCOND.
  DATA:WA_POCONDX     TYPE BAPIMEPOCONDX.
  DATA:WA_POSERVICE   TYPE BAPIESLLC.
  DATA:WA_POSRVVALUE  TYPE BAPIESKLC.
  DATA:WA_POLIMITS    TYPE BAPIESUHC.
  DATA:WA_POACCOUNT  TYPE BAPIMEPOACCOUNT,
       WA_POACCOUNTX TYPE BAPIMEPOACCOUNTX.

  DATA:LT_POITEM      TYPE TABLE OF BAPIMEPOITEM .
  DATA:LT_POITEMX     TYPE TABLE OF BAPIMEPOITEMX.
  DATA:LT_POSCHEDULE  TYPE TABLE OF BAPIMEPOSCHEDULE.
  DATA:LT_POSCHEDULEX TYPE TABLE OF BAPIMEPOSCHEDULX.
  DATA:LT_POCOND      TYPE TABLE OF BAPIMEPOCOND.
  DATA:LT_POCONDX     TYPE TABLE OF BAPIMEPOCONDX.
  DATA:LT_POSERVICE   TYPE TABLE OF BAPIESLLC.
  DATA:LT_POSRVVALUE TYPE TABLE OF BAPIESKLC.
  DATA:LT_POLIMITS   TYPE TABLE OF BAPIESUHC.
  DATA:LT_POACCOUNT  TYPE TABLE OF BAPIMEPOACCOUNT,
       LT_POACCOUNTX TYPE TABLE OF BAPIMEPOACCOUNTX.

  DATA: LT_POTEXTITEM TYPE TABLE OF BAPIMEPOTEXT,
        WA_POTEXTITEM TYPE          BAPIMEPOTEXT.

  FIELD-SYMBOLS: <FS_OUTPUT> TYPE TY_OUTPUT.
  DATA: LT_OUTPUT TYPE TABLE OF TY_OUTPUT WITH KEY EBELN.
  DATA: LS_OUTPUT TYPE TY_OUTPUT.
  DATA: L_ITEMNO TYPE BAPIMEPOITEM-PO_ITEM.

  DATA: COUNT_TOTAL TYPE SY-TABIX.

  DATA: LT_RETURN1 TYPE TABLE OF BAPIRETURN,
        WA_RETURN1 TYPE          BAPIRETURN.

  LT_OUTPUT = GT_OUTPUT.
  SORT LT_OUTPUT BY EBELN ASCENDING EBELP ASCENDING.
  DELETE ADJACENT DUPLICATES FROM LT_OUTPUT COMPARING EBELN.
*  DELETE LT_OUTPUT WHERE BSART IS INITIAL.
*  DESCRIBE TABLE LT_OUTPUT LINES COUNT_TOTAL.

  DATA: LC_TOTAL TYPE CHAR6.
  MOVE COUNT_TOTAL TO LC_TOTAL.

  DATA: L_COUNT TYPE SY-TABIX VALUE 0.
  DATA: L_PER       TYPE PERCENTAGE,
        L_INDICATOR TYPE STRING.

*  DATA: COUNT_LAST TYPE SYST-TABIX.
*  DESCRIBE TABLE GT_OUTPUT LINES COUNT_LAST.

*  CLEAR LT_OUTPUT.

  DATA: L_PCKG_NO TYPE BAPIMEPOITEM-PCKG_NO.
  DATA: L_TABIX LIKE SY-TABIX.

  DATA: L_ACC_SN TYPE DZEKKN.

  DATA:LV_FLAG TYPE C."标记是免费订单

  LOOP AT LT_OUTPUT INTO WA_OUTPUT.
    L_TABIX = 1.

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

*    APPEND WA_OUTPUT TO LT_OUTPUT.

    IF WA_OUTPUT-BSART IS NOT INITIAL.
      CLEAR WA_POHEADER.

*      wa_poheader-po_number  = wa_output-ebeln.      "此处是外部给号,内部给号时删除此处
      IF WA_OUTPUT-EBELN IS INITIAL.

      ELSE.
        WA_POHEADER-PO_NUMBER  = WA_OUTPUT-EBELN.      "此处是外部给号,内部给号时删除此处
      ENDIF.
      WA_POHEADER-DOC_TYPE  = WA_OUTPUT-BSART.
      WA_POHEADER-VENDOR    = WA_OUTPUT-LIFNR.
      WA_POHEADER-PURCH_ORG = WA_OUTPUT-EKORG.
      WA_POHEADER-PUR_GROUP = WA_OUTPUT-EKGRP.
      WA_POHEADER-COMP_CODE = WA_OUTPUT-BUKRS.
      WA_POHEADER-DOC_DATE  = WA_OUTPUT-BEDAT.
      WA_POHEADER-CURRENCY  = WA_OUTPUT-WAERS.
*      WA_POHEADER-CREAT_DATE  = WA_OUTPUT-BEDAT.

      WA_POHEADER-ITEM_INTVL = SPACE."指定行项目编号

*      IF WA_OUTPUT-BSART EQ 'ZPO1'.
*        WA_POHEADER-PO_REL_IND = 'R'.
*        WA_POHEADER-REL_STATUS = ''.
*      ENDIF.

      CLEAR WA_POHEADERX.
      IF WA_POHEADER-PO_NUMBER IS NOT INITIAL.      "此处是外部给号,内部给号时删除此处
        WA_POHEADERX-PO_NUMBER  = 'X'.
      ENDIF.

      WA_POHEADERX-DOC_TYPE  = 'X'.
      WA_POHEADERX-VENDOR    = 'X'.
      WA_POHEADERX-PURCH_ORG = 'X'.
      WA_POHEADERX-PUR_GROUP = 'X'.
      WA_POHEADERX-COMP_CODE = 'X'.
      WA_POHEADERX-DOC_DATE  = 'X'.
      WA_POHEADERX-CURRENCY  = 'X'.
*      WA_POHEADERX-CREAT_DATE  = 'X'.

      WA_POHEADERX-ITEM_INTVL = 'X'."指定行项目编号

*      IF WA_OUTPUT-BSART EQ 'ZPO1'.
*        WA_POHEADERX-PO_REL_IND = 'X'.
*        WA_POHEADERX-REL_STATUS = 'X'.
*      ENDIF.

    ENDIF.

    CLEAR PO_NO.

*    L_PCKG_NO = '0000000001'.
*    L_ACC_SN = '01'.
    LOOP AT GT_OUTPUT INTO LS_OUTPUT WHERE EBELN = WA_OUTPUT-EBELN.
*      l_itemno = l_tabix * 10.       此处为内部给号
      L_ITEMNO = LS_OUTPUT-PO_ITEM.   "外部给号
      IF LS_OUTPUT-MATNR IS NOT INITIAL .
        CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
          EXPORTING
            INPUT  = LS_OUTPUT-MATNR
          IMPORTING
            OUTPUT = LS_OUTPUT-MATNR.
      ENDIF.

      WA_POITEM-PO_ITEM                    = L_ITEMNO.
      WA_POITEM-MATERIAL_LONG              = LS_OUTPUT-MATNR .
      WA_POITEM-SHORT_TEXT                 = LS_OUTPUT-TXZ01.
      WA_POITEM-PLANT                      = LS_OUTPUT-WERKS .
      WA_POITEM-STGE_LOC                   = LS_OUTPUT-SUPPL_STLOC ."-----------------库存地点
      WA_POITEM-MATL_GROUP                 = LS_OUTPUT-MATKL .
      WA_POITEM-TRACKINGNO                 = LS_OUTPUT-BEDNR . "需求跟踪号
      WA_POITEM-QUANTITY                   = LS_OUTPUT-MENGE .
      WA_POITEM-PO_UNIT                    = LS_OUTPUT-MEINS .
      WA_POITEM-MATL_GROUP                 = LS_OUTPUT-MATKL.
      WA_POITEM-NET_PRICE                  = LS_OUTPUT-NETPR.
      WA_POITEM-PO_PRICE                   = '1'.
      WA_POITEM-PRICE_UNIT                 = LS_OUTPUT-PEINH. "价格单位
      WA_POITEM-ACCTASSCAT                 = LS_OUTPUT-KNTTP. "科目分配类别
      WA_POITEM-ITEM_CAT                   = LS_OUTPUT-PSTYP. "项目类别
      WA_POITEM-OVER_DLV_TOL               = LS_OUTPUT-UEBTO."交货不足限度
      WA_POITEM-UNDER_DLV_TOL              = LS_OUTPUT-UNTTO."过量交货限度
      WA_POITEM-TAX_CODE                   = LS_OUTPUT-MWSKZ."销售/购买税代码

      WA_POITEM-NO_MORE_GR                 = LS_OUTPUT-JHFLG. "交货完成标识
      WA_POITEM-FREE_ITEM                  = LS_OUTPUT-FREE. "免费项目
      CLEAR LV_FLAG."标记是免费订单
      IF WA_POITEM-FREE_ITEM IS NOT INITIAL.
        LV_FLAG = 'X'."标记是免费订单
      ENDIF.

      WA_POITEM-RET_ITEM                   = LS_OUTPUT-RET_ITEM."退货

      IF LV_FLAG NE 'X'."非免费订单
        WA_POITEM-IR_IND                     = 'X'.     "发票收据标识
      ENDIF.

      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
        EXPORTING
          INPUT          = LS_OUTPUT-MEINS
*         LANGUAGE       = SY-LANGU
        IMPORTING
          OUTPUT         = WA_POITEM-PO_UNIT
        EXCEPTIONS
          UNIT_NOT_FOUND = 1
          OTHERS         = 2.

      APPEND WA_POITEM TO LT_POITEM.

      CLEAR WA_POITEMX.
      WA_POITEMX-PO_ITEM                    = L_ITEMNO.

      IF LV_FLAG = 'X'."标记是免费订单
        WA_POITEMX-PO_ITEMX = 'X'.
      ENDIF.

      IF LS_OUTPUT-BEDNR IS NOT INITIAL.
        WA_POITEMX-TRACKINGNO                 = 'X'.
      ENDIF.
      IF LS_OUTPUT-JHFLG IS NOT INITIAL.
        WA_POITEMX-NO_MORE_GR                 = 'X'.
      ENDIF.
      IF LS_OUTPUT-FREE IS NOT INITIAL.
        WA_POITEMX-FREE_ITEM                 = 'X'.
      ENDIF.

      IF LS_OUTPUT-SUPPL_STLOC IS NOT INITIAL.         "库存地点
        WA_POITEMX-STGE_LOC                 = 'X'.
      ENDIF.

      IF LS_OUTPUT-MATNR IS NOT INITIAL.
        WA_POITEMX-MATERIAL_LONG              = 'X'.
      ENDIF.
      IF WA_POITEM-SHORT_TEXT IS NOT INITIAL .
        WA_POITEMX-SHORT_TEXT                 = 'X'.
      ENDIF.

      IF WA_POITEM-PLANT IS NOT INITIAL.
        WA_POITEMX-PLANT                      = 'X'.
      ENDIF.

      IF WA_POITEM-MATL_GROUP IS NOT INITIAL.
        WA_POITEMX-MATL_GROUP = 'X'.
      ENDIF.

      IF WA_POITEM-QUANTITY IS NOT INITIAL .
        WA_POITEMX-QUANTITY                   = 'X'.
      ENDIF.
      IF WA_POITEM-PO_UNIT IS NOT INITIAL .
        WA_POITEMX-PO_UNIT                   = 'X'.
      ENDIF.
      IF WA_POITEM-NET_PRICE IS NOT INITIAL.
        WA_POITEMX-NET_PRICE                  = 'X'.
      ENDIF.

      IF WA_POITEM-PO_PRICE IS NOT INITIAL.
        WA_POITEMX-PO_PRICE                   = 'X'.
      ENDIF.

      IF WA_POITEM-PRICE_UNIT IS NOT INITIAL.
        WA_POITEMX-PRICE_UNIT                   = 'X'. "价格单位
      ENDIF.
*      WA_POITEMX-PRICE_UNIT                 = 'X'.
      IF WA_POITEM-ACCTASSCAT IS NOT INITIAL.
        WA_POITEMX-ACCTASSCAT                   = 'X'.
      ENDIF.

      IF WA_POITEM-ITEM_CAT IS NOT INITIAL.
        WA_POITEMX-ITEM_CAT                   = 'X'.
      ENDIF.

*      WA_POITEMX-SHORT_TEXT                 = 'X'.
      IF WA_POITEM-PO_UNIT IS NOT INITIAL.
        WA_POITEMX-PO_UNIT                   = 'X'.
      ENDIF.
      IF WA_POITEM-OVER_DLV_TOL IS NOT INITIAL.
        WA_POITEMX-OVER_DLV_TOL                   = 'X'.
      ENDIF.
      IF WA_POITEM-UNDER_DLV_TOL IS NOT INITIAL.
        WA_POITEMX-UNDER_DLV_TOL                   = 'X'. "过量交货限度
      ENDIF.
      IF WA_POITEM-TAX_CODE IS NOT INITIAL.
        WA_POITEMX-TAX_CODE                   = 'X'. "销售/购买税代码
      ENDIF.
      IF WA_POITEM-RET_ITEM IS NOT INITIAL.       "退货
        WA_POITEMX-RET_ITEM                   = 'X'.
      ENDIF.
      IF WA_POITEM-ACCTASSCAT IS NOT INITIAL.
        WA_POITEMX-ACCTASSCAT                 = 'X'."科目分配类别
      ENDIF.
      IF LV_FLAG NE 'X'."非免费订单
        WA_POITEMX-IR_IND                       = 'X'.     "发票收据标识
      ENDIF.

      APPEND WA_POITEMX TO LT_POITEMX.
      CLEAR: WA_POITEMX, WA_POITEM.

*      IF LS_OUTPUT-KNTTP EQ 'F'.
      IF LV_FLAG NE 'X'."非免费订单
        WA_POACCOUNT-PO_ITEM      = L_ITEMNO.
        WA_POACCOUNT-ORDERID      = LS_OUTPUT-AUFNR.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            INPUT  = LS_OUTPUT-KOSTL
          IMPORTING
            OUTPUT = WA_POACCOUNT-COSTCENTER.
        "新增总账科目
        WA_POACCOUNT-GL_ACCOUNT = LS_OUTPUT-GL_ACCOUNT.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            INPUT  = WA_POACCOUNT-GL_ACCOUNT
          IMPORTING
            OUTPUT = WA_POACCOUNT-GL_ACCOUNT.

*      WA_POACCOUNT-COSTCENTER   = LS_OUTPUT-KOSTL.
        APPEND WA_POACCOUNT TO LT_POACCOUNT.


        WA_POACCOUNTX-PO_ITEM    = L_ITEMNO.
        IF WA_POACCOUNT-ORDERID IS NOT INITIAL.
          WA_POACCOUNTX-ORDERID    = 'X'.
        ENDIF.

        IF WA_POACCOUNT-COSTCENTER IS NOT INITIAL.
          WA_POACCOUNTX-COSTCENTER    = 'X'.
        ENDIF.

        IF WA_POACCOUNT-GL_ACCOUNT IS NOT INITIAL.
          WA_POACCOUNTX-GL_ACCOUNT    = 'X'.
        ENDIF.

        APPEND WA_POACCOUNTX TO LT_POACCOUNTX.
        CLEAR: WA_POACCOUNT, WA_POACCOUNTX.
      ENDIF.

*      ENDIF.
*
*      IF LS_OUTPUT-BSART = 'Z03'.
*        WA_POACCOUNT-PO_ITEM      = L_ITEMNO.
**        WA_POACCOUNT-SERIAL_NO    = L_ACC_SN.
*        WA_POACCOUNT-QUANTITY     = LS_OUTPUT-MENGE.
*        WA_POACCOUNT-ORDERID      = LS_OUTPUT-AUFNR.
**        WA_POACCOUNT-COSTCENTER   = LS_OUTPUT-KOSTL.
**        WA_POACCOUNT-ASSET_NO     = LS_OUTPUT-ASSET.
*        WA_POACCOUNT-GL_ACCOUNT   = '5001030200'.
*        APPEND WA_POACCOUNT TO LT_POACCOUNT.
*        CLEAR WA_POACCOUNT.
*
*        WA_POACCOUNTX-PO_ITEM    = L_ITEMNO.
**        WA_POACCOUNTX-SERIAL_NO  = L_ACC_SN.
*        WA_POACCOUNTX-PO_ITEMX   = 'X'.
*        WA_POACCOUNTX-SERIAL_NOX = 'X'.
*        WA_POACCOUNTX-QUANTITY   = 'X'.
*        WA_POACCOUNTX-ORDERID    = 'X'.
**        WA_POACCOUNTX-COSTCENTER = 'X'.
**        WA_POACCOUNTX-ASSET_NO   = 'X'.
*        WA_POACCOUNTX-GL_ACCOUNT = 'X'.
*        APPEND WA_POACCOUNTX TO LT_POACCOUNTX.
*        CLEAR WA_POACCOUNTX.
*
**        L_ACC_SN = L_ACC_SN + 1.
*      ENDIF.

      WA_POSCHEDULE-PO_ITEM        = L_ITEMNO.
      WA_POSCHEDULE-SCHED_LINE     = 1.

      CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
        EXPORTING
          DATE_INTERNAL = LS_OUTPUT-EINDT
        IMPORTING
          DATE_EXTERNAL = WA_POSCHEDULE-DELIVERY_DATE. "交货日期

      WA_POSCHEDULE-STAT_DATE = LS_OUTPUT-SLFDT. "交货日期的相关统计

      WA_POSCHEDULE-DEL_DATCAT_EXT = 'D'. "交货类型
      WA_POSCHEDULE-QUANTITY       = LS_OUTPUT-MENGE. "数量
      APPEND WA_POSCHEDULE TO LT_POSCHEDULE.

      WA_POSCHEDULEX-PO_ITEM        =  L_ITEMNO.

      IF LV_FLAG = 'X'."标记是免费订单
        WA_POSCHEDULEX-PO_ITEMX = 'X'.
      ENDIF.

      WA_POSCHEDULEX-SCHED_LINE     =  WA_POSCHEDULE-SCHED_LINE.
      WA_POSCHEDULEX-DELIVERY_DATE  = 'X'.
      IF WA_POSCHEDULE-STAT_DATE IS NOT INITIAL.
        WA_POSCHEDULEX-STAT_DATE = 'X'.
      ENDIF.
      IF WA_POSCHEDULE-DEL_DATCAT_EXT IS NOT INITIAL.
        WA_POSCHEDULEX-DEL_DATCAT_EXT = 'X'.
      ENDIF.
      IF WA_POSCHEDULE-QUANTITY IS NOT INITIAL.
        WA_POSCHEDULEX-QUANTITY = 'X'.
      ENDIF.
      APPEND WA_POSCHEDULEX TO LT_POSCHEDULEX.
      CLEAR WA_POSCHEDULEX.
      CLEAR WA_POSCHEDULE.

      "用于更新长文本
      IF LS_OUTPUT-ZBZXX IS NOT INITIAL.
        WA_POTEXTITEM-PO_ITEM = L_ITEMNO.
        WA_POTEXTITEM-TEXT_ID = 'F01'.
*      WA_POTEXTITEM-TEXT_FORM = L_ITEMNO.
        WA_POTEXTITEM-TEXT_LINE = LS_OUTPUT-ZBZXX.
        APPEND WA_POTEXTITEM TO LT_POTEXTITEM.
        CLEAR WA_POTEXTITEM.
      ENDIF.

      L_TABIX = L_TABIX + 1.

    ENDLOOP.
*    BREAK-POINT.
    SET UPDATE TASK LOCAL.
    CALL FUNCTION 'BAPI_PO_CREATE1'
      EXPORTING
        POHEADER         = WA_POHEADER
        POHEADERX        = WA_POHEADERX
*       POADDRVENDOR     =
*       TESTRUN          =
        NO_PRICE_FROM_PO = 'X'
      IMPORTING
        EXPPURCHASEORDER = PO_NO
*       EXPHEADER        =
*       EXPPOEXPIMPHEADER =
      TABLES
        RETURN           = LT_RETURN
        POITEM           = LT_POITEM
        POITEMX          = LT_POITEMX
*       POADDRDELIVERY   =
        POSCHEDULE       = LT_POSCHEDULE
        POSCHEDULEX      = LT_POSCHEDULEX
*       POSERVICES       = LT_POSERVICE
*       POSRVACCESSVALUES = LT_POSRVVALUE
*       polimits         = lt_polimits
        POACCOUNT        = LT_POACCOUNT
*       POACCOUNTPROFITSEGMENT       =
        POACCOUNTX       = LT_POACCOUNTX
*       POCONDHEADER     =
*       POCONDHEADERX    =
*       POCOND           = LT_POCOND
*       POCONDX          = LT_POCONDX.
        POTEXTITEM       = LT_POTEXTITEM.

    IF PO_NO IS INITIAL.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
*       IMPORTING
*         RETURN        =
        .
      DATA: L_MSG TYPE BAPIRET2-MESSAGE.
      DATA: L_RESULT TYPE BAPIRET2-MESSAGE.

      LOOP AT LT_RETURN INTO WA_RETURN WHERE TYPE EQ 'E' OR TYPE EQ 'A'.
        MESSAGE ID WA_RETURN-ID TYPE WA_RETURN-TYPE NUMBER WA_RETURN-NUMBER
          INTO L_MSG
            WITH WA_RETURN-MESSAGE_V1 WA_RETURN-MESSAGE_V2 WA_RETURN-MESSAGE_V3 WA_RETURN-MESSAGE_V4.
        IF L_RESULT IS INITIAL.
          L_RESULT = L_MSG.
        ELSE.
          CONCATENATE L_RESULT L_MSG INTO L_RESULT SEPARATED BY ';'.
        ENDIF.

      ENDLOOP.

      LOOP AT GT_OUTPUT ASSIGNING <FS_OUTPUT> WHERE EBELN = WA_OUTPUT-EBELN.
        <FS_OUTPUT>-STATU = 'E'.
        <FS_OUTPUT>-MSG = L_RESULT.
        <FS_OUTPUT>-CHK_LIGHTS = 1.
      ENDLOOP.
      CLEAR: L_MSG, L_RESULT.
    ELSE.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'
*         IMPORTING
*         RETURN        =
        .
      IF WA_OUTPUT-BSART EQ 'ZPO1'.

        CALL FUNCTION 'BAPI_PO_RELEASE'
          EXPORTING
            PURCHASEORDER          = PO_NO
            PO_REL_CODE            = '10'
*           USE_EXCEPTIONS         = 'X'
*           NO_COMMIT              = ' '
*   IMPORTING
*           REL_STATUS_NEW         =
*           REL_INDICATOR_NEW      =
*           RET_CODE               =
          TABLES
            RETURN                 = LT_RETURN1
          EXCEPTIONS
            AUTHORITY_CHECK_FAIL   = 1
            DOCUMENT_NOT_FOUND     = 2
            ENQUEUE_FAIL           = 3
            PREREQUISITE_FAIL      = 4
            RELEASE_ALREADY_POSTED = 5
            RESPONSIBILITY_FAIL    = 6
            OTHERS                 = 7.

        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'
*         IMPORTING
*           RETURN        =
          .

      ENDIF.

      LOOP AT GT_OUTPUT ASSIGNING <FS_OUTPUT> WHERE EBELN = WA_OUTPUT-EBELN.
        <FS_OUTPUT>-STATU = 'S'.
        <FS_OUTPUT>-MSG = '采购订单创建成功!'.
        <FS_OUTPUT>-EBELN = PO_NO.
        <FS_OUTPUT>-CHK_LIGHTS = 3.

*        PERFORM FRM_CERATE_TEXT USING <FS_OUTPUT>-EBELN <FS_OUTPUT>-EBELP 'F01' 'EKPO' CHANGING <FS_OUTPUT>-ZBZXX.    "备注
        IF SY-SUBRC EQ 0.
          COMMIT WORK AND WAIT.
        ENDIF.
      ENDLOOP.
    ENDIF.

    CLEAR: LT_RETURN,
           LT_POITEM,
           LT_POITEMX,
           LT_POSCHEDULE,
           LT_POSCHEDULEX,
           WA_POHEADER,
           WA_POHEADERX,
           WA_POTEXTITEM,
           LT_POSRVVALUE,
           LT_POLIMITS,
           LT_POSERVICE,
           LT_POACCOUNT,
           LT_POACCOUNTX,
           LT_POTEXTITEM.

  ENDLOOP.

  MESSAGE  '导入完成!' TYPE 'S'.

ENDFORM.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值