Mostrando postagens com marcador CRM 2011. Mostrar todas as postagens
Mostrando postagens com marcador CRM 2011. Mostrar todas as postagens

quinta-feira, 23 de maio de 2013

CRM IFD - Habilitar Exportação de Planilha Dinâmica

Existem alterações interessantes que podem ser feitas no Metadados do CRM - infelizmente não especificadas no SDK do próprio produto - como por exemplo, habilitar o recurso de exportação de planilha dinâmica do excel no CRM para IFD.
Por padrão, o CRM cria no excel uma [connection string] que aponta diretamente para o Servidor de Banco de Dados do CRM para buscar os dados. Porém, via IFD, esta conexão não é mais válida, pois você pode estar fora do domínio onde o servidor de banco do CRM se encontra.

Pois bem, para habilitar este recurso no IFD, faça o seguinte:

CRM 4.0
- Entre no servidor de aplicação do CRM;
- Abra o Regedit
- Vá até HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM
- E crie uma [DWORD Value] chamada UseWebQueryForLiveExport com o valor 1

CRM 2011
- Entre no servidor de aplicação do CRM;
- Abra o console do PowerShell do Windows (Iniciar => Todos os Programas => Acessórios => Windows PowerShell)
- Digite:
- Add-PSSnapin Microsoft.Crm.PowerShell
- $setting = New-Object "Microsoft.Xrm.Sdk.Deployment.ConfigurationEntity"
- $setting.LogicalName = "Organization"
- $setting.Attributes = New-Object "Microsoft.Xrm.Sdk.Deployment.AttributeCollection"
- $keypair = New-Object "System.Collections.Generic.KeyValuePair[String,Object]" ("UseWebQueryForLiveExport",$True)
- $setting.Attributes.Add($keypair)
- Set-CrmAdvancedSetting -Entity $setting

Fontes:
- Microsoft Office Excel worksheets exported from Microsoft Dynamics CRM are slow to open
- Organization Table Metadata (Advanced Settings)

[]s

sexta-feira, 24 de agosto de 2012

CRM 2011 - Javascript + WCF

Olá Pessoal,

Talvez já tenham notado que executar um WCF via JavaScript não é tão fácil como parece ou como era a chamada de um tradicional Web Services .ASMX .
Isto porque por padrão, no WCF, este tipo de execução no Client vem desabilitado.
Desta forma, segue um tutorial para uma execução bem sucedida no seu JScript.

1 - Habilitar compatibilidade de execução ASP.NET na sua classe. Para tanto, adicione a diretiva, conforme exemplificado abaixo:


[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1 : IService1


2 - Implementar as diretivas na sua INTERFACE de classe, conforme exemplo abaixo:

[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Xml)]
string MyMethod(string p1, string p2);
}


3 - Implementar o seguinte WEB.CONFIG:
P.S.: Se você estiver executando uma URL segura (httpS) use a propriedade [httpsGetEnabled] senão [httpGetEnabled] na seção [serviceMetadata]
P.S.2: Não esqueça de trocar as frases [YOURNAMESPACE] e [YOURURL] pelas respectivas informações reais do seu projeto.


<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<identity impersonate="true" />
<customErrors mode="Off"/>

<httpModules>
<clear/>
</httpModules>

</system.web>

<system.serviceModel>

<standardEndpoints>
<webScriptEndpoint>
<standardEndpoint name="" crossDomainScriptAccessEnabled="true"/>
</webScriptEndpoint>
</standardEndpoints>

<services>
<service name="YOURNAMESPACE.Service1" behaviorConfiguration="ServiceBehaviors">
<endpoint name="Endpoint"
address="http://YOURURL/Service1.svc"
binding="webHttpBinding"
contract="YOURNAMESPACE.IService1"
behaviorConfiguration="WCFAjaxBehavior"
bindingConfiguration="webBinding" />
</service>
</services>

<behaviors>
<endpointBehaviors>
<behavior name="WCFAjaxBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>

<serviceBehaviors>
<behavior name="ServiceBehaviors">
<serviceDiscovery />
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false" />

<bindings>
<webHttpBinding>
<binding name="webBinding">
<security mode="Transport"></security>
</binding>
</webHttpBinding>
</bindings>

</system.serviceModel>

<system.webServer> <modules runAllManagedModulesForAllRequests="true"/>

<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type, Accept" />
</customHeaders>
</httpProtocol>

</system.webServer>
</configuration>


4 - E como último passo, a execução do seu WCF via JScript:

var url = "http://YOURURL/Service1.svc/MyMethod";

var client = null;
if (window.XMLHttpRequest)
client = new XMLHttpRequest();
else if (window.ActiveXObject)
client = new ActiveXObject("Microsoft.XMLHTTP");

var data = '{';
data += '"p1":"' + "SOMEVALUE" + '"';
data += ',';
data += '"p2":"' + "SOMEVALUE" + '"';
data += '}';

client.open ('POST', url, false);
client.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
client.send(data);
var resultValue = client.responseText;


That's It!

sexta-feira, 10 de agosto de 2012

Corretor Ortográfico no Browser

Segue uma dica interessante, que é possibilidade de correção ortográfica no seu Browser. Para isto, basta instalar um Add-On gratuito da empresa Speckie e pronto.

