CRM 2011 根据当前视图抓取网格里面所有的数据
1.在对应实体的HomePage新增按钮土地地图,调用landinfomap.JS(上传到系统WEB资源中)
2. New_landdata.JS中关键代码
//取经过筛选之后视图的FETCHXML,并保存在实体new_tempdata中(因XML过长,URL传值受到限制,目前只找到此方法),然后把保存的记录ID传参到LandDataMap.aspx页面(需另外做个批量删除的作业,来删除实体new_tempdata不需要的数据,可在数据管理—>> 批量删除记录里面创建)
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.JS
接收landinfomap.JS传过来的参数,并通过LandDataInfo.ashx去取数据
//取土地 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.ashx
根据传过来的ID,先从new_tempdate取出保存的XML文件。因我这边需取经纬度,在原视图没有该列,所以我执行取出来的XML拿到GUID,然后重新再取了一次经纬度. CreateXml方法是采用分页 Cookie 对 FetchXML 查询的结果进行分页(因Fetchxml查询不能超过5千条,采用此方法解决)
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(); } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步