Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

BAPI to create a Sales Contract from a flat file.

Former Member
0 Kudos

Hi,

I have a requirement where i need to create 1 Sales Contract and multiple line items from a flat file using a BAPI:

BAPI_CONTRACT_CREATEFROMDATA.

Could anyone please help as to how to go about it.. some piece of code or steps or pseudo codes would be highly appreciated.

Regards,

Riya.

4 REPLIES 4

Former Member
0 Kudos

Hi Riya

Hope this code will surely help you.

<REMOVED BY MODERATOR>

Deepanker

Check this example of creating a sales order and for creating delivery...and PGI

************SALES ORDER INPUT CREATION.

PARAMETERS: p_auart TYPE auart OBLIGATORY.

PARAMETERS: p_vkorg TYPE vkorg OBLIGATORY.

PARAMETERS: p_vtweg TYPE vtweg OBLIGATORY.

PARAMETERS: p_spart TYPE vtweg OBLIGATORY.

PARAMETERS: p_sold TYPE kunnr OBLIGATORY.

PARAMETERS: p_ship TYPE kunnr OBLIGATORY.

*ITEM

PARAMETERS: p_matnr TYPE matnr OBLIGATORY.

PARAMETERS: p_menge TYPE kwmeng OBLIGATORY.

PARAMETERS: p_plant TYPE werks_d OBLIGATORY.

PARAMETERS: p_itcat TYPE pstyv OBLIGATORY.

  • DATA DECLARATIONS.

DATA: v_vbeln LIKE vbak-vbeln.

DATA: header LIKE bapisdhead1.

DATA: headerx LIKE bapisdhead1x.

DATA: item LIKE bapisditem OCCURS 0 WITH HEADER LINE.

DATA: itemx LIKE bapisditemx OCCURS 0 WITH HEADER LINE.

DATA: partner LIKE bapipartnr OCCURS 0 WITH HEADER LINE.

DATA: return LIKE bapiret2 OCCURS 0 WITH HEADER LINE.

DATA: lt_schedules_inx TYPE STANDARD TABLE OF bapischdlx

WITH HEADER LINE.

DATA: lt_schedules_in TYPE STANDARD TABLE OF bapischdl

WITH HEADER LINE.

  • HEADER DATA

header-doc_type = p_auart.

headerx-doc_type = 'X'.

header-sales_org = p_vkorg.

headerx-sales_org = 'X'.

header-distr_chan = p_vtweg.

headerx-distr_chan = 'X'.

header-division = p_spart.

headerx-division = 'X'.

headerx-updateflag = 'I'.

  • PARTNER DATA

partner-partn_role = 'AG'.

partner-partn_numb = p_sold.

APPEND partner.

partner-partn_role = 'WE'.

partner-partn_numb = p_ship.

APPEND partner.

  • ITEM DATA

itemx-updateflag = 'I'.

item-itm_number = '000010'.

itemx-itm_number = 'X'.

item-material = p_matnr.

itemx-material = 'X'.

item-plant = p_plant.

itemx-plant = 'X'.

item-target_qty = p_menge.

itemx-target_qty = 'X'.

item-target_qu = 'EA'.

itemx-target_qu = 'X'.

item-item_categ = p_itcat.

itemx-item_categ = 'X'.

APPEND item.

APPEND itemx.

  • Fill schedule lines

lt_schedules_in-itm_number = '000010'.

lt_schedules_in-sched_line = '0001'.

lt_schedules_in-req_qty = p_menge.

APPEND lt_schedules_in.

  • Fill schedule line flags

lt_schedules_inx-itm_number = '000010'.

lt_schedules_inx-sched_line = '0001'.

lt_schedules_inx-updateflag = 'X'.

lt_schedules_inx-req_qty = 'X'.

APPEND lt_schedules_inx.

  • Call the BAPI

CALL FUNCTION 'BAPI_SALESDOCU_CREATEFROMDATA1'

EXPORTING

sales_header_in = header

sales_header_inx = headerx

IMPORTING

salesdocument_ex = v_vbeln

TABLES

return = return

sales_items_in = item

sales_items_inx = itemx

sales_schedules_in = lt_schedules_in

sales_schedules_inx = lt_schedules_inx

sales_partners = partner.

  • Check the return table.

LOOP AT return WHERE type = 'E' OR type = 'A'.

EXIT.

ENDLOOP.

IF sy-subrc = 0.

WRITE: / 'Error in creating document'.

ELSE.

COMMIT WORK AND WAIT.

WRITE: / 'Document ', v_vbeln, ' created'.

