Question

I am trying to "insert" (or) "add a row" to Purchase Requisition using standard BAPI (PurchaseRequisition.CreateFromData).

I am using JCo3. The example in JCo3 indicates that we should use table.appendRow() OR table.insertRow() methods. I am trying with table.appendRow() & table.appendRows(1). When i try to insert a row, i dont get any error and the row is not inserted.

Below is the program i am trying to execute. /** Below are the inputs required for this program to run / / Step 1 **/ String BAPI_NAME = "BAPI_REQUISITION_CREATE";

    /** Step 2 **/
    String query_input_column1 = "DOCUMENTY_TYPE"; 
    String query_input_column1_value = "NB";

    String query_input_column2 = "PREQ_NAME";
    String query_input_column2_value = "Name";

    String query_input_column3 = "ACCTASSCAT";
    String query_input_column3_value = "U";

    String query_input_column4 = "DELIV_DATE";
    String query_input_column4_value = "20131101";

    String query_input_column5 = "MATERIAL";
    String query_input_column5_value = "DELL-RQ2013";

    String query_input_column6 = "QUANITY";
    int query_input_column6_value = 10100;




    /** Step 3 **/
    String targetTableUnderBAPI = "REQUISITION_ITEMS";

    /** Step 4 **/
    /** For the confirmation read the value from export parameter after insertion execution **/
    String result_column1 = "NUMBER";


    JCoDestination destination = null;
    try {
        destination = JCoDestinationManager.getDestination(DestinationManager.DESTINATION_NAME1);
        JCoRepository repository = destination.getRepository();
        JCoContext.begin(destination);

        JCoFunction function = repository.getFunction(BAPI_NAME);

        if(function == null)
            throw new RuntimeException(BAPI_NAME + " not found in SAP.");

        System.out.println("BAPI Name from function object: " + function.getName());            

        //function.getImportParameterList().setValue(query_input_column1, query_input_column1_value);
        JCoTable table = function.getTableParameterList().getTable(targetTableUnderBAPI); //it is taken from the response value of metadata
        //System.out.println("No of Columns: "+ table.getNumColumns());
        System.out.println("Trying to execute append row");

        table.appendRow();
            table.setValue(query_input_column1,query_input_column1_value);
            table.setValue(query_input_column2,query_input_column2_value);
            table.setValue(query_input_column3,query_input_column3_value);
            //table.setValue(query_input_column4,new java.util.Date(query_input_column4_value));

//skipped Other columns related code

        try{
            function.execute(destination);
        }
        catch(AbapException e){
            System.out.println(e.toString());
            return;
        }

        System.out.println("Let us check the result from export parameter");
        String exportParamStructure = (String)function.getExportParameterList().getValue(result_column1); //getStructure(result_column1); // getValue(result_column1);
        System.out.println("Resulting PR#: "+exportParamStructure);

    } catch (JCoException e) {
        e.printStackTrace();
    }
    finally
    {
        try {
            JCoContext.end(destination);
        } catch (JCoException e) {
            e.printStackTrace();
        }
    }

I did not understand how to read the response and am trying to fetch it from exportParameters!!

  1. Can anybody share a piece of code to insert and
  2. getting confirmation response (do we get the PREQ_NO in response?)
  3. I am adding date field value as "20131101", but not sure if the format and approach is right?
  4. when i try to add Quantity column value, i get an error message complaining this column is not part of BAPIEBANC. But the column is visible in BAPIEBANC type.
  5. any configuration on SAP side to be checked?
  6. should i activate any fields in JCo side? if so, how

Please note that my knowledge on SAP is very limited.

Waiting for an expert's response.

Thanks.

Was it helpful?

Solution

First, you should take a look at SAP JCo documentation, e.g. http://help.sap.com/saphelp_nw04/helpdata/en/6f/1bd5c6a85b11d6b28500508b5d5211/content.htm

Regarding your code:

  • Adding (one) row to the table looks right on first sight.
  • Your code says QUANITY instead of QUANTITY.
  • You should add date values as java.util.Date; if creating a Date from a String format, you should use java.text.DateFormat.parse(). See http://docs.oracle.com/javase/6/docs/api/java/util/Date.html (this is however Java specific and has nothing to do with JCo).
  • If changing anything in SAP, never forget to call BAPI_TRANSACTION_COMMIT in the end to finish the logical unit of work (aka transaction) or nothing will actually be changed.

If you don't like to fiddle with the more or less complicated and verbose JCo API, try using Hibersap which gives you a much nicer programming model when calling functions in SAP ERP: http://hibersap.org.

However, you will still need a basic understanding on how SAP function modules work technically (such as parameter types or data types) as well as on the domain specific model which lies behind them (in your case, creating a requisition). I.e. you may need to communicate with your SAP experts.

OTHER TIPS

Here I added 2 types of insertion :

  1. insertval() function for user defined module resides in sap with the help of abap programmer
  2. Its an standard module for insert a ticket using jco to SOLMAN system. First you have to analyse import, export, table & structure parameters, and according to that you have to pass values and retrieve response. In second function it will return ticket n° after successfull insertion of ticket in solman.

