התאמה אישית של רשת הרשומות המשמשת כרשת הרשומות המשמשת כרשת תחזיות

כמפתח, השתמש בתיעוד חומר עזר זה כדי ללמוד אודות האירועים ואובייקט ההקשר כדי להתאים אישית את רשת הרשומות המשמשת כברירת מחדל בתחזית שלך. באפשרותך להשתמש באובייקט ההקשר כדי לבצע התאמות אישיות כגון הפיכת הרשת כולה או שדות ספציפיים לקריאה בלבד, הפיכת שדות ללא זמינים, הצגת הודעות שגיאה וכן הלאה.

אירועים עבור רשת הרשומות המשמשת עבורך

האירועים הבאים נתמכים בהתחזית:

תרחישי הדוגמאות הבאים נוצרים בהתבסס על המטפלים באירועים הנתמכים:

אירוע OnRowLoad

האירוע OnRowLoad מופעל עבור כל רשומה המשמשת כמקור שנטען ברשת. אובייקט ההקשר המועבר למטפל OnRowLoad באירועים מכיל ממשקי API ספציפיים עבור הרשומה המשמשת בסיס.

להלן התרחישים לדוגמה שניתן לבצע באמצעות OnRowLoad מטפל:

הערה

עבור תצורת תחזית, רשומות המשמשות את הרשומות המשמשות כברירת מחדל של ישויות שונות מוצגות על-ידי בחירת התכונה Groupby ברשת הרשומות המשמשת כברירת מחדל. כדי לטפל בלוגיקה המבוססת על ישויות אלה, עיין בדוגמאות הפיכת שדות מעטים לזמינים תמיד בהתבסס על ישות ובטל עריכה של שדות בהתבסס על לוגיקה וישות.

אירוע OnChange

האירוע OnChange מופעל כאשר הערך של תא ברשת הרשומות המשמשת תחילה מתעדכן והתא נמצא מחוץ למיקוד.

הערה

  • עבור רשת הרשומות המשמשת תחילה, כל שינוי בשדה יפעיל ומטפלים OnChangeOnSave באירועים, אם הם קיימים.
  • השמירה לא תופעל אם שדה מוגדר עם הודעות שגיאה באמצעות ה- API של הלקוח במטפל OnChange . עבור הודעות הקשורות החיזוי ממשקי API של לקוח, setNotification עבור אל ה- API בהקשר.getFormContext().data.entity.attributes.getByName("Attribute Name").controls.get(0).
  • אין מיפוי בין תכונות למטפל OnChange , OnChange ושינוי שדה כלשהו יפעיל את המטפל עם פרמטר אובייקט ההקשר. כדי לזהות את התכונה שהפעילה את המטפל, השתמש בפונקציה getIsDirty באובייקט התכונה. מידע נוסף: context.getFormContext().data.entity.attributes.getByName("Attribute Name")

להלן תרחיש לדוגמה שניתן לבצע באמצעות המטפל OnChange :

אירוע OnSave

האירוע OnSave מופעל כאשר ערך משתנה בתא ברשת הרשומות המשמשת תחילה והתא נמצא מחוץ למיקוד. עם זאת, אם OnChange המטפל קיים עבור אותה תצורת תחזית, OnSave המטפל מופעל לאחר המטפל OnChange .

המטפל OnSave מופעל לפני השמירה בפועל של השדה.

הערה

  • עבור רשת הרשומות המשמשת תחילה, כל שינוי בשדה יפעיל ומטפלים OnChangeOnSave באירועים, אם הם קיימים.
  • השמירה לא תופעל אם שדה מוגדר עם הודעות שגיאה באמצעות ה- API של הלקוח במטפל OnSave . עבור הודעה הקשורה להתחזוי ממשקי API של לקוח, setNotification עבור אל ה- API בהקשר.getFormContext().data.entity.attributes.getByName("Attribute Name").controls.get(0).
  • אין מיפוי בין תכונות למטפל OnSave , OnSave ושינוי שדה כלשהו יפעיל את המטפל עם פרמטר אובייקט ההקשר. כדי לזהות את התכונה שהפעילה את המטפל, השתמש בפונקציה getIsDirty באובייקט התכונה. מידע נוסף: context.getFormContext().data.entity.attributes.getByName("Attribute Name")

