0

导入参数“QUERY_TABLE”=“LTAP”中有三个不同的表(OPTIONS、FIELDS 和 DATA)。我创建了一个 java 程序,使用帮助函数 RFC_READ_TABLE 显示表 FIELDS 中的 FIELDNAME 列。

当我调用方法 step2WorkWithTable() 时,它总是出现 Error com.sap.conn.jco.AbapException: (126) TABLE_NOT_AVAILABLE: TABLE_NOT_AVAILABLE Message 300 of class DA type E 。任何人都可以解释错误吗?以及如何解决?

我的代码:

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

}
}
4

2 回答 2

1

您的 JCo 代码没有任何问题。错误消息来自 SAP 系统。所以你需要在 SAP 系统中检查该错误代码的含义。这可以在事务 SE91 中完成。您输入消息类别 =“DA”和消息编号 =“300”,然后单击显示。

我为你做了这个,结果是:“No active nametab exists for &” 其中 '&' 需要替换为输入,在本例中为“LTAP”。所以我们有“LTAP 不存在活动的名称表”。

这个错误基本上意味着:数据库表“LTAP”存在于数据库中,但尚未在ABAP DDIC中激活。(可能是因为它仍然包含语法错误,或者缺少所需的数据元素/域等)

解决方法:转到事务 SE11 并尝试激活表。这可能会给您一条错误消息,说明此表有什么问题。修复所有语法错误,激活它,然后你就可以使用它了。

注意:如果 LTAP 是 SAP 提供的标准表,则此错误可能意味着从 SAP 安装包含对此表的修改的传输/热包时出现问题。在这种情况下,您最好联系 SAP 支持以使表再次恢复到“一致”状态。

于 2018-09-06T11:40:14.143 回答
0

我看到您正在使用 JCoDestinationManager 连接到 ABAP 系统。这意味着您正在使用来自 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"); 

我看不到它们可以在您的程序中的任何地方使用。似乎它们不适用于您的连接...

于 2017-06-29T11:58:43.513 回答