采购订单批导


REPORT zwc_pro13.

TABLES:sscrfields.

DATA:gt_upload TYPE alsmex_tabline OCCURS 0 WITH HEADER LINE.   " 弹出EXCEL
FIELD-SYMBOLS:<fs_upload> LIKE LINE OF gt_upload.
DATA:zdcno(10) TYPE c.

DATA:BEGIN OF gt_out OCCURS 0,
       zdcno(2) TYPE c,          "号码
       bsart     LIKE ekko-bsart, "采购订单类型
       lifnr     LIKE ekko-lifnr, "供应商
       ekorg     LIKE ekko-ekorg, "采购组织
       ekgrp     LIKE ekko-ekgrp, "采购组
       bukrs     LIKE ekko-bukrs, "公司代码
       ebelp     LIKE ekpo-ebelp, "订单行项目号
       knttp     LIKE ekpo-knttp, "科目分配类别
       pstyp     LIKE ekpo-pstyp, "项目类别
       matnr     LIKE ekpo-matnr, "物料
       menge     LIKE ekpo-menge, "订单数量
       meins     LIKE ekpo-meins, "订单单位
       eindt     LIKE eket-eindt, "交货日期
       netpr     LIKE ekpo-netpr, "净价
       waers     LIKE ekko-waers, "币别
       werks     LIKE ekpo-werks, "工厂
*       LGOBE     LIKE EKPO-LGOBE, "库存地点
       matkl     LIKE ekpo-matkl, "物料组
       change_id TYPE c,  "有信息记录U,无信息记录I
       zstat(30) TYPE c,
       msgty     TYPE c,
       msg(200)  TYPE c,



*       BEDAT     LIKE EKKO-BEDAT, "采购订单日期
*       TXZ01     LIKE EKPO-TXZ01, "物料描述
*       LGORT     LIKE EKPO-LGORT, "库位
*       KOSTL     TYPE KOSTL,      "成本中心
*       ANLN1     TYPE ANLN1,      "固定资产号
*       PEINH     LIKE EKPO-PEINH,  "价格单位
*       MWSKZ     TYPE MWSKZ,      "税码
*       TXT20     TYPE TDLINE,       "行项目文本
*       IHREZ     LIKE EKKO-IHREZ, "原采购订单号
     END OF gt_out.

FIELD-SYMBOLS:<fs_out> LIKE gt_out.
***alv data define
DATA:gv_repid  LIKE sy-repid VALUE sy-repid,
     gs_layout TYPE slis_layout_alv,
     gt_fcat   TYPE slis_t_fieldcat_alv WITH HEADER LINE.


DATA:lt_t163y LIKE t163y OCCURS 0 WITH HEADER LINE. "ADD BY XULE 20150427
DATA: wa_log TYPE ZPRO13_LOG,
      lv_zguid TYPE sysuuid_c32.
DEFINE mcr_build_fieldcat.
  gt_fcat-fieldname = &1.
  gt_fcat-seltext_l = &2.     " 长文本
  gt_fcat-seltext_m = &2.     " 中文版
  gt_fcat-seltext_s = &2.     " 短文本
  gt_fcat-ddictxt = 'L'.
  gt_fcat-inttype = &3.
*  gt_fcat-intlen = &4.
*  gt_fcat-outputlen = &5.
  IF &1 = 'LIFNR' OR &1 = 'MATNR' OR &1 = 'INFNR'.
    gt_fcat-no_zero = 'X'.
  ENDIF.
  APPEND gt_fcat.
  CLEAR gt_fcat.
END-OF-DEFINITION.

CONSTANTS:c_pf_status    TYPE slis_formname VALUE 'FRM_SET_PF_STATUS',
          c_user_command TYPE slis_formname VALUE 'FRM_USER_COMMAND'.

DATA:gv_flag TYPE c.

***selection screen define
SELECTION-SCREEN FUNCTION KEY 1. "工具条按钮 最多为5个.

SELECTION-SCREEN BEGIN OF BLOCK blc WITH FRAME TITLE TEXT-001.
  PARAMETERS:p_file TYPE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK blc .


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM frm_select_file.

INITIALIZATION.
  sscrfields-functxt_01 = '模板下载'.
  sscrfields-ucomm      = 'FC01'.

AT SELECTION-SCREEN.



  CASE sscrfields-ucomm.
    WHEN 'ONLI'.
      PERFORM frm_check_file_exist.
    WHEN 'FC01'.
      PERFORM frm_generate_template.
    WHEN OTHERS.
  ENDCASE.

START-OF-SELECTION.
  PERFORM FRM_UPLOAD_DATA.
  PERFORM frm_get_fieldcat.
  PERFORM frm_output_data.
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_FILE_EXIST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_check_file_exist .
  DATA:lv_file   TYPE string,
       lv_result TYPE abap_bool.

  DATA:lv_name(255) TYPE c,
       lv_path(255) TYPE c.

  DATA:lv_lenth TYPE i.

  CHECK sy-ucomm = 'ONLI'.

  IF p_file IS INITIAL.
    MESSAGE '请输入文件路径' TYPE 'E'.
  ENDIF.

  lv_file = p_file.
  CALL METHOD cl_gui_frontend_services=>file_exist
    EXPORTING
      file                 = lv_file
    RECEIVING
      result               = lv_result
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      wrong_parameter      = 3
      not_supported_by_gui = 4
      OTHERS               = 5.
  IF sy-subrc <> 0.
    MESSAGE '文件不存在' TYPE 'E'.
  ENDIF.

