cancel
Showing results for 
Search instead for 
Did you mean: 

oData collection not binding to data table rows

Former Member
0 Kudos

Hi experts,

I am developing a UI5 web application which consumes oData collections.
One of these oData collection is fetched using get_expanded_entityset method which I implemented in my oData service

The get_expanded_entityset method returns both header and line items in the form of a collection of items [in my case it is called 'toPosition' navigation property]

Now I have a data table which is binded to that oData method but I am not able to get the single line items data displayed into each cell.

This is the data bind code I use

         var oModelCarrier = new sap.ui.model.odata.ODataModel('/sap/opu/odata/sap/Z_COLL_PORTAL_SRV',{json:true});

         var tableCarrier = sap.ui.getCore().byId("carrierInvoiceSub-carrierSubmission--carrierTable");

         tableCarrier.setModel(oModelCarrier);

         oModelCarrier.setCountSupported(false);

         tableCarrier.bindRows( {path: '/fileRepositorySet',

                  filters : [ new sap.ui.model.Filter("fileId", sap.ui.model.FilterOperator.EQ, fileid) ],

                  parameters : {expand: 'toPosition'}

         });

and this is the table view part

        <table:Table id="carrierTable" enableGrouping="true" enableSorting="true">

              <table:title><Textview text="Carrier Shipments [Uploaded]"></Textview></table:title>

              <table:columns>

                 <table:Column>

                     <Label text="Invoice Num."/>

                     <table:template>

                           <layout:VerticalLayout content="{toPosition/results}" xmlns:layout="sap.ui.layout">

                              <layout:content>              

                                   <TextView text = "{invoiceNumber}" />               

                               </layout:content>

                           </layout:VerticalLayout>

                     </table:template>

                 </table:Column>

                 <table:Column>

                     <Label text="Container Type"/>

                     <table:template>

                           <layout:VerticalLayout content="{toPosition/results}" xmlns:layout="sap.ui.layout">

                              <layout:content>              

                                   <TextView text = "{containerType}" />               

                               </layout:content>

                           </layout:VerticalLayout>

                     </table:template>

                 </table:Column>

              </table:columns>

         </table:Table>

and most important this is the oData response I get from my service calling get_expanded_entityset

can anyone help me how to get collection data displayed on table cells ?

it seems the response I get is correct containing all the data I need for my application [pls see attachment table_response.png ].

please be patient with me, I am learning oData / UI5 technology so I am not an expert

best regards,

claudia

Accepted Solutions (1)

Accepted Solutions (1)

saivellanki
Active Contributor
0 Kudos

Hi Claudia,

Check this working sample, where I used your JSON response: JS Bin - Collaborative JavaScript Debugging


Few points -

1. I have added comments in the code, hope you will understand.

2. Since you told me fileId is a user input, so the logic is handled such a way where the fileid is must to filter the item details.

3. In text field control placed down the table, try to provide this fileId value carrierfile20150923174312, then the table data will get updated with respect to that fileId.

Regards,

Sai Vellanki.

Former Member
0 Kudos

Hi Sai,

I've implemented your solution into my web application.

But data into table rows is still not populating with data I get correctly from oData response.

I am now debugging the code part you passed to me.

In particular I think there is something about the oItems object which is different from the one hardcoded in the aData model into your example.

See my result for oItems here

Do you think there is something wrong about this structure I get back from oData ?
Maybe the "0", "1", "2", etc. attributes are not binding the data as expected ?

Many thanks in advance,

Kind regards

claudia

saivellanki
Active Contributor
0 Kudos

Hi Claudia,

Your items is in the array structure, Set the model and bind it to table rows like below -


sap.ui.getCore().getModel().setProperty("/modelData/itemData", oItems[0]);               //Set the Model

this.getView().byId("carieerTable").bindRows({path:"/modelData/itemData"});          //Bind the Model to table rows.

Regards,

Sai Vellanki.

Former Member
0 Kudos

Sai,

Now your solution is working fine into my application case.

Data rows have been populated with items data as expected.

Really many thanks and thank you for your patiente.

I am learning SAPUI5 so I am not an expert as you are,
but at least now I begin to understand a little more reading your suggestion step by step.

Kind regards,
Claudia

Message was edited by: Claudia Bressi

saivellanki
Active Contributor
0 Kudos

Claudia,

Glad that it worked! But, I am not an expert. Me too learning like you!

Have fun with UI5 and a great day ahead.


Regards,

Sai Vellanki.

Answers (4)

Answers (4)

saivellanki
Active Contributor
0 Kudos

Claudia,

In your response, Can you please remove the URLs in ID (Since those are your internal URLs).

Thanks for providing it. I will look into this and come back to you.


Regards,

Sai Vellanki.

Former Member
0 Kudos