I hope this sample code will help you, it worked for me.

  public class jco
    {

    static String DESTINATION_NAME1 = "ABAP_AS_WITHOUT_POOL";
        static String DESTINATION_NAME2 = "ABAP_AS_WITH_POOL";

    static
        {

            Properties connectProperties = new Properties();
            connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "192.1.1.1");
            connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  "01");
            connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "500");
            connectProperties.setProperty(DestinationDataProvider.JCO_USER,   "uname");
            connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "pwd");
            connectProperties.setProperty(DestinationDataProvider.JCO_LANG,   "en");

            createDestinationDataFile(DESTINATION_NAME1, connectProperties);
            connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, "3");
            connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT,    "10");
            createDestinationDataFile(DESTINATION_NAME2, connectProperties);
            System.err.println("hai");

        }

        static void createDestinationDataFile(String destinationName, Properties connectProperties)
        {
            File destCfg = new File(destinationName+".jcoDestination");
            try
            {
                try (FileOutputStream fos = new FileOutputStream(destCfg, false)) {
                    connectProperties.store(fos, "for tests only !");
                }
            }
            catch (IOException e)
            {
                throw new RuntimeException("Unable to create the destination files", e);
            }
        }






        public void insertval() throws JCoException
        {

            JCoDestination destination = JCoDestinationManager.getDestination(DESTINATION_NAME1);

          JCoFunction jf=destination.getRepository().getFunction("ZUSER_DET");

       jf.getImportParameterList().setValue("FIRST_NAME","member");
      jf.getImportParameterList().setValue("LAST_NAME","c");
         jf.getImportParameterList().setValue("USER_NO","1000");

         jf.execute(destination);
    System.out.println(jf);
        }





public void insertticket() throws JCoException
    { 
        JCoDestination destination = JCoDestinationManager.getDestination(DESTINATION_NAME2);
        System.out.println("test"+"\n");
      JCoFunction jf=destination.getRepository().getFunction("BAPI_NOTIFICATION_CREATE");

      JCoTable jt1=jf.getTableParameterList().getTable("APPX_HEADERS");


      JCoTable jt2=jf.getTableParameterList().getTable("APPX_LINES");


      JCoTable jt3=jf.getTableParameterList().getTable("APPX_LINES_BIN");


      JCoTable jt4=jf.getTableParameterList().getTable("NOTIF_NOTES");



      JCoTable jt5=jf.getTableParameterList().getTable("NOTIF_PARTNERS");
      JCoTable jt6=jf.getTableParameterList().getTable("NOTIF_SAP_DATA");
      JCoTable jt7=jf.getTableParameterList().getTable("NOTIF_TEXT_HEADERS");
      JCoTable jt8=jf.getTableParameterList().getTable("NOTIF_TEXT_LINES");


      JCoStructure jfn1=jf.getImportParameterList().getStructure("NOTIF_EXT");
  JCoStructure jfn2=jf.getImportParameterList().getStructure("NOTIF_CRM");
JCoStructure jfn3=jf.getImportParameterList().getStructure("IBASE_DATA");
jfn1.setValue("NUMB","1234");
jfn1.setValue("REFNUM","123");
jfn1.setValue("TYPE_NOTIF","SLFN");
jfn1.setValue("SUBJECT","tl");
jfn1.setValue("PRIORITY","2");
jfn1.setValue("LANGUAGE","EN");
jfn1.setValue("CATEGORY","Z01");
 jfn2.setValue("CODE","0011");
 jfn2.setValue("CODEGROUP","0011");
   jfn2.setValue("CATEGORY","Z01");
jfn3.setValue("INSTANCE","489");
  jfn3.setValue("IBASE","500");



jt1.appendRow();
jt1.setValue("DESCR","practise");
 jt2.appendRow();

      jt2.setValue("LINE","CVXCVXCV");
  jt3.appendRow();
      jt3.setValue("LINE","second text line");
      jt4.appendRow();
      jt4.setValue("TYPE_NOTE","my");
      jt4.setValue("IDENT","hoe twwrtgw");
      jt4.setValue("DESCRIPTION","its description ");
jt5.appendRow();

jt5.setValue("PARNR","new ");
jt5.setValue("TYPE_PAR","FN");
jt5.setValue("FUNC_PAR","EN");
jt5.setValue("PAR_ACTIVE","1");
jt6.appendRow();
jt6.setValue("INSTN","0020214076");
jt6.setValue("COMP","FI-AA");
jt6.setValue("SYSTYPE","P");
jt6.setValue("SYSID","PRD");
jt6.setValue("MANDT","900");
jt8.appendRow();
jt8.setValue("TXT_NUM","1");
jt8.setValue("TDFORMAT",">X");
jt8.setValue("TDLINE","/(performing all test)");






jf.execute(destination);
String jfex=jf.getExportParameterList().getString("REFNUM");

               System.out.println("hi "+jfex);

    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top