如何在sap.ui.comp.smarttable.SmartTable中显示复杂的OData属性类型?

时间:2017-01-04 17:26:44

标签: annotations odata sapui5

我正在使用SAPUI5应用程序,并希望使用sap.ui.comp.smarttable.SmartTable显示数据记录列表。

摆弄Smart Table samples from the SAPUI5 Explored App我能够针对模拟服务器提供的OData服务运行智能表。

XML视图中的智能表

<smartTable:SmartTable tableType="ResponsiveTable"
    entitySet="RecordSet" enableAutoBinding="true" />

metadata.xml的相应行

<Schema Namespace="my.namespace" sap:schema-version="1" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">

    <ComplexType Name="ShortReference">
        <Property Name="Type" Type="Edm.String" Nullable="false" sap:label="Reference type" />
        <Property Name="Key" Type="Edm.String" Nullable="false" sap:label="Reference key" />
    </ComplexType>

    <EntityType Name="Record" sap:label="Record" sap:content-version="1">
        <Key>
            <PropertyRef Name="RecordID" />
        </Key>
        <Property Name="RecordID" Type="Edm.String" Nullable="false" sap:label="Record ID" sap:creatable="false" sap:updatable="false" />
        <Property Name="ShortReference" Type="my.namespace.ShortReference" />
    </EntityType>

    <EntityContainer Name="my.namespace.Entities" m:IsDefaultEntityContainer="true" sap:supported-formats="atom json xlsx">
        <EntitySet Name="RecordSet" EntityType="my.namespace.Record" />
    </EntityContainer>

    <!-- Default columns shown by Smart Table -->
    <Annotations Target="my.namespace.Record" xmlns="http://docs.oasis-open.org/odata/ns/edm">
        <Annotation Term="com.sap.vocabularies.UI.v1.LineItem">
            <Collection>
                <Record Type="com.sap.vocabularies.UI.v1.DataField">
                    <PropertyValue Property="Value" Path="RecordID" />
                </Record>
                <!-- The following doesn't work - it won't be shown in a Smart Table column -->
                <Record Type="com.sap.vocabularies.UI.v1.DataField">
                    <PropertyValue Property="Value" Path="ShortReference/Key" />
                </Record>
                <Record Type="com.sap.vocabularies.UI.v1.DataField">
                    <PropertyValue Property="Value" Path="ShortReference/Type" />
                </Record>
            </Collection>
        </Annotation>
    </Annotations>
</Schema>

正如您所看到的,数据记录具有类型为my.namespace.ShortReference的复杂属性。我希望这两个属性在智能表中显示为单独的列,以便能够过滤它们。

我使用<customData>聚合确实没有成功,如下所示, 但由于我拥有的不仅仅是这个复杂的实体(包括一个复杂的实体和另一个复杂的实体),我正在寻找一种更简单,更健壮的方法来实现这一目标。此外,使用<customData> p13n对话框​​中的过滤功能有限(无法使用containsstarts with等过滤器。)

包含自定义数据的智能表

<smartTable:SmartTable tableType="ResponsiveTable"
    entitySet="RecordSet" enableAutoBinding="true" >
    <Table>
        <!-- http://stackoverflow.com/questions/32114675/sapui5-smart-table-how-to-inject-my-own-column-into-smart-table-default-colum -->
        <!-- Smart Table Developer Guide: https://sapui5.hana.ondemand.com/#docs/guide/bed8274140d04fc0b9bcb2db42d8bac2.html -->
        <columns>
            <!-- Reference -->
            <Column>
                <customData>
                    <core:CustomData
                        key="p13nData"
                        value='\{
                            "columnKey":        "ReferenceType",
                            "leadingProperty":  "ShortReference/Type",
                            "sortProperty":     "ShortReference/Type",
                            "filterProperty":   "ShortReference/Type",
                            "columnIndex":      "9"
                        }' />
                </customData>
                <Label text="Reference type"/>
            </Column>
            <Column>
                <customData>
                    <core:CustomData
                        key="p13nData"
                        value='\{
                            "columnKey":        "ReferenceKey",
                            "leadingProperty":  "ShortReference/Key",
                            "sortProperty":     "ShortReference/Key",
                            "filterProperty":   "ShortReference/Key",
                            "columnIndex":      "10"
                        }' />
                </customData>
                <Label text="Reference key"/>
            </Column>
        </columns>
        <items>
            <ColumnListItem>
                <cells>
                    <Text text="{ShortReference/Type}" />
                    <Text text="{ShortReference/Key}" />
                </cells>
            </ColumnListItem>
        </items>
    </Table>
</smartTable:SmartTable>

那么,这有可能实现吗?或者我是否必须展平我的OData实体?

如果更容易,我也会更改为正常sap.m.Table。我选择了智能表,因为它的排序,过滤,分组能力和变体管理(我需要所有这些)。

1 个答案:

答案 0 :(得分:0)

我已经搜索了一段时间的解决方案,但我还没有找到符合上述实体结构的令人满意的解决方案。

因此,我必须回答以下问题

  • 那么,这甚至可以实现吗? No。
  • 或者我是否必须展平我的OData实体?是。

我的列表概述了导航到详细信息页面的特定记录集。在我的概述列表中,我不需要每个属性,因此我创建了一个新实体RecordOverview来运行我的智能表。

metadata.xml (仅显示添加和更改)

<Schema Namespace="my.namespace" sap:schema-version="1" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">

    ...

    <EntityType Name="RecordOverview" sap:label="Record" sap:content-version="1">
        <Key>
            <PropertyRef Name="RecordID" />
        </Key>
        <Property Name="RecordID" Type="Edm.String" Nullable="false" sap:label="Record ID" sap:creatable="false" sap:updatable="false" />
        <Property Name="ReferenceKey" Type="Edm.String" Nullable="false" sap:label="Reference key" />
    </EntityType>

    <EntityContainer Name="my.namespace.Entities" m:IsDefaultEntityContainer="true" sap:supported-formats="atom json xlsx">
        <EntitySet Name="RecordSet" EntityType="my.namespace.Record" />
        <EntitySet Name="RecordOverviewSet" EntityType="my.namespace.RecordOverview" />
    </EntityContainer>

    <!-- Default columns shown by Smart Table -->
    <Annotations Target="my.namespace.RecordOverview" xmlns="http://docs.oasis-open.org/odata/ns/edm">
        <Annotation Term="com.sap.vocabularies.UI.v1.LineItem">
            <Collection>
                <Record Type="com.sap.vocabularies.UI.v1.DataField">
                    <PropertyValue Property="Value" Path="RecordID" />
                </Record>
                <Record Type="com.sap.vocabularies.UI.v1.DataField">
                    <PropertyValue Property="Value" Path="ReferenceKey" />
                </Record>
                ...
            </Collection>
        </Annotation>
    </Annotations>
</Schema>

然而,一个不错的(副作用)效果是我不再需要在XML视图中指定列。

XML视图

<smartTable:SmartTable entitySet="RecordOverviewSet" enableAutoBinding="true">
    <Table>
        <items>
            <ColumnListItem vAlign="Middle" type="Navigation" press="onListItemPressed" />
        </items>
    </Table>
</smartTable:SmartTable>