SAP ABAP 批量创建PR
&---------------------------------------------------------------------
*& Report ZRMM_049
&---------------------------------------------------------------------
*&
&---------------------------------------------------------------------
REPORT zrmm_049.
TABLES:sscrfields,eban.
**定义
TYPES:BEGIN OF tp_alv,
incon TYPE char50, "图标
index TYPE i,
message(100),
charg TYPE mseg-charg,
maktx TYPE makt-maktx,
banfn TYPE eban-banfn,
bnfpo TYPE eban-bnfpo,
matnr TYPE eina-matnr, "物料编码
menge TYPE eban-menge, "数量
werks TYPE eine-werks, "工厂
lfdat TYPE eban-lfdat, "交货日期
END OF tp_alv.
DATA:gt_alv TYPE TABLE OF tp_alv,
gs_alv TYPE tp_alv.
DATA:lv_error.
DATA: BEGIN OF itfile OCCURS 0 ,
matnr TYPE string, "物料编码
menge TYPE string, "数量
werks TYPE string, "工厂
lfdat TYPE string, "交货日期
END OF itfile.
DATA: gs_functxt TYPE smp_dyntxt. "功能代码文本
DATA: gt_fcat TYPE lvc_t_fcat, "字段目录
gs_fcat TYPE lvc_s_fcat,
gs_layout TYPE lvc_s_layo.
**选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS:p_bsart TYPE eban-bsart DEFAULT ‘Z002’ OBLIGATORY.
SELECTION-SCREEN SKIP 1.
PARAMETERS:p_pfile TYPE localfile MODIF ID m1.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN FUNCTION KEY 1.
**初始化
INITIALIZATION.
gs_functxt-icon_id = icon_export.
gs_functxt-quickinfo = ‘下载模版’.
gs_functxt-icon_text = ‘下载模版’.
sscrfields-functxt_01 = gs_functxt.
AT SELECTION-SCREEN.
IF sscrfields-ucomm = ‘FC01’.
PERFORM frm_download_template.
ENDIF.
IF sscrfields-ucomm = ‘ONLI’.
IF p_bsart = ‘Z001’ OR p_bsart = ‘Z002’.
ELSE.
MESSAGE '此功能只允许创建 ''Z001:手工采购申请和 Z002:售后采购申请 ’ TYPE ‘E’.
ENDIF.
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_pfile.
PERFORM frm_input_help CHANGING p_pfile.
START-OF-SELECTION.
CLEAR lv_error…
PERFORM get_data USING p_pfile. "导入数据
PERFORM check_data.
PERFORM frm_bapi.
END-OF-SELECTION.
CHECK lv_error = ‘’.
PERFORM frm_show.
&---------------------------------------------------------------------
*& Form frm_download_template
&---------------------------------------------------------------------
*& text
&---------------------------------------------------------------------
*& --> p1 text
*& <-- p2 text
&---------------------------------------------------------------------
FORM frm_download_template .
DATA: lv_filepath TYPE string, " 存放路径
lv_filename TYPE string, "文件名称
lv_path TYPE string . " 下载后存放全路径
DATA: lv_objdata LIKE wwwdatatab,
lv_obj_name LIKE wwwdatatab-objid,
lt_mime LIKE w3mime OCCURS 10.
DATA: lv_ret TYPE abap_bool,
lv_answer.
DATA: lv_file TYPE string.
"设置 www object信息
lv_obj_name = ‘ZMM049’.
"保存对话框
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = ‘下载模板’
default_extension = ‘xlsx’
default_file_name = ‘采购申请模板.xlsx’
file_filter = ‘EXCEL’
prompt_on_overwrite = ‘’
CHANGING
fullpath = lv_path
filename = lv_filename
path = lv_filepath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
"检查文件是否存在
MOVE lv_path TO lv_file.
CALL METHOD cl_gui_frontend_services=>file_exist
EXPORTING
file = lv_file
RECEIVING
result = lv_ret
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
EXIT.
ENDIF.
IF lv_ret EQ ‘X’.
-
模版已存在,是否覆盖
CALL FUNCTION ‘POPUP_TO_CONFIRM’
EXPORTING
text_question = ‘模版已存在,是否覆盖?’
text_button_1 = ‘是’(005)
text_button_2 = ‘否’(006)
IMPORTING
answer = lv_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.ENDIF.
IF lv_answer EQ ‘A’. "取消
EXIT.
ELSEIF lv_answer NE ‘1’. "否
EXIT.
ENDIF.
ELSE.
lv_answer = ‘1’.
ENDIF.IF lv_answer EQ ‘1’.
SELECT relid objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF lv_objdata
UP TO 1 ROWS
WHERE srtf2 = 0
AND relid = ‘MI’
AND objid = lv_obj_name.
ENDSELECT.IF lv_path IS NOT INITIAL.
" 装载至本地文件
p_pfile = lv_path.
CALL FUNCTION ‘DOWNLOAD_WEB_OBJECT’ "
EXPORTING
key = lv_objdata
destination = p_pfile.
ENDIF.ENDIF.
ENDFORM.
&---------------------------------------------------------------------
*& Form frm_input_help
&---------------------------------------------------------------------
*& text
&---------------------------------------------------------------------
*& <-- P_PFILE
&---------------------------------------------------------------------
FORM frm_input_help CHANGING p_o_file.
DATA:
ltd_filetable TYPE filetable,
lth_filetable TYPE LINE OF filetable,
lw_rc TYPE i.CALL METHOD cl_gui_frontend_services=>file_open_dialog
CHANGING
file_table = ltd_filetable
rc = lw_rc
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 ltd_filetable INTO lth_filetable INDEX 1.
p_o_file = lth_filetable-filename.
ELSE.
MESSAGE ID sy-msgid TYPE ‘I’ NUMBER sy-msgno
DISPLAY LIKE ‘E’
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
&---------------------------------------------------------------------
*& Form get_data
&---------------------------------------------------------------------
*& text
&---------------------------------------------------------------------
*& --> P_PFILE
&---------------------------------------------------------------------
FORM get_data USING p_i_file.
FIELD-SYMBOLS: TYPE any.
DATA: l_intern TYPE alsmex_tabline OCCURS 0 WITH HEADER LINE.
DATA: c_row TYPE i VALUE 4, "读EXCEL第4行开始
c_col TYPE i VALUE 1, "读EXCEL第1列开始
l_index TYPE i,
l_msg(60) TYPE c,
g_mod TYPE d,
l_row(5) TYPE n,
li_len TYPE sy-tabix,
l_cstr(4).
REFRESH l_intern.
CALL FUNCTION ‘ALSM_EXCEL_TO_INTERNAL_TABLE’
EXPORTING
filename = p_pfile
i_begin_col = ‘1’ "开始列
i_begin_row = ‘2’ "开始行
i_end_col = ‘9’ "结束列
i_end_row = ‘9999’ "结束行
-
I_END_ROW = '100000' "结束行
-
I_SHEET_NO =
TABLES
intern = l_intern
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ‘导入数据文件失败!’ TYPE ‘S’.
STOP.
ENDIF.SORT l_intern BY row col.
CLEAR:gt_alv[],gs_alv.
LOOP AT l_intern.
ASSIGN COMPONENT l_intern-col OF STRUCTURE itfile TO .
"动态方法将值传到相应的内表
= l_intern-value.AT END OF row.
MOVE-CORRESPONDING itfile TO gs_alv.APPEND gs_alv TO gt_alv. CLEAR: gs_alv,itfile.
ENDAT.
ENDLOOP.
ENDFORM.
&---------------------------------------------------------------------
*& Form check_data
&---------------------------------------------------------------------
*& text
&---------------------------------------------------------------------
*& --> p1 text
*& <-- p2 text
&---------------------------------------------------------------------
FORM check_data .
DELETE gt_alv WHERE matnr = ‘’.
CHECK gt_alv IS NOT INITIAL.
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>).
CALL FUNCTION ‘CONVERSION_EXIT_MATN1_INPUT’
EXPORTING
input = <fs_alv>-matnr
IMPORTING
output = <fs_alv>-matnr.
ENDLOOP.
SELECT
matnr,
maktx
INTO TABLE @DATA(lt_makt)
FROM makt
FOR ALL ENTRIES IN @gt_alv
WHERE matnr EQ @gt_alv-matnr
AND spras EQ @sy-langu.
SORT lt_makt BY matnr.
SELECT
matnr,
werks,
plifz
INTO TABLE @DATA(lt_marc)
FROM marc
FOR ALL ENTRIES IN @gt_alv
WHERE matnr EQ @gt_alv-matnr
AND werks EQ @gt_alv-werks.
SORT lt_marc BY matnr werks.
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv1>).
READ TABLE lt_makt INTO DATA(lw_makt) WITH KEY matnr = <fs_alv1>-matnr BINARY SEARCH.
IF sy-subrc = 0.
<fs_alv1>-maktx = lw_makt-maktx.
ENDIF.
IF <fs_alv1>-lfdat = ‘’ OR <fs_alv1>-lfdat = ‘00000000’.
READ TABLE lt_marc INTO DATA(lw_marc) WITH KEY matnr = <fs_alv1>-matnr
werks = <fs_alv1>-werks BINARY SEARCH.
IF sy-subrc = 0.
<fs_alv1>-lfdat = sy-datum + lw_marc-plifz.
ELSE.
<fs_alv1>-lfdat = sy-datum.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
&---------------------------------------------------------------------
*& Form frm_bapi
&---------------------------------------------------------------------
*& text
&---------------------------------------------------------------------
*& --> p1 text
*& <-- p2 text
&---------------------------------------------------------------------
FORM frm_bapi .
DATA:pr_number TYPE bapiebanc-preq_no. "purchase order num
DATA:lv_bnfpo TYPE eban-bnfpo.
DATA:lt_bapiebanc TYPE TABLE OF bapiebanc WITH HEADER LINE. " purchase order items
DATA:lt_return TYPE TABLE OF bapireturn WITH HEADER LINE. "return message
DATA:lv_mseg(500).
CHECK gt_alv IS NOT INITIAL.
CLEAR:pr_number,lv_bnfpo,lt_bapiebanc[],lt_return[].
LOOP AT gt_alv INTO gs_alv.
CLEAR lt_bapiebanc.
lv_bnfpo = lv_bnfpo + 10.
lt_bapiebanc-preq_item = lv_bnfpo.
lt_bapiebanc-doc_type = p_bsart.
lt_bapiebanc-preq_name = sy-uname.
lt_bapiebanc-material = gs_alv-matnr.
lt_bapiebanc-quantity = gs_alv-menge.
lt_bapiebanc-deliv_date = gs_alv-lfdat.
lt_bapiebanc-plant = gs_alv-werks.
APPEND lt_bapiebanc.
gs_alv-bnfpo = lv_bnfpo.
MODIFY gt_alv FROM gs_alv TRANSPORTING bnfpo.
ENDLOOP.
CALL FUNCTION ‘BAPI_REQUISITION_CREATE’
- EXPORTING
- SKIP_ITEMS_WITH_ERROR =
- AUTOMATIC_SOURCE = ‘X’
IMPORTING
number = pr_number
TABLES
requisition_items = lt_bapiebanc - REQUISITION_ACCOUNT_ASSIGNMENT = lt_bapiebkn
- requisition_item_text = lt_return
- REQUISITION_LIMITS =
- REQUISITION_CONTRACT_LIMITS =
- REQUISITION_SERVICES =
- REQUISITION_SRV_ACCASS_VALUES =
return = lt_return - REQUISITION_SERVICES_TEXT =
- REQUISITION_ADDRDELIVERY =
- EXTENSIONIN =
.
IF pr_number IS NOT INITIAL.
CALL FUNCTION ‘BAPI_TRANSACTION_COMMIT’
EXPORTING
wait = ‘X’.
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv2>).
<fs_alv2>-banfn = pr_number.
<fs_alv2>-incon = icon_led_green.
ENDLOOP.
ELSE.
lv_error = ‘X’.
LOOP AT lt_return WHERE type CA ‘AE’.
lv_mseg = lv_mseg && ‘/’ && lt_return-message.
ENDLOOP.
lv_mseg = ‘创建失败:’ && lv_mseg.
MESSAGE lv_mseg TYPE ‘I’.
EXIT.
ENDIF.
ENDFORM.
&---------------------------------------------------------------------
*& Form frm_show
&---------------------------------------------------------------------
*& text
&---------------------------------------------------------------------
*& --> p1 text
*& <-- p2 text
&---------------------------------------------------------------------
FORM frm_show .
CLEAR gs_layout.
gs_layout-zebra = ‘X’.
gs_layout-cwidth_opt = ‘X’.
gs_layout-sel_mode = ‘A’.
DEFINE set_fieldcat_alv.
CLEAR gs_fcat.
gs_fcat-fieldname = &1.
gs_fcat-coltext = &2.
gs_fcat-seltext = &2.
gs_fcat-ref_field = &3.
gs_fcat-ref_table = &4.
gs_fcat-outputlen = 20.
IF &1 = 'MATNR'.
gs_fcat-no_zero = 'X'.
ENDIF.
- IF &1 = ‘MENGE’.
-
gs_fcat-qfieldname = 'MEINS'.
- ENDIF.
APPEND gs_fcat TO gt_fcat.
END-OF-DEFINITION.
set_fieldcat_alv ‘INCON’ ‘图标’ ‘’ ‘’.
set_fieldcat_alv ‘BANFN’ ‘采购申请’ ‘BANFN’ ‘EBAN’.
set_fieldcat_alv ‘BNFPO’ ‘行项目’ ‘BNFPO’ ‘EBAN’.
set_fieldcat_alv ‘WERKS’ ‘工厂’ ‘WERKS’ ‘EBAN’.
set_fieldcat_alv ‘MATNR’ ‘物料代码’ ‘MATNR’ ‘MARA’.
set_fieldcat_alv ‘MAKTX’ ‘物料描述’ ‘’ ‘’.
set_fieldcat_alv ‘MENGE’ ‘数量’ ‘MENGE’ ‘EKPO’.
- set_fieldcat_alv ‘lfdat’ ‘交货日期’ ‘’ ‘’.
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY_LVC’
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fcat
-
i_callback_pf_status_set = 'PF_STATUS'
-
TABLESi_callback_user_command = 'USER_COMMAND' i_save = 'A'
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.