ENDIF.

************DELIVERY CREATION.

DATA: BEGIN OF t_vbap OCCURS 0,

vbeln LIKE vbap-vbeln,

posnr LIKE vbap-posnr,

zmeng LIKE vbap-kwmeng,

matnr LIKE vbap-matnr,

werks LIKE vbap-werks,

END OF t_vbap.

DATA: t_request TYPE STANDARD TABLE OF bapideliciousrequest

WITH HEADER LINE.

DATA: t_created TYPE STANDARD TABLE OF bapideliciouscreateditems

WITH HEADER LINE.

DATA: t_return TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE.

SELECT vbeln posnr zmeng matnr werks

INTO TABLE t_vbap

FROM vbap

WHERE vbeln = v_vbeln.

LOOP AT t_vbap.

t_request-document_numb = t_vbap-vbeln.

t_request-document_item = t_vbap-posnr.

t_request-quantity_sales_uom = t_vbap-zmeng.

t_request-quantity_base__uom = t_vbap-zmeng.

t_request-id = 1.

t_request-document_type = 'A'.

t_request-delivery_date = sy-datum.

t_request-material = t_vbap-matnr.

t_request-plant = t_vbap-werks.

t_request-date = sy-datum.

t_request-goods_issue_date = sy-datum.

t_request-goods_issue_time = sy-uzeit.

APPEND t_request.

ENDLOOP.

CALL FUNCTION 'BAPI_DELIVERYPROCESSING_EXEC'

TABLES

request = t_request

createditems = t_created

return = t_return.

READ TABLE t_return WITH KEY type = 'E'.

IF sy-subrc = 0.

MESSAGE e208(00) WITH 'Delivery creation error'.

ENDIF.

COMMIT WORK.

*

************Post goods issue.

READ TABLE t_created INDEX 1.

DATA: vbkok_wa TYPE vbkok.

vbkok_wa-vbeln_vl = t_created-document_numb.

vbkok_wa-wabuc = 'X'.

DATA: v_error.

CALL FUNCTION 'WS_DELIVERY_UPDATE'

EXPORTING

vbkok_wa = vbkok_wa

delivery = t_created-document_numb

IMPORTING

ef_error_in_goods_issue_0 = v_error.

COMMIT WORK.

<REMOVED BY MODERATOR>

Edited by: Alvaro Tejada Galindo on Jan 5, 2008 9:44 AM

0 Kudos

Hi Deepanker,

Thank you for the ans but, My requirement is to create CONTRACT from a FLAT FILE i.e .txt file

Kindly help.

Regards,

Riya.

0 Kudos

Riya

hope it will help you this time

<REMOVED BY MODERATOR>

REPORT ypat_salesorder_create LINE-SIZE 256.

This program will create a ZOC Sales Order with Reference to Contract

20000720 / 10. This will be done via BAPI. There are 2 BAPi calls,

BAPI_SALESORDER_CREATEFROMDAT2 and BAPI_SALESORDER_CHANGE. We need to

perform 2 BAPI calls as the BAPI to create the Sales Order does not

bring across the Pricing Conditions properly. To get around this we

create the Order with reference to the Contract, then we get the

related Pricing Conditions from the COntract and then update the newly

created Order.

*----


Constants

*----


CONSTANTS: c_contract LIKE vbak-vbeln VALUE '0020000720',

c_item LIKE vbap-posnr VALUE '000010'.

*----


Structures

*----


Structure to hold BAPI Header

DATA: st_bapisdhd1 LIKE bapisdhd1.

*----


Internal Tables

*----


Sales Order Create BAPI Return Messages

DATA: tbl_return TYPE STANDARD TABLE OF bapiret2

WITH HEADER LINE.

Sales Order BAPI Line Item

DATA: tbl_bapisditm TYPE STANDARD TABLE OF bapisditm

WITH HEADER LINE.

Sales Order BAPI Line Item

DATA: tbl_bapisditmx TYPE STANDARD TABLE OF bapisditmx

WITH HEADER LINE.

Sales Order BAPI Pricing Conditions

DATA: tbl_bapicond TYPE STANDARD TABLE OF bapicond

WITH HEADER LINE.

Sales Order BAPI Partner Functions

DATA: tbl_bapiparnr TYPE STANDARD TABLE OF bapiparnr

WITH HEADER LINE.

Sales Order BAPI Schedule Lines

DATA: tbl_bapischdl TYPE STANDARD TABLE OF bapischdl

WITH HEADER LINE.

Sales Order BAPI Schedule Lines

