SAP-EXCEL导入PR转PO的坑!

问题:业务老是拿你当百度,怎么办!!!
在这里插入图片描述
1.不要当老实人,让业务自己去核对一下她的采购申请!!!自己不当那个大傻子!!!
2.报表进行优化,如果采购数量不满足单位数量的话, 那么就报错(待实现)
附:实现代码

EXCEL-快捷转单(ZMM_PR_TO_PO)
《---------------------------主体-----------------------------------------*&---------------------------------------------------------------------*
*& Report ZMM_PR_TO_PO
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmm_pr_to_po.

" 变量声明
INCLUDE zmm_pr_to_po_var.
" alv定义, Ui定义
INCLUDE zmm_pr_to_po_alv.
" 业务处理
INCLUDE zmm_pr_to_po_do.

START-OF-SELECTION.
**** 数据上传
  PERFORM frm_upload_data.
  PERFORM frm_check_data.-------------------------INCLUDE zmm_pr_to_po_var.--------------*&---------------------------------------------------------------------*
*& 包含               ZMM_PR_TO_PO_VAR
*&---------------------------------------------------------------------*
TABLES: eban, lfm1, ekpo.

CONSTANTS:
  template_name(30) TYPE c VALUE '非生产性物料PR转PO模板下载.XLS'.

DATA:
  is_error   TYPE c,
  e_count(5) TYPE n VALUE 0,
  s_count(5) TYPE n VALUE 0,
  e_countc   TYPE c LENGTH 15 VALUE '错误条数:',
  s_countc   TYPE c LENGTH 15 VALUE '成功条数:',
  result(70) TYPE c.

DATA: co_objid    TYPE wwwdatatab-objid,
      gv_fullpath TYPE string.

************* 调BAPI执行.
DATA: ls_poheader     LIKE bapimepoheader,
      ls_poheaderx    LIKE bapimepoheaderx,
      ls_poaddrvendor LIKE bapimepoaddrvendor,
      ls_testrun      LIKE bapiflag-bapiflag.
DATA: lv_exponumber LIKE bapimepoheader-po_number.
DATA:
  lt_poheader     LIKE TABLE OF ls_poheader,
  lt_poheaderx    LIKE TABLE OF ls_poheaderx,
  lt_return       LIKE bapiret2 OCCURS 0 WITH HEADER LINE,
  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_potextheader LIKE bapimepotextheader OCCURS 0 WITH HEADER LINE,
  lt_potextitem   LIKE bapimepotext OCCURS 0 WITH HEADER LINE,
  lt_pocond       LIKE bapimepocond   OCCURS 0 WITH HEADER LINE,
  lt_pocondx      LIKE bapimepocondx  OCCURS 0 WITH HEADER LINE,
  lt_pocond1      LIKE bapimepocond   OCCURS 0 WITH HEADER LINE,
  lt_popartner    LIKE bapiekkop OCCURS 0 WITH HEADER LINE.
DATA: message(128).

FIELD-SYMBOLS: <fs1> TYPE any.
DATA :v_symbol_1(50) TYPE c.

DATA: BEGIN OF it_public OCCURS 0,
        banfn LIKE eban-banfn,  " 采购申请号
        bnfpo LIKE eban-bnfpo,  " 采购申请项目号
        bukrs LIKE ekko-bukrs,  " 公司代码
        ekorg LIKE eban-ekorg,  " 采购组织
        menge LIKE eban-menge,  " 采购数量
        netpr LIKE ekpo-netpr,  " 采购总净额
        mwskz LIKE ekpo-mwskz,  " 税码
        txz01 LIKE eban-txz01,  " 文本
      END OF it_public.

DATA: BEGIN OF it_excel OCCURS 0,
        banfn LIKE eban-banfn,  " 采购申请号
        bnfpo LIKE eban-bnfpo,  " 采购申请项目号
        bukrs LIKE ekko-bukrs,  " 公司代码
        ekorg LIKE eban-ekorg,  " 采购组织
        lifnr LIKE eban-lifnr,  " 供应商编号
        menge LIKE eban-menge,  " 采购数量
        netpr LIKE ekpo-netpr,  " 采购总净额
        mwskz LIKE ekpo-mwskz,  " 税码
        name1 LIKE lfa1-name1,  " 供应商名称
        ort01 LIKE lfa1-ort01,  " 供应商城市
        stras LIKE lfa1-stras,  " 供应商地址
        telf1 LIKE lfa1-telf1,  " 供应商电话
      END OF it_excel ,
      BEGIN OF it_excel1 OCCURS 0,
        s_0001 LIKE eban-banfn,  " 采购申请号
        s_0002 LIKE eban-bnfpo,  " 采购申请项目号
        s_0003 LIKE ekko-bukrs,  " 公司代码
        s_0004 LIKE eban-ekorg,  " 采购组织
        s_0005 LIKE eban-lifnr,  " 供应商编号
        s_0006 LIKE eban-menge,  " 采购数量
        s_0007 LIKE ekpo-netpr,  " 采购总净额
        s_0008 LIKE ekpo-mwskz,  " 税码
        s_0009 LIKE lfa1-name1,  " 供应商名称
        s_0010 LIKE lfa1-ort01,  " 供应商城市
        s_0011 LIKE lfa1-stras,  " 供应商地址
        s_0012 LIKE lfa1-telf1,  " 供应商电话
      END OF it_excel1
      .