***检查文件格式
  CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH'
    EXPORTING
      full_name     = p_file
    IMPORTING
      stripped_name = lv_name
      file_path     = lv_path
    EXCEPTIONS
      x_error       = 1
      OTHERS        = 2.
  IF sy-subrc = 0.
    lv_lenth = strlen( lv_name ).
    IF lv_lenth > 4.
      lv_lenth = lv_lenth - 4.
    ENDIF.
    lv_name = lv_name+lv_lenth.
    TRANSLATE lv_name TO UPPER CASE.
    IF lv_name NE '.XLS' AND lv_name NE 'XLSX'.
      MESSAGE '文件不是EXCEL格式文件,请检查' TYPE 'E'.
    ENDIF.
  ENDIF.
ENDFORM.                    " FRM_CHECK_FILE_EXIST
*&---------------------------------------------------------------------*
*&      Form  FRM_GENERATE_TEMPLATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_generate_template .
 DATA: gv_name        TYPE string,
      gv_file        TYPE string,
      gv_user_action TYPE i.

  CALL FUNCTION 'GUI_FILE_SAVE_DIALOG'
  EXPORTING
    default_file_name = gv_name
  IMPORTING
    fullpath          = gv_file
    user_action       = gv_user_action.

IF gv_user_action EQ 0.
  PERFORM frm_download_excel USING 'ZWC_BPO' gv_file.
  MESSAGE '模板下载成功!' TYPE 'S'.
ENDIF.


*  IF SY-SUBRC <> 0.
*    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*  ELSE.
*    CHECK LV_UA = 0.
*    READ TABLE LT_FT INTO LS_FT INDEX 1.
*    LWK_FN  = LS_FT-FILENAME.
****下载模板
*    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
*      EXPORTING
*        KEY         = LS_OBJECT
*        DESTINATION = LWK_FN
*      IMPORTING
*        RC          = LV_RC.
*    IF LV_RC <> 0.
*      MESSAGE S003(ZMM_RPT_MSG) DISPLAY LIKE 'E'. "下载模板失败!
*      EXIT.
*    ENDIF.
*  ENDIF.
ENDFORM.                    " FRM_GENERATE_TEMPLATE
FORM frm_download_excel USING excel_name excel_name1.
  DATA:
    ls_objdata     LIKE wwwdatatab,
    ls_mime        LIKE w3mime,
    ls_destination LIKE rlgrap-filename,
    lv_objnam      TYPE string,
    lv_subrc       LIKE sy-subrc,
    lv_errtxt      TYPE string,
    lv_objid       TYPE wwwdatatab-objid,
    lv_dest        LIKE sapb-sappfad,
    lv_fullpath    LIKE rlgrap-filename.

  MOVE excel_name TO lv_objid.
  CONCATENATE lv_objid '.XLSX' INTO lv_objnam.
  CONDENSE lv_objnam NO-GAPS.

  SELECT SINGLE
    relid,
    objid
  FROM
    wwwdata
  WHERE srtf2 EQ 0
    AND relid EQ 'MI'
    AND objid EQ @lv_objid
  INTO CORRESPONDING FIELDS OF @ls_objdata.

  IF sy-subrc NE 0 OR ls_objdata-objid EQ space.
    CONCATENATE '模板文件:' lv_objnam '不存在,请用TCODE:SMW0进行加载' INTO lv_errtxt.
    MESSAGE lv_errtxt TYPE 'E'.
    RETURN.
  ENDIF.

  CONCATENATE excel_name1 '.xlsx' INTO lv_fullpath.
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key         = ls_objdata
      destination = lv_fullpath
    IMPORTING
      rc          = lv_subrc.

  IF lv_subrc NE 0.
    CONCATENATE '模板文件:' lv_objnam '下载失败' INTO lv_errtxt.
    MESSAGE lv_errtxt TYPE 'E'.
  ELSE.
    MESSAGE '模板下载成功' TYPE 'S'.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_SELECT_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_select_file .
  DATA:lv_window_title TYPE string,
       lv_file_filter  TYPE string VALUE 'Excel Files(*.xls;*.xlsx)|*.xls;*.xlsx|All Files(*.*)|*.*',
       lt_filetable    TYPE filetable WITH HEADER LINE,
       lv_rc           TYPE i.
***选择文件
  lv_window_title  = '文件选择'(004).
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = lv_window_title
*     default_extension       =
*     default_filename        =
      file_filter             = lv_file_filter
*     with_encoding           =
      initial_directory       = 'C:\'
*     multiselection          =
    CHANGING
      file_table              = lt_filetable[]
      rc                      = lv_rc
*     user_action             =
*     file_encoding           =
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.
  IF sy-subrc = 0.
    READ TABLE lt_filetable INDEX 1.
    IF sy-subrc = 0.
      p_file = lt_filetable-filename.
    ENDIF.
  ENDIF.
