Отображение связи "один ко многим" с аннотациями 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>

Надеюсь, это решит вашу проблему. Если у вас есть вопросы, не стесняйтесь спросить.

Другие вопросы по тегам