天天看點

Dynamics 365 可編輯子網格(擷取子網格資料與擷取實體資料)提示

Dynamics 365 可編輯子網格

  • 提示
    • 擷取子網格資料
    • 擷取實體資料(循環出來)
    • 執行個體
    • 總結

提示

可編輯子網格的建立的詳細步驟可以去這個網址看看https://www.cnblogs.com/LanHai12/p/14074799.html

(注:foreach循環的操作無法在F12中直接進行,可以使用debugger調試的方法來檢視所擷取到的值)

擷取子網格資料

通過以下的操作,我們就可以将子網格中的資料通過foreach循環将每一條都顯示出來(注:stugrade為子網格的唯一名稱)

//擷取的為目前頁面所勾選的子網格資訊
//var rows = Xrm.Page.getControl("子網格名稱").getGrid().getSelectedRows();
//擷取所有行
//var rows = Xrm.Page.getControl("子網格名稱").getGrid().getRows();
var row2 = Xrm.Page.getControl("stugrade").getGrid().getRows();//學生
row2.forEach(function (row, i) {
//将子網格中字段名為以下操作中的名稱的值全部循環出來
    var aa = row2.get(i).getData().getEntity().attributes.get("new_stuachievement").getValue();
    var bb = row2.get(i).getData().getEntity().attributes.get("new_name").getValue();
    var cc = row2.get(i).getData().getEntity().attributes.get("new_stuclass").getValue();
    //驗證一下擷取到的值
    alert("" + aa + "" + bb + "" + cc + "");
});
           

擷取實體資料(循環出來)

由于使用子網格拿取資料是隻能擷取到目前頁面的資料,在子網格中可能存在着多頁資料,這個時候就要用到實體擷取到全部資料了。(注:簡單的寫了下兩個表的(學生表與年級表))

function getxml() {
    var xmlhttp;
    if (window.ActiveXObject) {
        var aVersions = ["Msxml2.XMLHttp", "Msxml2.XMLHttp.5.0", "Msxml2.XMLHttp.4.0", "Msxml2.XMLHttp.3.0", "Microsoft.XMLHttp"];
        for (var i = 0; i < aVersions.length; i++) {
            try {
                xmlHttp = new ActiveXObject(aVersions[i]);
                break;
            } catch (e) { }
        }
    } else if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }
    return xmlhttp;
}

function cs() {
    //目前頁面的id,擷取到的字元串中的英文字元為大寫字母.
    var bbb = Xrm.Page.data.entity.getId().replace("{", "").replace("}", "");
    var requestURL = Xrm.Page.context.getClientUrl() + "/api/data/v9.0/new_subgrid2s";
    var xmlhttp = getxml();
    xmlhttp.open("GET", requestURL, false);
    xmlhttp.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    //xmlhttp.setRequestHeader("Content-Length", 0);
    xmlhttp.setRequestHeader("Accept", "application/json");
    xmlhttp.setRequestHeader("Prefer", "odata.include-annotations=*");//formatvalue
    xmlhttp.send();
    //data就是實體名為new_subgrid2s的實體的全部資料
    var data = JSON.parse(xmlhttp.responseText);
    console.log(data)
    var c;//學生姓名
    data.value.forEach(function (val, i) {
        //toUpperCase為将所有的英文字元轉換為大寫字母
        //toLowerCase為将所有的英文字元轉換為小寫字母
        //實體中與目前頁面相關聯的lookup(查詢)字段的id,擷取到的字元串中的英文字元為小寫寫字母.
        var aaa = val._new_grade_value;
        var cc = val.new_name;//實體記錄中的學生姓名
        //擷取到與目前頁面相關的實體記錄的資訊
        if (bbb == aaa.toUpperCase()) {
            c = cc;//為學生姓名指派
        }
        alert(c);//将循環出來的學生姓名一一彈出
    });
}
           

執行個體

該執行個體是基于四個表來進行的(老師表、學生表、班級表、年級表(年級表最大)),根據老師(班主任)的姓名來查找到有關班級的學生的成績以及班級的評價(注:在執行表單中需要一個老師姓名的字段)

