【问题标题】:OData: Unable to create working get_entity method (RFC nore ABAP)OData:无法创建有效的 get_entity 方法(RFC nore ABAP)
【发布时间】:2016-09-29 11:09:04
【问题描述】:

我为测试目的创建了一个简单的表,并希望为此在SEGW 中实现get_entity 方法。

我有一个获取两个键并返回匹配条目的 RFC。

SELECT SINGLE * FROM ZORDER
  INTO ORDERRETURN
  WHERE ORDERADVENCO    = ORDERADVENCOINPUT AND
        POSITIONADVENCO = POSITIONADVENCOINPUT.

我尝试使用/sap/opu/odata/sap/ZORDER_RFC_SRV/OrderSet(Orderadvencoinput='10100', Positionadvencoinput='10') 调用它,但收到错误400: Bad request

我的元数据返回以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<edmx:Edmx xmlns:sap="http://www.sap.com/Protocols/SAPData" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="1.0">
    <edmx:DataServices m:DataServiceVersion="2.0">
        <Schema xml:lang="en" xmlns="http://schemas.microsoft.com/ado/2008/09/edm" sap:schema-version="1" Namespace="ZORDER_RFC_SRV">
            <EntityType sap:content-version="1" Name="Order">
                <Key>
                    <PropertyRef Name="Orderadvencoinput" />
                    <PropertyRef Name="Positionadvencoinput" />
                </Key>
                <Property Name="Orderreturn" Nullable="false" Type="ZORDER_RFC_SRV.Orderreturn" />
                <Property Name="Orderadvencoinput" Nullable="false" Type="Edm.String" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" />
                <Property Name="Positionadvencoinput" Nullable="false" Type="Edm.String" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" />
            </EntityType>
            <ComplexType Name="Orderreturn">
                <Property Name="Orderadvenco" Nullable="false" Type="Edm.String" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" />
                <Property Name="Positionadvenco" Nullable="false" Type="Edm.String" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" />
                <Property Name="Outcome" Nullable="false" Type="Edm.String" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" />
                <Property Name="Plantitem" Nullable="false" Type="Edm.String" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" />
                <Property Name="Progress" Nullable="false" Type="Edm.String" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" />
                <Property Name="Status" Nullable="false" Type="Edm.String" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" />
                <Property Name="Targetquantity" Nullable="false" Type="Edm.Int32" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="INT" />
                <Property Name="Targettime" Nullable="false" Type="Edm.String" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" />
                <Property Name="Unit" Nullable="false" Type="Edm.String" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" />
            </ComplexType>
            <EntityContainer Name="ZORDER_RFC_SRV_Entities" sap:supported-formats="atom json xlsx" m:IsDefaultEntityContainer="true">
                <EntitySet sap:content-version="1" Name="OrderSet" sap:updatable="false" sap:creatable="false" sap:pageable="false" sap:deletable="false" EntityType="ZORDER_RFC_SRV.Order" />
            </EntityContainer>
            <atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="http://vhcala4hci.wdf.sap.corp:50000/sap/opu/odata/sap/ZORDER_RFC_SRV/$metadata" rel="self" />
            <atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="http://vhcala4hci.wdf.sap.corp:50000/sap/opu/odata/sap/ZORDER_RFC_SRV/$metadata" rel="latest-version" />
        </Schema>
    </edmx:DataServices>
</edmx:Edmx>

我也尝试过自己编写方法:

method ORDERSET_GET_ENTITY.

  DATA:  lt_keys TYPE /iwbep/t_mgw_tech_pairs,
         ls_key TYPE /IWBEP/S_MGW_TECH_PAIR,
         lv_ORDERADVENCO   TYPE zorder-ORDERADVENCO,
         lv_POSITIONADVENCO  TYPE zorder-POSITIONADVENCO,
         ls_order TYPE  zorder.
         lt_keys = io_tech_request_context->get_keys( ).
  READ TABLE lt_keys with key name = 'Orderadvenco' into ls_key.
  lv_ORDERADVENCO = ls_key-value.
  READ TABLE lt_keys with key name = 'Positionadvenco' into ls_key.
  lv_POSITIONADVENCO = ls_key-value.
  SELECT SINGLE * FROM ZORDER
                  INTO ls_order
                  WHERE ORDERADVENCO    = lv_ORDERADVENCO and 
                        POSITIONADVENCO = lv_POSITIONADVENCO.
  IF sy-subrc = 0.
    er_entity-ORDERADVENCO = ls_order-ORDERADVENCO.
  ENDIF.
endmethod.

元数据:

<edmx:DataServices m:DataServiceVersion="2.0">

<Schema xml:lang="en" xmlns="http://schemas.microsoft.com/ado/2008/09/edm" sap:schema-version="1" Namespace="ZORDER_SRV">


<EntityType sap:content-version="1" Name="Order">


<Key>

<PropertyRef Name="Orderadvenco"/>

<PropertyRef Name="Positionadvenco"/>

</Key>

<Property Name="Orderadvenco" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" Nullable="false" Type="Edm.String"/>

<Property Name="Positionadvenco" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" Nullable="false" Type="Edm.String"/>

<Property Name="Outcome" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" Nullable="false" Type="Edm.String"/>

<Property Name="Plantitem" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" Nullable="false" Type="Edm.String"/>

<Property Name="Progress" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" Nullable="false" Type="Edm.String"/>

<Property Name="Status" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" Nullable="false" Type="Edm.String"/>

<Property Name="Targetquantity" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="INT" Nullable="false" Type="Edm.Int32"/>

