posts - 48,  comments - 179,  trackbacks - 2

最近很多朋友(AndrewBENEN1)都在问如何让Lookup显示InActive记录,研究后发现可以通过Plugin来实现这样的功能,
MSCRM真是无所不能,没有做不到,只有想不到!
实现步骤:
一、自定义实体->工程项目->表单和视图->查找视图->添加查找列 选择创建者 确保创建者属性在最后一列,如下图:

     
二、Plugin开发
    代码: 

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;

namespace PluginDemo
{
    
public class QuoteLookupShowAllRecord : IPlugin
    {
        
#region IPlugin 成员

        
public void Execute(IPluginExecutionContext context)
        {
            
if (context.InputParameters.Contains("FetchXml"))
            {
                
string FetchXml = (String)context.InputParameters["FetchXml"];
                
if (FetchXml.Contains("<entity name=\"new_project\">"))  
                {
                    
if (FetchXml.Contains("<attribute name=\"createdby\" /><filter type=\"and\"><condition attribute=\"statecode\" operator=\"eq\" value=\"0\" /></filter>"))
                    {
                        context.InputParameters[
"FetchXml"= FetchXml.Replace("<attribute name=\"createdby\" /><filter type=\"and\"><condition attribute=\"statecode\" operator=\"eq\" value=\"0\" /></filter>""<attribute name=\"createdby\" /><filter type=\"and\"></filter>");
                    }
                }
            }
        }

        
#endregion
    }
}

    注册Plugin:

  

 

posted on 2009-02-12 17:46 Batistuta Cai 阅读(2579) 评论(17) 编辑 收藏

FeedBack:
2009-02-13 18:12 | xue[未注册用户]
请教一个问题,如何在crm中取得当前用户登录的id号,然后将这个id号以超链接的方式放在客户窗口(Account)的任何一个位置,比如菜单中,窗体的任意一个位置,

然后登录都就可以点击这个链接地址,比如
http://www.aa.com/b.aspx?id=当前登录用户id,打开窗口链接到外部的系统?

aspx@hotmail.com,期待你的解答。

 回复 引用   
2009-02-20 17:41 | zw3004      

刀哥麻烦看看下面路径里面的问题怎么解决,我实在找不到它的原因了,谢谢。
http://space.cnblogs.com/question/5140/