Thanks for the suggestion, Sai.
I have deleted all the references to any URL in the JSON response.
Now I try to code your solution to see if it works for my scenario.

In the meantime many thanks for your support,

Kind regards,

Claudia

saivellanki
Active Contributor
0 Kudos

Hi Claudia,

Also, tell me what value are you passing for 'fileid'. Is it a user input value?


tableCarrier.bindRows( {path: '/fileRepositorySet',

        filters : [ new sap.ui.model.Filter("fileId", sap.ui.model.FilterOperator.EQ, fileid) ],

        parameters : {expand: 'toPosition'}

});

Regards,

Sai Vellanki.

Former Member
0 Kudos

Yes, fileid it is a user input STRING value merged with a timestamp casted to a string too.

Anyway I have double checked this value and it is coherent with the oData service query input accepted.

Regards,

Claudia

saivellanki
Active Contributor
0 Kudos

Hi Claudia,


After when you get response in the form of JSON, you have to handle some logic.

Please check this sample - http://embed.plnkr.co/te0BbGhEm7srVYn1UgEb/preview

1. I used some what a similar model structure.

2. First time, when the page is loaded I have hard-coded the file id to 'carriersmall.xml20150917135454' which will fetch me the data for that file and bind to the table. 

3. Now, there is file id text field placed below the table, you can try giving any of the below values and hit enter. The table data will get updated with respect to fileID.


carriersmall.xml20160917135455

carriersmall.xml20140917135456

I am using the same master model which has all the data, just I'm filtering on the file id and updating the table model.


Is this what you're expecting (or) is it different?


Regards,

Sai Vellanki.

Former Member
0 Kudos

Hi Sai,

Yes, the example you provided is very similar to what I expect to get on my page
except for fileId column which I do not need to show into table.

So how can I bind correctly table rows to get data cells displayed as in your code ?

Regards,
Claudia

saivellanki
Active Contributor
0 Kudos

Claudia,

Check the code here - http://plnkr.co/edit/te0BbGhEm7srVYn1UgEb?p=info

Let me know if you have any doubts.

Regards,

Sai Vellanki.

Former Member
0 Kudos

Hi Sai,

Your solution is well-done but in my case I have an expanded entity set
so I am still not able to get data displayed into table rows.

Anyway, after I analyzed your code I do not understand the following line

sap.ui.getCore().getModel().setProperty("/modelData/masterData",aData.d.results);

Where does the 'masterData' path is coming from ?
I am not able to see this within the model located into the aData variable.

Regards,
Claudia

saivellanki
Active Contributor
0 Kudos

Hi Claudia,

I hope you're storing the data response into a JSON model.

Can you alert the response and paste the data model here, I mean to say like this -


var oModel = sap.ui.getCore().getModel().getProperty("/d/results/1");

alert(JSON.stingify(oModel));      //Alerts the Header data

var oPositionModel = sap.ui.getCore().getModel().getProperty("/d/results/1/toPosition/results");

alert(JSON.stringify(oPositionModel));     //Alerts the Item Data

Regards,

Sai Vellanki.

Former Member
0 Kudos

Hi Sai,

Here is the data response I get.