" 中途显示输出
DATA : BEGIN OF it_ui OCCURS 0,
         " s---  at end of 排序用
         keyword TYPE string,    " 主键字符串
         lifnr   LIKE eban-lifnr,  " 供应商
         " end ---  at end of 排序用
         ort01   LIKE lfa1-ort01,  " 供应商城市
         name1   LIKE lfa1-name1,  " 供应商名称
         stras   LIKE lfa1-stras,  " 供应商地址
         telf1   LIKE lfa1-telf1,  " 供应商电话
         peinh   TYPE ekpo-peinh,  "价格单位数量
         bprme   TYPE ekpo-bprme,  "价格单位,
         bedat   TYPE ekko-bedat,  "订单日期
         knttp   TYPE ekpo-knttp,  "帐户类别
         pstyp   TYPE ekpo-pstyp,  "项目类别
         matnr   TYPE ekpo-matnr,  "物料编码
         bsart   TYPE ekko-bsart,  "订单类型
         ekgrp   LIKE ekko-ekgrp.  " 采购组
    INCLUDE STRUCTURE it_public.
DATA:  END OF it_ui.
DATA gw_ui LIKE it_ui.

DATA:it_header LIKE TABLE OF it_ui WITH HEADER LINE.

" 转换后返回结果
DATA : BEGIN OF it_tab_out OCCURS 0,
         lx           TYPE c,           " 消息类型
         mess(200),                     " 消息文本
         ebeln        TYPE eban-ebeln,         " 采购订单号
*         name1        TYPE lfa1-name1,         " 供应商名称
         linecolor(4).
    INCLUDE STRUCTURE it_ui.
DATA: END OF it_tab_out.
DATA: wa_tab_out LIKE it_tab_out.

" 中途校验数据返回结果
DATA : BEGIN OF it_check_out OCCURS 0,
         lx        TYPE c,           " 消息类型
         mess(200),                     " 消息文本
         lifnr     LIKE eban-lifnr,  " 供应商
         ort01     LIKE lfa1-ort01,  " 供应商城市
         name1     LIKE lfa1-name1,  " 供应商名称
         stras     LIKE lfa1-stras,  " 供应商地址
         telf1     LIKE lfa1-telf1.  " 供应商电话
    INCLUDE STRUCTURE it_public.
DATA: END OF it_check_out.
DATA: wa_check_out LIKE it_check_out.

TYPES: BEGIN OF ty_poitem,
         banfn TYPE eban-banfn,
         bnfpo TYPE eban-bnfpo,
         meins TYPE  eban-meins,
         menge TYPE  eban-menge,
         pstyp TYPE  eban-pstyp,
         knttp TYPE  eban-knttp,
         txz01 TYPE  eban-txz01,
         werks TYPE  eban-werks,
         matkl TYPE  eban-matkl,
       END OF ty_poitem.
DATA: itab_poitem TYPE TABLE OF ty_poitem.

DATA: BEGIN OF it_lfm1 OCCURS 0,
        lifnr TYPE lfm1-lifnr,
        name1 TYPE lfa1-name1,
        ekorg TYPE lfm1-ekorg,
      END OF it_lfm1.

DATA: BEGIN OF it_vendor OCCURS 0,
        partner LIKE but000-partner,
        vendor  LIKE cvi_vend_link-vendor,
      END OF it_vendor.

TYPES: BEGIN OF ty_ebkn,
         banfn TYPE eban-banfn,
         bnfpo TYPE eban-bnfpo,
         sakto TYPE  ebkn-sakto, " 科目
         anln1 TYPE  ebkn-anln1, " 资产号
         kostl TYPE  ebkn-kostl, " 成本中心
       END OF ty_ebkn.

DATA: it_ebkn TYPE TABLE OF ty_ebkn.

DATA: check_in TYPE c VALUE 'X'.----------------------INCLUDE zmm_pr_to_po_alv.-------------*&---------------------------------------------------------------------*
*& 包含               ZMM_PR_TO_PO_ALV
*&---------------------------------------------------------------------*

****ALV参数定义:
TYPE-POOLS: slis.
DATA: it_fieldcat   TYPE slis_t_fieldcat_alv,
      it_layout     TYPE slis_layout_alv,
      it_event      TYPE slis_t_event,  " 用户事件内表
      wa_event      TYPE slis_alv_event,
      it_commentary TYPE slis_t_listheader,
      wa_commentary TYPE slis_listheader
      .
DATA:   lv_repid LIKE sy-repid.
DATA:   it_ls_fieldcat TYPE slis_fieldcat_alv.
DATA:   lv_pos TYPE i VALUE 1.

****  屏幕
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS:p_file TYPE rlgrap-filename OBLIGATORY DEFAULT template_name .
PARAMETERS:p_col(3) TYPE i OBLIGATORY DEFAULT 1,
           p_row(3) TYPE i OBLIGATORY DEFAULT 2.

SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK bk2 WITH FRAME TITLE TEXT-002.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON 2(40) but USER-COMMAND export.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK bk2.