DATA: tbl_bapischdlx TYPE STANDARD TABLE OF bapischdlx

WITH HEADER LINE.

Sales Order BAPI Pricing Conditions

DATA: tbl_bapicondx TYPE STANDARD TABLE OF bapicondx

WITH HEADER LINE.

Customer Enhancement for VBAK, VBAP, VBEP

DATA: tbl_bapiparex TYPE STANDARD TABLE OF bapiparex

WITH HEADER LINE.

Table to hold BAPI Detail Conditions

DATA: tbl_bapisdcond TYPE STANDARD TABLE OF bapisdcond

WITH HEADER LINE.

Table to hold Return Messages from Sales Order Change BAPI

DATA: tbl_return_chg TYPE STANDARD TABLE OF bapiret2

WITH HEADER LINE.

*----


Variables

*----


DATA: g_vbeln_created LIKE vbak-vbeln,

g_valid_contract TYPE c,

g_cont_price_date TYPE d.

*----


Start of Selection

*----


START-OF-SELECTION.

PERFORM validate_contract.

PERFORM create_sales_ord.

PERFORM update_sales_ord.

*----


End of Selection

*----


END-OF-SELECTION.

PERFORM write_output_report.

*----


Subroutines

*----


&----


*& Form create_sales_ord

&----


Create the Sales Order

-


FORM create_sales_ord .

PERFORM populate_bapi_tables.

PERFORM call_create_sales_ord_bapi.

ENDFORM. " create_sales_ord

&----


*& Form populate_bapi_tables

&----


Fill up the BAPI Tables

-


FORM populate_bapi_tables .

PERFORM populate_bapi_header.

PERFORM build_bapi_partners.

PERFORM build_bapi_items.

PERFORM build_bapi_sched_lines.

ENDFORM. " populate_bapi_tables

&----


*& Form populate_bapi_header

&----


Build BAPI Header Details

-


FORM populate_bapi_header .

CLEAR st_bapisdhd1.

st_bapisdhd1-doc_type = 'ZOC'. "Order type

st_bapisdhd1-sales_org = '026'. "Sales Org

st_bapisdhd1-distr_chan = '00'. "Dist Channel

st_bapisdhd1-division = '00'. "Division

st_bapisdhd1-purch_no_c = 'Cust Po No'. "Cust PO No

st_bapisdhd1-name = 'Orderer'. "Name of Orderer

st_bapisdhd1-ord_reason = ''. "Order Reason

st_bapisdhd1-sales_off = '3001'. "Sales Office

st_bapisdhd1-sales_grp = '301'. "Market Area

IF g_valid_contract = 'X'.

st_bapisdhd1-price_date = g_cont_price_date.

ENDIF.

ENDFORM. " populate_bapi_header

&----


*& Form build_bapi_partners

&----


Build BAPI Partner Functions

-


FORM build_bapi_partners .

CLEAR tbl_bapiparnr.

tbl_bapiparnr-partn_role = 'AG'.

tbl_bapiparnr-partn_numb = '0000100750'.

APPEND tbl_bapiparnr.

CLEAR tbl_bapiparnr.

tbl_bapiparnr-partn_role = 'WE'.

tbl_bapiparnr-partn_numb = '0000504472'.

APPEND tbl_bapiparnr.

ENDFORM. " build_bapi_partners

&----


*& Form build_bapi_items

&----


Build The BAPI Line Items

-


FORM build_bapi_items .

DATA: l_matnr LIKE mara-matnr.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'

EXPORTING

input = '10000072'

IMPORTING

output = l_matnr.

CLEAR tbl_bapisditm.

tbl_bapisditm-itm_number = c_item.

IF g_valid_contract = 'X'.

tbl_bapisditm-ref_doc = c_contract.

tbl_bapisditm-ref_doc_it = c_item.

tbl_bapisditm-ref_doc_ca = 'G'. "Contract

ENDIF.

tbl_bapisditm-material = l_matnr.

tbl_bapisditm-plant = '3012'.

tbl_bapisditm-target_qty = '5.000'.

tbl_bapisditm-target_qu = 'M3'.

tbl_bapisditm-item_categ = 'ZZOC'.

tbl_bapisditm-sales_dist = '301'.

tbl_bapisditm-dlv_prio = '02'.

tbl_bapisditm-prc_group5 = '080'.

tbl_bapisditm-cust_mat35 = 'kdmat'.

tbl_bapisditm-route = 'TESYS'.

tbl_bapisditm-usage_ind = 'CIV'.

APPEND tbl_bapisditm.

CLEAR tbl_bapisditmx.

