Skip to content

BAPI_SALESORDER_CREATEFROMDAT2

Create sales orders programmatically — the standard SD BAPI for order creation.

Purpose

BAPI_SALESORDER_CREATEFROMDAT2 creates SD sales orders of any document type. It supports header, line items, partners (sold-to, ship-to, payer), schedule lines, and conditions. Always call BAPI_TRANSACTION_COMMIT after success.

Signature (key parameters)

Parameter Direction Type Description
ORDER_HEADER_IN Importing BAPISDHD1 Order header data
ORDER_HEADER_INX Importing BAPISDHD1X Checkbox — flag fields to send
ORDER_ITEMS_IN Tables BAPISDITM Line items
ORDER_ITEMS_INX Tables BAPISDITMX Checkbox for items
ORDER_PARTNERS Tables BAPIPARNR Partners (sold-to, ship-to, payer)
SALESDOCUMENT Exporting VBELN_VA Created order number
RETURN Tables BAPIRET2 Messages

Example — create a standard order

DATA: ls_header   TYPE bapisdhd1,
      ls_headerx  TYPE bapisdhd1x,
      lt_items    TYPE STANDARD TABLE OF bapisditm,
      lt_itemsx   TYPE STANDARD TABLE OF bapisditmx,
      lt_partners TYPE STANDARD TABLE OF bapiparnr,
      lt_return   TYPE STANDARD TABLE OF bapiret2.

DATA lv_order_no TYPE vbeln_va.

" Header
ls_header-doc_type  = 'TA'.        " standard order
ls_header-sales_org = '1000'.
ls_header-distr_chan = '10'.
ls_header-division  = '00'.
ls_header-req_date_h = sy-datum + 7.   " requested delivery

ls_headerx-doc_type   = 'X'.
ls_headerx-sales_org  = 'X'.
ls_headerx-distr_chan = 'X'.
ls_headerx-division   = 'X'.
ls_headerx-req_date_h = 'X'.

" Partners — sold-to is mandatory
APPEND VALUE #( partn_role = 'AG' partn_numb = '0000010001' ) TO lt_partners.  " sold-to
APPEND VALUE #( partn_role = 'WE' partn_numb = '0000010002' ) TO lt_partners.  " ship-to

" Items
APPEND VALUE #(
  itm_number  = '000010'
  material    = '000000000000000100'
  target_qty  = '5'
  target_qu   = 'PC'
  plant       = '1000'
) TO lt_items.

APPEND VALUE #(
  itm_number = '000010'
  material   = 'X'
  target_qty = 'X'
  target_qu  = 'X'
  plant      = 'X'
) TO lt_itemsx.

CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
  EXPORTING
    order_header_in  = ls_header
    order_header_inx = ls_headerx
  IMPORTING
    salesdocument    = lv_order_no
  TABLES
    order_items_in   = lt_items
    order_items_inx  = lt_itemsx
    order_partners   = lt_partners
    return           = lt_return.

" Check for errors
DATA(lv_has_error) = xsdbool( line_exists(
  lt_return[ type = 'E' ] ) OR line_exists( lt_return[ type = 'A' ] ) ).

IF lv_has_error = abap_false AND lv_order_no IS NOT INITIAL.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = abap_true.
  WRITE: / 'Sales order created:', lv_order_no.
ELSE.
  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  LOOP AT lt_return INTO DATA(ls_msg) WHERE type CA 'EA'.
    WRITE: / ls_msg-message.
  ENDLOOP.
ENDIF.

Common pitfalls

Checkbox pattern is mandatory

ORDER_HEADER_INX and ORDER_ITEMS_INX must have 'X' for every field you populate in the data structures. Unpopulated checkbox fields cause the corresponding data fields to be ignored.

Sold-to partner (AG) is required

If ORDER_PARTNERS doesn't contain an entry with PARTN_ROLE = 'AG', the BAPI returns an error. The sold-to partner drives pricing, tax, and delivery determination.

  • Incompleteness log: A successfully created order may still have incompleteness warnings in RETURN. The order is created — check it in VA02/VA03 and complete it there.
  • Pricing: Conditions are determined automatically from the customer/material master. Pass ORDER_CONDITIONS_IN only if you need to override prices.

See also

  • BAPI_PO_CREATE1 — purchase order creation
  • Transaction VA01 — create sales order manually
  • Transaction VA03 — display sales order

Comments