<Property Name="Targettime" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" Nullable="false" Type="Edm.String"/>

<Property Name="Unit" sap:filterable="false" sap:sortable="false" sap:updatable="false" sap:creatable="false" sap:label="Char" MaxLength="60" Nullable="false" Type="Edm.String"/>

</EntityType>


<EntityContainer Name="ZORDER_SRV_Entities" sap:supported-formats="atom json xlsx" m:IsDefaultEntityContainer="true">

<EntitySet sap:content-version="1" Name="OrderSet" sap:updatable="false" sap:creatable="false" sap:pageable="false" sap:deletable="false" EntityType="ZORDER_SRV.Order"/>

</EntityContainer>

<atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="http://vhcala4hci.wdf.sap.corp:50000/sap/opu/odata/sap/ZORDER_SRV/$metadata" rel="self"/>

<atom:link xmlns:atom="http://www.w3.org/2005/Atom" href="http://vhcala4hci.wdf.sap.corp:50000/sap/opu/odata/sap/ZORDER_SRV/$metadata" rel="latest-version"/>

</Schema>

</edmx:DataServices>

</edmx:Edmx>

但在这种情况下,lv_ORDERADVENCOlv_POSITIONADVENCO 似乎没有任何价值。这导致了sy-subrc = 4,因此失败了。

更新: 所以我现在用:

/sap/opu/odata/SAP/ZORDER_RFC_SRV_01/OrderSet(Orderadvenco='10100',Positionadvenco='10')

...但得到错误:

<code>/IWBEP/CX_MGW_BUSI_EXCEPTION</code>

<message>Resource not found for segment 'Order'</message>

我的 Orderadvenco 和 Positionadvenco 似乎也没有捕捉到我试图传递的值...

PS:我也实现了

/sap/opu/odata/SAP/ZORDER_SRV/OrderSet

效果很好,但有趣的是它调用了:

<id>http://vhcala4hci.wdf.sap.corp:50000/sap/opu/odata/SAP/ZORDER_SRV/OrderSet(Orderadvenco='10100',Positionadvenco='10')</id>

但是当我尝试调用该链接时,它会失败并出现与上述相同的错误。

【问题讨论】:

    标签: odata abap saprfc netweaver


    【解决方案1】:

    查看您的 $metadata 文件会发现错误。您的实体类型“Order”有两个关键属性:“Orderadvencoinput”和“Positionadvencoinput”。当尝试访问 /sap/opu/odata/sap/ZORDER_RFC_SRV/OrderSet(Orderadvencoinput='10100', Positionadvencoinput='10') 表 IT_KEY_TAB (或在您的情况下为 lt_keys)被这两个键填充。但是,您尝试从表 lt_keys 中读取的是 NAME 字段填充为“Orderadvenco”和“Positionadvenco”的行。所以两个 READ TABLES 总是会失败,因此 ls_key 仍然是初始的,因此 lv_ORDERADVENCO 和 lv_POSITIONADVENCO 是初始的。因此 SELECT 将失败并且 sy-subrc = 4。网关要做的常见事情是抛出 400 HTTP 代码,因为请求的资源 OrderSet(Orderadvencoinput='10100', Positionadvencoinput='10') 未填充(er_entity 再次出现首字母)

    您应该做的是将您的 $metadata 中的确切属性名称放入 READ TABLE 语句中。

    【讨论】:

    • 我现在更正了它,但似乎仍然无法获得我尝试传递的值...我刚刚用调试和错误更新了帖子。
    • 你能在这篇文章中更新你的 $metadata 吗?我看到一些不一致的地方。您还可以显示 lt_keys 中的内容。另一件事是您可能在错误的类中重新定义了一个方法。还请检查是否有 *DPC_EXT 类。你应该把你的重新定义放在那里。您也不需要调用 lt_keys = io_tech_request_context->get_keys( ) 因为应该有一个带有键的导入表
    • 我刚刚更新了帖子,我也发现了为什么 RFC 版本不起作用。因为调用有一个空格:/sap/opu/odata/SAP/ZORDER_RFC_SRV/OrderSet(Orderadvencoinput='10100',Positionadvencoinput='10')。但是我写的代码在lt_keys中似乎没有任何内容(图片在贴)。
    • LT_KEYS 确实有两行。这是 [2x2(68)]。前 2 告诉你它有两行。您可以双击变量 1 选项卡中的 LT_KEYS 吗?您应该会看到该表的内容 另外请检查某处是否还有 DPC_EXT 类。你应该把你的代码放在这个里面!
    • 值为: 1. ORDERADVENCO 10100; 2. 位置 ADVENCO 10; ...所以我传递给该方法的值就在那里。 DCP_EXT 存在,这就是我编写代码的地方。
    【解决方案2】:

    好的,问题是尽管有电话:

    OrderSet(Orderadvenco='10100',Positionadvenco='10')
    

    lt_keys 包含:

    1. ORDERADVENCO 10100

    2. POSITIONADVENCO 10

    所以我不得不改变:

    READ TABLE lt_keys with key name = 'Orderadvenco' into ls_key.
    READ TABLE lt_keys with key name = 'Positionadvenco' into ls_key.
    

    到:

    READ TABLE lt_keys with key name = 'ORDERADVENCO' into ls_key.
    READ TABLE lt_keys with key name = 'POSITIONADVENCO' into ls_key.
    

    其他错误:

    OrderSet(Orderadvenco='10100',Positionadvenco='10') - 我必须删除空间。

    谢谢@mash

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 2011-04-12
      • 2010-11-16
      相关资源
      最近更新 更多