function getxml() {
    var xmlhttp;
    if (window.ActiveXObject) {
        var aVersions = ["Msxml2.XMLHttp", "Msxml2.XMLHttp.5.0", "Msxml2.XMLHttp.4.0", "Msxml2.XMLHttp.3.0", "Microsoft.XMLHttp"];
        for (var i = 0; i < aVersions.length; i++) {
            try {
                xmlHttp = new ActiveXObject(aVersions[i]);
                break;
            } catch (e) { }
        }
    } else if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }
    return xmlhttp;
}

function cs() {
    var requestURL = Xrm.Page.context.getClientUrl() + "/api/data/v9.0/new_subgrid2s";
    var xmlhttp = getxml();
    xmlhttp.open("GET", requestURL, false);
    xmlhttp.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    //xmlhttp.setRequestHeader("Content-Length", 0);
    xmlhttp.setRequestHeader("Accept", "application/json");
    xmlhttp.setRequestHeader("Prefer", "odata.include-annotations=*");//formatvalue
    xmlhttp.send();
    var data = JSON.parse(xmlhttp.responseText);
    console.log(data)
    var teaname = Xrm.Page.getAttribute("new_teacher").getValue();//老師姓名
    if (teaname != "" && teaname != null && teaname != undefined) {
        var row1 = Xrm.Page.getControl("teagrade").getGrid().getRows();//老師
        var row3 = Xrm.Page.getControl("classgrade").getGrid().getRows();//班級
        var a = 0;//班級最高分
        var teaa = 0;//班級平均分
        var tear = 0;//班級人數
        var b;//學生姓名
        var c;//班級名稱
        var d;//老師所在班級
        var e;//班級總評價
        var yw;//國文
        var sx;//數學
        var yy;//英語
        //首先需要将老師表循環出來
        row1.forEach(function (row, i) {
            debugger;
            var ddd = row1.get(i).getData().getEntity().attributes.get("new_name").getValue();
            //将老師所在的班級擷取到
            var dd = row1.get(i).getData().getEntity().attributes.get("new_teaclass").getValue();
            if (ddd == teaname) {
                d = dd;
            }
        });
        data.value.forEach(function (val, i) {
            var aa = val.new_stuachievement;//學生成績
            var bb = val.new_name;
            var cc = val._new_stuclass_value;.//lookup字段(班級)的id
            var yws = val.new_c;
            var sxs = val.new_m;
            var yys = val.new_e;
            //d[0].id為老師所在的班級的id
            if (cc == d[0].id) {
                teaa += aa;
                tear++;
                //擷取班級中的最高成績
                if (aa > a) {
                    a = aa;
                    b = bb;
                    c = cc;//此處的c為id
                    yw = yws;
                    sx = sxs;
                    yy = yys;
                }
            }
        });
        //将班級表循環出來
        row3.forEach(function (row, i) {
            var ee = row3.get(i).getData().getEntity().attributes.get("new_classgrade").getValue();
            var eee = row3.get(i).getData().getEntity().getId();
            var eeee = row3.get(i).getData().getEntity().attributes.get("new_name").getValue();
            if (eee == d[0].id) {
                e = ee;
                c = eeee;//此處的c為學生姓名
            }
        });
       //班級表中的班級評價字段為選項集類型,給它加一個簡單的判斷。
        if (e == 100000000) {
            e = "優秀";
        } else if (e == 100000001) {
            e = "良好";
        } else if (e == 100000002) {
            e = "有待提升";
        } else {
            e = "暫未擁有";
        }
        var zz =
            "導員姓名:" + teaname +
            " \n班級名稱:" + c +
            " \n班級最高分:" + a +
            " \n班級平均分:" + teaa / tear +
            " \n班級人數:" + tear +
            " \n學生姓名(最高分):" + b +
            " \n國文:" + yw +
            " \n數學:" + sx +
            " \n英語:" + yy +
            " \n班級總評價:" + e + "";
        //這樣就可以在執行表單(年級表)中通過輸入老師的姓名擷取到其他三個實體中的資料了。
        alert(zz);
    }
}
           

總結

本人能力有限,有一些錯誤在所難免,望大佬進行指正。寫這個部落格首先呢也是想要幫到大家,其次也是想要給自己留一個記憶點,讓自己可以時刻的檢驗自身。

加油!!!

所學習的網址(上面提示中也有):https://www.cnblogs.com/LanHai12/p/14074799.html

繼續閱讀