问题:业务老是拿你当百度,怎么办!!!
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.