Таблица_недоступна при использовании JAVA SAP RFC_READ_TABLE

В параметре импорта «QUERY_TABLE» = «LTAP» есть три разные таблицы (OPTIONS, FIELDS и DATA). Я создал Java-программу для отображения столбца FIELDNAME из таблицы FIELDS с помощью вспомогательной функции RFC_READ_TABLE.

Всегда появляется Ошибка com.sap.conn.jco.AbapException: (126) TABLE_NOT_AVAILABLE: TABLE_NOT_AVAILABLE Сообщение 300 класса DA типа E, когда я вызываю метод step2WorkWithTable(). Кто-нибудь может объяснить ошибку? И как это исправить?

Мои коды:

import java.util.Properties;
import com.sap.conn.jco.AbapException;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import com.sap.conn.jco.JCoException;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.ext.DestinationDataProvider;
import com.sap.conn.jco.JCoStructure;
import com.sap.conn.jco.JCoTable;

public class RFC_Read_Table {
public static void main(String[] args) throws JCoException
{

    System.out.println("Step1: connect SAP without Pool");
    step1Connect();       

    System.out.println("");

    System.out.println("Step2: call RFC_Read_Table ");
    step2WorkWithTable();



    System.out.println("--------------------------------");
    System.out.println("finished");

}
static {
    String DESTINATION_NAME1 = "mySAPSystem";

    Properties connectProperties = new Properties();
    connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "ABC"); 
    connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  "33");
    connectProperties.setProperty(DestinationDataProvider.JCO_SAPROUTER, "/A/123/");               
    connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "100"); 
    connectProperties.setProperty(DestinationDataProvider.JCO_USER,   "UserID");  
    connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "Passwort"); 
    connectProperties.setProperty(DestinationDataProvider.JCO_LANG,   "de");
    createDestinationDataFile(DESTINATION_NAME1, connectProperties);
}


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

}   

public static void step1Connect() throws JCoException
{
     try {
         JCoDestination destination = JCoDestinationManager.getDestination("mySAPSystem");
         System.out.println("connected");
         destination.ping();
     } catch (JCoException e) {
         e.printStackTrace();
         System.out.println("not connected");
     } 

}




public static void step2WorkWithTable() throws JCoException
{
    JCoDestination destination = JCoDestinationManager.getDestination("mySAPSystem");
    JCoFunction function = destination.getRepository().getFunction("RFC_READ_TABLE");

    if (function == null)
        throw new RuntimeException("RFC_Read_Table not found in SAP.");
    try
    {
        function.execute(destination);
    }
    catch(AbapException e)
    {
        System.out.println(e.toString());
        return;
    }

    function.getImportParameterList().setValue("QUERY_TABLE","LTAP");

    JCoTable codes = function.getTableParameterList().getTable("FIELDS");
    codes.appendRow();

    for (int i = 0; i < codes.getNumRows(); i++) 
    {
        codes.setRow(i);
        System.out.println(codes.getString("FIELDNAME"));
    }
    codes.firstRow();
    for (int i = 0; i < codes.getNumRows(); i++, codes.nextRow()) 
    {
        function = destination.getRepository().getFunction("RFC_READ_TABLE");
        if (function == null) 
            throw new RuntimeException("RFC_READ_TABLE not found in SAP.");
        function.getImportParameterList().setValue("FIELDNAMEID", codes.getString("FIELDNAME"));


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


        JCoStructure detail = function.getExportParameterList().getStructure("FIELDS");

        System.out.println(detail.getString("FIELDNAME"));
   }

}
}

