javascript - Breezejs: read odata link -
i'm trying breezejs library working sap odata service. working reading entities, i'm not able resolve linked objects.
my entitytype orgobject.
<entitytype name="orgobject" sap:content-version="1"> ... <navigationproperty name="children" relationship="zgw_orgstructure.orgobject_to_children" fromrole="fromrole_orgobject_to_children" torole="torole_orgobject_to_children"/> </entitytype> i have link resolve linked orgobjects (link named children).
<association name="orgobject_to_children" sap:content-version="1"> <end type="zgw_orgstructure.orgobject" multiplicity="1" role="fromrole_orgobject_to_children"/> <end type="zgw_orgstructure.orgobject" multiplicity="*" role="torole_orgobject_to_children"/> </association> so, breeze query working:
var query = new breeze.entityquery().from("orgobjects"); manager.executequery(query).then( function(data){ data.results.foreach(function (item) { console.log(item); }); } ).fail( ... ); how call "children" object?
attempt 1:
var query = new breeze.entityquery().from("orgobjects"); manager.executequery(query).then( function(data){ data.results.foreach(function (item) { console.log(item); /* */ var children = item.children(); /* */ }); } ).fail( ... ); this results in error:
message: "object [object object] has no method 'children'" attempt 2:
var query = new breeze.entityquery().from("orgobjects"); manager.executequery(query).then( function(data){ data.results.foreach(function (item) { console.log(item); /* */ item.entityaspect.loadnavigationproperty("children").then(function(data) { console.log(data.results); data.results.foreach(function (item) { console.log( item ); }); }).fail( function(e){ console.log(e); } ); /* */ }); } ).fail( ... ); this results in error:
message: "the 'propertyorexpr' parameter must 'string'" attempt 3:
var query = new breeze.entityquery().from("orgobjects").expand("children"); manager.executequery(query).then( function(data){ data.results.foreach(function (item) { console.log(item); /* */ console.log( item.children ); console.log( item.children.length ); /* */ }); } ).fail( ... ); result: item.children object. buth item.children.length = 0. when check http response children fetched server, not available in item.children object.
console output:
finance department [parententity: object, navigationproperty: ctor, arraychanged: ctor, _addsinprocess: array[0], push: function…] _addsinprocess: array[0] _geteventparent: function () { _getpendingpubs: function () { arraychanged: ctor length: 0 load: function (callback, errorcallback) { navigationproperty: ctor parententity: object pop: function () { push: function () { shift: function () { splice: function () { unshift: function () { __proto__: array[0] 0 who can me out? there missing in odata service?
thanks, joachim
problem "solved".
1->n relations in breeze can used if inverse property (n->1) defined. far know not possible in sap gateway define inverse relation. test created 2 relationships:
<association name="orgobject_to_children" sap:content-version="1"> <end type="zgw_orgstructure.orgobject" multiplicity="1" role="fromrole_orgobject_to_children"/> <end type="zgw_orgstructure.orgobject" multiplicity="*" role="torole_orgobject_to_children"/> </association> <association name="orgobject_to_children_inverse" sap:content-version="1"> <end type="zgw_orgstructure.orgobject" multiplicity="*" role="fromrole_orgobject_to_children_inverse"/> <end type="zgw_orgstructure.orgobject" multiplicity="1" role="torole_orgobject_to_children_inverse"/> </association> then changed in breezejs
function updatecrossentityrelationship(np) { var metadatastore = np.parenttype.metadatastore; var incompletetypemap = metadatastore._incompletetypemap; // ok not find yet var targetentitytype = metadatastore._getentitytype(np.entitytypename, true); if (targetentitytype) { np.entitytype = targetentitytype; } var assocmap = incompletetypemap[np.entitytypename]; if (!assocmap) { addtoincompletemap(incompletetypemap, np); } else { var inverse = assocmap[np.associationname]; /* enable inverse relationship sap gateway */ // search inverse links if( !inverse ){ var associationname = ""; if(np.associationname.indexof("_inverse") > 0){ associationname = np.associationname.replace("_inverse", ""); }else{ associationname = np.associationname + "_inverse"; } inverse = assocmap[associationname]; } /* end enable inverse relationship sap gateway */ if (inverse) { removefromincompletemap(incompletetypemap, np, inverse); } else { addtoincompletemap(incompletetypemap, np); } } }; but didn't solve everything, there other thing had change work. don't know if bug or if related sap gateway.
function mergerelatedentitiescore(rawentity, navigationproperty, parsecontext) { var relatedrawentities = rawentity[navigationproperty.nameonserver]; if (!relatedrawentities) return null; // needed if returned not array , expect 1 - happens __deferred in odata. /* original code if (!array.isarray(relatedrawentities)) return null; var relatedentities = relatedrawentities.map(function(relatedrawentity) { return visitandmerge(relatedrawentity, parsecontext, { nodetype: "navpropitem", navigationproperty: navigationproperty }); }); return relatedentities; end original code */ if (!array.isarray(relatedrawentities.results)) return null; relatedrawentities.results = relatedrawentities.results.map(function(relatedrawentity) { return visitandmerge(relatedrawentity, parsecontext, { nodetype: "navpropitem", navigationproperty: navigationproperty }); }); return relatedrawentities.results; } i tested reading operations. later on i'll check update operations.
kr, joachim
Comments
Post a Comment