 回复 引用 查看   
2009-02-27 15:43 | 小豆豆      
刀哥,请教一个问题:
我准备写个Plug in来实现功能:在创建商机产品时给产品相对应的产品经理授予读写商机的权限,但是老是提示一个错误:未找到所请求的记录,或者您没有权限来查看该记录,我验证过,问题出在 GrantAccessResponse granted = (GrantAccessResponse)_server.Execute(grant);这一句。先谢谢刀哥了


代码如下:
DynamicEntity entity = null;
Lookup lkOpp = null;
Lookup lkUser = null;

if (context.InputParameters.Properties.Contains("Target") && context.InputParameters.Properties["Target"] is DynamicEntity)
{
entity = (DynamicEntity)context.InputParameters.Properties["Target"];

if (entity.Name != "opportunityproduct")
return;
lkOpp = (Lookup)entity.Properties["opportunityid"];
Lookup lkProd = (Lookup)entity.Properties["productid"];
ICrmService stservice = context.CreateCrmService(true);
TargetRetrieveDynamic target1 = new TargetRetrieveDynamic();
target1.EntityId = lkProd.Value;
target1.EntityName = "product";

RetrieveRequest rr = new RetrieveRequest();
rr.ColumnSet = new AllColumns();
rr.Target = target1;
rr.ReturnDynamicEntities = true;

RetrieveResponse rrr = stservice.Execute(rr) as RetrieveResponse;

DynamicEntity line = rrr.BusinessEntity as DynamicEntity;
if (line != null)
{
lkUser = line.Properties["new_productlinemanger"] as Lookup;
}
CrmService _server = GetService();
SecurityPrincipal principal = new SecurityPrincipal();
principal.Type = SecurityPrincipalType.User;
principal.PrincipalId = lkUser.Value;
PrincipalAccess principalAccess = new PrincipalAccess();
principalAccess.Principal = principal;
principalAccess.AccessMask = AccessRights.ReadAccess;
TargetOwnedQuote target = new TargetOwnedQuote();
target.EntityId = lkOpp.Value;
GrantAccessRequest grant = new GrantAccessRequest();
grant.PrincipalAccess = principalAccess;
grant.Target = target;

GrantAccessResponse granted = (GrantAccessResponse)_server.Execute(grant);

principal.Type = SecurityPrincipalType.User;
principal.PrincipalId = lkUser.Value;
principalAccess.Principal = principal;
principalAccess.AccessMask = AccessRights.WriteAccess;
target.EntityId = lkOpp.Value;
grant.PrincipalAccess = principalAccess;
grant.Target = target;
GrantAccessResponse granted1 = (GrantAccessResponse)_server.Execute(grant);

 回复 引用 查看   
#4楼[楼主]
2009-02-27 18:03 | 刀客(batistuta)      
@小豆豆
你用管理员创建商机产品应该不会报错.
对于其他用户如果他没有共享商机给产品经理的权限就会报错.

你需要做以下处理:
ICrmService stservice = context.CreateCrmService(true);
修改为
ICrmService stservice = context.CreateCrmService(false);

丢弃
CrmService _server = GetService();
直接用stservice 就可以.

就可以解决这个问题.

 回复 引用 查看   
#5楼[楼主]
2009-02-27 18:05 | 刀客(batistuta)      
@小豆豆
另外你要共享读跟写的权限,你不用执行两次execute,一次就够了.
你可以这样写:
access.AccessMask = AccessRights.ReadAccess | WriteAccess | DeleteAccess | AssignAccess | ShareAccess | AccessRights.AppendAccess | AccessRights.AppendToAccess;

AccessMask 是一个枚举类型

 回复 引用 查看   
#6楼[楼主]
2009-02-27 18:07 | 刀客(batistuta)      
@xue
你可以做一个custom aspx 在里面可以获取当前用户的id(通过webservice),如何跳转到
http://www.aa.com/b.aspx?id=当前登录用户id,这样的外部的系统地址

 回复 引用 查看   
#7楼[楼主]
2009-02-27 18:09 | 刀客(batistuta)      
@zw3004
不好意思,最近很忙,一直没时间去测试,看了你的blog,我觉得应该是一个bug,你可以试下把rollup1、2都打上,看看解决了没,如果还解决不了,我们再交流。

 回复 引用 查看   
2009-02-27 20:48 | zw3004      
@刀客(batistuta)
呵呵,谢谢刀哥百忙之中抽空出来回答,我把两个补丁都打了,还是存在一样的问题。在3.0上存在这样的bug,但是微软有补丁,4.0就没有任何说明。下面是3.0关于这个问题的补丁说明。可是4.0的我却怎么也找不到。
http://support.microsoft.com/kb/917822/EN-US/

 回复 引用 查看   
#9楼[楼主]
2009-02-27 21:56 | 刀客(batistuta)      
@zw3004
刚刚试了下,的确有这样的问题.这可以确定是一个bug,刚刚search了kb,没有发现有类似的kb,你可以向ms技术支持部门提起一个case,让他们跟产品组沟通,确认bug.

 回复 引用 查看   
2009-02-27 23:26 | zw3004      
@刀客(batistuta)
嗯,我一直怀疑这是一个bug,可是自己水平一般,所以不敢确定,感谢刀哥关注,明天和微软的技术支持部沟通。

 回复 引用 查看   
2009-03-02 08:32 | 小豆豆      
谢谢刀客,you are very good.
 回复 引用 查看   
2009-03-02 11:18 | 小豆豆      
刀客,有一个新问题请教一下您,在新建商机时,商机产品是没有办法添加的,因为商机产品的按钮成灰色,只有保存商机后才能添加商机产品,报价单也需要做成这样,能有办法设置报价单产品按钮在创建报价单产品时也成灰色,只有保存后才能添加报价单产品呢?不知道去哪设置这个功能.谢谢
 回复 引用 查看   
#13楼[楼主]
2009-03-03 17:32 | 刀客(batistuta)      
@小豆豆
商机跟报价单都是一样的啊,在新建商机/报价单时,商机/报价单产品是没有办法添加的. 你如果可以截个图上来看看

 回复 引用 查看   
2009-03-04 09:45 | 小豆豆      
Dear ,刀客,新建报价单时是从商机中新建的,而不是直接建报价单,图片如下:http://www.cnblogs.com/zssdouzi/admin/EditGalleries.aspx?catid=178764,有兴趣可看下,一看就知道了.
另外,我见一篇博客有写这方面的内容:
http://social.microsoft.com/Forums/zh-CN/dymanicscrmzhchs/thread/8d94d8ab-ee77-461a-8d82-3daf844a992f
但是不清楚博客里这些id是怎么找到的: "_NA_Info", Sales: "_NA_SFA", Service: "_NA_CS", Marketing: "_NA_MA",我去sitemap里面看过,没有找到,所以博客中的代码我做测试时没有成功.

另外针对上次的问题,我想请教下,赋予权限用
GrantAccessResponse granted = (GrantAccessResponse)_server.Execute(grant);
删除用户对实体读写的权限应该怎么写呢,我在SDK中一直没有找到.谢谢




 回复 引用 查看   
#15楼[楼主]
2009-03-04 23:52 | 刀客(batistuta)      
@小豆豆
有关id,你可以去下载一个Internet Explorer Developer Toolbar
下载地址:http://www.microsoft.com/downloadS/details.aspx?familyid=E59C3964-672D-4511-BB3E-2D5E1DB91038&displaylang=en
就可以查看到每一个页面的html代码了,而且可以定位,很方便的工具.
你是否是要把商机下面的报价单连接给hide掉吗?
把以下代码copy到商机的onload事件就ok。
document.getElementById("navQuotes").style.display = 'none';

 回复 引用 查看   
#16楼[楼主]
2009-03-04 23:56 | 刀客(batistuta)      
@小豆豆
删除用户对实体读写的权限
你可以用ModifyAccess Message(更改拥有的权限) 或者
RevokeAccess Message(回收所有权限)

 回复 引用 查看   
2009-03-05 08:23 | zssdouzi[未注册用户]
正解,太感谢了.刀哥
 回复 引用   

Batistuta Cai

MSN:caims#techsun.com

 

昵称:Batistuta Cai
园龄:3年11个月
粉丝:18
关注:1

随笔分类

随笔档案

MSCRM Blog

MSCRM Forum

积分与排名

  • 积分 - 44985
  • 排名 - 2346

最新评论

阅读排行榜