{"d":

    {"results":

        [

        "fileId":"carrierfile20150923174311",

        "recipientNumber":"recipient123",

        "invoiceNumber":"201510156836",

        "invoiceDate":"20150311",

        "invoiceCurrency":"EUR",

        "invoiceAmount":"256.77",

        "invoiceDueDate":"20151211",

        "accountNumber":"123123123",

        "countryCode":"IT",

        "taxId":"45347475756757",

        "toPosition":

        {"results":

        [

        "invoiceNumber":"201510156836","leadShipmentNumber":"1ZW19E460443751298","transactionDate":"20150216","trackingNumber":"1ZW19E460443751298","zone":"000","containerType":"PKG","quantity":"1","weight":"0.00 ","unitOfMeasure":"K","descriptionCode":"069","descriptionOfCharges":"Correzione dell'indirizzo WW Express Saver","currencyCode":"EUR","netAmount":"6.60 "},

        {

"invoiceNumber":"201510156836","leadShipmentNumber":"1ZW19E460444937710","transactionDate":"20150219","trackingNumber":"1ZW19E460444937710","zone":"000","containerType":"PKG","quantity":"1","weight":"0.00 ","unitOfMeasure":"K","descriptionCode":"9","descriptionOfCharges":"","currencyCode":"EUR","netAmount":"0.00 "},       

"invoiceNumber":"201510156836","leadShipmentNumber":"1ZW19E460444937710","transactionDate":"20150219","trackingNumber":"1ZW19E460444937710","zone":"000","containerType":"PKG","quantity":"1","weight":"0.00 ","unitOfMeasure":"K","descriptionCode":"069","descriptionOfCharges":"Correzione dell'indirizzo WW Express Saver","currencyCode":"EUR","netAmount":"6.60 "},

    "invoiceNumber":"201510156836","leadShipmentNumber":"1ZW19E460443202747","transactionDate":"20150227","trackingNumber":"1ZW19E460443202747","zone":"000","containerType":"PKG","quantity":"1","weight":"0.00 ","unitOfMeasure":"K","descriptionCode":"9","descriptionOfCharges":"","currencyCode":"EUR","netAmount":"0.00 "},

        "invoiceNumber":"201510156836","leadShipmentNumber":"1ZW19E460443202747","transactionDate":"20150227","trackingNumber":"1ZW19E460443202747","zone":"000","containerType":"PKG","quantity":"1","weight":"0.00 ","unitOfMeasure":"K","descriptionCode":"069","descriptionOfCharges":"Correzione dell'indirizzo WW Express Saver","currencyCode":"EUR","netAmount":"6.60 "},

        "invoiceNumber":"201510156836","leadShipmentNumber":"1ZW19E460445313454","transactionDate":"20150302","trackingNumber":"1ZW19E460445313454","zone":"000","containerType":"PKG","quantity":"1","weight":"0.00 ","unitOfMeasure":"K","descriptionCode":"9","descriptionOfCharges":"","currencyCode":"EUR","netAmount":"0.00 "},

        "invoiceNumber":"201510156836","leadShipmentNumber":"1ZW19E460445313454","transactionDate":"20150302","trackingNumber":"1ZW19E460445313454","zone":"000","containerType":"PKG","quantity":"1","weight":"0.00 ","unitOfMeasure":"K","descriptionCode":"069","descriptionOfCharges":"Correzione dell'indirizzo WW Express Saver","currencyCode":"EUR","netAmount":"6.60 "},

        "invoiceNumber":"201510156836","leadShipmentNumber":"1ZW19E460445313454","transactionDate":"20150302","trackingNumber":"1ZW19E460445313454","zone":"000","containerType":"PKG","quantity":"1","weight":"0.00 ","unitOfMeasure":"K","descriptionCode":"9","descriptionOfCharges":"","currencyCode":"EUR","netAmount":"0.00 "}]

}

}

]

}

}

Do you think this specific response would cause error if binded to table rows ?

saivellanki
Active Contributor
0 Kudos

Hi Claudia,

Data that you wanted to bind to the table rows is present only in /toPosition/results (or) any other value is present in /d/results/0/.... etc?  Since I can see Invoice number is also available in '/toPosition/results'.


Regards,

Sai Vellanki.

Former Member
0 Kudos

Hi Sai,

Data needed to bind table rows are not in /d/results/0/...
This is the header for the structure and invoiceNumber is one field available both in header and items structure.


I think the correct path should [but I am not sure] like this /d/results/1/toPosition/results .

My concern is about if the path I pass is correct and how to fix to get rows displayed.

Maybe also the bindRows(..) statement which I coded is not able to get the correct binding with data but I am able to see the response from the service with expected data [...]

SergioG_TX
Active Contributor
0 Kudos

hi Claudia,

if no errors in the developer tools console, can you try switching this line:

var oModelCarrier = new sap.ui.model.odata.ODataModel('/sap/opu/odata/sap/Z_COLL_PORTAL_SRV',{json:true});  

to

var oModelCarrier = new sap.ui.model.odata.ODataModel('/sap/opu/odata/sap/Z_COLL_PORTAL_SRV', true );

hope this helps

Sergio

Former Member
0 Kudos

Hi Sergio,

Using your proposed solution
I am getting same response from oData query
but the table is now filled with header data response [please see 1st and 2nd row]
and not with item data as expected

[e.g. with property line Container type, Transaction Date, Tracking Number, etc..]

Kind regards,

claudia

SergioG_TX
Active Contributor
0 Kudos

Claudia,

the next thing to verify would be the path to the item data.. since it is a child of the header data, you may need to specify one more level deep in your code. it is just matter of having the correct path in the bindings.

please mark the first question as answered if you got the correct answer. thank you

Former Member
0 Kudos

Sergio,

I am not able to view data even if I changed the items path for the data table.

What do you mean in details with 'since it is a child of the header data, you may need to specify one more level deep in your code' ? Is it about some to add for the binding in the table for example

1. <table:Table id="carrierTable" items="{path:'/d/results/1/toPosition/results'}">

or something into the controller.js side

2. tableCarrier.bindRows( {path: '/fileRepositorySet',

      filters : [ new sap.ui.model.Filter("fileId", sap.ui.model.FilterOperator.EQ, fileid) ],

      parameters : {expand: 'toPosition'}

    });

Do you think in case of point 1. the path would be correct using '/d/results/1/toPosition/results' for the odata received for this scenario ?

Regards,
Claudia