top of page
Writer's pictureArill André Aam

Hvordan populere 'Til Mottaker'-feltet med kontakter fra valgte rader i en model-driven app?

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:

PowerFx for Patch on Navigate to Email form and prepopulate data with Self.Selected.Item.Contact

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:

Power Automate example of how to populate activity party attributes field

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:






20 views0 comments

コメント


bottom of page