Пример программы для вставки строки с использованием BAPI с JCO3

Я пытаюсь "вставить" (или) "добавить строку" в заявку, используя стандартный BAPI (PurchaseRequisition.CreateFromData).

Я использую JCo3. Пример в JCo3 показывает, что мы должны использовать методы table.appendRow() ИЛИ table.insertRow(). Я пытаюсь с table.appendRow() и table.appendRows(1). Когда я пытаюсь вставить строку, я не получаю никакой ошибки, и строка не вставляется.

Ниже приведена программа, которую я пытаюсь выполнить. /** Ниже приведены входные данные, необходимые для запуска этой программы / / Шаг 1 **/ Строка 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));

// пропущен код, связанный с другими столбцами

        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();
        }
    }

Я не понял, как прочитать ответ, и пытаюсь получить его из exportParameters!!

  1. Кто-нибудь может поделиться частью кода для вставки и
  2. получение подтверждения (мы получаем PREQ_NO в ответ?)
  3. Я добавляю значение поля даты как "20131101", но не уверен, что формат и подход верны?
  4. Когда я пытаюсь добавить значение столбца Количество, я получаю сообщение об ошибке с жалобой на то, что этот столбец не является частью BAPIEBANC. Но столбец виден в типе BAPIEBANC.
  5. какая-либо конфигурация на стороне SAP будет проверена?
  6. я должен активировать какие-либо поля в стороне JCo? если да, то как

Обратите внимание, что мои знания по SAP очень ограничены.

Жду ответа эксперта.

Благодарю.

2 ответа

Решение

Во-первых, вы должны взглянуть на документацию SAP JCo, например, http://help.sap.com/saphelp_nw04/helpdata/en/6f/1bd5c6a85b11d6b28500508b5d5211/content.htm

Что касается вашего кода:

  • Добавление (одной) строки в таблицу выглядит прямо с первого взгляда.
  • Ваш код говорит КОЛИЧЕСТВО, а не КОЛИЧЕСТВО.
  • Вы должны добавить значения даты как java.util.Date; если вы создаете дату из формата String, вы должны использовать java.text.DateFormat.parse(). См. http://docs.oracle.com/javase/6/docs/api/java/util/Date.html (однако, это специфично для Java и не имеет ничего общего с JCo).
  • Если что-то изменяется в SAP, никогда не забывайте вызывать BAPI_TRANSACTION_COMMIT в конце, чтобы завершить логическую единицу работы (или транзакцию), иначе ничего не изменится.

Если вам не нравится возиться с более или менее сложным и многословным JCo API, попробуйте использовать Hibersap, который дает вам гораздо более приятную модель программирования при вызове функций в SAP ERP: http://hibersap.org/.

Однако вам все равно понадобится базовое понимание того, как функциональные модули SAP работают технически (например, типы параметров или типы данных), а также конкретной доменной модели, которая лежит за ними (в вашем случае, создание заявки). Т.е. вам может понадобиться связаться с вашими экспертами SAP.

Здесь я добавил 2 типа вставки:

  1. insertval() функция для определенного пользователем модуля находится в sap с помощью программиста abap
  2. Это стандартный модуль для вставки заявки с использованием jco в систему SOLMAN. Сначала вы должны проанализировать параметры импорта, экспорта, таблицы и структуры, и в соответствии с этим вы должны передать значения и получить ответ. Во второй функции он вернет билет n° после успешной вставки билета в solman.

Я надеюсь, что этот пример кода поможет вам, он работал для меня.

  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);

    }
Другие вопросы по тегам