INITIALIZATION.
  but = template_name.

AT SELECTION-SCREEN .
  CASE sy-ucomm.

    WHEN 'EXPORT'.
      PERFORM fm_get_filepath.
      CHECK gv_fullpath IS NOT INITIAL.
      PERFORM fm_downm.
    WHEN '&REFRESH'. " 当“刷新”时,重新读取、验证数据
      PERFORM frm_upload_data.
      PERFORM frm_check_data.

  ENDCASE.

*********  屏幕事件
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

  PERFORM frm_get_file USING p_file.

END-OF-SELECTION.


  " UI 界面设置
FORM frm_fieldcat_init.
  DEFINE fieldcat.
    CLEAR  it_ls_fieldcat.
    it_ls_fieldcat-col_pos       =  1.
    it_ls_fieldcat-fieldname     = &1.
    it_ls_fieldcat-seltext_l     = &2.
    it_ls_fieldcat-outputlen     = &3.
    it_ls_fieldcat-key           = &4.

    it_ls_fieldcat-seltext_m = it_ls_fieldcat-seltext_l.
    it_ls_fieldcat-seltext_s = it_ls_fieldcat-seltext_l.

    APPEND it_ls_fieldcat TO it_fieldcat.
    CLEAR  it_ls_fieldcat.
  END-OF-DEFINITION.
  IF check_in = 'X'.  " 中途验证时使用以下字段
    fieldcat  'LX'        '校验类型'                      '4'            'X'  .
    fieldcat  'MESS'      '校验结果'                      '60'           ''  .
    fieldcat  'BANFN'     '采购申请编号'                    '10'           'X'  .
    fieldcat  'BNFPO'     '采购申请项目'                    '5'           'X'  .
    fieldcat  'BUKRS'     '公司代码'                      '4'           'X'  .
    fieldcat  'EKORG'     '采购组织'                      '4'            'X'  .
    fieldcat  'LIFNR'     '供应商编号'                      '10'            'X'  .
    fieldcat  'MENGE'     '采购数量'                      '15'            'X'  .
    fieldcat  'NETPR'     '采购总净额'                      '10'            'X'  .
    fieldcat  'MWSKZ'     '税码'                      '4'            'X'  .
    fieldcat  'TXZ01'     '文本'                    '15'           'X'  .
    fieldcat  'NAME1'     '供应商名称(一次性供应商必填)'        '15'            'X'  .
    fieldcat  'ORT01'     '供应商城市(一次性供应商必填)'        '15'            'X'  .
    fieldcat  'STRAS'     '供应商地址(非必填)'                      '15'            'X'  .
    fieldcat  'TELF1'     '供应商电话(非必填)'                      '10'            'X'  .
  ELSE.   " 转换完成时
    fieldcat  'BUKRS'     '公司代码'                      '4'           'X'  .
    fieldcat  'EKORG'     '采购组织'                      '4'            'X'  .
    fieldcat  'LIFNR'     '供应商'                      '10'            'X'  .
    fieldcat  'NAME1'     '供应商名称'                      '10'            'X'  .
    fieldcat  'EBELN'     '采购订单号'                      '10'            'X'  .
    fieldcat  'LX'        '消息类型'                      '4'            'X'  .
    fieldcat  'MESS'      '消息结果'                      '60'           ''  .
*    fieldcat  'BANFN'     '采购申请编号'                    '10'           'X'  .
*    fieldcat  'BNFPO'     '采购申请项目'                    '5'           'X'  .
*    fieldcat  'MENGE'     '采购数量'                      '15'            'X'  .
*    fieldcat  'NETPR'     '采购总净额'                      '10'            'X'  .
*    fieldcat  'MWSKZ'     '税码'                      '4'            'X'  .
*    fieldcat  'TXZ01'     '文本'                    '40'           'X'  .
  ENDIF.
ENDFORM.

" 定义ALV事件
FORM frm_event_init.
  wa_event-name = 'USER_COMMAND'.  " 用户响应事件
  wa_event-form = 'FORM_USER_COMMAND'.
  APPEND wa_event TO it_event.
  wa_event-name = 'TOP_OF_PAGE'.  " 显示标题
  wa_event-form = 'FORM_TOP_OF_PAGE'.
  APPEND wa_event TO it_event.
  wa_event-name = 'PF_STATUS_SET'.  " 设置GUI状态栏
  wa_event-form = 'FORM_PF_STATUS_SET'.
  APPEND wa_event TO it_event.
ENDFORM.

FORM form_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.

  CASE r_ucomm.
    WHEN '&CREATE_PO'.
      IF is_error <> 'X'.
        IF check_in <> 'S'.  " 此处的标识符用于alv显示字段、限制用户多次点击创建PO浪费资源
          check_in = 'S' .
          CLEAR: it_tab_out,it_tab_out[].
          PERFORM frm_process_data.
          PERFORM frm_output_data.
        ENDIF.
      ELSE.
        MESSAGE '导入的数据有错误,无法执行创建PO' TYPE 'E'.
      ENDIF.
*    WHEN '&F03'.
*      PERFORM frm_check_data.
  ENDCASE.
ENDFORM.

FORM form_top_of_page.
*  DATA it_commentary TYPE slis_t_listheader.
*  DATA wa_commentary TYPE slis_listheader.