person Elisha Hachiko    schedule 28.06.2017    source источник
comment
Привет и добро пожаловать в Stack Overflow, пожалуйста, найдите время, чтобы пройти приветственный тур, чтобы узнать, как здесь ориентироваться (а также заработать свой первый значок), прочитайте, как создать минимальный, полный и проверяемый пример, а также проверьте Как задавать хорошие вопросы, чтобы повысить свои шансы на получение отзывов и полезных ответов.   -  person DarkCygnus    schedule 28.06.2017
comment
В какой строке вы получаете ошибку, пожалуйста, добавьте это к своему вопросу   -  person DarkCygnus    schedule 28.06.2017
comment
@GrayCygnus: спасибо за информацию. Когда я вызываю метод step2(), появляется ошибка com.sap.conn.jco.AbapException: (126) TABLE_NOT_AVAILABLE: TABLE_NOT_AVAILABLE Сообщение 300 класса DA типа E   -  person Elisha Hachiko    schedule 29.06.2017
comment
В функции function.getImportParameterList().setValue(QUERY_TABLE,LTAP); какие параметры буксировки? Я получаю ту же ошибку и получаю данные из своей системы SAP.   -  person Adrian    schedule 06.09.2018


Ответы (2)


В вашем коде JCo нет ничего плохого. Сообщение об ошибке поступает из системы SAP. Поэтому вам нужно проверить в системе SAP, что означает этот код ошибки. Это можно сделать в транзакции SE91. Вы вводите класс сообщения = «DA» и номер сообщения = «300» и нажимаете «Показать».

Я сделал это для вас, и результат таков: «Для & не существует активной вкладки имени», где «&» необходимо заменить вводом, которым в данном случае является «LTAP». Итак, у нас есть «Для LTAP не существует активной вкладки имени».

Эта ошибка в основном означает: таблица базы данных «LTAP» существует в базе данных, но еще не активирована в ABAP DDIC. (Возможно, потому что он по-прежнему содержит синтаксическую ошибку или отсутствует требуемый элемент данных/домен и т. д.)

Решение: перейти к транзакции SE11 и попробовать активировать таблицу. Это, вероятно, даст вам сообщение об ошибке о том, что не так с этой таблицей. Исправьте все синтаксические ошибки, активируйте его, и тогда вы сможете его использовать.

Примечание: если LTAP является стандартной таблицей, поставляемой SAP, эта ошибка, вероятно, означает, что что-то пошло не так при установке транспорта/горячего пакета из SAP, который содержал модификации этой таблицы. В этом случае вам лучше обратиться в службу поддержки SAP, чтобы снова вернуть таблицу в «непротиворечивое» состояние.

person Lanzelot    schedule 06.09.2018

Я вижу, вы подключаетесь к системе ABAP с помощью JCoDestinationManager. Это означает, что вы используете свойства из пункта назначения mySAPSystem. Пожалуйста, проверьте, подключается ли mySAPSystem к правильной системе ABAP.

Для чего нужны эти строки

Properties connectProperties = new Properties();
connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "ABC"); 
connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  "33");                       
connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "100"); 
connectProperties.setProperty(DestinationDataProvider.JCO_USER,   "UserID");  
connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "Passwort"); 
connectProperties.setProperty(DestinationDataProvider.JCO_LANG,   "de"); 

Я не вижу, чтобы они использовались где-либо в вашей программе. Кажется, они не применяются к вашему соединению...

person Skalozub    schedule 29.06.2017
comment
Спасибо за Ваш ответ. На самом деле я создал метод createDestinationDataFile() и вызвал createDestinationDataFile(DESTINATION_NAME1, connectProperties) для прямого подключения к SAP Server. Извините за еще один глупый вопрос: как я могу проверить, подключается ли mySAPSystem к правильной системе ABAP? - person Elisha Hachiko; 29.06.2017
comment
Не могли бы вы предоставить свой код для createDestinationDataFile? - person Skalozub; 29.06.2017
comment
Вы пробовали следующий пример? erpworkbench.com/java/jco/jco_callfunc.htm - person Skalozub; 30.06.2017
comment
это приведенный выше пример для JCO 2.x? Я попробовал следующий пример для JCO 3.x: github.com/hisataka/JcoRfcCall. Это сработало. - person Elisha Hachiko; 03.07.2017