0

我尝试用 SAP cap 做一个数据库项目。我想显示与父实体关联的所有实体。如果协会是一对一的,它工作得很好。但如果它是一对多,它不会显示任何东西。

--我有以下架构定义:

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显示在列表或类似的东西中?
如前所述,如果我将模式定义“与多个关联”更改为“与一个关联”,它会起作用。但我希望它关联多个实体。

4

1 回答 1

0

如果您使用的是 Fiori Elements List Report Object Page 模板,我认为您只能使用 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 服务创建了一个工作示例,使用列表视图的客户实体和详细视图的表中的订单实体。您可以通过使用 OData 服务 URLhttps://services.odata.org/Northwind/Northwind.svc/和主实体运行 Fiori List Report Object Page 向导来重新创建示例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>

我希望这能解决你的问题。如果您有任何问题随时问。

于 2021-04-09T09:04:42.230 回答