*  wa_commentary-typ = 'H'.
*  wa_commentary-info = '数据校验结果'.
*  APPEND wa_commentary to it_commentary.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = it_commentary
*     I_LOGO             =
*     I_END_OF_LIST_GRID =
*     I_ALV_FORM         =
    .

ENDFORM.

FORM form_pf_status_set USING rt_extab TYPE slis_t_extab.

  SET PF-STATUS '100'.
ENDFORM.-----------------------INCLUDE zmm_pr_to_po_do.------------------*&---------------------------------------------------------------------*
*& 包含               ZMM_PR_TO_PO_DO
*&---------------------------------------------------------------------*

FORM frm_read_excel.

  DATA :tab LIKE alsmex_tabline OCCURS 0 WITH HEADER LINE.
  FIELD-SYMBOLS: <fs1>.

  DATA : ld_index TYPE i.

  REFRESH :tab.
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = p_col
      i_begin_row             = p_row
      i_end_col               = 12
      i_end_row               = 30000
    TABLES
      intern                  = tab
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
************把 表 TAB 的内容给到IT_TAB1

  CLEAR : it_excel1. REFRESH :it_excel1.
  LOOP AT tab.
    MOVE tab-col TO ld_index.
    ASSIGN COMPONENT ld_index OF STRUCTURE it_excel1 TO <fs1>.
    MOVE tab-value TO <fs1>.
    AT END OF row.
      APPEND it_excel1.
      CLEAR  it_excel1.
    ENDAT.

  ENDLOOP.
  it_excel[] = it_excel1[].

ENDFORM.                    "frm_upload_data

FORM frm_read_excel_1.
  DATA: il_raw TYPE truxs_t_text_data.
  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP' "可以是Excel文件,也可以是Txt文件
    EXPORTING
*     I_FIELD_SEPERATOR    = 分隔符,默认为Tab
      i_line_header        = 'X' "文本中的第一行是否是标题头,如果是则不会读取
      i_tab_raw_data       = il_raw "该参数实际上没有使用到,但为必输参数
      i_filename           = p_file
    TABLES
      i_tab_converted_data = it_excel. "会自动的将Excel、Txt文件中的数据一行行读取到数据内表中
ENDFORM.

" 处理 导入的表格
FORM frm_upload_data.

  DATA: BEGIN OF it_bsmng OCCURS 0,
          banfn TYPE eban-banfn,
          bnfpo TYPE eban-bnfpo,
          txz01 TYPE eban-txz01,
          menge TYPE eban-menge,
          bsmng TYPE eban-bsmng,
        END OF it_bsmng.

  PERFORM frm_read_excel.

  LOOP AT it_excel INTO DATA(line).
    MOVE-CORRESPONDING line TO gw_ui.
    APPEND gw_ui TO it_ui.
    CLEAR gw_ui.
  ENDLOOP.

  " 查询一次性供应商
  SELECT partner cvi_vend_link~vendor INTO CORRESPONDING FIELDS OF TABLE it_vendor FROM but000 INNER JOIN cvi_vend_link ON cvi_vend_link~partner_guid = but000~partner_guid WHERE but000~bu_group = 'Z009'.

  SELECT lfm1~lifnr name1 ekorg FROM lfm1 INNER JOIN lfa1 ON lfa1~lifnr = lfm1~lifnr INTO CORRESPONDING FIELDS OF TABLE it_lfm1 GROUP BY lfm1~lifnr ekorg name1 ORDER BY lfm1~lifnr ASCENDING ekorg ASCENDING.
*  SELECT banfn bnfpo txz01 menge bsmng FROM eban INTO CORRESPONDING FIELDS OF TABLE it_bsmng GROUP BY banfn bnfpo txz01 menge bsmng  ORDER BY banfn ASCENDING bnfpo ASCENDING.
  "业务数据太多会全选所以注释
  IF it_ui[] IS NOT INITIAL.
    SELECT banfn bnfpo txz01 menge bsmng FROM eban INTO CORRESPONDING FIELDS OF TABLE it_bsmng
      FOR ALL ENTRIES IN it_ui
      WHERE  banfn = it_ui-banfn AND  bnfpo = it_ui-bnfpo .
  ENDIF.
  SORT it_ui  BY banfn ASCENDING bnfpo ASCENDING.
  " 数据格式化:前导0  大小写转换
  LOOP AT it_ui.
    " ------ 前导0
    " 采购申请项目
    PERFORM f_add_zero USING it_ui-bnfpo.
    " 供应商编号
    PERFORM f_add_zero USING it_ui-lifnr.
    " end 前导0
    " ------ 大小写
    " 税码
    TRANSLATE it_ui-mwskz TO UPPER CASE.
    " end 大小写
    " 处理采购申请项目
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = it_ui-bnfpo
      IMPORTING
        output = it_ui-bnfpo.

    MODIFY it_ui.
    " ------- 验证输入

    MOVE-CORRESPONDING it_ui TO wa_check_out.

    READ TABLE it_lfm1 INTO DATA(wa_lfm1) WITH KEY lifnr = it_ui-lifnr ekorg = it_ui-ekorg.
    IF sy-subrc <> 0.
      is_error = 'X'.
      wa_check_out-lx = 'E'.
      wa_check_out-mess = '该采购组织不存在此供应商;'.
    ENDIF.
    READ TABLE it_bsmng INTO DATA(wa_bs) WITH KEY banfn = it_ui-banfn bnfpo = it_ui-bnfpo.
    IF sy-subrc = 0 .
      wa_check_out-txz01 = wa_bs-txz01.
      IF NOT ( it_ui-menge <= ( wa_bs-menge - wa_bs-bsmng ) ). " 所上传的采购数量<=(eban.menge - bsmng )
        is_error = 'X'.
        wa_check_out-lx = 'E'.
        CONCATENATE wa_check_out-mess '采购数量小于pr可转数量;' INTO wa_check_out-mess.
      ENDIF.
    ELSE.
      is_error = 'X'.
      wa_check_out-lx = 'E'.
      wa_check_out-mess = '未找到采购申请及项目;'.
    ENDIF.
