首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OData:无法创建工作get_entity方法(RFC nore ABAP)

OData:无法创建工作get_entity方法(RFC nore ABAP)
EN

Stack Overflow用户
提问于 2016-09-29 11:09:04
回答 2查看 3.1K关注 0票数 2

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

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

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
<?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>

我还试图亲自编写该方法的代码:

代码语言:javascript
运行
复制
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.

元数据:

代码语言:javascript
运行
复制
<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')

..。但是得到错误:

代码语言:javascript
运行
复制
<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

它工作得很好,但有趣的是它调用:

代码语言:javascript
运行
复制
<id>http://vhcala4hci.wdf.sap.corp:50000/sap/opu/odata/SAP/ZORDER_SRV/OrderSet(Orderadvenco='10100',Positionadvenco='10')</id>

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-05 08:59:38

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

代码语言:javascript
运行
复制
OrderSet(Orderadvenco='10100',Positionadvenco='10')

lt_keys包含:

  1. ORDERADVENCO 10100
  2. POSITIONADVENCO 10

所以我不得不改变:

代码语言:javascript
运行
复制
READ TABLE lt_keys with key name = 'Orderadvenco' into ls_key.
READ TABLE lt_keys with key name = 'Positionadvenco' into ls_key.

至:

代码语言:javascript
运行
复制
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

票数 0
EN

Stack Overflow用户

发布于 2016-09-29 19:52:41

查看您的$metadata文件会发现错误。您的实体类型'Order‘有两个关键属性:'Orderadvencoinput’和'Positionadvencoinput‘。当试图访问/sap/opu/odata/sap/ZORDER_RFC_SRV/OrderSet(Orderadvencoinput='10100',时,Positionadvencoinput='10')表IT_KEY_TAB (或者在您的例子中是lt_keys)会填充这两个键。但是,您尝试从表lt_keys中读取的是填充为'Orderadvenco‘和'Positionadvenco’的名称字段的行。因此,这两个读取表总是失败的,因此ls_key仍然是初始的,因此lv_ORDERADVENCO和lv_POSITIONADVENCO是初始的。因此,SELECT将失败,subrc= 4。网关要做的一件常见事情是抛出400个HTTP,因为请求的资源OrderSet(Orderadvencoinput='10100',Positionadvencoinput='10')没有被填充(er_entity再次为首字母)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39768626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档