User Story: Som bruker av en skreddersydd model-driven app, ønsker jeg å sende e-post til valgte rader i en listevisning (custom tabell med lookup-kolonne til Kontakt).
Demo av sluttresultatet
Denne helgen kranglet jeg i flere timer med det som virket å være en enkel PowerFx-operasjon før jeg til slutt kapitulerte og brukte JavaScript for å finne en god workaround. Derfor deler jeg nå noen av disse funnene, ettersom det å opprette et e-postutkast med prepopulerte kontakter fra valgte rader i 'Til Mottaker'-listen er et ganske vanlig use case for model-driven apper.
Dette var utgangspunktet for slosskampen:
Enkel navigering med Patch for å forhåndsfylle mottakerlisten med valgte rader sine kontakter og emnet "Hello world". Uansett hvor mye jeg prøvde å justere PowerFx, resulterte det alltid i et tomt 'Til Mottaker'-felt ved navigering. Så, hvorfor fungerer det ikke?
Litt bakgrunnsstoff
'Til Mottaker'-feltene er noe som kalles 'polymorphic lookup'-felter hvor man kan velge data fra flere ulike tabeller, inkludert Kontakter, Forretningsforbindelser eller Brukere. For de av oss som har jobbet litt med Power Automate-flows og standard activity-tabeller, vet vi at vi ofte må spesifisere hvilken tabell vi populerer data fra ved å bruke 'Activity Party Attribute'-feltene. Et eksempel nedenfor:
Imidlertid kan vi for eksempel angi "Regarding"-feltet på en vanlig Patch-operasjon, ettersom metadataen er inkludert. Dermed "forstår" Dataverse hvilken tabell dataen eller raden kommer fra (f.eks. Kontakter-tabellen eller Forretningsforbindelse-tabellen, avhengig av hvilken rad vi patcher).
Men etter å ha prøvd å bruke de samme prinsippene som for Power Automate for å fylle ut feltene ved hjelp av PowerFx, ga jeg til slutt opp. I stedet begynte jeg å jobbe med JavaScript etter å ha funnet et relatert innlegg på Stack Overflow (lenke nederst i artikkelen).
Uansett, her er en workaround for forskjellige scenarier for å forhåndsutfylle et e-postutkast ved navigering.
Scenario 1: Populere en enkelt valgt kontakt fra en listevisning (basert på Kontakter-tabellen)
function openEmail(FirstSelectedItemId) {
console.log("FirstSelectedItemId:", FirstSelectedItemId); // Log the value of FirstSelectedItemId to the console
// Use Xrm.WebApi.retrieveRecord to get the "fullname" field value from the selected record
Xrm.WebApi.retrieveRecord("contact", FirstSelectedItemId, "?$select=fullname")
.then(
function success(result) {
// Retrieve the "fullname" field value from the result
let contactFullName = result["fullname"];
// Create activity parameters
let activityParameters = {
to: [{
id: FirstSelectedItemId,
name: contactFullName, // Use the "fullname" field value
entityType: "contact"
}]
};
// Navigate to email entity
window.parent.Xrm.Navigation.navigateTo(
{ pageType: "entityrecord", entityName: "email", data: activityParameters },
{ target: 2 } // Open in modal
);
},
function(error) {
console.log(error.message); // Handle error
}
);
}
Scenario 2: Populere flere valgte kontakter fra en listevisning (basert på Kontakter-tabellen)
function openEmail(selectedContactIds) {
// Array to store recipients
let toRecipients = [];
// Loop through each selected contact ID
selectedContactIds.forEach(function(contactId) {
// Use Xrm.WebApi.retrieveRecord to get the "fullname" field value from each selected contact record
Xrm.WebApi.retrieveRecord("contact", contactId, "?$select=fullname")
.then(
function success(result) {
// Retrieve the "fullname" field value from the result
let contactFullName = result["fullname"];
// Add the contact to the recipients array
toRecipients.push({
id: contactId,
name: contactFullName,
entityType: "contact"
});
// If all selected contacts are processed, navigate to the email entity
if (toRecipients.length === selectedContactIds.length) {
// Create activity parameters
let activityParameters = {
to: toRecipients
};
// Navigate to email entity
window.parent.Xrm.Navigation.navigateTo(
{ pageType: "entityrecord", entityName: "email", data: activityParameters },
{ target: 2 } // Open in modal
);
}
},
function(error) {
console.log(error.message); // Handle error
}
);
});
}
Scenario 3: Populere flere valgte kontakter fra en listevisning (basert på en custom tabell med en lookup-kolonne til Kontakter).
function openEmail(selectedRecordIds) {
// Array to store recipients
let toRecipients = [];
// Loop through each selected record ID
selectedRecordIds.forEach(function(recordId) {
// Use Xrm.WebApi.retrieveRecord to get the lookup field value from each selected record
Xrm.WebApi.retrieveRecord("prefix_custom_table", recordId, "?$select=_prefix_contact_value")
.then(
function success(result) {
// Retrieve the contact lookup field value from the result
let contactId = result["_prefix_contact_value"];
// Use Xrm.WebApi.retrieveRecord to get the "fullname" field value from the related contact record
Xrm.WebApi.retrieveRecord("contact", contactId, "?$select=fullname")
.then(
function success(contactResult) {
// Retrieve the "fullname" field value from the contact record
let contactFullName = contactResult["fullname"];
// Add the contact to the recipients array
toRecipients.push({
id: contactId,
name: contactFullName,
entityType: "contact"
});
// If all selected records are processed, navigate to the email entity
if (toRecipients.length === selectedRecordIds.length) {
// Create activity parameters
let activityParameters = {
to: toRecipients
};
// Navigate to email entity
window.parent.Xrm.Navigation.navigateTo(
{ pageType: "entityrecord", entityName: "email", data: activityParameters },
{ target: 2 } // Open in modal
);
}
},
function error(contactError) {
console.log("Error retrieving contact record:", contactError.message);
}
);
},
function error(recordError) {
console.log("Error retrieving record:", recordError.message);
}
);
});
}
Så, vær så god - håper dette kommer til nytte for dere også.
All ære til disse gutta som satte meg på sporet for det endelige resultatet:
Lær mer:
#PolymorphicLookUp #ActivityPartyAttributes #Navigate #Patch #PowerFx #EmailMessages #Dataverse #ModelDrivenApp #JavaScript
Comentários