Veja a matéria na Fonte, onde este recurso é usado no Microsoft Dynamics CRM.

[]s

terça-feira, 10 de janeiro de 2012

CRM 2011 >> SubGrid - Totalização de Valor (via JScript)

No CRM 2011 temos a possibilidade de explorar muito bem desenvolvimentos em JScript, jQuery, jSon (ou REST OData).

Seguindo esta linha, segue um código, pequeno inclusive, que faz uma Totalização de Valores, buscando as informações em um SubGrid!

Para a execução do código, basta adicioná-lo no formulário, e chamá-lo no método OnLoad.
Importante adicionar os JScripts prontos da Microsoft, para execução de chamadas jQuery, sendo eles [jquery1.4.1.min.js] e [jqueryrestdataoperationfunctions.js].

Importante também adicionar o campo de moeda do CRM (TransactionCurrencyId), quando existir na tela do CRM algum campo do tipo moeda. Neste caso usaremos e o script abaixo preenche o campo automaticamente.

Estes arquivos podem ser encontrados no SDK do CRM (quando descompactado em qualquer diretório), no caminho [\SDK\samplecode\js\restendpoint\jqueryrestdataoperations\jqueryrestdataoperations\scripts].

Segue Script:


var timeOutVar;
function PrepareAddUpValue() {
var grid = document.getElementById('GRIDNAME');
if (grid == null)
{
// delay one second and try again.
timeOutVar = setTimeout(PrepareAddUpValue, 1000);
return;
}
clearTimeout(timeOutVar);
grid.attachEvent("onrefresh", AddUpValue);
}

function AddUpValue(){
var gridControl = document.getElementById("GRIDNAME").control;
var ids = gridControl.get_allRecordIds();
var new_total = 0.0;

for(var i = 0; i < ids.length; i++)
{
str_value = gridControl.getCellValue("NOME_COLUNA_GRID", ids[i]).replace("R$", "").replace(" ", "");
new_total += parseFloatString(str_value);
}

Xrm.Page.getAttribute("new_total").setValue(new_total);
Xrm.Page.data.entity.save();
}

function parseFloatString(str){
str = String(str);
var strNew = "";
for(var i=0; i < str.length; i++){
if (isNaN(parseInt(str.charAt(i))) == false) strNew +=str.charAt(i);
}

return parseFloat(strNew);
}

function SetCurrency(){
if (Xrm.Page.getAttribute("transactioncurrencyid") != null) return;
var filter = "?$select=TransactionCurrencyId,CurrencyName";
retrieveMultiple("TransactionCurrencySet", filter, retrieveMultipleCurrencyCompleted, null);
}

function retrieveMultipleCurrencyCompleted(data, textStatus, XmlHttpRequest){
if (data == null) return;
var idValue = data[0].TransactionCurrencyId;
var textValue = data[0].CurrencyName;
var thisEntityType = 'transactioncurrency';
Xrm.Page.getAttribute("transactioncurrencyid").setValue([{ id: idValue, name: textValue, entityType: thisEntityType }]);
}

SetCurrency();

Veja uma tela de exemplo. Note que, ao adicionar um novo registro, o Script é acionado, totalizando o valor em um campo do formulário. Isto acontece porque o Script atua no evento [OnRefresh] do SubGrid do CRM.

terça-feira, 13 de setembro de 2011

>> CRM 2011 - Busca de Dados do CRM via JScript-JQuery

Segue os procedimentos para utilizar este poderoso recurso do CRM 2011:

1 - Baixar o SDK do produto;

2 - Após extrair o SDK em qualquer diretório, ir até o sub-diretório [sdk\samplecode\js\restendpoint\jqueryrestdataoperations\jqueryrestdataoperations\scripts] e importar o arquivo [jquery1.4.1.min.js] como um [Web Resource] no CRM;

3 - Efetuar o mesmo procedimento do passo 2, para o arquivo [jqueryrestdataoperationfunctions.js];

4 - Ao associar estes Web Resources a entidade do CRM desejada, atente para a ordem, pois é relevante no carregamento da página:
4.1 - primeiro [jquery1.4.1.min.js];
4.2 - depois [jqueryrestdataoperationfunctions.js];
4.3 - por último, seu próprio JS, que utilizará os recursos acima.

P.S.: Apenas para lembrar o caminho, para efetuar o passo 4, abrir o formulário da entidade desejada e clicar no botão [Propriedades do Formulário], como exemplifica a tela abaixo:




5- No sub-diretório citado no passo 2, existe uma arquivo chamado [jqueryrestdataoperationactions.js] que contém diversos exemplos de uso. Segue abaixo um deles:




function retrieveAccount(id) {
// [retrieveRecord] está presente na biblioteca [jqueryrestdataoperationfunctions.js].
retrieveRecord(id, "AccountSet", retrieveAccountCompleted, null);
}

function retrieveAccountCompleted(data, textStatus, XmlHttpRequest) {
alert(data.Name);
}



Para trabalhar com buscas mais complexas, existe a função [retrieveMultiple]. Porém, infelizmente, não existe exemplo no SDK. Consegui achar um artigo muito bom chamado [Adding Selection Criteria to REST Queries in CRM 2011]. Testei um caso com sucesso. Vale realmente a pena checar.