补充三:操纵示例

C#示例

示例一:多表内联

需求:根据记录的id查询给记录的历史记录中的更改人(用户名称)是否拥有管理员角色

分步查询

// 根据唯一线索id获取所有记录中的用户名称
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true" >
    <entity name="jk_assignment_log" >
		<attribute name="jk_assignment_object" />
        <filter type="and" >
            <condition attribute="statecode" operator="eq" value="0" />
            <condition attribute="jk_lead" operator="eq" value="618620BD-EF28-417E-982C-8057201B6D48" />
        </filter>
    </entity>
</fetch>

// 根据用户名称获取用户名称和id
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true" >
    <entity name="systemuser" >
        <attribute name="systemuserid" />
		<attribute name="fullname" />
		<filter type="and" >
            <condition attribute="fullname" operator="eq" value="优文途新管理员" />
        </filter>
    </entity>
</fetch>


// 查询此用户id是否存在执行角色名称
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true" >
    <entity name="role" >
        <attribute name="name" />
        <attribute name="businessunitid" />
        <attribute name="roleid" />
        <filter type="and" >
            <condition attribute="name" operator="eq" value="系统管理员" />
        </filter>
        <link-entity name="systemuserroles" from="roleid" to="roleid" visible="false" intersect="true" >
            <link-entity name="systemuser" from="systemuserid" to="systemuserid" alias="ad" >
                <attribute name="systemuserid" />
                <filter type="and" >
                    <condition attribute="systemuserid" operator="eq" value="65AD644C-64F7-E811-A81E-9A16184AF7BF" />
                </filter>
            </link-entity>
        </link-entity>
    </entity>
</fetch>

联表查询

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true" >
    <entity name="jk_assignment_log" >
		<attribute name="jk_assignment_object" />
        <filter type="and" >
            <condition attribute="statecode" operator="eq" value="0" />
            <condition attribute="jk_lead" operator="eq" value="618620BD-EF28-417E-982C-8057201B6D48" />
        </filter>
		<link-entity name="systemuser" from="fullname" to="jk_assignment_object">
			<attribute name="systemuserid" />
			<attribute name="fullname" />
			<link-entity name="systemuserroles" from="systemuserid" to="systemuserid">
				<link-entity name="role" from="roleid" to="roleid">
					<filter type="and" >
						<condition attribute="name" operator="eq" value="系统管理员" />
					</filter>
				</link-entity>
			</link-entity>
		</link-entity>
    </entity>
</fetch>

示例二:事务操作

Dynamics CRM 2015 UR1 新增了 ExecuteTransactionRequest,主要用来处理事务操作,即一组操作;

例一

using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Messages;

public static void ExecuteTransactionAction(OrganizationServiceProxy server)
{
    #region 增加操作
    CreateRequest add_req = new CreateRequest();
    Entity add_entity = new Entity("mcs_tc_order");
    add_entity["mcs_state"] = new OptionSetValue(1);
    add_entity["mcs_approvalstatus"] = new OptionSetValue(1);
    add_req.Target = add_entity;
    #endregion

    #region 修改操作
    UpdateRequest up_req = new UpdateRequest();
    ColumnSet attributes = new ColumnSet(new string[] { "mcs_state", "ownerid" });
    Entity up_entity = server.Retrieve("mcs_tc_order", new Guid("xxx"), attributes);
    up_entity.Attributes["mcs_state"] = new OptionSetValue(2);
    up_req.Target = up_entity;
    #endregion

    #region 删除操作
    DeleteRequest del_req = new DeleteRequest();
    Guid id = new Guid("xxx");
    del_req.Target = new EntityReference("mcs_tc_order",id);
    #endregion

    ExecuteTransactionRequest req = new ExecuteTransactionRequest();
    req.Requests = new OrganizationRequestCollection() { add_req,up_req, del_req };
    server.Execute(req);
}

例二

// 1.创建事务对象
var TranRequest = new ExecuteTransactionRequest()
{
    ReturnResponses = true, // 可选
    Requests = new OrganizationRequestCollection(),
};

// 2.1 更新操作,temp为更新的记录且已存在的记录
TranRequest.Requests.Add(new UpdateRequest() { Target = temp });

// 2.2 删除操作,temp为ToEntityReference类型且已存在的记录
TranRequest.Requests.Add(new DeleteRequest() { Target = temp.ToEntityReference() });

// 2.3 新建操作,temp为新记录
TranRequest.Requests.Add(new CreateRequest() { Target = temp });

// 3. 执行事务
if (TranRequest.Requests.Count() > 0) service.Execute(TranRequest);

JavaScript示例

示例一:禁用表单字段

function disableForm()
{
    var controls = Xrm.Page.ui.controls.get();
    for (var i in controls) {
        var control = controls[i];
        if (control.getControlType() != "iframe" 
            && control.getControlType() != "webresource"
            && control.getControlType() != "subgrid" 
            && control.getDisabled() == false) 
        {
            control.setDisabled(true);
        }
    }
}

示例二:窗体保存事件

该代码需要配置OnSave事件,并启用“将执行上下文作为第一个参数”

示例场景:通过判断是否字段未保存来防止触发

function SaveAlert(ExecutionObj) {
    var project_stage = Xrm.Page.getAttribute("new_productproject_stage").getValue();
    if (project_stage >= 7) {
        if (Xrm.Page.getAttribute("new_internalresourcesid").getIsDirty()) {
            if (confirm("生产公司简称变更将会邮件通知总经理,请点击确认/取消变更。")) {
            }
            else {
                ExecutionObj.getEventArgs().preventDefault();//阻止保存操作
            }
        }    
    }
}
上一篇:Entitas 初级


下一篇:Dotnet洋葱架构实践