【问题标题】:Change symbols of currency fields upon changing Currency on the Form in CRM 2011在 CRM 2011 中更改表单上的货币时更改货币字段的符号
【发布时间】:2013-05-13 16:28:10
【问题描述】:

你们中的一些人可能在 Microsoft Dynamics CRM 2011 中遇到过这个问题,但是今天我被分配了动态更改 Currency 查找值以匹配帐户货币的任务,以防出现任何差异.我只是通过调用我的setLookupValue JavaScript 函数来根据帐户货币设置货币值来做同样的事情。

setLookupValue("transactioncurrencyid", "transactioncurrency", accountCurrency.Id, accountCurrency.Name);

在进行单元测试之后,货币查找值发生了完美的变化,但我观察到表单上使用货币数据类型定义的所有字段的货币符号都没有更改为目标货币,在我的例子中是 accountCurrency

例如Currency 字段已从 US Dollar (USD) 更改为 Euro (EUR),但所有字段均显示 USD 作为前缀。

【问题讨论】:

    标签: javascript dynamic dynamics-crm-2011 dynamics-crm currency


    【解决方案1】:

    在 JS 中挖掘后发现,有一个简单的“支持”功能可以通过 JavaScript 更改或隐藏表单上的货币符号。在 IE 和 Chrome for CRM 365 上对此进行了测试。

    hideCurrencySymbol = function(fieldName)
    
    {
        var field = Xrm.Page.getAttribute(fieldName);
        if(field)
        {
            field.setCurrencySymbol("")//Or any symbol you want
        }
    }
    

    【讨论】:

      【解决方案2】:

      在网上花了几个小时后,我从不同来源收集了一些关于这个问题的有用信息。

      我已经设法在 IE 浏览器上为 Microsoft Dynamics CRM 2011 测试了两种方式,以动态更改表单上每个货币字段的货币符号。


      • 使用 OData(简单有效,没有跨浏览器兼容性问题):
      function changeCurrencySymbolOData(guid) {
          returnValue = retrieveMultiple("TransactionCurrencySet", "?$filter=TransactionCurrencyId eq guid'" + guid + "'");
          if (returnValue != null && returnValue[0] != null) {
              var currencyInfo = returnValue[0];
              // looping through all controls on the form and sets the currency symbol.
              var oCtrl;
              for (var i = 0; i < crmForm.all.length; i++) {
                  oCtrl = crmForm.all[i];
                  if (oCtrl.tagName == "INPUT" &&
                              (oCtrl.className == "ms-crm-Money-CurrencySymbol" ||
                              oCtrl.className == "ms-crm-Money-CurrencySymbol ms-crm-ReadOnly")) {
                      oCtrl.value = currencyInfo.ISOCurrencyCode;
                  }
              }
          }
      }
      

      用法:

      changeCurrencySymbolOData(accountCurrency.Id);
      

      其中accountCurrency 指的是欧元 (EUR) 货币。


      • 使用 获取 XML
      function changeCurrencySymbolFetchXML(isoCurrencyCode) {
          var currencySymbolName = crmForm.all.transactioncurrencyid.cursymclm;
          // ensuring that currency is present.
          var fetchCurr = '<fetch mapping="logical" count="50" version="1.0">';
          fetchCurr += '<entity name="transactioncurrency">';
          fetchCurr += '  <attribute name="currencyname" />';
          fetchCurr += '  <attribute name="' + currencySymbolName + '" />';
          fetchCurr += '    <filter>';
          fetchCurr += '        <condition attribute="isocurrencycode" operator="eq" value="' + isoCurrencyCode + '" />';
          fetchCurr += '    </filter>';
          fetchCurr += '</entity>';
          fetchCurr += '</fetch>';
      
          results = doFetch(fetchCurr);
          if (results != null && results.length > 0) {
              var currency = results[0].selectSingleNode('./transactioncurrencyid');
              // checking if the same currency is already selected, then there is no need to change anything.
              if (crmForm.all.transactioncurrencyid.DataValue == null ||
                  crmForm.all.transactioncurrencyid.DataValue[0].id != currency.text) {
                  var currencyName = results[0].selectSingleNode('./currencyname').text;
                  // defining the variable to hold the actual symbol.
                  var currencySymbol = results[0].selectSingleNode('./' + currencySymbolName).text;
                  var lookupData = new Array();
                  var lookupItem = new Object();
                  // setting the id, typename, and name properties to the object.
                  lookupItem.id = currency.text;
                  lookupItem.name = currencyName;
                  lookupItem.typename = 'transactioncurrency';
      
                  // adding the object to the array.
                  lookupData[0] = lookupItem;
                  // setting the value of the lookup field to the value of the array.
                  crmForm.all.transactioncurrencyid.DataValue = lookupData;
                  crmForm.all.transactioncurrencyid.ForceSubmit = true;
      
                  // looping through all controls on the form and sets the currency symbol.
                  var oCtrl;
                  for (var i = 0; i < crmForm.all.length; i++) {
                      oCtrl = crmForm.all[i];
                      if (oCtrl.tagName == "INPUT" &&
                          (oCtrl.className == "ms-crm-Money-CurrencySymbol" ||
                          oCtrl.className == "ms-crm-Money-CurrencySymbol ms-crm-ReadOnly")) {
                          oCtrl.value = currencySymbol;
                      }
                  }
              }
          }
      }
      
      function doFetch(fetchXml) {
          fetchXml = fetchXml.replace(/</g, '&lt;');
          fetchXml = fetchXml.replace(/>/g, '&gt;');
          // preparing the SOAP message.
          var xml = "<?xml version='1.0' encoding='utf-8'?>"
          xml += "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' "
          xml += "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' "
          xml += "xmlns:xsd='http://www.w3.org/2001/XMLSchema'>";
          xml += Xrm.Page.context.getAuthenticationHeader();
          xml += "<soap:Body>";
          xml += "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'><fetchXml>";
          xml += fetchXml;
          xml += "</fetchXml></Fetch>";
          xml += "</soap:Body></soap:Envelope>";
      
          // preparing the xmlHttpObject and send the request.
          var xHReq = new ActiveXObject("Msxml2.XMLHTTP");
          xHReq.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
          xHReq.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch");
          xHReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
          xHReq.setRequestHeader("Content-Length", xml.length);
          xHReq.send(xml);
      
          // capturing the result.
          var resultXml = xHReq.responseXML;
      
          // checking for errors.
          var errorCount = resultXml.selectNodes('//error').length;
          if (errorCount != 0) {
              var msg = resultXml.selectSingleNode('//description').nodeTypedValue;
              alert(msg);
          }
          // process and display the results.
          else {
              // capturing the result and UnEncode it.
              var resultSet = new String();
              resultSet = resultXml.text;
              resultSet.replace('&lt;', '<');
              resultSet.replace('&gt;', '>');
      
              // creating an XML document that you can parse.
              var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM");
              oXmlDoc.async = false;
      
              // loading the XML document that has the UnEncoded results.
              oXmlDoc.loadXML(resultSet);
      
              // displaying the results.
              var results = oXmlDoc.getElementsByTagName('result');
              return results;
          }
      }
      

      用法:

      changeCurrencySymbolFetchXML('EUR');
      

      资源:

      【讨论】:

      • 请注意,此代码不跨浏览器兼容,它使用 crm 4.0 端点,已从 crm 2011 在线实例中删除(使用 office 365 身份验证)
      • 不确定跨浏览器的兼容性,但它在 IE 中运行良好。此外,我已经测试了这段代码,现在在我的 CRM 2011 项目中使用它,效果很好。
      • 不支持的 DOM 访问:-1,也许只是触发刷新就可以了
      猜你喜欢
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多