1.在對應實體的HomePage新增按鈕土地地圖,調用landinfomap.JS(上傳到系統WEB資源中)javascript
2. New_landdata.JS中關鍵代碼java
//取通過篩選以後視圖的FETCHXML,並保存在實體new_tempdata中(因XML過長,URL傳值受到限制,目前只找到此方法),而後把保存的記錄ID傳參到LandDataMap.aspx頁面(需另外作個批量刪除的做業,來刪除實體new_tempdata不須要的數據,可在數據管理—>> 批量刪除記錄裏面建立)jquery
function landinfomap(IDArr) { var fetchxml = IDArr.GetParameter("effectiveFetchXml"); fetchxml = fetchxml.substring(fetchxml.indexOf(">") + 1, fetchxml.length) //去掉XML中的第一句 fetchxml = "<fetch mapping=\"logical\" version=\"1.0\">" + fetchxml; var tempdata = new Object(); tempdata.new_fetchxml = fetchxml; var jsontempdata = JSON.stringify(tempdata); var createtempdata = CreateEntityRecordByISV("new_tempdata", false); //同步 createtempdata.send(jsontempdata); if (createtempdata.status == 201) { var newTempdata = JSON.parse(createtempdata.responseText).d; var value = new Array(); value[0] = new Object(); value[0].id = newTempdata.new_tempdataId; value[0].typename = "new_tempdata"; } else { alert("發生錯誤: " + JSON.parse(createphonecallReq.responseText).error.message.value); } var url = "../../ISV/LandDataMap.aspx?"; var someValue = window.showModalDialog(url + "landid=" + newTempdata.new_tempdataId, "", "dialogWidth=800px;dialogHeight=600px;status=no;help=no;scrollbars=no"); } //建立實體信息 function CreateEntityRecordByISV(entityschema, mode) { if (typeof (mode) == "undefined") { mode = false; } var serverUrl = Xrm.Page.context.getClientUrl(); var ODataPath = serverUrl + "/XRMServices/2011/OrganizationData.svc" + "/" + entityschema + "Set"; var createEntityReq = new XMLHttpRequest(); createEntityReq.open("POST", ODataPath, mode); createEntityReq.setRequestHeader("Accept", "application/json"); createEntityReq.setRequestHeader("Content-Type", "application/json; charset=utf-8"); return createEntityReq; }
3 LandDataMap.JSajax
接收landinfomap.JS傳過來的參數,並經過LandDataInfo.ashx去取數據json
//取土地 function GetLandInfo() { //jquery取數據 $.ajax({ type: "post", contentType: "application/json", url: "_common/LandDataInfo.ashx?serverUrl=" + encodeURIComponent(serverUrl) + "&landid=" + encodeURIComponent(landid), data: "", dataType: '', success: function (retstr) { var cname; var cid; var clng; var clat; var makeInfo; var regArr = retstr.split(';'); markerArr = new Array(); map = new BMap.Map("divMap"); map.centerAndZoom(new BMap.Point(regArr[2], regArr[3]), 14); // 初始化地圖,設置中心點座標和地圖級別 (經度,緯度) map.addControl(new BMap.NavigationControl()); // 添加平移縮放控件 map.addControl(new BMap.OverviewMapControl()); //添加縮略地圖控件 map.enableScrollWheelZoom(); //啓用滾輪放大縮小 map.addControl(new BMap.MapTypeControl({ mapTypes: [BMAP_NORMAL_MAP, BMAP_HYBRID_MAP] })); //添加地圖類型控件 for (var i = 0; i < regArr.length; i++) { cname = regArr[i]; i++; cid = regArr[i]; i++; clng = regArr[i]; i++; clat = regArr[i]; if (clng != "" && clat != "") { //加載地圖標註 makeInfo = new Object(); makeInfo.title = cname; makeInfo.content = cname; makeInfo.lng = clng; makeInfo.lat = clat; makeInfo.isOpen = 0; makeInfo.ID = cid; if (rtype == "C") makeInfo.icon = { DType: "C", w: 60, h: 40, l: 46, t: 21, x: 9, lb: 12 }; markerArr.push(makeInfo); } } map.clearOverlays(); addMarker(); } }); }
4. LandDataInfo.ashxcookie
根據傳過來的ID,先從new_tempdate取出保存的XML文件。因我這邊需取經緯度,在原視圖沒有該列,因此我執行取出來的XML拿到GUID,而後從新再取了一次經緯度. CreateXml方法是採用分頁 Cookie 對 FetchXML 查詢的結果進行分頁(因Fetchxml查詢不能超過5千條,採用此方法解決)app
public void ProcessRequest(HttpContext context) { string serverUrl = DNTRequest.GetQueryString("serverUrl"); string landid = DNTRequest.GetQueryString("landid"); serverUrl = serverUrl + "/XRMServices/2011/Organization.svc"; CRMOrg crmOrg = new CRMOrg(); OrganizationServiceProxy orgSvc = crmOrg.GetOrganization(serverUrl); string retstr = ""; retstr = GetLandInfo(orgSvc, landid); retstr = retstr.Replace("{", ""); retstr = retstr.Replace("}", ""); retstr = retstr.Replace("null", ""); context.Response.Write(retstr); } //取土地信息 private string GetLandInfo(OrganizationServiceProxy orgSvc, string landid) { string retstr = ""; string fetchxml= ""; string landdataid; string landaddress; string lat; //緯度 string lng; #region //取存儲的xml文檔 string tempXml = string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'> <entity name='new_tempdata'> <attribute name='new_fetchxml' /> <filter type='and'> <condition attribute='new_tempdataid' operator='eq' value='{0}'/> </filter> </entity> </fetch>", new Guid(landid)); EntityCollection tempdataRetrieved = null; tempdataRetrieved = orgSvc.RetrieveMultiple(new FetchExpression(tempXml)); foreach (var tempdataResult in tempdataRetrieved.Entities) { fetchxml= (tempdataResult.Contains("new_fetchxml")) ? tempdataResult.Attributes["new_fetchxml"].ToString() : ""; } #endregion int fetchCount = 300; //定義每頁查詢的數目 int pageNumber = 1; //起始頁 string pagingCookie = null; while (true) { string xml = CreateXml(fetchxml, pagingCookie, pageNumber, fetchCount); EntityCollection returnCollection = orgSvc.RetrieveMultiple(new Microsoft.Xrm.Sdk.Query.FetchExpression(xml)); foreach (var entity in returnCollection.Entities) { landdataid = entity.Attributes.Contains("new_landdataid") ? (entity.Attributes["new_landdataid"]).ToString() : ""; #region //取經緯度 string competeXml = string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'> <entity name='new_landdata'> <attribute name='new_landdataid' /> <attribute name='new_landaddress' /> <attribute name='new_lat' /> <attribute name='new_lng' /> <order attribute='new_lat' descending='false' /> <filter type='and'> <condition attribute='statecode' operator='eq' value='0' /> <condition attribute='new_landdataid' operator='eq' value='{0}'/> <condition attribute='new_lng' operator='not-null' /> <condition attribute='new_lat' operator='not-null' /> </filter> </entity> </fetch>", new Guid(landdataid)); EntityCollection landRetrieved = null; landRetrieved = orgSvc.RetrieveMultiple(new FetchExpression(competeXml)); foreach (var landResult in landRetrieved.Entities) { landaddress = (landResult.Contains("new_landaddress")) ? landResult.Attributes["new_landaddress"].ToString() : ""; lat = (landResult.Contains("new_lat")) ? landResult.Attributes["new_lat"].ToString() : ""; lng = (landResult.Contains("new_lng")) ? landResult.Attributes["new_lng"].ToString() : ""; retstr += landaddress + ";" + landdataid + ";" + lng + ";" + lat + ";"; } #endregion } if (returnCollection.MoreRecords) { pageNumber++; } else { break; } } retstr = retstr.TrimEnd(';'); return retstr; } public string CreateXml(string xml, string cookie, int page, int count) { StringReader stringReader = new StringReader(xml); XmlTextReader reader = new XmlTextReader(stringReader); // Load document XmlDocument doc = new XmlDocument(); doc.Load(reader); return CreateXml(doc, cookie, page, count); } public string CreateXml(XmlDocument doc, string cookie, int page, int count) { XmlAttributeCollection attrs = doc.DocumentElement.Attributes; if (cookie != null) { XmlAttribute pagingAttr = doc.CreateAttribute("paging-cookie"); pagingAttr.Value = cookie; attrs.Append(pagingAttr); } XmlAttribute pageAttr = doc.CreateAttribute("page"); pageAttr.Value = System.Convert.ToString(page); attrs.Append(pageAttr); XmlAttribute countAttr = doc.CreateAttribute("count"); countAttr.Value = System.Convert.ToString(count); attrs.Append(countAttr); StringBuilder sb = new StringBuilder(1024); StringWriter stringWriter = new StringWriter(sb); XmlTextWriter writer = new XmlTextWriter(stringWriter); doc.WriteTo(writer); writer.Close(); return sb.ToString(); }