להלן תרחיש לדוגמה שניתן לבצע באמצעות המטפל OnSave :

אובייקט הקשר עבור מטפלים באירועים ברשת הרשומות המשמשת עבורך

אובייקט ההקשר מכיל ערכה של ממשקי API לביצוע פעולות ספציפיות עבור רשומה המשמשת בסיסיות תחזית. אובייקט הקשר זה מועבר כפרמטר למטפלים באירועים בתצוגת הרשת המשמשת לרשומות המשמשות בסיס.

ממשקי ה- API הבאים נתמכים:

context.getFormContext method

החזרת הפניה לרשומה ברשת הרשומות המשמשת כמקור.

context.getFormContext().data.entity

פעולה זו מחזירה אובייקט ישות וכוללת את השיטות הבאות:

פעולת שירות סוג החזרה תיאור‬‏‫‬
getEntityName() מחרוזת החזרת מחרוזת המייצגת את השם הלוגי של הישות עבור הרשומה.
getId() מחרוזת החזרת מחרוזת המייצגת את ערך ה- GUID עבור הרשומה.
attributes רשימה החזרת רשימת תכונות הקשורות לתצוגה ולישות שנטענות כחלק מרשת הרשומות המשמשת כברירת מחדל. באפשרותך לבצע את הפעולות הבאות:
- context.getFormContext().data.entity.attributes.forEach
- context.getFormContext().data.entity.attributes.getByName(arg)
- context.getFormContext().data.entity.attributes.get(index)

context.getFormContext().data.entity.attributes.getByName("Attribute Name")

פעולה זו מחזירה אובייקט תכונה והיא כוללת את השיטות הבאות:

פעולת שירות סוג החזרה תיאור‬‏‫‬
getName() מחרוזת החזרת מחרוזת המייצגת את השם הלוגי של התכונה.
getValue() -- מאחזר את ערך הנתונים עבור תכונה.
getIsDirty() בוליאני החזרת ערך בוליאני המציין אם קיימים שינויים שלא נשמרו בערך התכונה.
controls רשימה החזרת רשימה של פקדים עבור כל אובייקט תכונה.
הערה: אורך controls רשימת האובייקטים הוא תמיד 1, ובאפשרותך get(0) להשתמש בו ישירות.

context.getFormContext().data.entity.attributes.getByName("Attribute Name").controls.get(0)

פעולה זו מחזירה מיפוי אובייקט פקד לתכונה, והיא כוללת את השיטות הבאות:

פעולת שירות סוג החזרה תיאור‬‏‫‬
getDisabled() בוליאני מחזירה אם הפקד אינו זמין.
setDisabled(bool) -- הגדרת הערך כלא זמין (True או False) לפקד.
setNotification(message: string, uniqueId?: string) בוליאני הצגת הודעת שגיאה עבור הפקד כדי לציין שהנתונים אינם חוקיים. בעת שימוש בשיטה זו, סמל צלב אדום מופיע לצד הפקד בתוך התא. ריחוף מעל סמל השגיאה יציג את ההודעה שסופקה. בחירת סמל השגיאה תטען מחדש את השורה ותבטל את כל השינויים. משמש uniqueId לניקוי הודעה זו בעת שימוש בפעולת clearNotification השירות.
clearNotification(uniqueId?: string) בוליאני הסרת הודעה שכבר מוצגת עבור פקד. אם לא מוצג מזהה ייחודי, כל ההודעות עבור פקד זה יוסרו.

הערה

אנו ממליצים על שמות הפונקציות בקובץ JavaScript להתאים לשמות האירועים, ועליהם לקבל את פרמטר אובייקט ההקשר.

דוגמה 1:

בוא ניצור קוד JavaScript כדי להפוך את כל השדות ברשת הרשומות המשמשת כרשת לקריאה בלבד. כמו כן, נקרא לפונקציה OnRowLoad עבור כל שורה כאשר הרשת נטענת ונשמרת בהצלחה.