ENDFORM.                    " FRM_SELECT_FILE
*&---------------------------------------------------------------------*
*&      Form  FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_upload_data .
  DATA:lv_no(2) TYPE c VALUE '10'.

  DEFINE mcr_add_zero.
    IF &1 IS NOT INITIAL.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input         = &1
     IMPORTING
       output        = &1.
    ENDIF.
  END-OF-DEFINITION.

  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = '1'
      i_begin_row             = '2'
      i_end_col               = '20'
      i_end_row               = '9999'
    TABLES
      intern                  = gt_upload[]
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  IF gt_upload[] IS INITIAL.
    MESSAGE '上传文档为空' TYPE 'I'.
    EXIT.
  ENDIF.

  LOOP AT gt_upload ASSIGNING <fs_upload>.
    TRANSLATE <fs_upload>-value TO UPPER CASE.
    CASE <fs_upload>-col.
      WHEN '1'.
        gt_out-zdcno = <fs_upload>-value. "序号
      WHEN '2'.
        gt_out-bsart = <fs_upload>-value. "订单类型
      WHEN '3'.
        gt_out-lifnr = <fs_upload>-value. "供应商
      WHEN '4'.
        gt_out-ekorg = <fs_upload>-value. "采购组织
      WHEN '5'.
        gt_out-ekgrp  = <fs_upload>-value."采购组
      WHEN '6'.
        gt_out-bukrs = <fs_upload>-value. "公司代码
      WHEN '7'.
        gt_out-ebelp = <fs_upload>-value. "行项目文本
      WHEN '8'.
        gt_out-knttp = <fs_upload>-value. "科目分配类别
      WHEN '9'.
        gt_out-pstyp = <fs_upload>-value. "项目类别
      WHEN '10'.
        gt_out-matnr = <fs_upload>-value. "物料编码
      WHEN '11'.
        gt_out-menge = <fs_upload>-value. "采购订单数量
      WHEN '12'.
        gt_out-meins  = <fs_upload>-value."采购订单单位
      WHEN '13'.
        gt_out-eindt = <fs_upload>-value. "交货日期
      WHEN '14'.
        gt_out-netpr = <fs_upload>-value. "单价
      WHEN '15'.
        gt_out-waers  = <fs_upload>-value."货币
      WHEN '16'.
        gt_out-werks  = <fs_upload>-value."工厂
      WHEN '17'.
        gt_out-matkl = <fs_upload>-value. "物料组
      WHEN OTHERS.
    ENDCASE.
    AT END OF row.
      IF gt_out-bsart IS NOT INITIAL AND gt_out-lifnr IS NOT INITIAL AND gt_out-ekorg IS NOT INITIAL
          AND gt_out-ekgrp IS NOT INITIAL AND gt_out-bukrs IS NOT INITIAL .
        ADD 1 TO lv_no.
      ENDIF.
*     gt_out-zdcno = lv_no.
      mcr_add_zero:gt_out-lifnr,gt_out-matnr.
      APPEND gt_out.
      CLEAR gt_out.
    ENDAT.

  ENDLOOP.
***check上传的数据
  PERFORM frm_check_data.
ENDFORM.                    " FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_check_data .
  DATA:lv_no1(10) TYPE c.

  DATA:lt_t161  LIKE t161 OCCURS 0 WITH HEADER LINE,
       lt_t024e LIKE t024e OCCURS 0 WITH HEADER LINE,
       lt_t024  LIKE t024 OCCURS 0 WITH HEADER LINE.

  DATA:BEGIN OF lt_lfa1 OCCURS 0,
         lifnr LIKE lfa1-lifnr,
       END OF lt_lfa1.

  DATA:BEGIN OF lt_t001 OCCURS 0,
         bukrs LIKE t001-bukrs,
       END OF lt_t001.

  DATA:BEGIN OF lt_matnr OCCURS 0,
         matnr LIKE mara-matnr,
         matkl LIKE mara-matkl,
       END OF lt_matnr.

  DATA:BEGIN OF lt_t001w OCCURS 0,
         werks LIKE t001w-werks,
       END OF lt_t001w.

  DATA:BEGIN OF lt_t001l OCCURS 0,
         werks LIKE t001l-werks,
         lgort LIKE t001l-lgort,
       END OF lt_t001l.

  DATA:lt_t163i LIKE t163i OCCURS 0 WITH HEADER LINE.

  DATA:BEGIN OF lt_vbap OCCURS 0,
         vbeln LIKE vbap-vbeln,
         posnr LIKE vbap-posnr,
       END OF lt_vbap.

  DATA:BEGIN OF lt_marc OCCURS 0,
         matnr LIKE marc-matnr,
         werks LIKE marc-werks,
         lgfsb LIKE marc-lgfsb,
         lgpro LIKE marc-lgpro,
       END OF lt_marc.

  DATA:lv_banfn LIKE eban-banfn,
       lv_pstyp LIKE eban-pstyp.

  DATA:BEGIN OF lt_ekpo OCCURS 0,
         ebeln LIKE ekpo-ebeln,
         ebelp LIKE ekpo-ebelp,
         banfn LIKE ekpo-banfn,
         bnfpo LIKE ekpo-bnfpo,
       END OF lt_ekpo.

  DATA:BEGIN OF lt_rfq OCCURS 0,
         ebeln LIKE ekko-ebeln,
         ebelp LIKE ekpo-ebelp,
       END OF lt_rfq.

  DATA:lv_subrc TYPE sy-subrc.
  DATA:lv_index LIKE sy-tabix.

  DEFINE  mcr_add_msg.
    IF gt_out-msg IS INITIAL.
      gt_out-msg = &1.
    ELSE.
      CONCATENATE gt_out-msg &1 INTO gt_out-msg SEPARATED BY ','.
    ENDIF.
  END-OF-DEFINITION.

  CHECK gt_out[] IS NOT INITIAL.
***抓取采购订单类型
  SELECT * INTO TABLE lt_t161 FROM t161 WHERE bstyp EQ 'F'.
  IF sy-subrc = 0.
    SORT lt_t161 BY bsart.
  ENDIF.

***抓取供应商信息
  SELECT lifnr
    INTO TABLE lt_lfa1
    FROM lfa1
    FOR ALL ENTRIES IN gt_out
    WHERE lifnr = gt_out-lifnr.
  IF sy-subrc = 0.
    SORT lt_lfa1 BY lifnr.
  ENDIF.

