AUTO PO CREATION with Extension (Custom Fields ) (ME21N) Using BAPI
*&---------------------------------------------------------------------*
*& Report ZMM_AUTO_PO_CREATE*&---------------------------------------------------------------------*
************************************************************************
* Program : ZMM_AUTO_PO_CREATE
* Author : King Of ABAP'r
* Created on : 2022
* Requested By :
* Transport-No : 1234567890
*----------------------------------------------------------------------*
* Description : Cutover Object
* Assumption :
* Called from :
* Called to : N/A
* Includes : N/A
* Logical DB : N/A
*----------------------------------------------------------------------*
REPORT zmm_auto_po_create.
INCLUDE zmm_auto_po_create_top.
INCLUDE zmm_auto_po_create_sel.
INCLUDE zmm_auto_po_create_f01.
START-OF-SELECTION.
* Get File Data
PERFORM get_file_data.
* Process The Data
PERFORM process_data.
* Create Purchase Order
PERFORM creat_po.
* Display Error/Success Log
PERFORM display_log.
*&---------------------------------------------------------------------*
*& Include ZMM_AUTO_PO_CREATE_TOP
*&---------------------------------------------------------------------*
tables: sscrfields.
TYPES : BEGIN OF ty_file,
sno(4) TYPE c, "serial Number
doc_type(4) TYPE c, "ekko-bsart, "Purchasing Document Type
vendor(10) TYPE c, "ekko-lifnr, "Vendor's account number
inco1(30) TYPE c, "ekko-inco1, "Incoterms (Part 1)
inco2(30) TYPE c, "ekko-inco2, "Incoterms (Part 2)
pay_term(4) TYPE c, "ekko-zterm, "Terms of payment key
* currency(5) TYPE c, "ekko-WAERS, " Currency key
currency(3) TYPE c, "ekko-WAERS, " Currency key
pur_org(4) TYPE c, "ekko-ekorg, "Purchasing organization
pur_grp(4) TYPE c, "ekko-ekgrp, "Purchasing Group
comp_code(4) TYPE c, "ekko-bukrs, "Company Code
scn_no(20) TYPE c, "ekko-zzscnum, "SCN Number
prgm_code(5) TYPE c, "ekko-zzprgm_code, "Program Code in PO
text(12) TYPE c, "ekko-ihrez, "Your Reference text
liqtxt(1) TYPE c, " Liquid Text Indicator for PO
reason(25) TYPE c, "Liquid damages reason
po_item(5) TYPE c, "PO Item Number
pr_item(10) TYPE c, "Purchase Requisition Number
item_no(5) TYPE n, "Item Number of Purchasing Document
* material(18) TYPE c, "Material Number
material(40) TYPE c, "Material Number
qnty TYPE bstmg, "Purchase Order Quantity
del_date(10) TYPE c, "Delivery Date
net_price(13) TYPE c, "Net Price in Purchasing Document
price_unit(5) TYPE c, "Price unit
uom(3) TYPE c, "ekpo-meins,
tax_code(2) TYPE c, "ekpo-mwskz, "Tax on sales/purchases code
value_type(10) TYPE c, "ekpo-bwtar, "Valuation Type
plant(4) TYPE c, "ekpo-werks " Plant
storage_loc(4) TYPE c, "ekpo-lgort, " Storage location
free_ind TYPE c, "Free Of Cost Indicator
END OF ty_file.
*& Include ZMM_AUTO_PO_CREATE_TOP
*&---------------------------------------------------------------------*
tables: sscrfields.
TYPES : BEGIN OF ty_file,
sno(4) TYPE c, "serial Number
doc_type(4) TYPE c, "ekko-bsart, "Purchasing Document Type
vendor(10) TYPE c, "ekko-lifnr, "Vendor's account number
inco1(30) TYPE c, "ekko-inco1, "Incoterms (Part 1)
inco2(30) TYPE c, "ekko-inco2, "Incoterms (Part 2)
pay_term(4) TYPE c, "ekko-zterm, "Terms of payment key
* currency(5) TYPE c, "ekko-WAERS, " Currency key
currency(3) TYPE c, "ekko-WAERS, " Currency key
pur_org(4) TYPE c, "ekko-ekorg, "Purchasing organization
pur_grp(4) TYPE c, "ekko-ekgrp, "Purchasing Group
comp_code(4) TYPE c, "ekko-bukrs, "Company Code
scn_no(20) TYPE c, "ekko-zzscnum, "SCN Number
prgm_code(5) TYPE c, "ekko-zzprgm_code, "Program Code in PO
text(12) TYPE c, "ekko-ihrez, "Your Reference text
liqtxt(1) TYPE c, " Liquid Text Indicator for PO
reason(25) TYPE c, "Liquid damages reason
po_item(5) TYPE c, "PO Item Number
pr_item(10) TYPE c, "Purchase Requisition Number
item_no(5) TYPE n, "Item Number of Purchasing Document
* material(18) TYPE c, "Material Number
material(40) TYPE c, "Material Number
qnty TYPE bstmg, "Purchase Order Quantity
del_date(10) TYPE c, "Delivery Date
net_price(13) TYPE c, "Net Price in Purchasing Document
price_unit(5) TYPE c, "Price unit
uom(3) TYPE c, "ekpo-meins,
tax_code(2) TYPE c, "ekpo-mwskz, "Tax on sales/purchases code
value_type(10) TYPE c, "ekpo-bwtar, "Valuation Type
plant(4) TYPE c, "ekpo-werks " Plant
storage_loc(4) TYPE c, "ekpo-lgort, " Storage location
free_ind TYPE c, "Free Of Cost Indicator
END OF ty_file.
TYPES: BEGIN OF ty_header,
sno(4) TYPE c, "serial Number
ebeln TYPE ebeln,
bsart TYPE bsart,
lifnr TYPE elifn,
inco1(30) TYPE c,
inco2(30) TYPE c,
zterm TYPE dzterm,
waers TYPE waers,
ekorg TYPE ekorg,
ekgrp TYPE ekgrp,
burks TYPE bukrs,
zzscnum TYPE zzscnum,
zzprgm_code TYPE zdeprgm_code,
ihrez TYPE ihrez,
zzliqtxt TYPE zdeliqtxt,
zldreason TYPE zldreason,
END OF ty_header.
TYPES: BEGIN OF ty_item,
sno(4) TYPE c, "serial Number
ebeln TYPE ebeln,
ebelp TYPE ebelp,
bnfpo TYPE bnfpo,
* matnr(18) TYPE c, "matnr,
matnr(40) TYPE c, ""so
menge TYPE bstmg,
meins TYPE bstme,
bprme TYPE bbprm,
netpr TYPE bprei,
mwskz TYPE mwskz,
bwtar TYPE bwtar_d,
eindt(10) TYPE c, "eindt,
werks TYPE ewerk,
lgort TYPE lgort_d,
free_ind TYPE umson,
END OF ty_item.
TYPES: BEGIN OF ty_alv,
ebeln TYPE ebeln,
type TYPE bapi_mtype,
message TYPE bapi_msg,
END OF ty_alv.
DATA: gt_data TYPE STANDARD TABLE OF ty_file,
gs_data TYPE ty_file,
gt_header TYPE STANDARD TABLE OF ty_header,
gs_header TYPE ty_header,
gt_item TYPE STANDARD TABLE OF ty_item,
gs_item TYPE ty_item,
gt_alv TYPE STANDARD TABLE OF ty_alv,
gs_alv TYPE ty_alv.
DATA: lv_ebelp TYPE ebelp.
DATA: lv_bnfpo TYPE bnfpo.
***Excel File Dowload Button
DATA: h_excel TYPE ole2_object, " Excel object
h_mapl TYPE ole2_object, " list of workbooks
h_map TYPE ole2_object, " workbook
h_zl TYPE ole2_object, " cell
h_f TYPE ole2_object. " font
*&---------------------------------------------------------------------*
*& Include ZMM_AUTO_PO_CREATE_SEL
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS:p_file LIKE rlgrap-filename OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-003.
PARAMETERS: P_CHECK AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-004.
SELECTION-SCREEN: PUSHBUTTON 2(60) cmdgen USER-COMMAND a_gen VISIBLE LENGTH 20.
SELECTION-SCREEN END OF BLOCK b3.
INITIALIZATION.
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = icon_xxl
text = 'Generate Template'
info = 'Generate Excel File Template'
IMPORTING
result = cmdgen
EXCEPTIONS
OTHERS = 0.
AT SELECTION-SCREEN.
CASE sscrfields.
WHEN 'A_GEN'.
PERFORM generate_template.
ENDCASE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
* File Upload
PERFORM file_upload.
*& Include ZMM_AUTO_PO_CREATE_SEL
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS:p_file LIKE rlgrap-filename OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-003.
PARAMETERS: P_CHECK AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-004.
SELECTION-SCREEN: PUSHBUTTON 2(60) cmdgen USER-COMMAND a_gen VISIBLE LENGTH 20.
SELECTION-SCREEN END OF BLOCK b3.
INITIALIZATION.
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = icon_xxl
text = 'Generate Template'
info = 'Generate Excel File Template'
IMPORTING
result = cmdgen
EXCEPTIONS
OTHERS = 0.
AT SELECTION-SCREEN.
CASE sscrfields.
WHEN 'A_GEN'.
PERFORM generate_template.
ENDCASE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
* File Upload
PERFORM file_upload.
*&---------------------------------------------------------------------*
*& Include ZMM_AUTO_PO_CREATE_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form file_upload
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM file_upload .
* F4 Functionality
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
field_name = 'P_FILE'
IMPORTING
file_name = p_file.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_file_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM get_file_data .
DATA: lt_raw TYPE truxs_t_text_data.
* Convert the XL file to Internal Table
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
* I_FIELD_SEPERATOR =
i_line_header = abap_true
i_tab_raw_data = lt_raw
i_filename = p_file
TABLES
i_tab_converted_data = gt_data
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN 1.
MESSAGE 'File Conversion Error' TYPE 'E' DISPLAY LIKE 'S'.
ENDCASE.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form process_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM process_data .
LOOP AT gt_data INTO DATA(ls_data).
gs_data = ls_data.
AT NEW sno.
gs_header-sno = gs_data-sno.
gs_header-ebeln = gs_data-pr_item.
gs_header-bsart = gs_data-doc_type.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_data-vendor
IMPORTING
output = gs_data-vendor.
gs_header-lifnr = gs_data-vendor.
gs_header-inco1 = gs_data-inco1.
gs_header-inco2 = gs_data-inco2.
gs_header-zterm = gs_data-pay_term.
gs_header-waers = gs_data-currency.
gs_header-ekorg = gs_data-pur_org.
gs_header-ekgrp = gs_data-pur_grp.
gs_header-burks = gs_data-comp_code.
gs_header-zzscnum = gs_data-scn_no.
gs_header-zzprgm_code = gs_data-prgm_code.
gs_header-ihrez = gs_data-text.
gs_header-zzliqtxt = gs_data-liqtxt.
gs_header-zldreason = gs_data-reason.
APPEND gs_header TO gt_header.
CLEAR gs_header.
ENDAT.
gs_item-sno = gs_data-sno.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_data-pr_item
IMPORTING
output = gs_data-pr_item.
gs_item-ebeln = gs_data-pr_item.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_data-po_item
IMPORTING
output = gs_data-po_item.
gs_item-ebelp = gs_data-po_item.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_data-item_no
IMPORTING
output = gs_data-item_no.
gs_item-bnfpo = gs_data-item_no.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_data-material
IMPORTING
output = gs_data-material.
gs_item-matnr = gs_data-material.
gs_item-menge = gs_data-qnty.
gs_item-eindt = gs_data-del_date.
gs_item-netpr = gs_data-net_price.
gs_item-bprme = gs_data-price_unit.
gs_item-meins = gs_data-uom.
gs_item-mwskz = gs_data-tax_code.
gs_item-bwtar = gs_data-value_type.
gs_item-werks = gs_data-plant.
gs_item-lgort = gs_data-storage_loc.
gs_item-free_ind = gs_data-free_ind.
APPEND gs_item TO gt_item.
CLEAR: gs_item , gs_data , ls_data.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form Creat_po
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM creat_po .
DATA : ls_header TYPE bapimepoheader,
ls_headerx TYPE bapimepoheaderx.
DATA : lt_item TYPE TABLE OF bapimepoitem,
lt_itemx TYPE TABLE OF bapimepoitemx,
lt_del TYPE TABLE OF bapimeposchedule,
lt_delx TYPE TABLE OF bapimeposchedulx,
ls_item TYPE bapimepoitem,
ls_itemx TYPE bapimepoitemx,
ls_del TYPE bapimeposchedule,
ls_delx TYPE bapimeposchedulx,
lt_return TYPE TABLE OF bapiret2,
ls_return TYPE bapiret2.
* Added custom fields in Bapi Extention
DATA: bapi_te_po TYPE bapi_te_mepoheader, "extension tables
bapi_te_pox TYPE bapi_te_mepoheaderx, "extension tables
ext_container TYPE TABLE OF bapiparex WITH HEADER LINE. "extension Container
DATA: lv_po_no TYPE bapimepoheader-po_number.
CONSTANTS: lc_e TYPE char1 VALUE 'E',
lc_s TYPE char1 VALUE 'S'.
* Display Header Details
SORT gt_header BY ebeln.
* SORT gt_item BY ebeln ebelp ASCENDING.
SORT gt_item BY ebelp ASCENDING.
* DELETE ADJACENT DUPLICATES FROM gt_item COMPARING ebeln ebelp.
LOOP AT gt_header INTO gs_header.
ls_header-doc_type = gs_header-bsart.
ls_header-vendor = gs_header-lifnr.
ls_header-incoterms1 = gs_header-inco1.
ls_header-incoterms2 = gs_header-inco2.
ls_header-pmnttrms = gs_header-zterm.
ls_header-currency = gs_header-waers.
ls_header-purch_org = gs_header-ekorg.
ls_header-pur_group = gs_header-ekgrp.
ls_header-comp_code = gs_header-burks.
ls_header-ref_1 = gs_header-ihrez.
* Set Flag for Header
ls_headerx-doc_type = abap_true.
ls_headerx-vendor = abap_true.
ls_headerx-incoterms1 = abap_true.
ls_headerx-incoterms2 = abap_true.
ls_headerx-pmnttrms = abap_true.
ls_headerx-currency = abap_true.
ls_headerx-purch_org = abap_true.
ls_headerx-pur_group = abap_true.
ls_headerx-comp_code = abap_true.
ls_headerx-ref_1 = abap_true.
* preepare the extension tables
bapi_te_po-po_number = lv_po_no. " Key Field
bapi_te_po-zzscnum = gs_header-zzscnum.
bapi_te_po-zzprgm_code = gs_header-zzprgm_code.
bapi_te_po-zzliqtxt = gs_header-zzliqtxt.
bapi_te_po-zldreason = gs_header-zldreason.
* Mark for fields updation
bapi_te_pox-po_number = lv_po_no. " Key Field
bapi_te_pox-zzscnum = abap_true.
bapi_te_pox-zzprgm_code = abap_true.
bapi_te_pox-zzliqtxt = abap_true.
bapi_te_pox-zldreason = abap_true.
* Prepare the extension Container
ext_container-structure = 'BAPI_TE_MEPOHEADER'.
ext_container-valuepart1 = bapi_te_po.
APPEND ext_container.
CLEAR ext_container.
* prepare the extension container
ext_container-structure = 'BAPI_TE_MEPOHEADERX'.
ext_container-valuepart1 = bapi_te_pox.
APPEND ext_container.
LOOP AT gt_item INTO gs_item WHERE sno = gs_header-sno.
lv_ebelp = lv_ebelp + 10.
ls_item-preq_no = gs_item-ebeln.
ls_item-po_item = lv_ebelp.
ls_item-preq_item = gs_item-bnfpo.
gs_item-matnr = |{ gs_item-matnr ALPHA = OUT }|.
DATA(len) = strlen( gs_item-matnr ).
IF len LT '18'.
ls_item-material = gs_item-matnr.
ls_item-material = |{ ls_item-material ALPHA = IN }| .
ls_item-material_long = ls_item-material .
ELSE.
ls_item-material_long = gs_item-matnr.
ENDIF.
ls_item-quantity = gs_item-menge.
ls_item-net_price = gs_item-netpr.
ls_item-price_unit = gs_item-bprme.
ls_item-po_unit = gs_item-meins.
ls_item-tax_code = gs_item-mwskz.
ls_item-val_type = gs_item-bwtar.
ls_item-plant = gs_item-werks.
ls_item-stge_loc = gs_item-lgort.
ls_item-free_item = gs_item-free_ind.
APPEND ls_item TO lt_item.
* Set Flag for Item
ls_itemx-preq_no = abap_true.
ls_itemx-po_item = lv_ebelp.
ls_itemx-po_itemx = abap_true.
ls_itemx-preq_item = abap_true.
ls_itemx-material = abap_true.
ls_itemx-material_long = abap_true.
ls_itemx-quantity = abap_true.
ls_itemx-net_price = abap_true.
ls_itemx-price_unit = abap_true.
ls_itemx-po_unit = abap_true.
ls_itemx-tax_code = abap_true.
ls_itemx-val_type = abap_true.
ls_itemx-plant = abap_true.
ls_itemx-stge_loc = abap_true.
ls_itemx-free_item = abap_true.
APPEND ls_itemx TO lt_itemx.
ls_del-po_item = lv_ebelp.
ls_del-preq_item = gs_item-bnfpo.
ls_del-delivery_date = gs_item-eindt.
APPEND ls_del TO lt_del.
ls_delx-po_item = lv_ebelp.
ls_delx-po_itemx = abap_true.
ls_delx-preq_item = abap_true.
ls_delx-delivery_date = abap_true.
APPEND ls_delx TO lt_delx.
CLEAR: ls_item,ls_itemx,ls_del,ls_delx.
ENDLOOP.
IF p_check IS INITIAL.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = ls_header
poheaderx = ls_headerx
no_price_from_po = abap_true
IMPORTING
exppurchaseorder = lv_po_no
TABLES
return = lt_return
extensionin = ext_container
poitem = lt_item
poitemx = lt_itemx
poschedule = lt_del
poschedulex = lt_delx.
ELSEIF p_check IS NOT INITIAL.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = ls_header
poheaderx = ls_headerx
* memory_uncomplete = 'X'
memory_complete = abap_true "'X'
no_price_from_po = abap_true
IMPORTING
exppurchaseorder = lv_po_no
TABLES
return = lt_return
extensionin = ext_container
poitem = lt_item
poitemx = lt_itemx
poschedule = lt_del
poschedulex = lt_delx.
ENDIF.
READ TABLE lt_return INTO ls_return WITH KEY type = lc_e.
IF sy-subrc = 0.
LOOP AT lt_return INTO ls_return.
gs_alv-ebeln = lv_po_no.
gs_alv-type = ls_return-type.
gs_alv-message = ls_return-message.
APPEND gs_alv TO gt_alv.
CLEAR gs_alv.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
IF p_check IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
gs_alv-ebeln = lv_po_no.
gs_alv-type = lc_s.
gs_alv-message = TEXT-002.
APPEND gs_alv TO gt_alv.
CLEAR gs_alv.
ELSEIF p_check IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
data: PO_no type string.
PO_NO = |'PO document on Hold' { lv_po_no }|.
gs_alv-ebeln = lv_po_no.
gs_alv-type = lc_s.
gs_alv-message = PO_NO. "TEXT-005.
APPEND gs_alv TO gt_alv.
CLEAR gs_alv.
ENDIF.
ENDIF.
CLEAR: ls_header, ls_headerx, lt_item,lt_itemx,lt_del,lt_delx,lv_ebelp.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form Display_log
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM display_log .
TYPE-POOLS:
slis.
DATA:
ls_fieldcat TYPE slis_fieldcat_alv,
ls_layout TYPE slis_layout_alv.
DATA:
lt_fieldcat TYPE slis_t_fieldcat_alv.
DATA:
lv_program TYPE sy-repid.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'EBELN'.
ls_fieldcat-tabname = 'GT_ALV'.
ls_fieldcat-seltext_m = 'Po Number'.
ls_fieldcat-hotspot = abap_true.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'TYPE'.
ls_fieldcat-tabname = 'GT_ALV'.
ls_fieldcat-seltext_m = 'STATUS'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'MESSAGE'.
ls_fieldcat-tabname = 'GT_ALV'.
ls_fieldcat-seltext_m = 'Message'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_layout.
ls_layout-colwidth_optimize = 'X'.
ls_layout-zebra = 'X'.
lv_program = sy-repid.
* Display The Final Display
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = lv_program
is_layout = ls_layout
it_fieldcat = lt_fieldcat
i_callback_user_command = 'USER_CMD'
TABLES
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
FORM user_cmd USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
SET PARAMETER ID 'BES' FIELD rs_selfield-value.
CALL TRANSACTION 'ME23N'.
ENDFORM.
FORM generate_template .
* start Excel
CREATE OBJECT h_excel 'EXCEL.APPLICATION'.
SET PROPERTY OF h_excel 'Visible' = 1.
* get list of workbooks, initially empty
CALL METHOD OF
h_excel
'Workbooks' = h_mapl.
*** Error handle File
PERFORM err_hdl.
* add a new workbook
CALL METHOD OF
h_mapl
'Add' = h_map.
*** Error handle File
PERFORM err_hdl.
PERFORM fill_cell USING: 1 1 0 'Serial Number',
1 2 0 'Purchasing Document Type',
1 3 0 'Vendor Account Number',
1 4 0 'Incoterms (Part 1)',
1 5 0 'Incoterms (Part 2)',
1 6 0 'Terms of payment key',
1 7 0 'Currency key',
1 8 0 'Purchasing Organization',
1 9 0 'Purchasing Group',
1 10 0 'Company Code',
1 11 0 'SCN Number',
1 12 0 'Program Code in PO',
1 13 0 'Reference text',
1 14 0 'Liquid Text Indicator for PO',
1 15 0 'Liquid damages reason',
1 16 0 'PO Item Number',
1 17 0 'PR Number',
1 18 0 'PR Item Number ',
1 19 0 'Material Number',
1 20 0 'PO Quantity',
1 21 0 'Delivery Date',
1 22 0 'Net Price',
1 23 0 'Price Unit',
1 24 0 'PO UOM',
1 25 0 'Tax code',
1 26 0 'Valuation Type',
1 27 0 'Plant',
1 28 0 'Storage Location',
1 29 0 'Free Of Cost Indicator'.
ENDFORM.
FORM err_hdl .
IF sy-subrc <> 0.
CALL METHOD OF
h_excel
'QUIT'.
FREE OBJECT h_excel.
h_excel-handle = -1.
MESSAGE: 'Failed to generate template.' TYPE 'E'.
ENDIF.
ENDFORM.
FORM fill_cell USING i j bold val.
CALL METHOD OF
h_excel
'Cells' = h_zl
EXPORTING
#1 = i
#2 = j.
PERFORM err_hdl.
SET PROPERTY OF h_zl 'Value' = val .
PERFORM err_hdl.
GET PROPERTY OF h_zl 'Font' = h_f.
PERFORM err_hdl.
SET PROPERTY OF h_f 'Bold' = bold .
PERFORM err_hdl.
ENDFORM.
*& Include ZMM_AUTO_PO_CREATE_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form file_upload
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM file_upload .
* F4 Functionality
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
field_name = 'P_FILE'
IMPORTING
file_name = p_file.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_file_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM get_file_data .
DATA: lt_raw TYPE truxs_t_text_data.
* Convert the XL file to Internal Table
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
* I_FIELD_SEPERATOR =
i_line_header = abap_true
i_tab_raw_data = lt_raw
i_filename = p_file
TABLES
i_tab_converted_data = gt_data
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN 1.
MESSAGE 'File Conversion Error' TYPE 'E' DISPLAY LIKE 'S'.
ENDCASE.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form process_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM process_data .
LOOP AT gt_data INTO DATA(ls_data).
gs_data = ls_data.
AT NEW sno.
gs_header-sno = gs_data-sno.
gs_header-ebeln = gs_data-pr_item.
gs_header-bsart = gs_data-doc_type.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_data-vendor
IMPORTING
output = gs_data-vendor.
gs_header-lifnr = gs_data-vendor.
gs_header-inco1 = gs_data-inco1.
gs_header-inco2 = gs_data-inco2.
gs_header-zterm = gs_data-pay_term.
gs_header-waers = gs_data-currency.
gs_header-ekorg = gs_data-pur_org.
gs_header-ekgrp = gs_data-pur_grp.
gs_header-burks = gs_data-comp_code.
gs_header-zzscnum = gs_data-scn_no.
gs_header-zzprgm_code = gs_data-prgm_code.
gs_header-ihrez = gs_data-text.
gs_header-zzliqtxt = gs_data-liqtxt.
gs_header-zldreason = gs_data-reason.
APPEND gs_header TO gt_header.
CLEAR gs_header.
ENDAT.
gs_item-sno = gs_data-sno.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_data-pr_item
IMPORTING
output = gs_data-pr_item.
gs_item-ebeln = gs_data-pr_item.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_data-po_item
IMPORTING
output = gs_data-po_item.
gs_item-ebelp = gs_data-po_item.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_data-item_no
IMPORTING
output = gs_data-item_no.
gs_item-bnfpo = gs_data-item_no.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_data-material
IMPORTING
output = gs_data-material.
gs_item-matnr = gs_data-material.
gs_item-menge = gs_data-qnty.
gs_item-eindt = gs_data-del_date.
gs_item-netpr = gs_data-net_price.
gs_item-bprme = gs_data-price_unit.
gs_item-meins = gs_data-uom.
gs_item-mwskz = gs_data-tax_code.
gs_item-bwtar = gs_data-value_type.
gs_item-werks = gs_data-plant.
gs_item-lgort = gs_data-storage_loc.
gs_item-free_ind = gs_data-free_ind.
APPEND gs_item TO gt_item.
CLEAR: gs_item , gs_data , ls_data.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form Creat_po
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM creat_po .
DATA : ls_header TYPE bapimepoheader,
ls_headerx TYPE bapimepoheaderx.
DATA : lt_item TYPE TABLE OF bapimepoitem,
lt_itemx TYPE TABLE OF bapimepoitemx,
lt_del TYPE TABLE OF bapimeposchedule,
lt_delx TYPE TABLE OF bapimeposchedulx,
ls_item TYPE bapimepoitem,
ls_itemx TYPE bapimepoitemx,
ls_del TYPE bapimeposchedule,
ls_delx TYPE bapimeposchedulx,
lt_return TYPE TABLE OF bapiret2,
ls_return TYPE bapiret2.
* Added custom fields in Bapi Extention
DATA: bapi_te_po TYPE bapi_te_mepoheader, "extension tables
bapi_te_pox TYPE bapi_te_mepoheaderx, "extension tables
ext_container TYPE TABLE OF bapiparex WITH HEADER LINE. "extension Container
DATA: lv_po_no TYPE bapimepoheader-po_number.
CONSTANTS: lc_e TYPE char1 VALUE 'E',
lc_s TYPE char1 VALUE 'S'.
* Display Header Details
SORT gt_header BY ebeln.
* SORT gt_item BY ebeln ebelp ASCENDING.
SORT gt_item BY ebelp ASCENDING.
* DELETE ADJACENT DUPLICATES FROM gt_item COMPARING ebeln ebelp.
LOOP AT gt_header INTO gs_header.
ls_header-doc_type = gs_header-bsart.
ls_header-vendor = gs_header-lifnr.
ls_header-incoterms1 = gs_header-inco1.
ls_header-incoterms2 = gs_header-inco2.
ls_header-pmnttrms = gs_header-zterm.
ls_header-currency = gs_header-waers.
ls_header-purch_org = gs_header-ekorg.
ls_header-pur_group = gs_header-ekgrp.
ls_header-comp_code = gs_header-burks.
ls_header-ref_1 = gs_header-ihrez.
* Set Flag for Header
ls_headerx-doc_type = abap_true.
ls_headerx-vendor = abap_true.
ls_headerx-incoterms1 = abap_true.
ls_headerx-incoterms2 = abap_true.
ls_headerx-pmnttrms = abap_true.
ls_headerx-currency = abap_true.
ls_headerx-purch_org = abap_true.
ls_headerx-pur_group = abap_true.
ls_headerx-comp_code = abap_true.
ls_headerx-ref_1 = abap_true.
* preepare the extension tables
bapi_te_po-po_number = lv_po_no. " Key Field
bapi_te_po-zzscnum = gs_header-zzscnum.
bapi_te_po-zzprgm_code = gs_header-zzprgm_code.
bapi_te_po-zzliqtxt = gs_header-zzliqtxt.
bapi_te_po-zldreason = gs_header-zldreason.
* Mark for fields updation
bapi_te_pox-po_number = lv_po_no. " Key Field
bapi_te_pox-zzscnum = abap_true.
bapi_te_pox-zzprgm_code = abap_true.
bapi_te_pox-zzliqtxt = abap_true.
bapi_te_pox-zldreason = abap_true.
* Prepare the extension Container
ext_container-structure = 'BAPI_TE_MEPOHEADER'.
ext_container-valuepart1 = bapi_te_po.
APPEND ext_container.
CLEAR ext_container.
* prepare the extension container
ext_container-structure = 'BAPI_TE_MEPOHEADERX'.
ext_container-valuepart1 = bapi_te_pox.
APPEND ext_container.
LOOP AT gt_item INTO gs_item WHERE sno = gs_header-sno.
lv_ebelp = lv_ebelp + 10.
ls_item-preq_no = gs_item-ebeln.
ls_item-po_item = lv_ebelp.
ls_item-preq_item = gs_item-bnfpo.
gs_item-matnr = |{ gs_item-matnr ALPHA = OUT }|.
DATA(len) = strlen( gs_item-matnr ).
IF len LT '18'.
ls_item-material = gs_item-matnr.
ls_item-material = |{ ls_item-material ALPHA = IN }| .
ls_item-material_long = ls_item-material .
ELSE.
ls_item-material_long = gs_item-matnr.
ENDIF.
ls_item-quantity = gs_item-menge.
ls_item-net_price = gs_item-netpr.
ls_item-price_unit = gs_item-bprme.
ls_item-po_unit = gs_item-meins.
ls_item-tax_code = gs_item-mwskz.
ls_item-val_type = gs_item-bwtar.
ls_item-plant = gs_item-werks.
ls_item-stge_loc = gs_item-lgort.
ls_item-free_item = gs_item-free_ind.
APPEND ls_item TO lt_item.
* Set Flag for Item
ls_itemx-preq_no = abap_true.
ls_itemx-po_item = lv_ebelp.
ls_itemx-po_itemx = abap_true.
ls_itemx-preq_item = abap_true.
ls_itemx-material = abap_true.
ls_itemx-material_long = abap_true.
ls_itemx-quantity = abap_true.
ls_itemx-net_price = abap_true.
ls_itemx-price_unit = abap_true.
ls_itemx-po_unit = abap_true.
ls_itemx-tax_code = abap_true.
ls_itemx-val_type = abap_true.
ls_itemx-plant = abap_true.
ls_itemx-stge_loc = abap_true.
ls_itemx-free_item = abap_true.
APPEND ls_itemx TO lt_itemx.
ls_del-po_item = lv_ebelp.
ls_del-preq_item = gs_item-bnfpo.
ls_del-delivery_date = gs_item-eindt.
APPEND ls_del TO lt_del.
ls_delx-po_item = lv_ebelp.
ls_delx-po_itemx = abap_true.
ls_delx-preq_item = abap_true.
ls_delx-delivery_date = abap_true.
APPEND ls_delx TO lt_delx.
CLEAR: ls_item,ls_itemx,ls_del,ls_delx.
ENDLOOP.
IF p_check IS INITIAL.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = ls_header
poheaderx = ls_headerx
no_price_from_po = abap_true
IMPORTING
exppurchaseorder = lv_po_no
TABLES
return = lt_return
extensionin = ext_container
poitem = lt_item
poitemx = lt_itemx
poschedule = lt_del
poschedulex = lt_delx.
ELSEIF p_check IS NOT INITIAL.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = ls_header
poheaderx = ls_headerx
* memory_uncomplete = 'X'
memory_complete = abap_true "'X'
no_price_from_po = abap_true
IMPORTING
exppurchaseorder = lv_po_no
TABLES
return = lt_return
extensionin = ext_container
poitem = lt_item
poitemx = lt_itemx
poschedule = lt_del
poschedulex = lt_delx.
ENDIF.
READ TABLE lt_return INTO ls_return WITH KEY type = lc_e.
IF sy-subrc = 0.
LOOP AT lt_return INTO ls_return.
gs_alv-ebeln = lv_po_no.
gs_alv-type = ls_return-type.
gs_alv-message = ls_return-message.
APPEND gs_alv TO gt_alv.
CLEAR gs_alv.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
IF p_check IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
gs_alv-ebeln = lv_po_no.
gs_alv-type = lc_s.
gs_alv-message = TEXT-002.
APPEND gs_alv TO gt_alv.
CLEAR gs_alv.
ELSEIF p_check IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
data: PO_no type string.
PO_NO = |'PO document on Hold' { lv_po_no }|.
gs_alv-ebeln = lv_po_no.
gs_alv-type = lc_s.
gs_alv-message = PO_NO. "TEXT-005.
APPEND gs_alv TO gt_alv.
CLEAR gs_alv.
ENDIF.
ENDIF.
CLEAR: ls_header, ls_headerx, lt_item,lt_itemx,lt_del,lt_delx,lv_ebelp.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form Display_log
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM display_log .
TYPE-POOLS:
slis.
DATA:
ls_fieldcat TYPE slis_fieldcat_alv,
ls_layout TYPE slis_layout_alv.
DATA:
lt_fieldcat TYPE slis_t_fieldcat_alv.
DATA:
lv_program TYPE sy-repid.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'EBELN'.
ls_fieldcat-tabname = 'GT_ALV'.
ls_fieldcat-seltext_m = 'Po Number'.
ls_fieldcat-hotspot = abap_true.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'TYPE'.
ls_fieldcat-tabname = 'GT_ALV'.
ls_fieldcat-seltext_m = 'STATUS'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'MESSAGE'.
ls_fieldcat-tabname = 'GT_ALV'.
ls_fieldcat-seltext_m = 'Message'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_layout.
ls_layout-colwidth_optimize = 'X'.
ls_layout-zebra = 'X'.
lv_program = sy-repid.
* Display The Final Display
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = lv_program
is_layout = ls_layout
it_fieldcat = lt_fieldcat
i_callback_user_command = 'USER_CMD'
TABLES
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
FORM user_cmd USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
SET PARAMETER ID 'BES' FIELD rs_selfield-value.
CALL TRANSACTION 'ME23N'.
ENDFORM.
FORM generate_template .
* start Excel
CREATE OBJECT h_excel 'EXCEL.APPLICATION'.
SET PROPERTY OF h_excel 'Visible' = 1.
* get list of workbooks, initially empty
CALL METHOD OF
h_excel
'Workbooks' = h_mapl.
*** Error handle File
PERFORM err_hdl.
* add a new workbook
CALL METHOD OF
h_mapl
'Add' = h_map.
*** Error handle File
PERFORM err_hdl.
PERFORM fill_cell USING: 1 1 0 'Serial Number',
1 2 0 'Purchasing Document Type',
1 3 0 'Vendor Account Number',
1 4 0 'Incoterms (Part 1)',
1 5 0 'Incoterms (Part 2)',
1 6 0 'Terms of payment key',
1 7 0 'Currency key',
1 8 0 'Purchasing Organization',
1 9 0 'Purchasing Group',
1 10 0 'Company Code',
1 11 0 'SCN Number',
1 12 0 'Program Code in PO',
1 13 0 'Reference text',
1 14 0 'Liquid Text Indicator for PO',
1 15 0 'Liquid damages reason',
1 16 0 'PO Item Number',
1 17 0 'PR Number',
1 18 0 'PR Item Number ',
1 19 0 'Material Number',
1 20 0 'PO Quantity',
1 21 0 'Delivery Date',
1 22 0 'Net Price',
1 23 0 'Price Unit',
1 24 0 'PO UOM',
1 25 0 'Tax code',
1 26 0 'Valuation Type',
1 27 0 'Plant',
1 28 0 'Storage Location',
1 29 0 'Free Of Cost Indicator'.
ENDFORM.
FORM err_hdl .
IF sy-subrc <> 0.
CALL METHOD OF
h_excel
'QUIT'.
FREE OBJECT h_excel.
h_excel-handle = -1.
MESSAGE: 'Failed to generate template.' TYPE 'E'.
ENDIF.
ENDFORM.
FORM fill_cell USING i j bold val.
CALL METHOD OF
h_excel
'Cells' = h_zl
EXPORTING
#1 = i
#2 = j.
PERFORM err_hdl.
SET PROPERTY OF h_zl 'Value' = val .
PERFORM err_hdl.
GET PROPERTY OF h_zl 'Font' = h_f.
PERFORM err_hdl.
SET PROPERTY OF h_f 'Bold' = bold .
PERFORM err_hdl.
ENDFORM.
Note: Custom Fields in Bapi Structure: BAPI_TE_MEPOHEADER
Comments
Post a Comment