2017-03-03 6 views
1

私はUI5を使用してViewSettingsDialogコントロールを使用してテーブルとソート/グループ/フィルタをレンダリングしています。 私のODataサービスには、「プロジェクト」エンティティセットがあり、それぞれに顧客が関連付けられています(1人の顧客が複数のプロジェクトを持つことができます)。 一方、私は "顧客"エンティティセットを持っています。それは、1000 +エントリの顧客を示していますが、すべてのプロジェクトが進行中ではないので、ViewSettingsFilterItemのアイテム集約には使用できません。SAPUI5集約バインディングで重複を削除する

顧客がViewSettingsDialogフィルタを使用できるようにするには、ViewSettingsFilterItemのアイテムaggragetionの「プロジェクト」エンティティセットを渡します。しかし、複数のプロジェクトが継続している顧客は、複数回出現します。

複数のプロジェクトを持つ顧客に一度だけ表示されるようにバインドを制限するにはどうすればよいですか?ノースウィンドを使用して

チェックこのスニペット: https://jsbin.com/sakurisoxo/edit?html,output

あなたがフィルターに行けば、あなたは彼らが

は、[コード]

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <title>SAPUI5</title> 
     <script src="https://sapui5.hana.ondemand.com/resources/sap-ui-core.js" 
      id="sap-ui-bootstrap" 
      data-sap-ui-theme="sap_belize" 
      data-sap-ui-libs="sap.m" 
      data-sap-ui-bindingSyntax="complex" 
      data-sap-ui-compatVersion="edge" 
      data-sap-ui-preload="async"></script> 
      <!-- use "sync" or change the code below if you have issues --> 

     <!-- XMLView --> 
     <script id="myXmlView" type="ui5/xmlview"> 
      <mvc:View 
       controllerName="MyController" 
       xmlns="sap.m" 
       xmlns:core="sap.ui.core" 
       xmlns:mvc="sap.ui.core.mvc"> 

       <Table 
        id="myTable" 
        growing="true" 
        growingThreshold="25" 
        growingScrollToLoad="true" 
        busyIndicatorDelay="0" 
        items="{/Orders}"> 
        <headerToolbar> 
         <Toolbar> 
          <Title text="Orders of ALFKI"/> 
          <ToolbarSpacer/> 
          <Button text="Click here for filters" press="onDialogOpen"/> 
         </Toolbar> 
        </headerToolbar> 
        <columns> 
         <Column> 
          <Text text="OrderID"/> 
         </Column> 
         <Column> 
          <Text text="CustomerID"/> 
         </Column> 
        </columns> 
        <items> 
         <ColumnListItem> 
          <cells> 
           <Text text="{OrderID}"/> 
           <Text text="{CustomerID}"/> 
          </cells> 
         </ColumnListItem> 
        </items> 
       </Table> 

      </mvc:View> 
     </script> 

     <!-- XML Fragment --> 
     <script id="myXMLFragment" type="ui5/fragment"> 
      <core:FragmentDefinition 
       xmlns="sap.m" 
       xmlns:core="sap.ui.core"> 
       <ViewSettingsDialog 
        confirm="onTableSettingsConfirm"> 
        <sortItems> 
         <ViewSettingsItem text="OrderID" key="OrderID" selected="true" /> 
        </sortItems> 
        <filterItems> 
         <ViewSettingsFilterItem 
          text="CustomerID" 
          key="CustomerID" 
          multiSelect="true" 
          items="{path: '/Orders', sorter: [{path: 'CustomerID', descending: false}]}"> 
          <items> 
           <ViewSettingsItem text="{CustomerID}" key="{CustomerID}" /> 
          </items> 
         </ViewSettingsFilterItem> 
        </filterItems> 
       </ViewSettingsDialog> 
      </core:FragmentDefinition> 
     </script> 

     <script> 
      sap.ui.getCore().attachInit(function() { 
       "use strict"; 

       //### Controller ### 
       sap.ui.define([ 
        "sap/ui/core/mvc/Controller", 
        "sap/ui/model/odata/v2/ODataModel" 
       ], function (Controller, ODataModel) { 
        "use strict"; 

        return Controller.extend("MyController", { 

         _oTableSettingsDialog: null, 

         onInit : function() { 
          this.getView().setModel(
           new ODataModel("https://cors-anywhere.herokuapp.com/services.odata.org/V2/Northwind/Northwind.svc/") 
          ); 
         }, 

         onDialogOpen: function(){ 
          if (!this._oTableSettingsDialog) { 
           this._oTableSettingsDialog = sap.ui.xmlfragment({ 
            fragmentContent : jQuery("#myXMLFragment").html() 
           }); 
           this._oTableSettingsDialog.setModel(this.getView().getModel()); 
          } 
          this._oTableSettingsDialog.open(); 
         } 

        }); 
       }); 

       //### THE APP: place the XMLView somewhere into DOM ### 
       sap.ui.xmlview({ 
        viewContent : jQuery("#myXmlView").html() 
       }).placeAt("content"); 

      }); 
     </script> 

    </head> 

    <body class="sapUiBody"> 
     <div id="content"></div> 
    </body> 