*    SELECT SINGLE partner INTO @DATA(wa_vendor) FROM but000 INNER JOIN cvi_vend_link ON cvi_vend_link~partner_guid = but000~partner_guid WHERE but000~bu_group = 'Z009' AND cvi_vend_link~vendor = @it_ui-lifnr.
    READ TABLE it_vendor WITH KEY vendor = it_ui-lifnr INTO DATA(wa_vendor).
    IF sy-subrc = 0 AND ( it_ui-name1 = '' OR it_ui-ort01 = '' ).
      is_error = 'X'.
      wa_check_out-lx = 'E'.
      wa_check_out-mess = '供应商是一次性供应商,则必填名称及城市;'.
    ENDIF.

    IF wa_check_out-lx <> 'E'.
      wa_check_out-lx = 'S'.
*      wa_check_out-mess = '校验通过'.
      it_ui-keyword = | { it_ui-lifnr } { it_ui-ort01 } { it_ui-name1 } { it_ui-stras } { it_ui-telf1 } |.
      APPEND it_ui TO it_header.
    ENDIF.

*    MOVE-CORRESPONDING it_ui TO wa_check_out."因为多了txz01逻辑往上移

    APPEND wa_check_out TO it_check_out.
    CLEAR wa_check_out.
    " end ------- 验证输入
  ENDLOOP.

*  BREAK-POINT.

ENDFORM.

" 处理数据
FORM frm_process_data.
  CLEAR : ls_poheader,ls_poheaderx,lv_exponumber,lt_return,lt_poitem,lt_poitemx,
  lt_poschedule,lt_poschedulex,lt_poaccount,lt_poaccountx,lt_potextheader,
  lt_potextitem,lt_pocond,lt_pocondx,lt_popartner.
  REFRESH : lt_return,lt_poitem,lt_poitemx,
  lt_poschedule,lt_poschedulex,lt_poaccount,lt_poaccountx,lt_potextheader,
  lt_potextitem,lt_pocond,lt_pocondx,lt_popartner.
*  REFRESH it_header.CLEAR it_header.

  SORT it_ui BY  lifnr ASCENDING bukrs ASCENDING ekorg ASCENDING.

*  APPEND LINES OF it_ui TO it_header.

  CLEAR : e_count,s_count.
  DATA:
    bukrs    TYPE eban-werks,
    ekorg    TYPE eban-ekorg,
    lifnr    TYPE lfm1-lifnr,
    line_num TYPE i VALUE 10.  " 行项目,每次自增10
  SELECT
    banfn
    bnfpo
    meins
    menge
    pstyp
    knttp
    txz01
    werks
    matkl
  FROM eban INTO CORRESPONDING FIELDS OF TABLE itab_poitem
  FOR ALL ENTRIES IN it_ui WHERE banfn = it_ui-banfn  AND  bnfpo = it_ui-bnfpo
  .
  SORT itab_poitem BY banfn DESCENDING bnfpo DESCENDING.

  SELECT
    banfn
    bnfpo
    sakto
    anln1
    kostl
  FROM ebkn INTO CORRESPONDING FIELDS OF TABLE it_ebkn
  FOR ALL ENTRIES IN it_ui WHERE banfn = it_ui-banfn  AND  bnfpo = it_ui-bnfpo
  .
  SORT itab_poitem BY banfn DESCENDING bnfpo DESCENDING.

  DATA(temp_item) = wa_check_out.

  LOOP AT it_header INTO DATA(wa_header).

    " ------ poheader
    "ls_poheader-doc_type   = wa_header-bsart.    "采购订单类型
    ls_poheader-doc_type   = 'NC'.    "采购订单类型
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = wa_header-lifnr    "供应商
      IMPORTING
        output = ls_poheader-vendor.
    ls_poheader-comp_code  = wa_header-bukrs.    "公司代码
    ls_poheader-purch_org  = wa_header-ekorg.    "采购组织
    ls_poheader-pur_group  = wa_header-ekgrp = '114'.    "采购组, 固定114
    ls_poheader-currency   = 'CNY'.    "币别
    ls_poheader-creat_date = sy-datum.           "采购订单创建日期
    ls_poheader-created_by = sy-uname.           "创建人
    ls_poheader-doc_date   = wa_header-bedat.    "订单日期
    ls_poheader-langu      = sy-langu.           "语言
    ls_poheader-item_intvl = space.              "项目间隔

    ls_poheaderx-po_number  = 'X'.
    ls_poheaderx-doc_type   = 'X'.
    ls_poheaderx-vendor     = 'X'.
    ls_poheaderx-comp_code  = 'X'.
    ls_poheaderx-purch_org  = 'X'.
    ls_poheaderx-pur_group  = 'X'.
    ls_poheaderx-currency   = 'X'.
    ls_poheaderx-creat_date = 'X'.
    ls_poheaderx-created_by = 'X'.
    ls_poheaderx-doc_date   = 'X'.
    ls_poheaderx-langu      = 'X'.
    ls_poheaderx-item_intvl = 'X'. "自动编号
    ls_poheaderx-ref_1      = 'X'.    "旧采购订单号
    " end ------ poheader

    " ----- poaddrvendor:地址、名称等信息

    IF wa_header-name1 <> '' AND wa_header-ort01 <> ''.
      ls_poaddrvendor-name = wa_header-name1.
      ls_poaddrvendor-city = wa_header-ort01.
    ENDIF.
    ls_poaddrvendor-country = 'CN'.
    ls_poaddrvendor-street = wa_header-stras.
    ls_poaddrvendor-tel1_numbr = wa_header-telf1.

    " end ---------poaddrvendor

