2015-05-28 2 views
2

Мы должны связать URL OData с UI5 в ODataModel

https://sapes1.sapdevcenter.com/sap/opu/odata/sap/ZCD204_EPM_DEMO_SRV/BusinessPartners ('0100000000')/SalesOrders /? $ Расширяющие = SalesOrderItems

Мы можем связать элементы корневого уровня, которые принадлежат для каждого SalesOrder. Однако мы сталкиваемся с проблемой в случае привязки данных от SalesOrderItems, которые являются дочерними до SalesOrder.

Мы не можем привязывать поля SalesOrderItems к любому из наших объектов. Мы пробовали использовать {SalesOrderItems/results/QuantityUnit}, {SalesOrderItems/QuantityUnit} без большой удачи.

Можете ли вы предложить какие-либо альтернативы?

Существует 1..m мощность между SalesOrder и SalesOrderItem

// model of oData 

var model = sap.ui.model.odata.ODataModel("proxy/https/sapes1.sapdevcenter.com/sap/opu/odata/sap/ZCD204_EPM_DEMO_SRV/",true,'username','password'); 
//app is defined in index.html here we are setting model to the app. 

App.setModel(model); 

// create a table 

var pastOrder_S3= new sap.m.Table("PastOrder_S3",{ 
      inset:true, 
      //visibleRowCount: 2, 
      firstVisibleRow: 2, 
      fixedColumnCount: 2, 
      columns:[ 
        new sap.m.Column({ 
         header:new sap.m.Label("item").setText("Items"), 
         hAlign:"Left", 
         width:"20px", 
         demandPopin:true, 
         popinDisplay:"Block", 
         minScreenWidth: sap.m.ScreenSize.Medium 
        }), 
        new sap.m.Column({ 
         header:new sap.m.Label("orderdetail").setText("OrderDetails"), 
         hAlign:"Left", 
         width:"200px", 
         demandPopin:true, 
         popinDisplay:"Block", 
         minScreenWidth: sap.m.ScreenSize.Medium 
        }) 
}); 

//create a template to bind into the table using model. 

var oTemplate_S3= new sap.m.ColumnListItem({ 
     type: sap.m.ListType.Active, 
     cells: [ 

     new sap.m.Text({ 
     text:"{ProductName} \n {ProductID}" 
       }),  

      new sap.m.Text({ 
       text:"OrderId: {SalesOrderID} \n {DeliveryDate} \n {TotalSum}{Currency}" 
       })    
      ] 
    }); 

// bind into the table. 
`pastOrder_S3.bindAggregation("items","BusinessPartners('BusinessPartnerId')/SalesOrders/?$expand=SalesOrderItems",oTemplate_S3);` 

Здесь мы имеем ребенка свойство с именем 'SalesOrderItems' мы должны прочитать свойства внутри salesorderitems.

+0

Просьба поделиться с вами кодом, который вы используете для установки модели OData. – Timo

ответ

6

При привязке агрегации к коллекции OData параметр expand (и любые другие параметры в этом отношении) должен быть предоставлен отдельно, а не частью URI коллекции.

В двух словах, вы должны сделать следующее:

oTable.bindAggregation("items", { 
    path: "/BusinessPartners('BusinessPartnerId')/SalesOrders", 
    template: oTemplate, 
    parameters: { 
     expand: "SalesOrderItems" 
    } 
}); 

Отъезд bindAggregation и ODataListBinding constructor документацию для получения более подробной информации.

Другая проблема, с которой вы столкнетесь, заключается в том, что у вас есть мощность 1: n между SaleOrder и SaleOrderItems. Это означает, что вы сможете использовать это свойство навигации для привязки агрегации, а не непосредственно к свойству (так что вам нужно иметь что-то вроде таблицы внутри другой таблицы).

Вам нужно будет четко определить, что должно отображаться в SaleOrderItems, чтобы иметь возможность «сгладить» его (например, выполнить агрегацию или выбрать первый вариант и т. Д.). Это, скорее всего, подразумевает, что изменения должны быть внесены в службу OData или вам придется использовать либо пользовательский элемент управления в UI5, либо JSONModel вместо/вместе с OData.

Смежные вопросы