function OnRowLoad(executionContext) {
    // Iterating through all attributes and disabling it.
    executionContext.getFormContext().data.entity.attributes.forEach(
        attribute => {
            attribute.controls.get(0).setDisabled(true);
        }
    )
}

דוגמה 2:

בוא ניצור קוד JavaScript כדי להפוך את כל השדות ללא זמינים, למעט כמה מהם עבור ישות ההזדמנות בלבד. כמו כן, נקרא לפונקציה OnRowLoad עבור כל שורה כאשר הרשת נטענת ונשמרת בהצלחה.

function OnRowLoad(executionContext) {

    // Get the logical name of the loaded entity as part of underlying records grid.
    var entityName = executionContext.getFormContext().data.entity.getEntityName();

    if (entityName === "opportunity") {

        // Defining the attributes list from opportunity that has to be enabled if loaded as part of view.
        var OPTY_ENABLE_ATTRS_LIST = ["name", "msdyn_forecastcategory", "actualvalue", "actualclosedate", "estimatedvalue", "estimatedclosedate"];

        executionContext.getFormContext().data.entity.attributes.forEach(
            attribute => {
                // Disabling all attributes other than OPTY_ENABLE_ATTRS_LIST
                if (!OPTY_ENABLE_ATTRS_LIST.includes(attribute.getName())) {
                    attribute.controls.get(0).setDisabled(true);
                }
            }
        )        
    }
}

דוגמה 3:

בוא ניצור קוד JavaScript לטיפול בישויות שונות עבור תצורת התחזית שנטען.

עבור ישות הזדמנות, קובץ ה- Script יהפוך את הפריטים הבאים ללא זמינים:

  • עמודת שם
  • actualRevenue ואם actualCloseData הערך הוא forecastCategory במקרה הטוב ביותר, מחויב, מושמט או קו צינור.
  • estimatedRevenue ואם estimatedCloseDate הערך forecastCategory זכה או אבד.

באופן דומה, קובץ ה- Script יהפוך את עמודת השם עבור ישות החשבון ללא זמינה ותבטל את כל העמודות עבור ישויות אחרות.

כמו כן, נקרא לפונקציה OnRowLoad עבור כל שורה כאשר הרשת נטענת ונשמרת בהצלחה.


function OnRowLoad(executionContext) {
		 
    // Get the logical name of the loaded entity as part of underlying records grid.
    var entityName = executionContext.getFormContext().data.entity.getEntityName();
    
    // If loaded logical name of entity in underlying records grid is opportunity.
    if (entityName === "opportunity") {
        
       var allAttrs = executionContext.getFormContext().data.entity.attributes;

       // Disable column name for all records if exists in the view.
       var nameAttr = allAttrs.getByName("name");
       if (nameAttr) {
           nameAttr.controls.get(0).setDisabled(true);
       }

       var fcatAttr = allAttrs.getByName("msdyn_forecastcategory");
       if (fcatAttr) {
           // Disable actualRevenue, actualCloseDate for forecastcategory Bestcase, committed, omitted, or pipeline.
           if (fcatAttr.getValue() <= 100000004 && fcatAttr.getValue() >= 100000001) {
                   var actualRevenueAttr = allAttrs.getByName("actualvalue");
                   var actualCloseDateAttr = allAttrs.getByName("actualclosedate");
                   if (actualRevenueAttr) actualRevenueAttr.controls.get(0).setDisabled(true);
                   if (actualCloseDateAttr) actualCloseDateAttr.controls.get(0).setDisabled(true);
           }
           // Disable estimatedRevenue, estimatedCloseDate for forecastCategory won or lost.
           else if (fcatAttr.getValue() == 100000005 || fcatAttr.getValue() == 100000006) {
                   var estimatedRevenueAttr = allAttrs.getByName("estimatedvalue");
                   var estimatedCloseDateAttr = allAttrs.getByName("estimatedclosedate");
                   if (estimatedRevenueAttr) estimatedRevenueAttr.controls.get(0).setDisabled(true);
                   if (estimatedCloseDateAttr) estimatedCloseDateAttr.controls.get(0).setDisabled(true);
           }
       }
   } 
   
   // Else disable name column, if loaded logical name of entity is Account.
   else if (entityName === "account"){
       var attrNameObj = executionContext.getFormContext().data.entity.attributes.getByName("name");
       if (attrNameObj) {
               attrNameObj.controls.get(0).setDisabled(true);
       }
   } 
   
   // For all other entities
   else {
       executionContext.getFormContext().data.entity.attributes.forEach(
           attribute => {
               attribute.controls.get(0).setDisabled(true);
           }
       )
   }
}