*      CLEAR: lt_poitem, lt_poitemx.
    " -------- poitem
    lt_poitem-po_item    = line_num.
    READ TABLE itab_poitem INTO DATA(wa_poitem) WITH KEY  banfn = wa_header-banfn  bnfpo = wa_header-bnfpo.
    IF wa_poitem IS NOT INITIAL.
      lt_poitem-po_unit  = wa_poitem-meins." 单位
      lt_poitem-item_cat = wa_poitem-pstyp."项目类别
      lt_poitem-acctasscat = wa_poitem-knttp.
      lt_poitem-short_text = wa_poitem-txz01."短文本
      lt_poitem-plant = wa_poitem-werks." 工厂
      lt_poitem-matl_group = wa_poitem-matkl."物料组.

      lt_poitem-quantity  = wa_header-menge."数量

    ENDIF.
    lt_poitem-preq_no = wa_header-banfn.     " 采购申请号
    lt_poitem-preq_item = wa_header-bnfpo.   " 采购申请项目
    lt_poitem-net_price = wa_header-netpr .  "单价,采购净额
    lt_poitem-price_unit   = wa_header-menge. "价格单位数量,采购数量
    lt_poitem-orderpr_un   = lt_poitem-po_unit . "价格单位
    lt_poitem-gr_basediv    = 'X' .  "基于收货的 IV
    lt_poitem-tax_code  = wa_header-mwskz.   " 税码
    APPEND lt_poitem.
    lt_poitemx-po_item    = line_num. "行项目,每次自增10

    lt_poitemx-acctasscat = 'X'.
    lt_poitemx-preq_no = 'X'.
    lt_poitemx-preq_item = 'X'.

    lt_poitemx-short_text = 'X'.           "短文本
    lt_poitemx-quantity   = 'X'.           "数量
    lt_poitemx-po_unit    = 'X'.           "单位
    lt_poitemx-net_price  = 'X'.           "单价
    lt_poitemx-matl_group = 'X'.           "物料组
    lt_poitemx-plant      = 'X'.           "工厂
    lt_poitemx-tax_code   = 'X'.           "税码
    lt_poitemx-price_unit   = 'X'.         "价格单位数量
    lt_poitemx-orderpr_un   = 'X'.         "价格单位
    lt_poitemx-item_cat    = 'X'.        "项目类别
    lt_poitemx-gr_basediv    = 'X' .  "基于收货的 IV
    lt_poitemx-acctasscat = 'X'.           "帐户类别
    APPEND lt_poitemx.
    " end ------ poitem

    " -------- pocond
    lt_pocond-itm_number = line_num.
    lt_pocond-change_id  = 'U'.
    lt_pocond-cond_type  = 'PBXX'.
    lt_pocond-cond_value = wa_header-netpr."价格
    lt_pocond-currency   = 'CNY'.
    lt_pocond-cond_p_unt = wa_header-menge. "价格单位数量
    APPEND lt_pocond.

    lt_pocondx-itm_number  = line_num.
    lt_pocondx-itm_numberx = 'X'.
    lt_pocondx-change_id   = 'X'.
    lt_pocondx-cond_type   = 'X'.
    lt_pocondx-cond_value  = 'X'.
    lt_pocondx-currency    = 'X'.
    lt_pocondx-cond_p_unt  = 'X'.
    APPEND lt_pocondx.
    " end ------ pocond

    " -------- poaccount
    READ TABLE it_ebkn INTO DATA(wa_ebkn) WITH KEY banfn = wa_header-banfn bnfpo = wa_header-bnfpo .
    IF wa_ebkn IS NOT INITIAL.
      lt_poaccount-po_item    = line_num.
      lt_poaccount-gl_account = wa_ebkn-sakto.  "科目
      lt_poaccount-asset_no   = wa_ebkn-anln1.  "资产号
      lt_poaccount-costcenter = wa_ebkn-kostl.  " 成本中心
      APPEND lt_poaccount.
      lt_poaccountx-po_item   = line_num.
      IF wa_ebkn-anln1 IS NOT INITIAL.
        lt_poaccountx-asset_no = 'X'.   " 资产号
      ENDIF.
      IF wa_ebkn-kostl IS NOT INITIAL.
        lt_poaccountx-costcenter =  'X'. "成本中心
      ENDIF.
      lt_poaccountx-gl_account = 'X'.

      APPEND lt_poaccountx.
    ENDIF.
    " end ------ poaccount

    line_num = line_num + 10.
    " 处理一次性供应商
    "1. 先查询是否是一次性供应商
    "READ TABLE it_vendor WITH KEY vendor = ls_poheader-vendor INTO DATA(wa_vendor).
    "2. 若是,则判断当前的item与前一个item相关字段值是否一致,一致则跳过,不一致则处理
    "IF sy-subrc = 0 AND ( wa_header-name1 = temp_item-name1 AND wa_header-ort01 = temp_item-ort01 AND wa_header-stras = temp_item-stras AND wa_header-telf1 = temp_item-telf1  ).
    "  CONTINUE.
    "ELSEIF sy-subrc = 0.

    "ENDIF.

    " 处理非一次性供应商
    DATA(wa_header_temp) = wa_header.
    "AT END OF lifnr.
    AT END OF keyword.
      wa_header = wa_header_temp.

      CLEAR: wa_poitem, wa_ebkn.
      CLEAR it_tab_out.
      line_num = line_num + 10.

      it_tab_out-bukrs  =  wa_header-bukrs.    "公司代码
      it_tab_out-ekgrp  =  wa_header-ekorg.    "采购组织
      it_tab_out-lifnr  =  wa_header-lifnr.    "供应商编号
      READ TABLE it_vendor WITH KEY vendor = ls_poheader-vendor INTO DATA(wa_vendor).
      IF wa_vendor IS NOT INITIAL.
        it_tab_out-name1  =  wa_header-name1.
      ELSE.
        READ TABLE it_lfm1 WITH KEY lifnr = wa_header-lifnr INTO DATA(wa_lfm1).
        it_tab_out-name1  =  wa_lfm1-name1.    "供应商名称
      ENDIF.

      it_tab_out-ekgrp  =  wa_header-bprme.    "采购组织

      it_tab_out-banfn = wa_header-banfn.
      it_tab_out-bnfpo = wa_header-bnfpo.
      it_tab_out-txz01 = wa_header-txz01.
      it_tab_out-bukrs = wa_header-bukrs.
      it_tab_out-ekorg = wa_header-ekorg.
      it_tab_out-lifnr = wa_header-lifnr.
      it_tab_out-menge = wa_header-menge.
      it_tab_out-netpr = wa_header-netpr.
      it_tab_out-mwskz = wa_header-mwskz.
      CALL FUNCTION 'BAPI_PO_CREATE1'
        EXPORTING
          poheader         = ls_poheader
          poheaderx        = ls_poheaderx
          poaddrvendor     = ls_poaddrvendor
          testrun          = ls_testrun
        IMPORTING
          exppurchaseorder = lv_exponumber
        TABLES
          poitem           = lt_poitem[]
          poitemx          = lt_poitemx[]
          poschedule       = lt_poschedule[]
          poschedulex      = lt_poschedulex[]
          poaccount        = lt_poaccount[]
          poaccountx       = lt_poaccountx[]
          pocond           = lt_pocond[]
          pocondx          = lt_pocondx[]
          potextheader     = lt_potextheader
          return           = lt_return[].
      IF lv_exponumber IS NOT INITIAL.

        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.

        it_tab_out-ebeln  =  lv_exponumber.     "新采购订单号
        it_tab_out-lx     = 'S'.
        it_tab_out-mess   = '成功'.
        APPEND it_tab_out.
        s_count = s_count + 1.

        WAIT UP TO 2 SECONDS.

        DATA knumv LIKE ekko-knumv.
        CLEAR knumv.
        SELECT SINGLE knumv INTO knumv FROM ekko WHERE ebeln = lv_exponumber.
        DELETE FROM prcd_elements WHERE knumv = knumv AND kschl = 'PBXX' AND kinak <> ''.
        COMMIT WORK AND WAIT.

        ""审批
        "" ***先取批准代码
        DATA :tab_bapirlcopo LIKE TABLE OF bapirlcopo WITH HEADER LINE.

        CALL FUNCTION 'BAPI_PO_GETRELINFO'
          EXPORTING
            purchaseorder = lv_exponumber
          TABLES
            release_final = tab_bapirlcopo.

      ELSE.

        LOOP AT lt_return WHERE type = 'E' .
          IF lt_return-id <> 'BAPI' AND lt_return-id <> 'MEPO'.
            EXIT.
          ENDIF.
        ENDLOOP.
        it_tab_out-lx     = 'E'.
        it_tab_out-mess   = lt_return-message.
        APPEND it_tab_out.
        e_count = e_count + 1.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      ENDIF.
      CLEAR:ls_poheader,ls_poheaderx,ls_poheader,lt_poitem,lt_poitemx,lt_poschedule,lt_poschedulex,lt_poaccount,lt_poaccountx,
      lt_pocond,lt_pocondx,lt_return,lt_potextheader,wa_vendor,
      lt_poitem[],lt_poitemx[],lt_poschedule[],lt_poschedulex[],lt_poaccount[],lt_poaccountx[],
      lt_pocond[],lt_pocondx[],lt_return[],lt_potextheader[].

      line_num = 10.

      CONCATENATE e_countc e_count ';' s_countc s_count INTO result.
    ENDAT.
    CLEAR wa_header.
  ENDLOOP.