***抓取采购组织
  SELECT * INTO TABLE lt_t024e FROM t024e.
  IF sy-subrc = 0.
    SORT lt_t024e.
  ENDIF.

***采购组
  SELECT * INTO TABLE lt_t024 FROM t024.
  IF sy-subrc = 0.
    SORT lt_t024.
  ENDIF.

***抓取公司
  SELECT bukrs INTO CORRESPONDING FIELDS OF TABLE lt_t001 FROM t001.
  IF sy-subrc = 0.
    SORT lt_t001.
  ENDIF.

***抓取物料编码
  SELECT matnr matkl INTO TABLE lt_matnr FROM mara FOR ALL ENTRIES IN gt_out WHERE matnr = gt_out-matnr.
  IF sy-subrc = 0.
    SORT lt_matnr BY matnr.
  ENDIF.

***抓取工厂
  SELECT werks INTO TABLE lt_t001w FROM t001w.
  IF sy-subrc = 0.
    SORT lt_t001w.
  ENDIF.

***抓取库位信息
  SELECT werks
    INTO CORRESPONDING FIELDS OF TABLE lt_t001l
    FROM t001l
     FOR ALL ENTRIES IN gt_out
   WHERE werks = gt_out-werks.
  IF sy-subrc = 0.
    SORT lt_t001l BY werks .
  ENDIF.

  SELECT matnr werks lgfsb lgpro
    INTO CORRESPONDING FIELDS OF TABLE lt_marc
    FROM marc
    FOR ALL ENTRIES IN gt_out
    WHERE matnr = gt_out-matnr
      AND werks = gt_out-werks.
  SORT lt_marc BY matnr werks.

  LOOP AT gt_out.
    lv_index = sy-tabix.
***采购订单类型

      lv_no1 = gt_out-zdcno.
      READ TABLE gt_out INTO DATA(gs) WITH KEY zdcno = lv_no1.
      IF gt_out-bsart IS INITIAL.
        mcr_add_msg:'采购订单类型为空'.
      ELSE.
        READ TABLE lt_t161 WITH KEY bsart = gt_out-bsart BINARY SEARCH.
        IF sy-subrc <> 0.
          mcr_add_msg:'采购订单类型不存在'.
        ENDIF.
      ENDIF.

***凭证日期
*    AT NEW ZDCNO.
*      IF GT_OUT-BEDAT IS INITIAL.
**        mcr_add_msg:'凭证日期为空'.
*      ELSE.
*        PERFORM FRM_DATE_CHECK USING GT_OUT-BEDAT CHANGING LV_SUBRC.
*        IF LV_SUBRC NE 0.
*          MCR_ADD_MSG:'凭证日期无效'.
*        ENDIF.
*      ENDIF.
*    ENDAT.
***K3采购订单号
*    if gt_out-ihrez is initial.
*      mcr_add_msg:'原采购订单号'.
*    endif.

***供应商
      IF gt_out-lifnr IS INITIAL.
        mcr_add_msg:'供应商编码为空'.
      ELSE.
        READ TABLE lt_lfa1 WITH KEY lifnr = gt_out-lifnr BINARY SEARCH.
        IF sy-subrc <> 0.
          mcr_add_msg:'供应商不存在'.
        ENDIF.
      ENDIF.
***采购组织
      IF gt_out-ekorg IS INITIAL.
        mcr_add_msg:'采购组织为空'.
      ELSE.
        READ TABLE lt_t024e WITH KEY ekorg = gt_out-ekorg BINARY SEARCH.
        IF sy-subrc <> 0.
          mcr_add_msg:'采购组织不存在'.
        ENDIF.
      ENDIF.
***采购组
      IF gt_out-ekgrp IS INITIAL.
        mcr_add_msg:'采购组为空'.
      ELSE.
        READ TABLE lt_t024 WITH KEY ekgrp = gt_out-ekgrp BINARY SEARCH.
        IF sy-subrc <> 0.
          mcr_add_msg:'采购组不存在'.
        ENDIF.
      ENDIF.
***公司代码
      IF gt_out-bukrs IS INITIAL.
        mcr_add_msg:'公司代码为空'.
      ELSE.
        READ TABLE lt_t001 WITH KEY bukrs  = gt_out-bukrs BINARY SEARCH.
        IF sy-subrc <> 0.
          mcr_add_msg:'公司代码不存在'.
        ENDIF.
      ENDIF.
***物料编码
    IF gt_out-matkl = ''.
      IF gt_out-matnr IS INITIAL.
        mcr_add_msg:'物料编码为空'.
      ELSE.
        READ TABLE lt_matnr WITH KEY matnr = gt_out-matnr BINARY SEARCH.
        IF sy-subrc <> 0.
          mcr_add_msg:'物料编码不存在'.
        ELSE.
          gt_out-matkl = lt_matnr-matkl.
        ENDIF.
      ENDIF.
    ENDIF.

***未清采购订单数量
    IF gt_out-menge IS INITIAL.
      mcr_add_msg:'采购订单数量为空'.
    ENDIF.

***计划交货日期
    IF gt_out-eindt IS INITIAL.
*      mcr_add_msg:'计划交货日期为空'.
    ELSE.
      PERFORM frm_date_check USING gt_out-eindt CHANGING lv_subrc.
      IF lv_subrc NE 0.
        mcr_add_msg:'计划交货日期无效'.
      ENDIF.
    ENDIF.

***工厂
    IF gt_out-werks IS INITIAL.
      mcr_add_msg:'工厂为空'.
    ELSE.
      READ TABLE lt_t001w WITH KEY werks = gt_out-werks BINARY SEARCH.
      IF sy-subrc <> 0.
        mcr_add_msg:'工厂不存在'.
      ENDIF.
    ENDIF.

