如何根据唯一值和另一个表单中的值自动填写表单中的字段

Posted

技术标签:

【中文标题】如何根据唯一值和另一个表单中的值自动填写表单中的字段【英文标题】:How to auto fill field in a form based on a unique value and values from another form 【发布时间】:2013-08-02 12:26:12 【问题描述】:

我有 4 到 5 个自定义实体,每个实体都有一个表单。从一个表格到另一个表格会有一个流畅的进展,例如,第一个实体“预订屏幕”有一个表格,填写后用户将移动到下一个实体并填写其表格和下一个等等。

我希望根据将在第一个预订屏幕上分配的预订号上传之前填写的表格的一些信息。

例如,预订屏幕表单有:

名字、姓氏、预订号(唯一 ID)和其他信息...我希望下一个表单可以选择输入唯一 ID,然后从第一个开始自动填写姓名字段或其他信息表格。

我们可以通过工作流还是 java 脚本来做到这一点?我更喜欢 java 脚本,因为工作流是异步的。

我该怎么做?

使用上述库和一些搜索我想出了这个

function retrieveRecord(id, odataSetName, successCallback, errorCallback) 

   var context = Xrm.Page.context;

   var serverUrl = context.getServerUrl();

   var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";



   //Asynchronous AJAX function to Retrieve a CRM record using OData

   $.ajax(

   type: "GET",

   contentType: "application/json; charset=utf-8",

   datatype: "json",

   url: serverUrl + ODATA_ENDPOINT + "/" + odataSetName + "(guid'" + id + "')",

   beforeSend: function (XMLHttpRequest) 

       //Specifying this header ensures that the results will be returned as JSON.            

       XMLHttpRequest.setRequestHeader("Accept", "application/json");

   ,

   success: function (data, textStatus, XmlHttpRequest) 

       if (successCallback) 

           successCallback(data.d, textStatus, XmlHttpRequest);

       

   ,

   error: function (XmlHttpRequest, textStatus, errorThrown) 

       if (errorCallback)

           errorCallback(XmlHttpRequest, textStatus, errorThrown);

       else

           errorHandler(XmlHttpRequest, textStatus, errorThrown);

   

);


但这只是设置检索调用的方法吗?

我已经添加了 json2jquery 1.4.1.min 库。

现在我已经在我想要填充的表单的 ONLOAD 事件中添加了这个。我希望当我在表单上添加预订号时(我猜这将在文本字段的 ON CHANGE 事件中进行)它应该从主表单中检索名字、姓氏、中间名、SSN#,即预订屏幕..

我该怎么做?

我的最终代码,但它没有在表单字段上设置任何值 函数 getContactDetails() var lookUpObjectValue = Xrm.Page.getAttribute("inmate_lookupbookingscree").getValue(); 如果 ((lookUpObjectValue != null)) var lookuptextvalue = lookUpObjectValue[0].name;

    var lookupid = lookUpObjectValue[0].id;
    //alert(lookupid);


var serverUrl = Xrm.Page.context.getServerUrl();

//The XRM OData end-point
var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";


//var odataSetName = "ContactSet";

var odataSelect = serverUrl + ODATA_ENDPOINT + "/" + "(guid'" + lookupid + "')";

//alert(odataSelect);

$.ajax(
    type: "GET",
    contentType: "application/json; charset=utf-8",
    datatype: "json",
    url: odataSelect,
    beforeSend: function (XMLHttpRequest)  XMLHttpRequest.setRequestHeader("Accept", "application/json"); ,
    success: function (data, textStatus, XmlHttpRequest) 

         var result_contact= data.d;

        //alert(result_contact.AccountNumber);
                    //replace the fields with the fields on your entity
                    Xrm.Page.getAttribute("inmate_firstname").setValue(result_contact.inmate_firstname);
                    Xrm.Page.getAttribute("inmate_lastname").setValue(result_contact.inmate_lastname);



    ,
    error: function (XmlHttpRequest, textStatus, errorThrown)  alert('OData Select Failed: ' + odataSelect); 
);


【问题讨论】:

