Non-Stock Service PO Upload (ME21N) Using BAPI
*&---------------------------------------------------------------------*
*& Report ZMM_NON_STOCK_SER_PO_UPL*&---------------------------------------------------------------------*
*& Program : ZMM_NON_STOCK_SER_PO_UPL
*& Author : King Of ABAP'r
*& Created on : 2024
*& Requested By : Functional Consultant
*& Tcode : ZPO_SERVICE_CREATE
*& Transport-No : 1234567890
*&---------------------------------------------------------------------*
REPORT zmm_non_stock_ser_po_upl.
INCLUDE zmm_non_stock_ser_po_upl_top.
INCLUDE zmm_non_stock_ser_po_upl_sel.
INCLUDE zmm_non_stock_ser_po_upl_f01.
**** Start of Selection
START-OF-SELECTION.
*** File Upload
PERFORM file_upload.
*** Split Data into Header & Item
PERFORM po_create.
*** Display Data
PERFORM display_data.
*&---------------------------------------------------------------------*
*& Include ZMM_NON_STOCK_SER_PO_UPL_TOP
*&---------------------------------------------------------------------*
TABLES: sscrfields.
TYPES:BEGIN OF ty_data,
sno TYPE i,
doc_typ TYPE esart,
vendor TYPE elifn,
incoterms1 TYPE inco1,
incoterms2 TYPE inco2,
pymnt_terms TYPE dzterm,
* currency TYPE waers,
pur_group TYPE bkgrp,
scn_no TYPE zzscnum,
zzprgm_code TYPE zdeprgm_code,
reason TYPE zldreason,
liquidate_change TYPE zdeliqtxt,
*** Item Data
po_item TYPE ebelp,
pr_no TYPE banfn,
pr_item TYPE bnfpo,
short_text TYPE txz01,
po_qty TYPE bstmg,
po_net_price TYPE bapicurext,
del_date TYPE eeind,
cntrl_code TYPE j_1bnbmco1,
tax_code TYPE mwskz,
*** Service Po
ser_line_no TYPE extrow,
ser_net_price TYPE bapigrprice,
END OF ty_data.
DATA:it_data TYPE TABLE OF ty_data,
wa_data TYPE ty_data.
*** Error Log
TYPES: BEGIN OF ty_alv,
sno TYPE i,
ebeln TYPE ekko-ebeln,
type TYPE bapi_mtype,
message TYPE bapi_msg,
END OF ty_alv.
DATA:it_alv TYPE STANDARD TABLE OF ty_alv,
wa_alv TYPE ty_alv.
*** Constant Values Declarations
CONSTANTS: lc_e TYPE char1 VALUE 'E',
lc_s TYPE char1 VALUE 'S',
lc_id TYPE char2 VALUE 'M3'.
***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_NON_STOCK_SER_PO_UPL_TOP
*&---------------------------------------------------------------------*
TABLES: sscrfields.
TYPES:BEGIN OF ty_data,
sno TYPE i,
doc_typ TYPE esart,
vendor TYPE elifn,
incoterms1 TYPE inco1,
incoterms2 TYPE inco2,
pymnt_terms TYPE dzterm,
* currency TYPE waers,
pur_group TYPE bkgrp,
scn_no TYPE zzscnum,
zzprgm_code TYPE zdeprgm_code,
reason TYPE zldreason,
liquidate_change TYPE zdeliqtxt,
*** Item Data
po_item TYPE ebelp,
pr_no TYPE banfn,
pr_item TYPE bnfpo,
short_text TYPE txz01,
po_qty TYPE bstmg,
po_net_price TYPE bapicurext,
del_date TYPE eeind,
cntrl_code TYPE j_1bnbmco1,
tax_code TYPE mwskz,
*** Service Po
ser_line_no TYPE extrow,
ser_net_price TYPE bapigrprice,
END OF ty_data.
DATA:it_data TYPE TABLE OF ty_data,
wa_data TYPE ty_data.
*** Error Log
TYPES: BEGIN OF ty_alv,
sno TYPE i,
ebeln TYPE ekko-ebeln,
type TYPE bapi_mtype,
message TYPE bapi_msg,
END OF ty_alv.
DATA:it_alv TYPE STANDARD TABLE OF ty_alv,
wa_alv TYPE ty_alv.
*** Constant Values Declarations
CONSTANTS: lc_e TYPE char1 VALUE 'E',
lc_s TYPE char1 VALUE 'S',
lc_id TYPE char2 VALUE 'M3'.
***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_NON_STOCK_SER_PO_UPL_SEL
*&---------------------------------------------------------------------*
SELECTION-SCREEN:BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-000.
PARAMETERS:p_file TYPE rlgrap-filename .
SELECTION-SCREEN:END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-001.
SELECTION-SCREEN: PUSHBUTTON 2(60) cmdgen USER-COMMAND a_gen VISIBLE LENGTH 20.
SELECTION-SCREEN END OF BLOCK b2.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
**** File F4 Functioality.
PERFORM f4_function.
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.
*& Include ZMM_NON_STOCK_SER_PO_UPL_SEL
*&---------------------------------------------------------------------*
SELECTION-SCREEN:BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-000.
PARAMETERS:p_file TYPE rlgrap-filename .
SELECTION-SCREEN:END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-001.
SELECTION-SCREEN: PUSHBUTTON 2(60) cmdgen USER-COMMAND a_gen VISIBLE LENGTH 20.
SELECTION-SCREEN END OF BLOCK b2.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
**** File F4 Functioality.
PERFORM f4_function.
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.
*&---------------------------------------------------------------------*
*& Include ZMM_NON_STOCK_SER_PO_UPL_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form f4_function
*&---------------------------------------------------------------------*
FORM f4_function .
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = sy-repid
field_name = 'P_FILE '
IMPORTING
file_name = p_file.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form file_upload
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM file_upload .
DATA:lt_raw TYPE truxs_t_text_data.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_line_header = abap_true
i_tab_raw_data = lt_raw
i_filename = p_file
TABLES
i_tab_converted_data = it_data
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE 'No Data File Uploaded' TYPE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM po_create .
DATA:lv_po_no TYPE bapimepoheader-po_number.
DATA:lv_ebelp TYPE ebelp.
DATA:wa_pohead TYPE bapimepoheader,
wa_poheadx TYPE bapimepoheaderx.
DATA:it_poitem TYPE TABLE OF bapimepoitem,
wa_poitem TYPE bapimepoitem.
DATA:it_poitemx TYPE TABLE OF bapimepoitemx,
wa_poitemx TYPE bapimepoitemx.
DATA:it_poschl TYPE TABLE OF bapimeposchedule,
wa_poschl TYPE bapimeposchedule.
DATA:it_poschlx TYPE TABLE OF bapimeposchedulx,
wa_poschlx TYPE bapimeposchedulx.
DATA:it_poaccunt TYPE TABLE OF bapimepoaccount,
wa_poaccnt TYPE bapimepoaccount.
DATA:it_poaccuntx TYPE TABLE OF bapimepoaccountx,
wa_poaccntx TYPE bapimepoaccountx.
DATA:it_poservices TYPE TABLE OF bapiesllc,
wa_poservices TYPE bapiesllc.
DATA:it_poservalue TYPE TABLE OF bapiesklc,
wa_poservalue TYPE bapiesklc.
DATA:it_return TYPE TABLE OF bapiret2,
wa_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_pack TYPE packno.
DATA:lv_line_no TYPE introw.
DATA(it_ser) = it_data.
SORT it_ser BY po_item.
SORT it_data BY sno.
DELETE it_data WHERE pr_no IS INITIAL.
LOOP AT it_data INTO DATA(ls_data).
wa_data = ls_data.
wa_data-pr_no = |{ wa_data-pr_no ALPHA = IN }|.
SELECT SINGLE * FROM eban INTO @DATA(ls_eban)
WHERE banfn EQ @wa_data-pr_no
AND bnfpo EQ @wa_data-pr_item.
*** Filling Header data
AT NEW sno.
wa_pohead-doc_type = wa_data-doc_typ.
wa_pohead-vendor = |{ wa_data-vendor ALPHA = IN }|.
wa_pohead-currency = ls_eban-waers.
wa_pohead-pmnttrms = wa_data-pymnt_terms.
wa_pohead-incoterms1 = wa_data-incoterms1.
wa_pohead-incoterms2 = wa_data-incoterms2.
IF wa_data-pur_group IS NOT INITIAL.
wa_pohead-pur_group = wa_data-pur_group.
ENDIF.
**** Set Flag (Header)
wa_poheadx-doc_type = abap_true.
wa_poheadx-vendor = abap_true.
wa_poheadx-currency = abap_true.
wa_poheadx-pmnttrms = abap_true.
wa_poheadx-incoterms1 = abap_true.
wa_poheadx-incoterms2 = abap_true.
IF wa_data-pur_group IS NOT INITIAL.
wa_poheadx-pur_group = abap_true.
ENDIF.
*** Prepare the extension TABLES
bapi_te_po-po_number = lv_po_no. " Key Field
bapi_te_po-zzprgm_code = wa_data-zzprgm_code.
bapi_te_po-zzscnum = wa_data-scn_no.
bapi_te_po-zldreason = wa_data-reason.
bapi_te_po-zzliqtxt = wa_data-liquidate_change.
*** 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-zldreason = abap_true.
bapi_te_pox-zzliqtxt = 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.
ENDAT.
**** Non-Stock PO
IF ls_eban-pstyp = 0.
*** Item Data
lv_ebelp = lv_ebelp + 10.
wa_poitem-po_item = lv_ebelp.
wa_poitem-preq_no = wa_data-pr_no.
wa_poitem-preq_no = wa_data-pr_no.
wa_poitem-preq_item = wa_data-pr_item.
wa_poitem-short_text = wa_data-short_text.
wa_poitem-quantity = wa_data-po_qty.
wa_poitem-bras_nbm = wa_data-cntrl_code.
wa_poitem-tax_code = wa_data-tax_code.
wa_poitem-net_price = wa_data-po_net_price.
APPEND wa_poitem TO it_poitem.
CLEAR:wa_poitem.
*** Set Flag
wa_poitemx-po_item = lv_ebelp.
wa_poitemx-po_itemx = abap_true.
wa_poitemx-preq_no = abap_true.
wa_poitemx-preq_item = abap_true.
wa_poitemx-short_text = abap_true.
wa_poitemx-quantity = abap_true.
wa_poitemx-net_price = abap_true.
wa_poitemx-bras_nbm = abap_true.
wa_poitemx-tax_code = abap_true.
APPEND wa_poitemx TO it_poitemx.
CLEAR:wa_poitemx.
*** Delivey Date Line Item
wa_poschl-po_item = lv_ebelp.
wa_poschl-delivery_date = wa_data-del_date.
APPEND wa_poschl TO it_poschl.
CLEAR:wa_poschl.
*** Set Flag
wa_poschlx-po_item = lv_ebelp.
wa_poschlx-po_itemx = abap_true.
wa_poschlx-delivery_date = wa_data-del_date.
APPEND wa_poschlx TO it_poschlx.
CLEAR:wa_poschlx.
AT END OF sno.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = wa_pohead
poheaderx = wa_poheadx
IMPORTING
exppurchaseorder = lv_po_no
TABLES
return = it_return
poitem = it_poitem
poitemx = it_poitemx
poschedule = it_poschl
poschedulex = it_poschlx
extensionin = ext_container.
IF it_return IS NOT INITIAL.
READ TABLE it_return INTO wa_return WITH KEY type = lc_e.
IF sy-subrc = 0.
DELETE it_return WHERE type = 'W'.
LOOP AT it_return INTO wa_return.
wa_alv-sno = wa_data-sno.
wa_alv-ebeln = lv_po_no.
wa_alv-type = wa_return-type.
wa_alv-message = wa_return-message.
APPEND wa_alv TO it_alv.
CLEAR: wa_alv.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
READ TABLE it_return INTO wa_return WITH KEY type = lc_s.
IF sy-subrc = 0.
wa_alv-sno = wa_data-sno.
wa_alv-ebeln = lv_po_no.
wa_alv-type = lc_s.
wa_alv-message = wa_return-message.
APPEND wa_alv TO it_alv.
CLEAR: wa_alv.
ENDIF.
ENDIF.
CLEAR:wa_return.
CLEAR:wa_pohead,wa_poheadx,lv_po_no.
REFRESH:it_poitem,it_poitemx,it_poschl,it_poschlx,it_return.
ENDIF.
ENDAT.
***** Service Po
ELSEIF ls_eban-pstyp = 9.
*** Item Data Filling
lv_pack = lv_pack + 1.
lv_pack = |{ lv_pack ALPHA = IN }|.
lv_ebelp = lv_ebelp + 10.
wa_poitem-po_item = lv_ebelp.
wa_poitem-preq_no = |{ wa_data-pr_no ALPHA = IN }|.
wa_poitem-preq_item = wa_data-pr_item.
wa_poitem-short_text = wa_data-short_text.
wa_poitem-tax_code = wa_data-tax_code.
wa_poitem-pckg_no = lv_pack.
wa_poitem-item_cat = ls_eban-pstyp.
wa_poitem-acctasscat = ls_eban-knttp.
APPEND wa_poitem TO it_poitem.
CLEAR:wa_poitem.
*** Set Flag
wa_poitemx-po_item = lv_ebelp.
wa_poitemx-po_itemx = abap_true.
wa_poitemx-preq_no = abap_true.
wa_poitemx-preq_item = abap_true.
wa_poitemx-short_text = abap_true.
wa_poitemx-tax_code = abap_true.
wa_poitemx-pckg_no = abap_true.
wa_poitemx-item_cat = abap_true.
wa_poitemx-acctasscat = abap_true.
APPEND wa_poitemx TO it_poitemx.
CLEAR:wa_poitemx.
*** Delivey Date Line Item
wa_poschl-po_item = lv_ebelp.
wa_poschl-delivery_date = wa_data-del_date.
APPEND wa_poschl TO it_poschl.
CLEAR:wa_poschl.
*** Set Flag
wa_poschlx-po_item = lv_ebelp.
wa_poschlx-po_itemx = abap_true.
wa_poschlx-delivery_date = wa_data-del_date.
APPEND wa_poschlx TO it_poschlx.
CLEAR:wa_poschlx.
**** Account Data
SELECT SINGLE kostl INTO @DATA(lv_kostl)
FROM ebkn
WHERE banfn EQ @wa_data-pr_no.
wa_poaccnt-po_item = lv_ebelp.
wa_poaccnt-costcenter = lv_kostl.
APPEND wa_poaccnt TO it_poaccunt.
CLEAR:wa_poaccnt.
*** Set Flag
wa_poaccntx-po_item = lv_ebelp.
wa_poaccntx-po_itemx = abap_true.
wa_poaccntx-costcenter = abap_true.
APPEND wa_poaccntx TO it_poaccuntx.
CLEAR:wa_poaccntx.
**** Service Line Items Filling
ls_eban-packno = ls_eban-packno + 1.
LOOP AT it_ser INTO DATA(ls_ser) WHERE po_item = lv_ebelp.
SELECT SINGLE srvpos INTO @DATA(lv_servpo)
FROM esll WHERE packno EQ @ls_eban-packno
AND extrow EQ @ls_ser-ser_line_no.
SELECT SINGLE menge INTO @DATA(lv_menge)
FROM esll WHERE packno EQ @ls_eban-packno
AND extrow EQ @ls_ser-ser_line_no.
SELECT SINGLE meins INTO @DATA(lv_meins)
FROM esll WHERE packno EQ @ls_eban-packno
AND extrow EQ @ls_ser-ser_line_no.
lv_line_no = lv_line_no + 1.
wa_poservices-pckg_no = lv_pack.
wa_poservices-line_no = lv_line_no.
wa_poservices-subpckg_no = lv_pack + 1.
APPEND wa_poservices TO it_poservices.
CLEAR:wa_poservices.
lv_line_no = lv_line_no + 1.
wa_poservices-pckg_no = lv_pack + 1.
wa_poservices-line_no = lv_line_no.
wa_poservices-ext_line = |{ ls_ser-ser_line_no ALPHA = IN }|..
wa_poservices-service = lv_servpo.
wa_poservices-quantity = lv_menge.
wa_poservices-gr_price = wa_data-ser_net_price.
wa_poservices-base_uom = lv_meins.
APPEND wa_poservices TO it_poservices.
CLEAR:wa_poservices.
wa_poservalue-pckg_no = lv_pack + 1.
wa_poservalue-line_no = lv_line_no.
wa_poservalue-serial_no = '01'.
APPEND wa_poservalue TO it_poservalue.
CLEAR:wa_poservalue.
CLEAR:ls_ser,lv_servpo,lv_menge,lv_meins.
ENDLOOP.
AT END OF sno.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = wa_pohead
poheaderx = wa_poheadx
IMPORTING
exppurchaseorder = lv_po_no
TABLES
return = it_return
poitem = it_poitem
poitemx = it_poitemx
poschedule = it_poschl
poschedulex = it_poschlx
poaccount = it_poaccunt
poaccountx = it_poaccuntx
poservices = it_poservices
posrvaccessvalues = it_poservalue
extensionin = ext_container.
IF it_return IS NOT INITIAL.
READ TABLE it_return INTO wa_return WITH KEY type = lc_e.
IF sy-subrc = 0.
DELETE it_return WHERE type = 'W'.
LOOP AT it_return INTO wa_return.
wa_alv-sno = wa_data-sno.
wa_alv-ebeln = lv_po_no.
wa_alv-type = wa_return-type.
wa_alv-message = wa_return-message.
APPEND wa_alv TO it_alv.
CLEAR: wa_alv.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
READ TABLE it_return INTO wa_return WITH KEY type = lc_s.
IF sy-subrc = 0.
wa_alv-sno = wa_data-sno.
wa_alv-ebeln = lv_po_no.
wa_alv-type = lc_s.
wa_alv-message = wa_return-message.
APPEND wa_alv TO it_alv.
CLEAR: wa_alv.
ENDIF.
ENDIF.
CLEAR:wa_return.
CLEAR:wa_pohead,wa_poheadx,lv_po_no.
REFRESH:it_poitem,it_poitemx,it_return,
it_poschl,it_poschlx,
it_poaccunt,it_poaccuntx,
it_poservices,it_poservalue,
ext_container.
ENDIF.
ENDAT.
ENDIF.
CLEAR:wa_data,ls_data,lv_servpo,lv_kostl,lv_pack,lv_line_no.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form display_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM display_data .
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 = 'SNO'.
ls_fieldcat-tabname = 'IT_ALV'.
ls_fieldcat-seltext_m = 'Serial No.'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'EBELN'.
ls_fieldcat-tabname = 'IT_ALV'.
ls_fieldcat-seltext_m = 'PO Number'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'TYPE'.
ls_fieldcat-tabname = 'IT_ALV'.
ls_fieldcat-seltext_m = 'Status'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'MESSAGE'.
ls_fieldcat-tabname = 'IT_ALV'.
ls_fieldcat-seltext_m = 'Message'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_layout.
ls_layout-colwidth_optimize = abap_true.
ls_layout-zebra = abap_true.
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
TABLES
t_outtab = it_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 generate_template
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
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 'Sno',
1 2 0 'Doc Type',
1 3 0 'Vendor',
1 4 0 'Inco Terms',
1 5 0 'Inco Terms1',
1 6 0 'Payment Terms',
1 7 0 'Purchase Grp', "'Currency Key',
1 8 0 'SCN No.',
1 9 0 'Program Code',
1 10 0 'Reason',
1 11 0 'Liquid Damages',
1 12 0 'PO Item',
1 13 0 'PR No.',
1 14 0 'PR Item',
1 15 0 'PO Line Item Text',
1 16 0 'PO Line QTY',
1 17 0 'PO Net Price',
1 18 0 'Delivery Date',
1 19 0 'Control Code',
1 20 0 'Tax Code',
1 21 0 'Service Line Item',
1 22 0 'Service Net Price'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form err_hdl
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
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
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
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_NON_STOCK_SER_PO_UPL_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form f4_function
*&---------------------------------------------------------------------*
FORM f4_function .
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = sy-repid
field_name = 'P_FILE '
IMPORTING
file_name = p_file.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form file_upload
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM file_upload .
DATA:lt_raw TYPE truxs_t_text_data.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_line_header = abap_true
i_tab_raw_data = lt_raw
i_filename = p_file
TABLES
i_tab_converted_data = it_data
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE 'No Data File Uploaded' TYPE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM po_create .
DATA:lv_po_no TYPE bapimepoheader-po_number.
DATA:lv_ebelp TYPE ebelp.
DATA:wa_pohead TYPE bapimepoheader,
wa_poheadx TYPE bapimepoheaderx.
DATA:it_poitem TYPE TABLE OF bapimepoitem,
wa_poitem TYPE bapimepoitem.
DATA:it_poitemx TYPE TABLE OF bapimepoitemx,
wa_poitemx TYPE bapimepoitemx.
DATA:it_poschl TYPE TABLE OF bapimeposchedule,
wa_poschl TYPE bapimeposchedule.
DATA:it_poschlx TYPE TABLE OF bapimeposchedulx,
wa_poschlx TYPE bapimeposchedulx.
DATA:it_poaccunt TYPE TABLE OF bapimepoaccount,
wa_poaccnt TYPE bapimepoaccount.
DATA:it_poaccuntx TYPE TABLE OF bapimepoaccountx,
wa_poaccntx TYPE bapimepoaccountx.
DATA:it_poservices TYPE TABLE OF bapiesllc,
wa_poservices TYPE bapiesllc.
DATA:it_poservalue TYPE TABLE OF bapiesklc,
wa_poservalue TYPE bapiesklc.
DATA:it_return TYPE TABLE OF bapiret2,
wa_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_pack TYPE packno.
DATA:lv_line_no TYPE introw.
DATA(it_ser) = it_data.
SORT it_ser BY po_item.
SORT it_data BY sno.
DELETE it_data WHERE pr_no IS INITIAL.
LOOP AT it_data INTO DATA(ls_data).
wa_data = ls_data.
wa_data-pr_no = |{ wa_data-pr_no ALPHA = IN }|.
SELECT SINGLE * FROM eban INTO @DATA(ls_eban)
WHERE banfn EQ @wa_data-pr_no
AND bnfpo EQ @wa_data-pr_item.
*** Filling Header data
AT NEW sno.
wa_pohead-doc_type = wa_data-doc_typ.
wa_pohead-vendor = |{ wa_data-vendor ALPHA = IN }|.
wa_pohead-currency = ls_eban-waers.
wa_pohead-pmnttrms = wa_data-pymnt_terms.
wa_pohead-incoterms1 = wa_data-incoterms1.
wa_pohead-incoterms2 = wa_data-incoterms2.
IF wa_data-pur_group IS NOT INITIAL.
wa_pohead-pur_group = wa_data-pur_group.
ENDIF.
**** Set Flag (Header)
wa_poheadx-doc_type = abap_true.
wa_poheadx-vendor = abap_true.
wa_poheadx-currency = abap_true.
wa_poheadx-pmnttrms = abap_true.
wa_poheadx-incoterms1 = abap_true.
wa_poheadx-incoterms2 = abap_true.
IF wa_data-pur_group IS NOT INITIAL.
wa_poheadx-pur_group = abap_true.
ENDIF.
*** Prepare the extension TABLES
bapi_te_po-po_number = lv_po_no. " Key Field
bapi_te_po-zzprgm_code = wa_data-zzprgm_code.
bapi_te_po-zzscnum = wa_data-scn_no.
bapi_te_po-zldreason = wa_data-reason.
bapi_te_po-zzliqtxt = wa_data-liquidate_change.
*** 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-zldreason = abap_true.
bapi_te_pox-zzliqtxt = 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.
ENDAT.
**** Non-Stock PO
IF ls_eban-pstyp = 0.
*** Item Data
lv_ebelp = lv_ebelp + 10.
wa_poitem-po_item = lv_ebelp.
wa_poitem-preq_no = wa_data-pr_no.
wa_poitem-preq_no = wa_data-pr_no.
wa_poitem-preq_item = wa_data-pr_item.
wa_poitem-short_text = wa_data-short_text.
wa_poitem-quantity = wa_data-po_qty.
wa_poitem-bras_nbm = wa_data-cntrl_code.
wa_poitem-tax_code = wa_data-tax_code.
wa_poitem-net_price = wa_data-po_net_price.
APPEND wa_poitem TO it_poitem.
CLEAR:wa_poitem.
*** Set Flag
wa_poitemx-po_item = lv_ebelp.
wa_poitemx-po_itemx = abap_true.
wa_poitemx-preq_no = abap_true.
wa_poitemx-preq_item = abap_true.
wa_poitemx-short_text = abap_true.
wa_poitemx-quantity = abap_true.
wa_poitemx-net_price = abap_true.
wa_poitemx-bras_nbm = abap_true.
wa_poitemx-tax_code = abap_true.
APPEND wa_poitemx TO it_poitemx.
CLEAR:wa_poitemx.
*** Delivey Date Line Item
wa_poschl-po_item = lv_ebelp.
wa_poschl-delivery_date = wa_data-del_date.
APPEND wa_poschl TO it_poschl.
CLEAR:wa_poschl.
*** Set Flag
wa_poschlx-po_item = lv_ebelp.
wa_poschlx-po_itemx = abap_true.
wa_poschlx-delivery_date = wa_data-del_date.
APPEND wa_poschlx TO it_poschlx.
CLEAR:wa_poschlx.
AT END OF sno.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = wa_pohead
poheaderx = wa_poheadx
IMPORTING
exppurchaseorder = lv_po_no
TABLES
return = it_return
poitem = it_poitem
poitemx = it_poitemx
poschedule = it_poschl
poschedulex = it_poschlx
extensionin = ext_container.
IF it_return IS NOT INITIAL.
READ TABLE it_return INTO wa_return WITH KEY type = lc_e.
IF sy-subrc = 0.
DELETE it_return WHERE type = 'W'.
LOOP AT it_return INTO wa_return.
wa_alv-sno = wa_data-sno.
wa_alv-ebeln = lv_po_no.
wa_alv-type = wa_return-type.
wa_alv-message = wa_return-message.
APPEND wa_alv TO it_alv.
CLEAR: wa_alv.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
READ TABLE it_return INTO wa_return WITH KEY type = lc_s.
IF sy-subrc = 0.
wa_alv-sno = wa_data-sno.
wa_alv-ebeln = lv_po_no.
wa_alv-type = lc_s.
wa_alv-message = wa_return-message.
APPEND wa_alv TO it_alv.
CLEAR: wa_alv.
ENDIF.
ENDIF.
CLEAR:wa_return.
CLEAR:wa_pohead,wa_poheadx,lv_po_no.
REFRESH:it_poitem,it_poitemx,it_poschl,it_poschlx,it_return.
ENDIF.
ENDAT.
***** Service Po
ELSEIF ls_eban-pstyp = 9.
*** Item Data Filling
lv_pack = lv_pack + 1.
lv_pack = |{ lv_pack ALPHA = IN }|.
lv_ebelp = lv_ebelp + 10.
wa_poitem-po_item = lv_ebelp.
wa_poitem-preq_no = |{ wa_data-pr_no ALPHA = IN }|.
wa_poitem-preq_item = wa_data-pr_item.
wa_poitem-short_text = wa_data-short_text.
wa_poitem-tax_code = wa_data-tax_code.
wa_poitem-pckg_no = lv_pack.
wa_poitem-item_cat = ls_eban-pstyp.
wa_poitem-acctasscat = ls_eban-knttp.
APPEND wa_poitem TO it_poitem.
CLEAR:wa_poitem.
*** Set Flag
wa_poitemx-po_item = lv_ebelp.
wa_poitemx-po_itemx = abap_true.
wa_poitemx-preq_no = abap_true.
wa_poitemx-preq_item = abap_true.
wa_poitemx-short_text = abap_true.
wa_poitemx-tax_code = abap_true.
wa_poitemx-pckg_no = abap_true.
wa_poitemx-item_cat = abap_true.
wa_poitemx-acctasscat = abap_true.
APPEND wa_poitemx TO it_poitemx.
CLEAR:wa_poitemx.
*** Delivey Date Line Item
wa_poschl-po_item = lv_ebelp.
wa_poschl-delivery_date = wa_data-del_date.
APPEND wa_poschl TO it_poschl.
CLEAR:wa_poschl.
*** Set Flag
wa_poschlx-po_item = lv_ebelp.
wa_poschlx-po_itemx = abap_true.
wa_poschlx-delivery_date = wa_data-del_date.
APPEND wa_poschlx TO it_poschlx.
CLEAR:wa_poschlx.
**** Account Data
SELECT SINGLE kostl INTO @DATA(lv_kostl)
FROM ebkn
WHERE banfn EQ @wa_data-pr_no.
wa_poaccnt-po_item = lv_ebelp.
wa_poaccnt-costcenter = lv_kostl.
APPEND wa_poaccnt TO it_poaccunt.
CLEAR:wa_poaccnt.
*** Set Flag
wa_poaccntx-po_item = lv_ebelp.
wa_poaccntx-po_itemx = abap_true.
wa_poaccntx-costcenter = abap_true.
APPEND wa_poaccntx TO it_poaccuntx.
CLEAR:wa_poaccntx.
**** Service Line Items Filling
ls_eban-packno = ls_eban-packno + 1.
LOOP AT it_ser INTO DATA(ls_ser) WHERE po_item = lv_ebelp.
SELECT SINGLE srvpos INTO @DATA(lv_servpo)
FROM esll WHERE packno EQ @ls_eban-packno
AND extrow EQ @ls_ser-ser_line_no.
SELECT SINGLE menge INTO @DATA(lv_menge)
FROM esll WHERE packno EQ @ls_eban-packno
AND extrow EQ @ls_ser-ser_line_no.
SELECT SINGLE meins INTO @DATA(lv_meins)
FROM esll WHERE packno EQ @ls_eban-packno
AND extrow EQ @ls_ser-ser_line_no.
lv_line_no = lv_line_no + 1.
wa_poservices-pckg_no = lv_pack.
wa_poservices-line_no = lv_line_no.
wa_poservices-subpckg_no = lv_pack + 1.
APPEND wa_poservices TO it_poservices.
CLEAR:wa_poservices.
lv_line_no = lv_line_no + 1.
wa_poservices-pckg_no = lv_pack + 1.
wa_poservices-line_no = lv_line_no.
wa_poservices-ext_line = |{ ls_ser-ser_line_no ALPHA = IN }|..
wa_poservices-service = lv_servpo.
wa_poservices-quantity = lv_menge.
wa_poservices-gr_price = wa_data-ser_net_price.
wa_poservices-base_uom = lv_meins.
APPEND wa_poservices TO it_poservices.
CLEAR:wa_poservices.
wa_poservalue-pckg_no = lv_pack + 1.
wa_poservalue-line_no = lv_line_no.
wa_poservalue-serial_no = '01'.
APPEND wa_poservalue TO it_poservalue.
CLEAR:wa_poservalue.
CLEAR:ls_ser,lv_servpo,lv_menge,lv_meins.
ENDLOOP.
AT END OF sno.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = wa_pohead
poheaderx = wa_poheadx
IMPORTING
exppurchaseorder = lv_po_no
TABLES
return = it_return
poitem = it_poitem
poitemx = it_poitemx
poschedule = it_poschl
poschedulex = it_poschlx
poaccount = it_poaccunt
poaccountx = it_poaccuntx
poservices = it_poservices
posrvaccessvalues = it_poservalue
extensionin = ext_container.
IF it_return IS NOT INITIAL.
READ TABLE it_return INTO wa_return WITH KEY type = lc_e.
IF sy-subrc = 0.
DELETE it_return WHERE type = 'W'.
LOOP AT it_return INTO wa_return.
wa_alv-sno = wa_data-sno.
wa_alv-ebeln = lv_po_no.
wa_alv-type = wa_return-type.
wa_alv-message = wa_return-message.
APPEND wa_alv TO it_alv.
CLEAR: wa_alv.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
READ TABLE it_return INTO wa_return WITH KEY type = lc_s.
IF sy-subrc = 0.
wa_alv-sno = wa_data-sno.
wa_alv-ebeln = lv_po_no.
wa_alv-type = lc_s.
wa_alv-message = wa_return-message.
APPEND wa_alv TO it_alv.
CLEAR: wa_alv.
ENDIF.
ENDIF.
CLEAR:wa_return.
CLEAR:wa_pohead,wa_poheadx,lv_po_no.
REFRESH:it_poitem,it_poitemx,it_return,
it_poschl,it_poschlx,
it_poaccunt,it_poaccuntx,
it_poservices,it_poservalue,
ext_container.
ENDIF.
ENDAT.
ENDIF.
CLEAR:wa_data,ls_data,lv_servpo,lv_kostl,lv_pack,lv_line_no.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form display_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM display_data .
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 = 'SNO'.
ls_fieldcat-tabname = 'IT_ALV'.
ls_fieldcat-seltext_m = 'Serial No.'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'EBELN'.
ls_fieldcat-tabname = 'IT_ALV'.
ls_fieldcat-seltext_m = 'PO Number'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'TYPE'.
ls_fieldcat-tabname = 'IT_ALV'.
ls_fieldcat-seltext_m = 'Status'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'MESSAGE'.
ls_fieldcat-tabname = 'IT_ALV'.
ls_fieldcat-seltext_m = 'Message'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_layout.
ls_layout-colwidth_optimize = abap_true.
ls_layout-zebra = abap_true.
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
TABLES
t_outtab = it_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 generate_template
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
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 'Sno',
1 2 0 'Doc Type',
1 3 0 'Vendor',
1 4 0 'Inco Terms',
1 5 0 'Inco Terms1',
1 6 0 'Payment Terms',
1 7 0 'Purchase Grp', "'Currency Key',
1 8 0 'SCN No.',
1 9 0 'Program Code',
1 10 0 'Reason',
1 11 0 'Liquid Damages',
1 12 0 'PO Item',
1 13 0 'PR No.',
1 14 0 'PR Item',
1 15 0 'PO Line Item Text',
1 16 0 'PO Line QTY',
1 17 0 'PO Net Price',
1 18 0 'Delivery Date',
1 19 0 'Control Code',
1 20 0 'Tax Code',
1 21 0 'Service Line Item',
1 22 0 'Service Net Price'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form err_hdl
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
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
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
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.
Comments
Post a Comment