***库存地点
*    IF GT_OUT-LGORT IS INITIAL.
*      SELECT SINGLE LGFSB INTO GT_OUT-LGORT FROM MARC WHERE MATNR = GT_OUT-MATNR AND WERKS = GT_OUT-WERKS.
*    ENDIF.
*    IF GT_OUT-LGORT IS INITIAL AND GT_OUT-WERKS IS NOT INITIAL.
*      READ TABLE LT_T001L WITH KEY WERKS = GT_OUT-WERKS LGORT = GT_OUT-LGORT BINARY SEARCH.
*      IF SY-SUBRC <> 0.
*        MCR_ADD_MSG:'工厂与库存地点不匹配'.
*      ENDIF.
*    ENDIF.

***订单单位
    IF gt_out-meins IS INITIAL.
      SELECT SINGLE meins INTO gt_out-meins FROM mara WHERE matnr = gt_out-matnr.
    ENDIF.

***科目分配类别
*    CASE GT_OUT-KNTTP.
*      WHEN 'K'.
*        IF GT_OUT-KOSTL = ''.
*          MCR_ADD_MSG:'成本中心不能为空'.
*        ENDIF.
*      WHEN 'A'.
*        IF GT_OUT-ANLN1 = ''.
*          MCR_ADD_MSG:'固定资产号不能为空'.
*        ENDIF.
*      WHEN OTHERS.
*    ENDCASE.

***含税单价 价格单位  税码
    IF gt_out-netpr IS INITIAL.
      gt_out-change_id = 'U'.
      SELECT SINGLE konp~kbetr INTO gt_out-netpr FROM a017
        INNER JOIN konp ON konp~knumh = a017~knumh AND konp~kopos = 1
        WHERE a017~kappl = 'M'
        AND a017~kschl = 'PB00'
        AND a017~lifnr = gs-lifnr
        AND a017~matnr = gt_out-matnr
        AND a017~ekorg = gs-ekorg
        AND a017~werks = gs-werks
        AND a017~esokz = '0'
        AND a017~datab <= sy-datum
        AND a017~datbi >= sy-datum.
      IF sy-subrc <> 0.
        mcr_add_msg:'信息记录中无有效价格'.
      ENDIF.
    ELSE.
      gt_out-change_id = 'I'.
    ENDIF.

*    IF GT_OUT-MWSKZ IS INITIAL.
*      SELECT SINGLE EINE~PEINH EINE~MWSKZ INTO (GT_OUT-PEINH,GT_OUT-MWSKZ)
*         FROM EINE
*        INNER JOIN EINA ON EINA~INFNR = EINE~INFNR
*        WHERE EINA~MATNR = GT_OUT-MATNR
*        AND EINA~LIFNR = GS-LIFNR
*        AND EINE~EKORG = GS-EKORG
*        AND EINE~ESOKZ = '0'
*        AND EINE~WERKS = GS-WERKS.
*
*      IF GT_OUT-MWSKZ = ''.
*        MCR_ADD_MSG:'信息记录中无税码'.
*      ENDIF.
*    ENDIF.


    IF gt_out-msg IS INITIAL.
*      gt_out-zstat = icon_light_out.
      gt_out-zstat = icon_green_light.
    ELSE.
      gt_out-zstat = icon_red_light.
      gt_out-msgty = 'E'.
    ENDIF.

    MODIFY gt_out INDEX lv_index.
    CLEAR gt_out.
  ENDLOOP.


ENDFORM.                    " FRM_CHECK_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_DATE_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_OUT_BEDAT  text
*      <--P_LV_SUBRC  text
*----------------------------------------------------------------------*
FORM frm_date_check  USING   u_date LIKE sy-datum
                     CHANGING c_subrc LIKE sy-subrc.
  CLEAR : c_subrc.

  CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
    EXPORTING
      date                      = u_date
    EXCEPTIONS
      plausibility_check_failed = 1
      OTHERS                    = 2.
  IF sy-subrc <> 0.
    c_subrc = sy-subrc.
  ENDIF.
ENDFORM.                    " FRM_DATE_CHECK
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_fieldcat .

  mcr_build_fieldcat:'ZSTAT'   '状态'               'C'    ,      "  '30'   '5',
                     'MSG'     '消息'               'C'    ,      "  '200'  '30',
                     'BSART'   '采购订单类型'       'C'    ,      "  '4'    '6',
                     'LIFNR'   '供应商'             'C'    ,      "  '10'   '10',
                     'EKORG'   '采购组织'           'C'    ,      "  '4'    '6',
                     'EKGRP'   '采购组'             'C'    ,      "  '3'    '6',
                     'BUKRS'   '公司代码'           'C'    ,      "  '4'    '6',
                     'EBELP'   '行项目文本'         'C'    ,      "  '20'   '15',
                     'KNTTP'   '科目分配类别'       'C'    ,      "  '1'    '4',
                     'PSTYP'   '项目类别'           'C'    ,      "  '1'    '4',
                     'MATNR'   '物料'               'C'    ,      "  '18'   '15',
                     'MENGE'   '订单数量'           'P'    ,      "  '15'   '12',
                     'MEINS'   '订单单位'           'C'    ,      "  '3'    '3',
                     'EINDT'   '交货日期'           'D'    ,      "  '8'    '10',
                     'NETPR'   '净价'               'P'    ,      "  '11'   '11',
                     'WAERS'   '币别'               'C'    ,      "  '5'    '5',
                     'WERKS'   '工厂'               'C'    ,      "  '4'    '4',
