CAP-不能在ON条件的定义中使用非托管关联

2020-08-14 04:14发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

实现CAP应用程序,我具有以下数据模型:

实体驱动程序:托管,cuid {
     seqID:整数;
     firstName:字符串;
     ...
     车辆:许多DriverVehicles的关联
                    在cars.driver = $ self;
 }

 实体车辆:托管,液体{
     seqID:整数;
     numberPlate:字符串;
     ...
     驾驶员:与许多DriverVehicles的关联
                     在drivers.vehicle = $ self;
 }

 实体DriverVehicles {
     关键驱动程序:与驱动程序的关联;
     关键车辆:车辆协会;
 }
 

现在,我想定义一个视图,以便可以在搜索驱动程序时使用它。 在这里,我还需要能够通过车辆ID进行搜索。 因此,我具有以下视图定义:

查看驱动程序搜索为
      从驱动程序中选择
      左外连接DriverVehicles
        在Drivers.ID = DriverVehicles.driver.ID上
      左外连接车辆
        在Vehicles.ID = DriverVehicles.vehicle.ID上
      {
        concat(Drivers.ID,Installations.ID)作为recordID:字符串,
        键" ABC"作为键:字符串,
        Drivers.ID作为driverID,
        Drivers.firstName,
        ...
        Vehicles.ID作为vehicleID,
        Vehicles.numberPlate
     };
 

稍作调整*,以上内容即可在SQLite中编译并正常运行(几乎**)。 但是,在将cds部署到HANA时,会引发错误消息:

 ...
 错误:com.sap.hana.di.cds:无法在打开条件的定义中使用非托管关联
 ... 

现在,检查用于多对多关联的CAP文档 ,以上两个似乎是托管关联。 那么,有什么想法可以支持上述用例,但如果我不能正确设置呢?

问候

Serdar

* SQLite不支持concat(); 因此,我将行更改为:

 ...
 Drivers.ID ||  Installations.ID作为recordID:字符串,
 ... 

**为简短起见,如果HANA也出现此问题,我将另开一篇文章

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

实现CAP应用程序,我具有以下数据模型:

实体驱动程序:托管,cuid {
     seqID:整数;
     firstName:字符串;
     ...
     车辆:许多DriverVehicles的关联
                    在cars.driver = $ self;
 }

 实体车辆:托管,液体{
     seqID:整数;
     numberPlate:字符串;
     ...
     驾驶员:与许多DriverVehicles的关联
                     在drivers.vehicle = $ self;
 }

 实体DriverVehicles {
     关键驱动程序:与驱动程序的关联;
     关键车辆:车辆协会;
 }
 

现在,我想定义一个视图,以便可以在搜索驱动程序时使用它。 在这里,我还需要能够通过车辆ID进行搜索。 因此,我具有以下视图定义:

查看驱动程序搜索为
      从驱动程序中选择
      左外连接DriverVehicles
        在Drivers.ID = DriverVehicles.driver.ID上
      左外连接车辆
        在Vehicles.ID = DriverVehicles.vehicle.ID上
      {
        concat(Drivers.ID,Installations.ID)作为recordID:字符串,
        键" ABC"作为键:字符串,
        Drivers.ID作为driverID,
        Drivers.firstName,
        ...
        Vehicles.ID作为vehicleID,
        Vehicles.numberPlate
     };
 

稍作调整*,以上内容即可在SQLite中编译并正常运行(几乎**)。 但是,在将cds部署到HANA时,会引发错误消息:

 ...
 错误:com.sap.hana.di.cds:无法在打开条件的定义中使用非托管关联
 ... 

现在,检查用于多对多关联的CAP文档 ,以上两个似乎是托管关联。 那么,有什么想法可以支持上述用例,但如果我不能正确设置呢?

问候

Serdar

* SQLite不支持concat(); 因此,我将行更改为:

 ...
 Drivers.ID ||  Installations.ID作为recordID:字符串,
 ... 

**为简短起见,如果HANA也出现此问题,我将另开一篇文章

付费偷看设置
发送
4条回答
粗暴的香蕉
1楼 · 2020-08-14 04:33.采纳回答

你好

由于cds-compiler将所有托管关联都转换为非托管关联,因此您收到了错误消息,即它添加了打开条件。 您可以通过直接使用关联来避免此问题,而不是通过JOIN重建关系:

//使用已建立的关系得到相同的结果
 查看DriverSearchAssocs(从Drivers中选择){
   键" ABC"作为键:字符串,
   ID作为驱动程序ID,
   Vehicles.vehicle.ID作为vehicleID
 };


//与您的观点相似
 查看DriverSearchJoins为
      从驱动程序中选择
      左外连接DriverVehicles
        在Drivers.ID = DriverVehicles.driver.ID上
      左外连接车辆
        在Vehicles.ID = DriverVehicles.vehicle.ID上
      {
        键" ABC"作为键:字符串,
        Drivers.ID作为driverID,
        Vehicles.ID作为vehicleID,
     }; 

最好的问候

Simon

当学会了学习
2楼-- · 2020-08-14 04:34

Simon嗨

谢谢您的回答。 这样就可以解决问题。

SAP小菜
3楼-- · 2020-08-14 04:28

根据您要执行的操作,可以将视图基于DriverVehicle表,然后可以进行内部联接(假定删除/插入) 正常工作):

 ...作为DriverVehicles上的选择...内部联接驱动程序...内部联接Vehicles 

应该适合搜索。

出于纯粹的显示目的,我仅使用三个表的直接性作为服务中的投影,因此odata这样的调用将为您提供所有必需的信息

 .../srv/Drivers?$ expand = vehicles($ expand = vehicle)

和在ui5上下文中的绑定,像这样的简单工作(粗略的例子)

 <列表项= {/Driver(123)/车辆}>
     
 
 
lukcy2020
4楼-- · 2020-08-14 04:19

您好Sergei

感谢您的建议。 但是,我也需要让驾驶员没有车辆。 这就是为什么它必须以Drivers开头并且必须进行外部联接的原因。

一周热门 更多>