SAP OData(二)Association

发布时间:2024年01月12日

Entity之间用Association来表示关联关系,可以同CDS view中的Association一起理解。

我们在上次已经建好实体Item的基础上,再建一个Header,其方法的重写也参考Item即可,然后开始本篇的探索。

一,构建Association
1.1 新建Association

右键Association新建,弹出如下窗口,填入关联名称。

上图红框:左右EntityType填入两个关联的Entity,然后是两个Entity的关联基数。

上图紫框:勾选Create Navigation Property会为EntityType生成一个NavigationProperty(如图3粉框),表示了entity之间的导航路径(详见第二节),如左紫框表示了Header到Item的导航,右紫框表示Item到Header的导航。我们可以只勾选一边,代表只建立单侧的导航。

1.2 指定关联字段

指定两个Entity关联的字段,类似两个表的join字段。注意匹配的字段其数据类型也要一致,且不能使用数量金额作为关联字段。

1.3 Association生成对象

在Association保存之后会生成一些新的对象,如下图内容:

NavigationProperties:这个很重要,表示了entity之间是否能够导航,

Association:展示了关联名,以及关联字段

Association Set:似乎没什么要注意的

二,测试与报文分析
2.1 读取Header实体

使用Postman测试一下获取Header的实体,得到atom格式报文如下,我精简了一些element和attribute。

<?--请求地址 https://{{host}}:{{port}}/sap/opu/odata/sap/Y_TEST_ODATA4_SRV/HeaderSet('4500000001')-->
<?xml version="1.0" encoding="utf-8"?>
<entry xml:base="https://xxxxxx:44301/sap/opu/odata/sap/Y_TEST_ODATA4_SRV/">
    <category term="Y_TEST_ODATA4_SRV.Header"/>
    <link href="HeaderSet('4500000001')" rel="self" title="Header"/>
    <link href="HeaderSet('4500000001')/Header_To_Item" title="Header_To_Item"/>
    <content type="application/xml">
        <m:properties>
            <d:DOCNO>4500000001</d:DOCNO>
            <d:VENDOR>XA016</d:VENDOR>
        </m:properties>
    </content>
</entry>

我们在请求地址中指明了entity的key,所以会执行get_entity方法。

从报文可以看到有两个Link:?

HeaderSet('4500000001')" />

这是一个自连接指向Entity自身,每个Entity都会包含自连接,href是相对路径加上服务的前置路径就能得到指向Entity的完整URL

https://xxxxxx:44301/sap/opu/odata/sap/Y_TEST_ODATA4_SRV/HeaderSet('4500000001')

HeaderSet('4500000001')/Header_To_Item" />

由Association生成的连接,导航到相关的EntitySet,那么本例根据Header导航到行项目的URL就是

https://xxxxxx:44301/sap/opu/odata/sap/Y_TEST_ODATA4_SRV/HeaderSet('4500000001')/Header_To_Item

如果Header还有到其他实体的导航,比如到供应商主数据,就会有多个导航Link

2.2 使用Header到Item的导航

在上一步我们知道了Header到Item的导航地址,我们放到postman中测试一下。

在报文中我们看到返回的就是Item内容,而每个Item中又包含一个link可以导航到其Header。注意:如果图1右紫框没有勾选,那么这里就没有导航到Header的link。

由于图1中维护的关联基数是1:N,所以在导航到item时执行的是item的get_entityset方法,如果是1:1则执行的是get_entity方法

2.3 指令$expand

https://{{host}}:{{port}}/sap/opu/odata/sap/Y_TEST_ODATA4_SRV/HeaderSet('4500000001')?$expand=Header_To_Item

如上查询指令:也是利用导航来关联entity的,与2.2小节导航不同的是该指令返回的报文同时包含了Header和Item两个实体,参考下一篇笔记的$expand

文章来源:https://blog.csdn.net/hustliangchen/article/details/135552096
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。