Update: Managed to get everything in place. The issue was that all API calls were executed asynchronously, which was leading to sending a query without ID parameter to query.
function filterTrainings(executionContext) {
var formContext = executionContext.getFormContext();
var trainigsControl = formContext.getControl("relatedTrainings");
var guid = Xrm.Page.data.entity.getId();
console.log(guid);
var relatedProfiles = [];
var relatedTatigkeiten = [];
var relatedBetriebsmittelGruppen = [];
var unterweisungTypen = [];
var xml;
GetRelatedProfiles()
.then(() => GetRelatedTatigkeiten().then(GetTatigkeitenRelatedUnterweisungTypen).then(() => GetRelatedBetriebsmittel().then(GetBetriebsmittelRelatedUnterweisungTypen).then(buildFetchXMLAndUpdateGrid)));
function buildFetchXMLAndUpdateGrid() {
getUniques(unterweisungTypen);
var values = unterweisungTypen.map(val => `${val}`);
console.log(values);
xml = `
${values.join('')}
`;
console.log(xml);
trainigsControl.setFilterXml(xml);
trainigsControl.refresh();
return xml;
}
function GetRelatedProfiles() {
return Xrm.WebApi.online.retrieveMultipleRecords("new_contact_new_profil", "?$select=new_profilid&$filter=contactid eq " guid).then(
function success(result) {
for (var i = 0; i < result.entities.length; i ) {
relatedProfiles.push(result.entities[i]["new_profilid"]);
}
},
function (error) {
console.log(error.message);
// handle error conditions
}
);
}
function getUniques(arr) {
var uniques = [];
arr.forEach(item => {
if (uniques.indexOf(item) === -1) {
uniques.push(item);
}
});
arr = uniques;
}
function GetRelatedTatigkeiten() {
return Promise.all(relatedProfiles.map(profile =>
Xrm.WebApi.online.retrieveMultipleRecords("new_new_profil_new_azttigkeit", `?$select=new_azttigkeitid&$filter=new_profilid eq ${profile}`).then(
function success(result) {
for (var i = 0; i < result.entities.length; i ) {
relatedTatigkeiten.push(result.entities[i]["new_azttigkeitid"]);
}
}, function (error) {
console.log(error.message);
// handle error conditions
}
)
)).then(() => getUniques(relatedTatigkeiten));
}
function GetRelatedBetriebsmittel() {
return Promise.all(relatedProfiles.map(profile =>
Xrm.WebApi.online.retrieveMultipleRecords("new_new_betriebsmittel_new_profil", "?$select=new_betriebsmittelid&$filter=new_profilid eq " profile).then(
function success(result) {
for (var i = 0; i < result.entities.length; i ) {
relatedBetriebsmittelGruppen.push(result.entities[i]["new_betriebsmittelid"])
}
}, function (error) {
console.log(error.message);
// handle error conditions
}
)
)).then(() => getUniques(relatedTatigkeiten));
}
function GetBetriebsmittelRelatedUnterweisungTypen() {
return Promise.all(relatedBetriebsmittelGruppen.map(betriebsmittel =>
Xrm.WebApi.online.retrieveMultipleRecords("new_new_betriebsmittel_new_schulungstyp", "?$select=new_schulungstypid&$filter=new_betriebsmittelid eq " betriebsmittel).then(
function success(result) {
for (var i = 0; i < result.entities.length; i ) {
unterweisungTypen.push(result.entities[i]["new_schulungstypid"]);
}
}, function (error) {
console.log(error.message);
// handle error conditions
}
)
)).then(() => getUniques(unterweisungTypen));
}
function GetTatigkeitenRelatedUnterweisungTypen() {
return Promise.all(relatedTatigkeiten.map(tatigkeiten =>
Xrm.WebApi.online.retrieveMultipleRecords("new_new_schulungstyp_new_azttigkeit", "?$select=new_schulungstypid&$filter=new_azttigkeitid eq " tatigkeiten).then(
function success(result) {
for (var i = 0; i < result.entities.length; i ) {
unterweisungTypen.push(result.entities[i]["new_schulungstypid"]);
}
}, function (error) {
console.log(error.message);
// handle error conditions
}
))).then(() => getUniques(unterweisungTypen));
}
}
Built XML:
7fba9f28-d44e-e911-80dc-0017fa100b027fba9f28-d44e-e911-80dc-0017fa100b02a993610a-2c2d-e811-80db-0017fa100b02769aca6d-2c2d-e811-80db-0017fa100b02449e8a0d-97a0-e811-80dc-0017fa100b0289a86b68-0c6e-e811-80db-0017fa100b02
Currently I am building a somewhat decent fetchXML, but I have issues with trainigsControl.setFilterXml(xml);
Error:
Uncaught (in promise) TypeError: trainigsControl.setFilterXml is not a function
at buildFetchXMLAndUpdateGrid
Looks like there is a minor detail I am missing.