tbl_bapisditmx-itm_number = c_item.

tbl_bapisditmx-ref_doc = 'X'.

tbl_bapisditmx-ref_doc_it = 'X'.

tbl_bapisditmx-ref_doc_ca = 'X'.

tbl_bapisditmx-material = 'X'.

tbl_bapisditmx-updateflag = 'I'.

tbl_bapisditmx-plant = 'X'.

tbl_bapisditmx-target_qty = 'X'.

tbl_bapisditmx-target_qu = 'X'.

tbl_bapisditmx-item_categ = 'X'.

tbl_bapisditmx-sales_dist = 'X'.

tbl_bapisditmx-dlv_prio = 'X'.

tbl_bapisditmx-prc_group5 = 'X'.

tbl_bapisditmx-cust_mat35 = 'X'.

tbl_bapisditmx-usage_ind = 'X'.

tbl_bapisditmx-route = 'X'.

APPEND tbl_bapisditmx.

ENDFORM. " build_bapi_items

&----


*& Form build_bapi_sched_lines

&----


Build the BAPI Schedule Lines

-


FORM build_bapi_sched_lines .

CLEAR tbl_bapischdl.

tbl_bapischdl-itm_number = c_item.

tbl_bapischdl-req_qty = '1'.

tbl_bapischdl-req_date = sy-datum.

APPEND tbl_bapischdl.

ENDFORM. " build_bapi_sched_lines

&----


*& Form build_bapi_conditions

&----


Pull the BAPI Pricing Conditions from the Contract

-


FORM build_bapi_conditions .

LOOP AT tbl_bapisdcond.

CLEAR tbl_bapicond.

MOVE-CORRESPONDING tbl_bapisdcond TO tbl_bapicond.

APPEND tbl_bapicond.

CLEAR tbl_bapicondx.

tbl_bapicondx-itm_number = tbl_bapicond-itm_number.

tbl_bapicondx-cond_st_no = tbl_bapicond-cond_st_no.

tbl_bapicondx-cond_count = tbl_bapicond-cond_count.

tbl_bapicondx-cond_type = tbl_bapicond-cond_type.

tbl_bapicondx-updateflag = 'I'.

tbl_bapicondx-cond_value = 'X'.

tbl_bapicondx-currency = 'X'.

tbl_bapicondx-cond_unit = 'X'.

tbl_bapicondx-cond_p_unt = 'X'.

tbl_bapicondx-varcond = tbl_bapicond-varcond.

APPEND tbl_bapicondx.

ENDLOOP.

ENDFORM. " build_bapi_conditions

&----


*& Form call_create_sales_ord_bapi

&----


Call the Sales Order Create BAPI

-


FORM call_create_sales_ord_bapi .

CLEAR g_vbeln_created.

CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'

EXPORTING

order_header_in = st_bapisdhd1

IMPORTING

salesdocument = g_vbeln_created

TABLES

return = tbl_return

order_items_in = tbl_bapisditm

order_items_inx = tbl_bapisditmx

order_partners = tbl_bapiparnr

order_schedules_in = tbl_bapischdl.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

EXPORTING

wait = 'X'.

ENDFORM. " call_create_sales_ord_bapi

&----


*& Form update_sales_ord

&----


Update the newly created Sales Order with the Pricing Conditions

from the Contract

-


FORM update_sales_ord .

CHECK g_valid_contract EQ 'X'.

PERFORM get_contract_details.

PERFORM build_bapi_conditions.

PERFORM call_change_sales_ord_bapi.

ENDFORM. " update_sales_ord

&----


*& Form get_contract_details

&----


Get Contract Details

-


FORM get_contract_details .

Need to manually get the relevant Pricing Conditions as the BAPI

BAPISDORDER_GETDETAILEDLIST causes problems when we call the BAPI

BAPI_SALESORDER_CREATEFROMDAT2 and BAPI_SALESORDER_CHANGE (I think

this is due to the fact that these BAPIs belong to the same Function

Group and there must be some common structures that are not cleared

causing us all sorts of grief when we try and call the next BAPI)

DATA: tbl_konv TYPE STANDARD TABLE OF konv WITH HEADER LINE.

DATA: tbl_komv TYPE STANDARD TABLE OF komv WITH HEADER LINE.

DATA: tbl_vbak TYPE STANDARD TABLE OF vbak WITH HEADER LINE.

Pricing Condition Master

DATA: BEGIN OF tbl_t685a OCCURS 0,

kschl LIKE t685a-kschl,

kaend_wrt LIKE t685a-kaend_wrt,

