Skip to Content
avatar image
Former Member

Sales Order creation using SAP NCo 3.0 x64

Hi,

I have been trying to create a sales order using the SAP NCo from Visual Studio (C#) and I'm stuck.

The code I have used is:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SAP.Middleware.Connector;

namespace ConsoleApplication2
{
    class Program : IDestinationConfiguration
    {
        static void Main(string[] args)
        {
            RfcDestinationManager.RegisterDestinationConfiguration(new Program());
            RfcDestination destination = RfcDestinationManager.GetDestination("EHP6");

            try
            {
                RfcRepository repo = destination.Repository;
                IRfcFunction salesDoc = repo.CreateFunction("BAPI_SALESORDER_CREATEFROMDAT2");
                IRfcFunction salesDocCommit = repo.CreateFunction("BAPI_TRANSACTION_COMMIT");

                IRfcStructure salesHeader = salesDoc.GetStructure("ORDER_HEADER_IN");

                IRfcTable salesItems = salesDoc.GetTable("ORDER_ITEMS_IN");
                IRfcTable salesPartners = salesDoc.GetTable("ORDER_PARTNERS");


                IRfcStructure salesItemsStruct = salesItems.Metadata.LineType.CreateStructure();
                IRfcStructure salesPartnersStruct = salesPartners.Metadata.LineType.CreateStructure();


                //Sales Header
                salesHeader.SetValue("DOC_TYPE", "MOR");
                salesHeader.SetValue("DOC_DATE", Convert.ToDateTime("2014-06-19"));
                salesHeader.SetValue("SALES_ORG", "M210");
                salesHeader.SetValue("DISTR_CHAN", "01");
                salesHeader.SetValue("DIVISION", "M1");
                salesHeader.SetValue("CURRENCY", "USD");

                //Sales Items
                salesItemsStruct.SetValue("ITM_NUMBER", "000010");
                salesItemsStruct.SetValue("MATERIAL", "MP_SHEET_22");
                salesItemsStruct.SetValue("SHORT_TEXT", "Sheet Grade B, BWT 20lb/75gsm");
                salesItemsStruct.SetValue("PLANT", "M210");               
                salesItemsStruct.SetValue("TARGET_QTY", "2000");
                salesItemsStruct.SetValue("TARGET_QU","LBR");
                salesItemsStruct.SetValue("TARGET_VAL", "11655.67");


                // Partner
                salesPartnersStruct.SetValue("PARTN_ROLE", "SP");
                salesPartnersStruct.SetValue("PARTN_NUMB", "MP-CUST201");

                RfcSessionManager.BeginContext(destination);
                salesDoc.Invoke(destination);
                salesDocCommit.Invoke(destination);
                RfcSessionManager.EndContext(destination);


                Console.WriteLine("Sales Order Created!!");
                Console.ReadLine();
            }
            catch (RfcCommunicationException e)
            {
                e.ToString();
                Console.WriteLine(e);
                Console.ReadLine();

            }
            catch (RfcLogonException e)
            {
                e.ToString();
                Console.WriteLine(e);
                Console.ReadLine();
            }
            catch (RfcAbapRuntimeException e)
            {
                e.ToString();
                Console.WriteLine(e);
                Console.ReadLine();
            }
            catch (RfcAbapBaseException e)
            {
                e.ToString();
                Console.WriteLine(e);
                Console.ReadLine();
            }

        }

        public RfcConfigParameters GetParameters(String destinationName)
        {
            if ("EHP6".Equals(destinationName))
            {
                RfcConfigParameters parms = new RfcConfigParameters();
                parms.Add(RfcConfigParameters.AppServerHost, "xx.xxx.xxx.xx");
                parms.Add(RfcConfigParameters.SystemNumber, "00");
                parms.Add(RfcConfigParameters.SystemID, "IE6");
                parms.Add(RfcConfigParameters.User, "user");
                parms.Add(RfcConfigParameters.Password, "password");
                parms.Add(RfcConfigParameters.Client, "800");
                parms.Add(RfcConfigParameters.Language, "EN");                
                return parms;
            }
            else return null;
        }

    }
}

It returns me no error and even displays "Sales Order Created!!" from the try block. But when I check in VBAK, no Sales Order is being created. 😕

Can somebody help me understand, if I have missed out something or if I'm going wrong somewhere? 😕

All dependencies have been added correctly, platform being set to x64. No build/run-time errors.

Add comment
10|10000 characters needed characters exceeded

  • Follow
  • Get RSS Feed

3 Answers

  • Best Answer
    avatar image
    Former Member
    Jun 23, 2014 at 11:59 AM

    Thank you for the heads up everybody. I finally solved the error.

    Thanks to Venkata for pointing out the IRfcTable bapiTable = salesDoc.GetTable("RETURN"); part.

    The error was in sold-to-party/ship-to-party which is actually the partner number.

    There is nothing wrong with the code. It's just that sold-to-party/ship-to-party should have the role AG while creating the sales order, otherwise it doesn't get created.

    I have attached the entire code, in case it helps someone. 😊


    Add comment
    10|10000 characters needed characters exceeded

  • avatar image
    Former Member
    Jun 20, 2014 at 08:41 PM

    if sales document is created then you can get the value from

    string orderNo = salesDoc.GetValue("SD_NO").ToString();

    if there is an error you can get the details from this piece of code

    IRfcTable bapiTable = salesDoc.GetTable("RETURN");

    Add comment
    10|10000 characters needed characters exceeded

  • Jun 19, 2014 at 09:18 AM

    Hi Sreyan Choudhury

    have you check if you have completed all the mandatory field?

    the partner "SP" is the customer in your system?

    here an example on how I've used this bapi in a webdynpro:

    * Order Header Details

    CLEAR w_order_header_in.



    w_order_header_in-doc_type = zauart.

    w_order_header_in-sales_org = zvkorg.

    w_order_header_in-distr_chan = stru_order_header-distr_chan.

    w_order_header_in-division = 'GN'.

    w_order_header_in-purch_no_c = stru_order_header-purch_no_s.

    w_order_header_in-purch_no_s = stru_order_header-purch_no_s.

    w_order_header_in-sales_grp = zvkgrp.

    w_order_header_in-sales_off = zvkbur.

    w_order_header_in-compl_dlv = stru_order_header-compl_dlv.

    w_order_header_in-req_date_h = stru_order_header-req_date_h.



    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'

    EXPORTING

    input = w_order_items_in-material

    IMPORTING

    output = w_order_items_in-material.


    * Order Partner Details

    CLEAR: i_order_partners,w_order_partners.

    w_order_partners-partn_role = 'AG'.

    w_order_partners-partn_numb = stru_order_partners-partn_numb.



    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'

    EXPORTING

    input = w_order_partners-partn_numb

    IMPORTING

    output = w_order_partners-partn_numb.



    APPEND w_order_partners TO i_order_partners.


    *partener roles

    SELECT * INTO w_agenti FROM zagenti WHERE vkgrp = zvkgrp.



    CLEAR w_order_partners.

    w_order_partners-partn_role = w_agenti-parvw.

    w_order_partners-partn_numb = w_agenti-lifnr.



    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'

    EXPORTING

    input = w_order_partners-partn_numb

    IMPORTING

    output = w_order_partners-partn_numb.



    APPEND w_order_partners TO i_order_partners.

    ENDSELECT.



    * Order Items

    LOOP AT stru_order_items INTO i_order_items.

    CLEAR: w_order_items_in.



    MOVE-CORRESPONDING i_order_items TO w_order_items_in.

    w_order_items_in-store_loc = i_order_items-lgort.

    w_order_items_in-itm_number = sy-tabix * 10.





    w_order_items_in-item_categ = 'TAN'.

    w_order_items_in-ship_point = 'LS00'.

    w_order_items_in-plant = 'DS00'.





    APPEND w_order_items_in TO i_order_items_in.



    w_order_items_inx-itm_number = w_order_items_in-itm_number.

    w_order_items_inx-target_qty = 'X'.

    w_order_items_inx-item_categ = 'X'.

    w_order_items_inx-ship_point = 'X'.

    w_order_items_inx-plant = 'X'.

    IF w_order_items_in-batch IS NOT INITIAL.

    w_order_items_inx-batch = 'X'.

    ENDIF.

    IF w_order_items_in-store_loc IS NOT INITIAL.

    w_order_items_inx-store_loc = 'X'.

    ENDIF.

    APPEND w_order_items_inx TO i_order_items_inx.



    w_order_schedules_in-itm_number = w_order_items_in-itm_number.

    w_order_schedules_in-sched_line = '0001'.

    w_order_schedules_in-req_qty = w_order_items_in-target_qty.

    APPEND w_order_schedules_in TO i_order_schedules_in.



    w_order_schedules_inx-itm_number = w_order_items_in-itm_number.

    w_order_schedules_inx-sched_line = '0001'.

    w_order_schedules_inx-req_qty = 'X'.

    w_order_schedules_inx-updateflag = 'I'.

    APPEND w_order_schedules_inx TO i_order_schedules_inx.


    * Order Condition Details

    IF i_order_items-prriga <> i_order_items-prnet AND

    i_order_items-prriga <> i_order_items-prbase.

    CLEAR: w_order_conditions_in.

    w_order_conditions_in-itm_number = w_order_items_in-itm_number.

    w_order_conditions_in-cond_type = 'ZMAN'. “manual
    price condition

    w_order_conditions_in-cond_value = i_order_items-prriga / 10.



    APPEND w_order_conditions_in TO i_order_conditions_in.



    ENDIF.



    DATA: v_message_riga TYPE string.
    * Get message manager

    DATA: l_current_controller TYPE REF TO if_wd_controller,

    l_message_manager TYPE REF TO if_wd_message_manager.



    l_current_controller ?= wd_this->wd_get_api( ).



    CALL METHOD l_current_controller->get_message_manager

    RECEIVING

    message_manager = l_message_manager.



    IF i_order_items-prriga = 0 AND i_order_items-omaggio = ''.



    CONCATENATE 'Error during the creation '

    'empty line INTO v_message_riga.


    * v_message_riga = 'Errore durante la creazione. Riga non
    *valorizzata'.


    * Report Error message

    CALL METHOD l_message_manager->report_error_message

    EXPORTING

    message_text = v_message_riga.

    i_bloccasalva = 'X'.

    ENDIF.



    ENDLOOP.



    CLEAR v_sales_doc.



    IF i_bloccasalva NE 'X'.
    * Create Sales Order BAPI Call

    CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'

    EXPORTING

    order_header_in = w_order_header_in

    IMPORTING

    salesdocument = v_sales_doc

    TABLES

    return = i_return

    order_items_in = i_order_items_in

    order_schedules_in = i_order_schedules_in

    order_items_inx = i_order_items_inx

    order_partners = i_order_partners

    order_conditions_in = i_order_conditions_in.
    * order_text = i_order_text.

    ENDIF.

    DATA: v_message_text TYPE string.


    * When Sales Order is created commit the data

    IF NOT v_sales_doc IS INITIAL.



    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

    EXPORTING

    wait = 'X'.



    me->registra_bolla(

    EXPORTING

    sales_order = v_sales_doc

    IMPORTING

    delivery = v_delivery_doc

    bolla = v_xab ).





    LOOP AT i_return INTO w_return.

    CONCATENATE v_message_text '/' w_return-message

    INTO v_message_text SEPARATED BY space.

    ENDLOOP.



    wd_context->invalidate( ).



    node_order_header = wd_context->get_child_node( 'ORDER_HEADER' ).

    node_order_header->set_attribute( EXPORTING name = 'REQ_DATE_H'

    value = sy-datum ).




    * Report Success message

    CALL METHOD l_message_manager->report_success

    EXPORTING

    message_text = v_message_text.



    ELSE.

    v_message_text = 'Error during the creation.'.



    LOOP AT i_return INTO w_return.

    CONCATENATE v_message_text '/' w_return-message INTO v_message_text

    SEPARATED BY space.

    ENDLOOP.


    * Report Error message

    CALL METHOD l_message_manager->report_error_message

    EXPORTING

    message_text = v_message_text.

    ENDIF.

    Add comment
    10|10000 characters needed characters exceeded