Отображение связи "один ко многим" с аннотациями SAP Fiori в CAP
Я пытаюсь сделать проект БД с крышкой SAP. Я хочу отобразить все объекты, связанные с родительским объектом. Если объединение один на один, все работает нормально. Но если это один ко многим, он ничего не отображает.
- У меня следующее определение схемы:
entity Company{
key ID : Integer @title: 'Company ID';
cName : String @title: 'Company name';
pers: Association to many Person on pers.comp = $self; //association to one works
}
entity Person{
key ID : Integer @title: 'ID';
pName: String @titel: 'Name';
comp: Association to Company;
}
--И следующие аннотации fiori:
annotate Admin.Company with @(
UI.LineItem:[
{$Type: 'UI.DataField', Value: cName},
],
UI.HeaderInfo:{
TypeName: 'Company',
TypeNamePlural: 'Companys'
},
);
//Details view:
annotate Admin.Company with @(
UI: {
HeaderInfo: {
Description: {Value: ID}
},
HeaderFacets: [
{$Type: 'UI.ReferenceFacet', Target: '@UI.FieldGroup#Comp'},
],
Facets: [
{$Type: 'UI.ReferenceFacet', Target: '@UI.FieldGroup#Pers'}
],
FieldGroup#Comp: {
Data: [
{Value: cName},
]
},
FieldGroup#Pers: {
Data: [
{Value: pers.pName},
]
},
});
Служба администратора - это просто проекция на данные сущности.
Кто-нибудь знает, что мне нужно изменить, чтобы получить
pers.Name
отображается в списке или что-то в этом роде?
Как уже упоминалось, если я изменю в определении схемы «ассоциация со многими» на «ассоциация с одним», это сработает. Но я хочу, чтобы с ним было связано более одного объекта.
1 ответ
Если вы используете шаблон страницы объекта отчета Fiori Elements List, я думаю, вы можете использовать только ассоциацию 1:1. Это предполагаемый дизайн плана этажа (Список → Деталь). Как Fiori Elements узнать, какие из «многих» элементов пользователя должны быть привязаны к одному подробному представлению.
Однако то, что вы можете и, вероятно, захотите сделать, — это привязать подробное представление к выбранному элементу компании и создать группу полей. Там вы можете отобразить таблицу, которая относится к другому объекту. Итак, вы держите свой
schema.cds
как сейчас, но измените свой
annotation.cds
:
annotate Admin.Company with @(
UI: {
// columns of the list view
LineItem:[
{$Type: 'UI.DataField', Value: cName},
],
// title (singular/plural) of the list view and description of the detail view
HeaderInfo:{
TypeName: 'Company',
TypeNamePlural: 'Companies',
Description: {Value: ID}
},
// facet for the person table
HeaderFacets: [
{$Type: 'UI.ReferenceFacet', Target: 'Person/@UI.LineItem'}
]
);
annotate Admin.Person with @(
// person table (only displayed in detail view) with columns
UI.LineItem: [
{$Type: 'UI.DataField', Value: 'comp/cName'},
{$Type: 'UI.DataField', Value: 'pName'}
]);
Возможно, приведенный выше код не работает сразу, потому что я его не тестировал. Но я создал рабочий пример со службой Northwind OData V2, используя сущность клиента для представления списка и сущность заказа в таблице в подробном представлении. Вы можете воссоздать пример, запустив мастер страницы объекта отчета списка Fiori с URL-адресом службы OData.
https://services.odata.org/Northwind/Northwind.svc/
и главное существо
Customer
. Когда генерация проекта завершена, вы можете заменить содержимое
annotation.xml
со следующим:
<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/Common.xml">
<edmx:Include Namespace="com.sap.vocabularies.Common.v1" Alias="Common" />
</edmx:Reference>
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/UI.xml">
<edmx:Include Namespace="com.sap.vocabularies.UI.v1" Alias="UI" />
</edmx:Reference>
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/Communication.xml">
<edmx:Include Namespace="com.sap.vocabularies.Communication.v1" Alias="Communication" />
</edmx:Reference>
<edmx:Reference Uri="/Northwind/Northwind.svc/$metadata">
<edmx:Include Namespace="NorthwindModel" />
<edmx:Include Namespace="ODataWebV3.Northwind.Model" />
</edmx:Reference>
<edmx:DataServices>
<Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="local">
<Annotations Target="NorthwindModel.Customer">
<Annotation Term="UI.LineItem">
<Collection>
<Record Type="UI.DataField">
<PropertyValue Property="Value" Path="CompanyName" />
</Record>
</Collection>
</Annotation>
<Annotation Term="UI.Facets">
<Collection>
<Record Type="UI.ReferenceFacet">
<PropertyValue Property="Target" AnnotationPath="Orders/@UI.LineItem" />
</Record>
</Collection>
</Annotation>
</Annotations>
<Annotations Target="NorthwindModel.Order">
<Annotation Term="UI.LineItem">
<Collection>
<Record Type="UI.DataField">
<PropertyValue Property="Value" Path="OrderID" />
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Value" Path="Customer/CompanyName" />
</Record>
</Collection>
</Annotation>
</Annotations>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
Надеюсь, это решит вашу проблему. Если у вас есть вопросы, не стесняйтесь спросить.