END OF tbl_t685a.

SELECT *

INTO TABLE tbl_vbak

FROM vbak

WHERE vbeln = c_contract.

READ TABLE tbl_vbak INDEX 1.

SELECT *

INTO TABLE tbl_konv

FROM konv

WHERE knumv = tbl_vbak-knumv AND

kposn = c_item.

CHECK sy-subrc EQ 0.

We now need to make sure we only bring across the Condition Types that

are EDITABLE. If we bring across non editable conditions (such as

'ZPR1') the Change Sales Order BAPI will fail

SELECT kschl kaend_wrt

INTO TABLE tbl_t685a

FROM t685a

FOR ALL ENTRIES IN tbl_konv

WHERE kappl EQ 'V' AND "Sales

kschl EQ tbl_konv-kschl AND

kaend_wrt EQ 'X' AND "Value is Editable

kmanu NE 'D'. "Process manually

Prepare for Binary Search

SORT tbl_t685a BY kschl.

LOOP AT tbl_konv.

READ TABLE tbl_t685a WITH KEY kschl = tbl_konv-kschl BINARY SEARCH.

IF sy-subrc EQ 0.

MOVE-CORRESPONDING tbl_konv TO tbl_komv.

APPEND tbl_komv.

ENDIF.

ENDLOOP.

CHECK NOT tbl_komv[] IS INITIAL.

Map KOMV into the more BAPI friendly BAPISDCOND structure

CALL FUNCTION 'MAP_INT_TO_EXT_STRUCTURE'

TABLES

fxvbak = tbl_vbak

fxkomv = tbl_komv

fxbapikomv = tbl_bapisdcond

EXCEPTIONS

entry_missing = 1

OTHERS = 2.

ENDFORM. " get_contract_details

&----


*& Form call_change_sales_ord_bapi

&----


Call the Change Sales Order BAPI

-


FORM call_change_sales_ord_bapi .

DATA: st_head_chg LIKE bapisdh1x,

st_logic_switch TYPE bapisdls.

CHECK NOT g_vbeln_created IS INITIAL.

CHECK g_valid_contract EQ 'X'.

st_head_chg-updateflag = 'U'.

st_logic_switch-cond_handl = 'X'.

CALL FUNCTION 'BAPI_SALESORDER_CHANGE'

EXPORTING

salesdocument = g_vbeln_created

order_header_inx = st_head_chg

logic_switch = st_logic_switch

TABLES

return = tbl_return_chg

conditions_in = tbl_bapicond

conditions_inx = tbl_bapicondx.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

EXPORTING

wait = 'X'.

ENDFORM. " call_change_sales_ord_bapi

&----


*& Form write_output_report

&----


Produce Output Report

-


FORM write_output_report .

IF NOT g_vbeln_created IS INITIAL.

WRITE:/ 'Success! Sales Order', g_vbeln_created, 'was created!'.

ELSE.

WRITE:/ 'Failure! Sales Order was not created!'.

ENDIF.

SKIP.

WRITE:/ 'Sales Order Create Log'.

LOOP AT tbl_return.

WRITE:/ tbl_return-type, tbl_return-id, tbl_return-number,

tbl_return-message.

ENDLOOP.

SKIP.

WRITE:/ 'Sales Order Change Log'.

LOOP AT tbl_return_chg.

WRITE:/ tbl_return_chg-type, tbl_return_chg-id,

tbl_return_chg-number, tbl_return_chg-message.

ENDLOOP.

ENDFORM. " write_output_report

&----


*& Form validate_contract

&----


Make sure that the Contract is Valid

-


FORM validate_contract .

DATA: l_gueen LIKE vbak-gueen,

l_prsdt LIKE vbkd-prsdt.

SELECT SINGLE vbakgueen vbkdprsdt

INTO (l_gueen, l_prsdt)

FROM vbak

INNER JOIN vbkd

ON vbakvbeln = vbkdvbeln

WHERE vbak~vbeln = c_contract AND

vbkd~posnr = '000000'.

IF sy-datum LE l_gueen.

Contract is valid! Set Order Price Date

g_valid_contract = 'X'.

g_cont_price_date = l_prsdt.

ENDIF.

ENDFORM. " validate_contract

[/code]

Hope this helps.

Edited by: Alvaro Tejada Galindo on Jan 5, 2008 9:47 AM

0 Kudos

Hi Deepanker,

I dont need sales order i need CONTRACT and also i cannot hard code it since i will be fetching data from a .txt file i.e i need to upload the file from the desktop.

Please help me with this.

Regards,

Riya.