ENDFORM.

" 输出数据
FORM frm_output_data.

  lv_repid = sy-repid.
  it_layout-detail_popup = 'X'.
  it_layout-info_fieldname = 'LINECOLOR'.

  CLEAR it_commentary.
  wa_commentary-typ = 'H'.
  wa_commentary-info = '非生产性物料PR转PO结果统计'.
  APPEND wa_commentary TO it_commentary.

  REFRESH :it_fieldcat[].
  PERFORM frm_fieldcat_init.
  REFRESH :it_event[].
  PERFORM frm_event_init.

  " Pr成功转换成Po时
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = lv_repid
      it_fieldcat        = it_fieldcat[]
      is_layout          = it_layout
      i_default          = 'X'
      i_save             = 'A'
      i_grid_title       = result
      it_events          = it_event[]
    TABLES
      t_outtab           = it_tab_out.

  CLEAR it_commentary.
  wa_commentary-typ = 'H'.
  wa_commentary-info = '校验结果概览'.
  APPEND wa_commentary TO it_commentary.

ENDFORM.

FORM frm_check_data.
  lv_repid = sy-repid.
  it_layout-detail_popup = 'X'.
  it_layout-info_fieldname = 'LINECOLOR'.

  CLEAR it_commentary.
  wa_commentary-typ = 'H'.
  wa_commentary-info = '导入结果概览'.
  APPEND wa_commentary TO it_commentary.

  REFRESH :it_fieldcat[].
  PERFORM frm_fieldcat_init.
  REFRESH :it_event[].
  PERFORM frm_event_init.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = lv_repid
      it_fieldcat        = it_fieldcat[]
      is_layout          = it_layout
      i_default          = 'X'
      i_save             = 'A'
      i_grid_title       = result
      it_events          = it_event[]
    TABLES
      t_outtab           = it_check_out.