דוגמה 4:

בוא ניצור קובץ JavaScript של אימות שיחסום שמירה ויציג הודעת שגיאה בעמודה המשוערת של הכנסות כאשר הערך קטן מ- 10. כמו כן, אנו נסיר את הודעת השגיאה ותאפשר שמירה כאשר ערך עמודת ההכנסות המשוער יתוקן להיות גדול או שווה ל- 10. כאן, OnChange הפונקציה מופעלת כאשר הערך של שדה כלשהו מתעדכן ברשת הרשומות המשמשת תחילה עבור תחזית.


// OnChange function is invoked when any field's value is updated on the underlying records grid of the forecast
function OnChange(executionContext) {

    let entity = executionContext.getFormContext().data.entity;

    // Verify the logical name of the entity and load as part of the underlying records grid.
    if (entity.getEntityName() === "opportunity") {

        // Verify estimated revenue value
        let estValAttr = entity.attributes.get("estimatedvalue");

        // Verify if this attribute exists within the grid view and changed
        if(estValAttr && estValAttr.getIsDirty()) 
        {
            if(estValAttr.getValue() < 10){

                // This will show an error icon next to the estimated revenue field. On hovering over the icon, the below provided message is displayed.
                // Any save attempts are blocked by the system until all notifications are cleared from the columns.
                estValAttr.controls.get(0).setNotification("Estimated revenue cannot be less than 10");
            }
            else{
                // Clearing notifications to save.
                estValAttr.controls.get(0).clearNotification();
            }
        }
    }
}

context.getWebApiContext()

פעולה זו מחזירה אובייקט webApiContext וכוללת את השיטות הבאות:

פעולת שירות תיאור‬‏‫‬
retrieveRecord(entityLogicalName, id, options)
then (successCallback, errorCallback);
מאחזר רשומת ישות. מידע נוסף: retrieveRecord (חומר עזר עבור API של לקוח)
updateRecord(entityLogicalName, id, data)
then(successCallback, errorCallback);
מעדכן רשומת ישות. מידע נוסף: updateRecord (חומר עזר עבור API של לקוח)
createRecord(entityLogicalName, data)
then(successCallback, errorCallback);
יוצר רשומת ישות. מידע נוסף: createRecord (חומר עזר עבור API של לקוח)
deleteRecord(entityLogicalName, id)
then(successCallback, errorCallback);
מחיקת רשומת ישות. מידע נוסף: deleteRecord (חומר עזר עבור API של לקוח)

context.getEventArgs().preventDefault()

פעולת preventDefault() השירות זמינה רק בתוך OnSave האירוע. קריאה לשיטה זו בתוך OnSave מונעת מאירוע השמירה להמשיך.

דוגמה:

בוא ניצור JavaScript לדוגמה כדי לפתוח את רשת ההזדמנויות, לחסום את אירוע השמירה האוטומטית ולפתוח התראת חלון אם ערך ההכנסות המשוער קטן מ- 10. כמו כן, נאפשר את אירוע השמירה האוטומטית אם ערך ההכנסות המשוער גדול מ- 10 או שווה לו.

// OnSave function will be invoked whenever grid attempts to save changes made to any field. 
function OnSave(executionContext){

    let entity = executionContext.getFormContext().data.entity;

    // Verify the logical name of the entity and load as part of the underlying records grid.
    if (entity.getEntityName() === "opportunity") {

        // Verify estimated revenue value
        var estValAttr = entity.attributes.get("estimatedvalue");

        if(estValAttr && estValAttr.getIsDirty() && estValAttr.getValue() < 10){

            // This call will prevent the save event from proceeding
            executionContext.getEventArgs().preventDefault(); 
            alert("Estimated revenue cannot be less than 10");

        }
    }
}

התאמה אישית של רשת הרשומות המשמשות כרשת