</html> 
事前

にありがとうを繰り返しているかを確認することができます

+0

お客様IDをプロジェクト名でグループ化できないのはなぜですか?この方法では、プロジェクトごとに別々のセクションを持つことができ、プロジェクトごとに顧客IDが表示されます。または顧客IDでグループ化することもできます。これが役に立ったら教えてください。 https://sapui5.hana.ondemand.com/#docs/guide/c4b2a32bb72f483faa173e890e48d812.html –

+0

こんにちはRahul、私は(スニペットではなく)私のアプリでgoupingを実装しますが、とにかく私はフィルタ機能を実装する必要があります。 多くのエントリ(7列) を持つ未処理の応答テーブルをレンダリングし、**並べ替えとグループ化とフィルタリング**の列の値を提供する必要があります そのため、私はViewSettingsDialogコントロールhttps://sapui5.hana.ondemand.comを使用しています/explored.html#/sample/sap.m.sample.TableViewSettingsDialog/preview グループ化と並べ替えはスムーズに機能していますが、フィルタに記載されている問題があります。 –

+0

こんにちはRafael、私はあなたが[sap.ui.table.Table](https://openui5.hana.ondemand.com/explored.html#/entity/sap.ui.table 。テーブル/サンプル)。後者の制御は、膨大な量のデータを処理するためのものではなく、7列(特にIE上)のパフォーマンスに大きな問題があります。私は痛みを伴って経験によってそれを学ばなければならなかった。 – boghyon

答えて

0

多くのプロジェクトエントリがある場合は、クライアント側で重複を手動で削除するのはおそらく最適です。また、V2からのfilterクエリは、もう一方のV4がサポートする拡張されたコレクション内のプロパティの検索をサポートしていません。

バインディングパスで顧客(プロジェクトではなく)を使用して、custom queryを定義してバックエンドに要件を知らせて、1つ以上のプロジェクトを持つ顧客のみを取得することをお勧めします。

+1

最後に、説明したようなことをしました。 ここで[Snippet](https://jsbin.com/coraperisa/edit?html,output) –

0

フィルター値を顧客エンティティーセットに直接バインドしない特別な理由はありますか?そうすれば、各顧客は一度しか現れません。残念なことに、OData v2では、注文のない顧客を箱から取り除くことはできません。そのためには、バックエンドから(ビューに基づいて)特殊なエンティティセットを取得する必要があります。

逆に、重複を直接削除するフィルタはありません。あなたは、グループ化を使っていくつかの回避策を試みることができます(私はあなたがこれを達成できるとは思っていません)。JSONモデル内のすべてのデータを読み込み、手動でフィルタリングするか、ODataリスト(実際にはすべての注文を読む - >本当に完璧な) "クライアント"にバインディング操作モードを適用し、重複を削除するカスタムフィルタリング機能を実装します。

+0

ありがとうSerban! これは私が思った...「一意の」呼び出しはODataサービスに対して実行できないようです。 私はクライアント側でJSを使用してそれらをフィルタリングすることを考えていますが、同じ顧客と多くのエントリ(Northwind Ordersエンティティセットのような)があると問題が発生します...私はすべてのエントリを取得していないので、私はちょうど顧客の一部を持っています... –

0

顧客でソートしてから、テーブルでCustomerId列を最初に配置し、次にOrderId列を配置すると、顧客列に<Column mergeDuplicates="true" ... />属性を使用できます。

これにより、お客様の識別子が繰り返されるのを防ぐことができます。これがあなたの意図だったのでしょうか?

+0

こんにちはBernand、ありがとう、しかし問題はテーブルにありません。テーブルは大丈夫ですが、顧客は繰り返しています。 問題は** ViewSettingsFilterItem ** items aggregationにあります。そのため、フィルタを選択すると、同じ顧客に複数のチェックボックスが表示されます –

関連する問題