*                     'LGOBE'   '库存地点'           'C'    ,      "  '4'    '4',
                     'MATKL'   '物料组'             'C'    .      "  '9'    '8',
  gs_layout-zebra = 'X'.
*  gs_layout-colwidth_optimize = 'X'.

ENDFORM.                    " FRM_GET_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_output_data .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*     I_INTERFACE_CHECK        = ' '
*     I_BYPASSING_BUFFER       = ' '
*     I_BUFFER_ACTIVE          = ' '
      i_callback_program       = gv_repid
      i_callback_pf_status_set = c_pf_status
      i_callback_user_command  = c_user_command
*     I_CALLBACK_TOP_OF_PAGE   = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME         =
*     I_BACKGROUND_ID          = ' '
*     I_GRID_TITLE             =
*     I_GRID_SETTINGS          =
      is_layout                = gs_layout
      it_fieldcat              = gt_fcat[]
*     IT_EXCLUDING             =
*     IT_SPECIAL_GROUPS        =
*     IT_SORT                  =
*     IT_FILTER                =
*     IS_SEL_HIDE              =
      i_default                = 'X'
      i_save                   = ' '
*     IS_VARIANT               =
*     IT_EVENTS                =
*     IT_EVENT_EXIT            =
*     IS_PRINT                 =
*     IS_REPREP_ID             =
*     I_SCREEN_START_COLUMN    = 0
*     I_SCREEN_START_LINE      = 0
*     I_SCREEN_END_COLUMN      = 0
*     I_SCREEN_END_LINE        = 0
*     I_HTML_HEIGHT_TOP        = 0
*     I_HTML_HEIGHT_END        = 0
*     IT_ALV_GRAPHICS          =
*     IT_HYPERLINK             =
*     IT_ADD_FIELDCAT          =
*     IT_EXCEPT_QINFO          =
*     IR_SALV_FULLSCREEN_ADAPTER        =
* IMPORTING
*     E_EXIT_CAUSED_BY_CALLER  =
*     ES_EXIT_CAUSED_BY_USER   =
    TABLES
      t_outtab                 = gt_out[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.                    " FRM_OUTPUT_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_SET_PF_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_set_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'S0100'.
ENDFORM.                    " FRM_SET_PF_STATUS

*&---------------------------------------------------------------------*
*&      Form  FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_user_command  USING r_ucomm LIKE sy-ucomm
                         rs_selfield TYPE slis_selfield.

  rs_selfield-refresh = 'X'.
  rs_selfield-col_stable = 'X'.
  rs_selfield-row_stable = 'X'.

  CASE r_ucomm.
    WHEN 'ZCREATE'.
      PERFORM frm_create_po.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.                    " FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_BOM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_create_po .
  DATA:lt_out LIKE gt_out OCCURS 0 WITH HEADER LINE.

  DATA:ls_poheader    LIKE bapimepoheader,
       ls_poheaderx   LIKE bapimepoheaderx,
       lt_poitem      LIKE bapimepoitem OCCURS 0 WITH HEADER LINE,
       lt_poitemx     LIKE bapimepoitemx OCCURS 0 WITH HEADER LINE,
       lt_poschedule  LIKE bapimeposchedule OCCURS 0 WITH HEADER LINE,
       lt_poschedulex LIKE bapimeposchedulx OCCURS 0 WITH HEADER LINE,
       lt_poaccount   LIKE bapimepoaccount OCCURS 0 WITH HEADER LINE,
       lt_poaccountx  LIKE bapimepoaccountx OCCURS 0 WITH HEADER LINE,
       lt_pocond      LIKE bapimepocond OCCURS 0 WITH HEADER LINE,
       lt_pocondx     LIKE bapimepocondx OCCURS 0 WITH HEADER LINE,
       lt_potextitem  LIKE bapimepotext OCCURS 0 WITH HEADER LINE,
       lt_return      LIKE bapiret2 OCCURS 0 WITH HEADER LINE.
  DATA:lv_ebelp LIKE ekpo-ebelp.
  DATA:lv_po_number LIKE ekko-ebeln,
       lv_type      TYPE c,
       lv_msg       TYPE string,
       lv_msg_sum   TYPE string.

  IF gv_flag IS INITIAL.
    gv_flag = 'X'.
  ELSE.
    MESSAGE '请不要重复导入数据' TYPE 'E'.
  ENDIF.

  READ TABLE gt_out WITH KEY msgty = 'E'.
  IF sy-subrc = 0.
    MESSAGE '上载数据存在错误,请先修正' TYPE 'E'.
  ENDIF.

  APPEND LINES OF gt_out TO lt_out.

  LOOP AT lt_out ASSIGNING <fs_out>.
    AT NEW zdcno.
      zdcno = <fs_out>-zdcno.
      CLEAR:lv_ebelp,ls_poheader,ls_poheaderx,lv_msg_sum,lv_po_number,lt_poitem,
            lt_poitemx,lt_poschedule,lt_poschedulex,lt_poaccount,lt_poaccountx,
            lt_pocond,lt_pocondx,lt_return,lv_ebelp,lt_potextitem,lt_potextitem[].
      REFRESH:lt_poitem,lt_poitemx,lt_poschedule,lt_poschedulex,
              lt_poaccount,lt_poaccountx,lt_pocond,lt_pocondx,lt_return.

      ls_poheader-doc_type  = <fs_out>-bsart.
      ls_poheader-vendor    = <fs_out>-lifnr.
      ls_poheader-purch_org = <fs_out>-ekorg.
      ls_poheader-pur_group = <fs_out>-ekgrp.
      ls_poheader-comp_code = <fs_out>-bukrs.
*      IF <FS_OUT>-BEDAT = '00000000'.
*        LS_POHEADER-DOC_DATE  = SY-DATUM.
*      ELSE.
*        LS_POHEADER-DOC_DATE  = <FS_OUT>-BEDAT.
*      ENDIF.
      SELECT SINGLE zterm
        INTO ls_poheader-pmnttrms
        FROM lfb1
       WHERE lifnr = <fs_out>-lifnr
         AND bukrs = <fs_out>-bukrs.
*      LS_POHEADER-REF_1 = <FS_OUT>-IHREZ. "旧物料

      ls_poheaderx-doc_type  = 'X'.
      ls_poheaderx-doc_date  = 'X'.
      ls_poheaderx-vendor    = 'X'.
      ls_poheaderx-purch_org = 'X'.
      ls_poheaderx-pur_group = 'X'.
      ls_poheaderx-comp_code = 'X'.
      ls_poheaderx-pmnttrms  = 'X'.
      ls_poheaderx-ref_1  = 'X'.
    ENDAT.

***行项目数据
*   lv_ebelp = lv_ebelp + 10.
    lv_ebelp = <fs_out>-ebelp.
    lt_poitem-po_item = lv_ebelp. "项目
    lt_poitem-material = <fs_out>-matnr.  "物料
*    IF <FS_OUT>-TXZ01 <> ''.
*      LT_POITEM-SHORT_TEXT = <FS_OUT>-TXZ01.  "物料描述
*    ENDIF.

    lt_poitem-matl_group = <fs_out>-matkl.  "物料组
    lt_poitem-plant = <fs_out>-werks.     "工厂
*    LT_POITEM-STGE_LOC = <FS_OUT>-LGORT.  "库存地点
    lt_poitem-item_cat = <fs_out>-pstyp.  "项目类别
    lt_poitem-acctasscat = <fs_out>-knttp.  "科目分配类别
    lt_poitem-quantity = <fs_out>-menge.  "数量
    lt_poitem-po_unit  = <fs_out>-meins.  " 采购订单单位
*    LT_POITEM-TAX_CODE  = <FS_OUT>-MWSKZ.  " 税码

    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
      EXPORTING
        input          = lt_poitem-po_unit
        language       = sy-langu
      IMPORTING
        output         = lt_poitem-po_unit
      EXCEPTIONS
        unit_not_found = 1
        OTHERS         = 2.
    lt_poitem-gr_basediv = 'X'. "标识:基于收货的发票验证
    lt_poitem-ir_ind = 'X'.     "发票收据标识
    lt_poitem-gr_ind = 'X'.     "货物收据标识
    lt_pocond-cond_unit  = lt_poitem-po_unit. "条件单位
    APPEND lt_poitem.
    CLEAR lt_poitem.

    lt_poitemx-po_item = lv_ebelp.
    lt_poitemx-material = 'X'.
*    IF <FS_OUT>-TXZ01 <> ''.
*      LT_POITEMX-SHORT_TEXT = 'X'.
*    ENDIF.
    lt_poitemx-matl_group = 'X'.
    lt_poitemx-plant = 'X'.
    lt_poitemx-stge_loc = 'X'.
    lt_poitemx-item_cat = 'X'.
    lt_poitemx-acctasscat = 'X'.
    lt_poitemx-quantity = 'X'.
    lt_poitemx-po_unit  = 'X'.
    lt_poitemx-tax_code  = 'X'.

    lt_poitemx-net_price = 'X'.
    lt_poitemx-po_price = 'X'.
    lt_poitemx-info_rec = 'X'.
    lt_poitemx-info_upd = 'X'.
    lt_poitemx-orderpr_un = 'X'.

    lt_poitemx-gr_basediv = 'X'.
    lt_poitemx-ir_ind = 'X'.
    lt_poitemx-gr_ind = 'X'.
    APPEND lt_poitemx.
    CLEAR lt_poitemx.

***采购价格
    lt_pocond-itm_number = lv_ebelp.
    lt_pocond-cond_type = 'PB00'.
    lt_pocond-cond_value = <fs_out>-netpr.    "价格
    "lt_pocond-COND_UNIT  = lt_poitem-po_unit. "'PC'.
*    LT_POCOND-COND_P_UNT = <FS_OUT>-PEINH."GS_EXCEL_RAW0-PEINH.    "价格单位
    lt_pocond-currency = <fs_out>-waers.
    lt_pocond-change_id    = <fs_out>-change_id.
    APPEND lt_pocond.
    CLEAR lt_pocond.
    lt_pocondx-itm_number = lv_ebelp.
    lt_pocondx-cond_type = 'X'.
    lt_pocondx-cond_value = 'X'.
    lt_pocondx-cond_unit = 'X'.    "条件单位
    lt_pocondx-cond_p_unt = 'X'.    "价格单位
    lt_pocondx-currency = 'X'.
    lt_pocondx-change_id    = 'X'.
    APPEND lt_pocondx.
    CLEAR lt_pocondx.
***计划交货日期
    lt_poschedule-po_item = lv_ebelp.
    lt_poschedule-sched_line = 1.
    lt_poschedule-delivery_date = <fs_out>-eindt.
    lt_poschedule-quantity = <fs_out>-menge.
    APPEND lt_poschedule.
    CLEAR lt_poschedule.

    lt_poschedulex-po_item = lv_ebelp.
    lt_poschedulex-sched_line = 1.
    lt_poschedulex-delivery_date = 'X'.
    lt_poschedulex-quantity = 'X'.
    APPEND lt_poschedulex.
    CLEAR lt_poschedulex.
***科目分配
*    LT_POACCOUNT-PO_ITEM = LV_EBELP.
*    LT_POACCOUNT-SERIAL_NO = 1.
*    IF <FS_OUT>-KNTTP = 'K'.    "科目分配类别
**      MCR_ADD_ZERO <FS_OUT>-KOSTL.
*      LT_POACCOUNT-COSTCENTER = <FS_OUT>-KOSTL. "成本中心
*    ELSEIF <FS_OUT>-KNTTP = 'A'.
*      LT_POACCOUNT-ASSET_NO = <FS_OUT>-ANLN1. "固定资产号
*    ENDIF.
*    APPEND LT_POACCOUNT.
*    CLEAR LT_POACCOUNT.

    lt_poaccountx-po_item = lv_ebelp.
    lt_poaccountx-serial_no = 1.
    IF <fs_out>-knttp = 'K'.    "科目分配类别
      lt_poaccountx-costcenter = 'X'.
    ELSEIF <fs_out>-knttp = 'A'.
      lt_poaccountx-asset_no = 'X'.
    ENDIF.
    APPEND lt_poaccountx.
    CLEAR lt_poaccountx.
***行项目文本
*    LT_POTEXTITEM-PO_ITEM =  LV_EBELP.
*    LT_POTEXTITEM-TEXT_ID = 'F01'.
*    LT_POTEXTITEM-TEXT_FORM = 'X'.
*    LT_POTEXTITEM-TEXT_LINE = <FS_OUT>-TXT20.
*    APPEND  LT_POTEXTITEM.
*    CLEAR  LT_POTEXTITEM.


***调用BAPI 创建PO
    AT END OF zdcno.
      CALL FUNCTION 'BAPI_PO_CREATE1'
        EXPORTING
          poheader         = ls_poheader
          poheaderx        = ls_poheaderx
*         no_price_from_po = 'X'
        IMPORTING
          exppurchaseorder = lv_po_number
        TABLES
          return           = lt_return
          poitem           = lt_poitem
          poitemx          = lt_poitemx
*         POADDRDELIVERY   =
          poschedule       = lt_poschedule
          poschedulex      = lt_poschedulex
*         POEXPIMPITEM     =
*         POEXPIMPITEMX    =
*         POTEXTHEADER     =
          potextitem       = lt_potextitem
          pocond           = lt_pocond
          pocondx          = lt_pocondx
          poaccount        = lt_poaccount
          poaccountx       = lt_poaccountx.




   CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_c32
        RECEIVING
        uuid = lv_zguid.

      IF lv_po_number IS INITIAL. "存在错误
        lv_type = 'E'.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        LOOP AT lt_return WHERE type = 'A' OR type = 'E'.
          PERFORM frm_get_msg USING lt_return CHANGING lv_msg.
          CONCATENATE  lv_msg_sum lv_msg INTO lv_msg_sum .
          CONDENSE lv_msg_sum .
        ENDLOOP.
          wa_log-guid = lv_zguid.
          wa_log-result_flag = lv_type.
          wa_log-created_by = sy-uname.
          wa_log-created_on = sy-datum.
          wa_log-created_at = sy-uzeit.
          wa_log-comp_code = <fs_out>-bukrs.
          wa_log-vendor = <fs_out>-lifnr.
          wa_log-purch_org = <fs_out>-ekorg.
          wa_log-pur_group = <fs_out>-ekgrp.
          wa_log-msg = lv_msg_sum.
          wa_log-external_document = lv_po_number.
      ELSE.
        lv_type = 'S'.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
        CONCATENATE '创建成功:'(041) lv_po_number INTO lv_msg_sum .

          wa_log-guid = lv_zguid.
          wa_log-result_flag = lv_type.
          wa_log-created_by = sy-uname.
          wa_log-created_on = sy-datum.
          wa_log-created_at = sy-uzeit.
          wa_log-comp_code = <fs_out>-bukrs.
          wa_log-vendor = <fs_out>-lifnr.
          wa_log-purch_org = <fs_out>-ekorg.
          wa_log-pur_group = <fs_out>-ekgrp.
          wa_log-msg = lv_msg_sum.
          wa_log-external_document = lv_po_number.
      ENDIF.

    IF wa_log IS NOT INITIAL.
     MODIFY ZPRO13_LOG FROM wa_log.

    ENDIF.

      LOOP AT gt_out WHERE zdcno = <fs_out>-zdcno.
        gt_out-msgty = lv_type.
        CASE lv_type.
          WHEN 'S'.
            gt_out-zstat = icon_green_light.
          WHEN 'E'.
            gt_out-zstat = icon_red_light.
        ENDCASE.
        gt_out-msg = lv_msg_sum .
        MODIFY gt_out INDEX sy-tabix.

      ENDLOOP.
    ENDAT.
  ENDLOOP.
ENDFORM.                    " FRM_CREATE_BOM

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_MSG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_RETURN  text
*      <--P_LV_MSG  text
*----------------------------------------------------------------------*
FORM frm_get_msg  USING    u_return LIKE bapiret2
                  CHANGING c_message TYPE string.
  CLEAR c_message.
  CALL FUNCTION 'MESSAGE_TEXT_BUILD'
    EXPORTING
      msgid               = u_return-id
      msgnr               = u_return-number
      msgv1               = u_return-message_v1
      msgv2               = u_return-message_v2
      msgv3               = u_return-message_v3
      msgv4               = u_return-message_v4
    IMPORTING
      message_text_output = c_message.
ENDFORM.                    " FRM_GET_MSG
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值