ENDFORM.

* 获取数据模板文件路径
FORM fm_get_filepath .

  DATA: lv_filename TYPE string,
        lv_path     TYPE string,
        lv_fullpath TYPE string,
        lv_title    TYPE string.


  co_objid = 'ZMMRP002'.

  CONCATENATE  co_objid '-' sy-datum  sy-uzeit INTO lv_title .
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         = '模板保存为EXCEL'
      default_extension    = 'xls'
      default_file_name    = lv_title
*     file_filter          = '.xls'
      file_filter          = 'Excel 文件 (*.XLS)'
      initial_directory    = 'D:/'
*     DEFAULT_FILE_NAME    = p_filename
    CHANGING
      filename             = lv_filename
      path                 = lv_path
      fullpath             = gv_fullpath
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    STOP .
  ENDIF.

ENDFORM.

" 下载数据模板
FORM fm_downm .

  DATA: ls_indcatortxt TYPE string,
        p_filename     TYPE sapb-sappfad.
  DATA: lo_objdata     LIKE wwwdatatab,
        lo_mime        LIKE w3mime,
        ls_destination LIKE rlgrap-filename,
        ls_objnam      TYPE string,
        li_rc          LIKE sy-subrc,
        ls_errtxt      TYPE string.

  p_filename = gv_fullpath.
  ls_indcatortxt = '程序正在下载模板' .
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = 0
      text       = ls_indcatortxt.
  CONCATENATE co_objid '.XLS' INTO ls_objnam.
  CONDENSE ls_objnam NO-GAPS.
  SELECT SINGLE relid objid FROM wwwdata
    INTO CORRESPONDING FIELDS OF lo_objdata
    WHERE srtf2    = 0
    AND relid    = 'MI'
    AND objid    = co_objid .
  IF sy-subrc NE 0 OR lo_objdata-objid EQ space .
    CONCATENATE '模板文件:' ls_objnam '不存在,请用TCODE:SMW0进行加载' INTO ls_errtxt.
    MESSAGE ls_errtxt  TYPE  'E' .
  ENDIF.

  ls_destination   = gv_fullpath.
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key         = lo_objdata
      destination = ls_destination
    IMPORTING
      rc          = li_rc.
  IF li_rc NE 0.
    CONCATENATE '模板文件:' ls_objnam '下载失败' INTO ls_errtxt.
    MESSAGE ls_errtxt TYPE 'E' .
  ENDIF.

ENDFORM.

FORM frm_get_file USING pr_file.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_path         = 'C:\'
      mask             = '*.*'
      title            = '选择文件...'
    IMPORTING
      filename         = pr_file
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
ENDFORM.

"  设置前导0
FORM f_add_zero  USING vi_input.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = vi_input
    IMPORTING
      output = vi_input.

ENDFORM.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值