您的 odata 查询似乎有了一个良好的开端。您的名字和姓氏字段没有被填充吗?此外,正如 Campey 所建议的那样,如果您不在第一个屏幕上包含名字和姓氏,而是允许他们选择/创建联系人(您甚至可以创建一个自定义联系人表单,那么它可能会导致更简洁的设计对于这个过程)。您不希望允许您拥有的 4-5 个实体之间的名称不同。 是的,它们没有被填充。不,我需要预订屏幕(第一个屏幕)中的姓名。它们只会以我想要自动填充的形式读取。 说真的,我需要帮助,为什么这不起作用?!!!我已经在这里使用了模式名称 setValue(result_contact.inmate_FirstName);它仍然无法正常工作 【参考方案1】:

我认为这些形式(实体)之间存在关系。如果是这样,您可以将值从第一个屏幕带到第二个屏幕,等等。转到设置 |定制 |自定义系统,选择您的实体,选择您的关系,对于类型(下拉列表)选择可映射,选择您的相关实体,最后选择映射。您可以在此处创建源字段和目标字段之间的映射。

【讨论】:

【参考方案2】:

我会尝试重新考虑您在做什么,因为 CRM 在表单之间并不能真正流畅地工作。

相反,您将拥有主要的“预订实体”,然后链接到联系人等(因此,如果您需要输入名字和姓氏,您可以单击联系人查找并选择“新建”),这样您就有了一个基本表单与他人有关。

我还将研究 CRM 2013 (Orion),因为它具有可能有益的流程相关表格。

如果你想在表单之间传递数据,你需要表单之间的关系,然后我会使用 javascript。那里有很多很好的样本,比如这个。 http://crmscape.blogspot.com.au/2011/03/crm-2011-odata-json-and-crm-forms.html

【讨论】:

感谢 Campey 和 Bokkie 的回复。我将查看您的答案并尽快回复。【参考方案3】:

获取您的 odataSelect 网址,然后在浏览器中运行它。验证响应中是否返回了 inmate_firstnameinmate_lastname。如果是,那么您的问题出在您的 javascript 上。要么它实际上没有得到响应(看起来这不是问题,由于您的错误处理),或者您在响应中错误地访问了信息(或者实体不包含名字或姓氏)。要检查这些问题,请在 IE 中使用 F12 调试来检查响应数据对象。

除此之外,您的 URL 看起来缺少实体集逻辑名称。试试这个:

var odataSetName = "ContactSet";
var odataSelect = serverUrl + ODATA_ENDPOINT + "/" + odataSetName + "(guid'" + lookupid + "')";

【讨论】:

如果 odataSetName 不是 ContactSet 怎么办? odataSetName 应该是什么?我在自定义实体中保存了一个新人,而不是我们在 crm 中的联系人实体。 它将始终采用 Set 格式,但区分大小写!我相信它使用模式名称的大小写,但我不确定。尝试获取正在生成的 OData URL,并将其直接粘贴到浏览器中并不断调整它直到它工作为止。 vt-crm/JailManagementSystem/XRMServices/2011/… 这是生成的 url,它给了我一个错误“重试此操作。如果问题仍然存在,请查看 Microsoft Dynamics CRM 社区以获取解决方案或联系您组织的 Microsoft Dynamics CRM管理员。最后,您可以联系 Microsoft 支持。" @hkhan,验证此部分是否有效:vt-crm/JailManagementSystem/XRMServices/2011/…。然后试试这个:vt-crm/JailManagementSystem/XRMServices/2011/… 这是假设您的实体名称是“new_bookingscreen”,而不是“new_bookingscreen1” 它是 new_bookingscreen1。我仍然得到同样的错误。我已经尝试过上述修改url的方法:(

以上是关于如何根据唯一值和另一个表单中的值自动填写表单中的字段的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个在 php 中自动填写表单的唯一链接?

如何根据每条记录的连续表单中 ms-access 中的其他值填充文本框上的值

当有人单击电子邮件中的链接时,如何自动填写电子邮件表单字段?

如何使用 VBA 根据活动工作表中的单元格自动填充 Excel 表单?

根据先前在同一表单上输入的值自动完成表单字段

如何防止 chrome 自动填充表单中的每个字段?