Table_not_available при использовании 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"));
}
}
}
2 ответа
В вашем коде JCo нет ничего плохого. Сообщение об ошибке приходит из системы SAP. Поэтому вам нужно проверить в системе SAP, что означает этот код ошибки. Это можно сделать в транзакции SE91. Вы вводите сообщение class = "DA" и номер сообщения = "300" и нажимаете на дисплей.
Я сделал это для вас, и в результате получилось: "Нет активной таблицы имен для &", где "&" необходимо заменить вводом, в данном случае "LTAP". Таким образом, у нас "Нет активных именных таблиц для LTAP".
Эта ошибка в основном означает: таблица базы данных "LTAP" существует в базе данных, но еще не была активирована в ABAP DDIC. (Возможно, потому что он все еще содержит синтаксическую ошибку, или отсутствует необходимый элемент данных / домен и т. Д.)
Решение: перейдите к транзакции SE11 и попробуйте активировать таблицу. Это, вероятно, даст вам сообщение об ошибке о том, что не так с этой таблицей. Исправьте все синтаксические ошибки, активируйте его, и тогда вы сможете его использовать.
Примечание: если LTAP - это стандартная таблица, поставляемая SAP, эта ошибка, вероятно, означает, что что-то пошло не так при установке транспортного / горячего пакета из SAP, который содержал изменения в этой таблице. В этом случае вам лучше обратиться в службу поддержки SAP, чтобы снова вернуть таблицу в "согласованное" состояние.
Я вижу, что вы подключаетесь к системе 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");
Я не вижу их для использования в вашей программе. Кажется, они не применяются к вашей связи...