Volta a ativa!

Olá a todos.

Depois de um longo e tenebroso Inverno a Primavera chegou. E com ela a promessa que iremos atualizar este Blog mais constantemente, com Notícias, Artigos, Tutoriais e Códigos sobre o nosso amado Microsoft Dynamics CRM. É aguardar para ver!

Enquanto isso não se esqueçam de seguir nosso perfil no Twitter: http://twitter.com/dynamicscrmbr. Vai rolar sorteio de um Microsoft Touch Mouse assim que chegarmos a 500 seguidores. Não esqueça de seguir nosso perfil e de dar um Retweet para concorrer.

image

Boa sorte a todos.

Até mais!

Artigo sobre xRM na Codificando.NET e-Magazine

Pessoal,

Na revista Codificando.NET e-Magazine, edição 20, foi publicado um artigo de minha autoria sobre Dynamics CRM e a sua utilização como plataforma de desenvolvimento.

Download ou leitura on-line gratuita neste link:

http://www.codificandomagazine.com.br/revista/

Ricardo Alves

Removendo módulo no Dynamics CRM 2011

Olá,

Neste post vou demonstrar como ocultar um modulo do Dynamics CRM, alterando o SiteMap (local onde fica mapeado a estrutura de um site).

No exemplo vou remover o módulo de Vendas.

Passo 1: Baixar a solução

Siga em Configurações > Personalização > Personalizações e clique em Personalizar o Sistema:


Na tela que abrirá clique em Exportar Solução, na barra superior:

Após abrir a tela, clique em Publicar Todas as Personalizações e em seguida em Avançar:

Marque a opção Personalização e clique em Avançar:

Salve o arquivo *.zip em qualquer diretorio.

Faça um backup desta solução antes de prosseguir.

Passo 2: Alterando o arquivo customizations.xml

Descompacte o arquivo e abra o arquivo customizations.xml em um editor de sua preferência.

No arquivo procure por “SiteMap”, dentro do nó SiteMap, retire do arquivo xml o Area (módulo) que deseja remover do Dynamics CRM.

No meu exemplo estou retirando o módulo de Vendas, ou seja, eu retiro o
Id=”SFA” / ResourceId=”Area_Sales” do arquivo:

Salve e feche o arquivo.

Passo 3: Importando as customizações

Compacte os arquivos em um arquivo *.zip.

Siga no Dynamics CRM em Configurações > Personalização > Soluções e clique em Importar:

Selecione o arquivo compactado e clique em Avançar:

Clique em Avançar novamente e aguarde a importação finalizar.

Clique em Publicar Todas as Personalizações e em seguida em Fechar.

Agora é só atualizar o browser (pressione F5) e veja o resultado:

Até a próxima!

OData e jQuery no Dynamics CRM 2011

Uma dica muito interessante ao trabalhar com dados no Dynamics CRM 2011 é a utilização de OData (Open Data Protocol).

Com esse protocolo é possível fazer consultas utilizando o REST Endpoint do WCF utilizando Ajax, Jscript e jQuery.

Com ele é possível criar um CRUD completo.

Na função abaixo, por exemplo, eu recupero as contas com o atributo Name igual a Teste:


function ObterContas() {
    //caminho para o serviço WCF
    var ODataPath = Xrm.Page.context.getServerUrl() + "/XRMServices/2011/OrganizationData.svc";

    $.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        datatype: "json",

        //Endpoint para efetuar as condições
        url: ODataPath + "/AccountSet?$filter=Name eq 'Teste'",

        /*

        Operadores de consulta suportados:

        $filter, $select, $top, $skip, $orderby

        Exemplo:

        $filter=Name eq ‘Teste’ and Email eq ‘teste@teste.com’$orderby=CreatedOn asc

        */

        beforeSend: function (XMLHttpRequest) {

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

        },
        success: function (data, textStatus, XmlHttpRequest) {

            //retorno dos dados em JSON. Coleção em data.d.results
            var id = data.d.results[0].AccountId
            alert(id);

        },
        error: function (XmlHttpRequest, textStatus, errorThrown) {

            //mensagem de falha
            alert("Falha");

        }
    });
}

Vamos ao exemplo.

Antes de mais nada iremos utilizar o jQuery, biblioteca JavaScript que facilita muito o trabalho. Faça download aqui da versão Minified (os testes foram feitos com a versão 1.4.1):

http://docs.jquery.com/Downloading_jQuery

Com o arquivo .js em mãos, crie um Recurso da Web (WebResource) para ele.

Configurações > Personalizações > Personalizar o Sistema > Recursos da Web > Clique em Nova e preencha desta forma:

Carregue o arquivo do jQuery (jquery-1.4.1.min.js) e clique em Salvar e Fechar.

Crie mais um Recurso da Web com este dados (este ira conter as nossas funções):

Não é necessario carregar nenhum arquivo, apenas clique em Salvar e Fechar.

Pronto, com o jQuery dentro da aplicação podemos começar a customização.

Neste eu quero recuperar todas as contas com determinado nome, isso acionado em um OnChange qualquer.

Abrar a customização do formulário (neste caso estou fazendo em Conta mesmo):

De um duplo clique em um campo, para customizarmos o OnChange:

Clique na aba (guia) Eventos, logo abaixo do subtitulo Lista de Eventos, expanda Bibliotecas de Formulários:

Clique em Adicionar, e adicione os Recursos jQuery e Teste que criamos nos passos anteriores.

Logo em seguida de um Editar na biblioteca Teste e cole a função criada para o exemplo:

No próximo passo vá na seção abaixo, Manipuladores de Eventos:

Clique em Adicionar e preencha o OnChange desta forma e clique em OK:

Bom, clique em OK em Propriedades do Campo para fechar. Feche e Salve a tela de customização do formulário de Conta.

Antes de testar vá em Configurações > Personalizações > Personalizar o Sistema e clique em Publicar Todas as Personalizações (caso contrário suas personalizações não surtiram efeito):

Pronto, agora só testar:

Espero que tenham gostado, vou alguns exemplos de CRUD para postar.

Abraços

Usando Repoting Services no CRM 2011 Online

Olá,

Quando eu vi o CRM Online sendo tão aguardado pelas empresas e profissionais, um dos itens que eu mais curioso era em relação a criação de relatórios.

Aqui tem dois artigos muito interessantes sobre o assunto:

http://blogs.msdn.com/b/crm/archive/2010/02/01/using-microsoft-sql-reporting-services-with-microsoft-crm-online.aspx

http://blogs.msdn.com/b/crm/archive/2011/03/18/parameterizing-fetch-based-reports.aspx

Onde, pelo o que eu percebi a utilização de query em FetchXml é a melhor e mais simples solução para o caso. Mas para quem gosta de queries em SQL vai sofrer um pouco.

Abs

A revolução dos TABLETS e os Projetos de CRM

Olhando o mercado de eletrônicos atualmente, é inegável o crescimento espantoso dos Tablets, impulsionados pela entrada da Apple em um setor que patinava. Agora que as grandes fábricas de eletrônicos descobriram este filão, como a Samsung e seu Galaxy Tab, muito provavelmente este é um tipo de produto que veio para ficar.

image

Relacionar Projetos de Sistema de Gestão com a adoção dos Tablets não é difícil. Como fazem parte do cotidiano operacional das empresas, os Sistemas de Gestão precisam sempre de um veículo rápido para inserção e visualização das informações. Os Tablets não poderiam chegar em melhor hora.

Sistemas de CRM, geralmente mais ágeis do que ERP, muitas vezes precisam deste tipo de veículo. Um Gerente de Contas com um Tablet executando um sistema de CRM bem afinado tem um grande potencial nas mãos, tanto em visitas a Clientes, Prospects e afins. Com telas grandes, bom poder de processamento, fácil inserção de dados, os Tablets podem ser um novo nicho ainda não explorado pelas empresas de CRM, ainda mais com a política de aplicativos já bem definida desde que a Apple inovou com sua App Store.

Será que teclado físico está com seus dias contados? Poderão os Tablets serem um recurso de produtividade a mais para Projetos de CRM? As implantadoras de Sistemas de Gestão saberão aproveitar este nicho sem perda de tempo? Teremos projetos práticos a serem demonstrados em breve? A ver.

Recuperar dados de usuário no formulário via JScript

Hi,

Desenvolvi um solução para buscar dados do usuario no via JScript (Quem nunca precisou fazer isso?)…

Está trazendo o nome e unidade de negócio, mas está simples para alterar e trazer outros dados, ou implementar a busca para outras entidades.

//passe o id do usuario
var idUsuario = '68B79189-22BC-DF11-942D-00155D082900';
var Dados = crmForm.ObterDadosUsuario(idUsuario);

//ou passe null para busca os dados do usuario logado
var Dados = crmForm.ObterDadosUsuario(null);

var idUsuario = Dados.user.id;
var nomeUsuario = Dados.user.name;
var idUnidadeNegocio = Dados.businessunit.id
var nomeUnidadeNegocio = Dados.businessunit.name

Como podem ver na chamada, funciona tanto para buscar um usuário com o id como paramêtro ou dados do usuário logado.

Agora a função…

function ExecuteRequest(query) {
    try {
        var XMLRequest = '' +
'<?xml version=\'1.0\' encoding=\'utf-8\'?>' +
'<soap:Envelope xmlns:soap=\'http://schemas.xmlsoap.org/soap/envelope/\' xmlns:xsi=\'http://www.w3.org/2001/XMLSchema-instance\' xmlns:xsd=\'http://www.w3.org/2001/XMLSchema\'>' +
GenerateAuthenticationHeader() +
' <soap:Body>' +
' <RetrieveMultiple xmlns=\'http://schemas.microsoft.com/crm/2007/WebServices\'>' +
' <query xmlns:q1=\'http://schemas.microsoft.com/crm/2006/Query\' xsi:type=\'q1:QueryExpression\'>' +
query +
' </query>' +
' </RetrieveMultiple>' +
' </soap:Body>' +
'</soap:Envelope>' +
'';
        var xmlHttpRequest = new ActiveXObject('Msxml2.XMLHTTP');
        xmlHttpRequest.Open('POST', '/mscrmservices/2007/CrmService.asmx', false);
        xmlHttpRequest.setRequestHeader('SOAPAction', 'http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple');
        xmlHttpRequest.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
        xmlHttpRequest.setRequestHeader('Content-Length', XMLRequest.length);
        xmlHttpRequest.send(XMLRequest);
        var Result = xmlHttpRequest.responseXML;
        var BusinessEntityNodes = Result.selectNodes('//RetrieveMultipleResult/BusinessEntities/BusinessEntity');
        if (BusinessEntityNodes.length != 0)
            return BusinessEntityNodes;
        else
            return null;
    }
    catch (e) {
    }
}

crmForm.ObterDadosUsuario = function (idUsuario) {

	var consulta = '';

	if(idUsuario != null)
	{
		consulta = '' +
		' <q1:Operator>Equal</q1:Operator>' +
		'<q1:Values>' +
		'<q1:Value xsi:type="xsd:string">' + idUsuario + '</q1:Value>' +
		'</q1:Values>';
	}
	else
	{
		consulta = '' +
		' <q1:Operator>EqualUserId</q1:Operator>';
	}

    var query = '' +
' <q1:EntityName>systemuser</q1:EntityName>' +
' <q1:ColumnSet xsi:type=\'q1:ColumnSet\'>' +
' <q1:Attributes>' +
' <q1:Attribute>businessunitid</q1:Attribute>' +
' <q1:Attribute>systemuserid</q1:Attribute>' +
' <q1:Attribute>fullname</q1:Attribute>' +
' </q1:Attributes>' +
' </q1:ColumnSet>' +
' <q1:Distinct>false</q1:Distinct>' +
' <q1:Criteria>' +
' <q1:FilterOperator>And</q1:FilterOperator>' +
' <q1:Conditions>' +
' <q1:Condition>' +
' <q1:AttributeName>systemuserid</q1:AttributeName>' +
consulta +
' </q1:Condition>' +
' </q1:Conditions>' +
' </q1:Criteria>' +
'';
    var result = ExecuteRequest(query);
    if (result != null) {
        var resultNode = result[0];
        var businessUnitId = (resultNode.selectSingleNode('q1:businessunitid') == null) ? null : resultNode.selectSingleNode('q1:businessunitid').text;
        var fullname = (resultNode.selectSingleNode('q1:fullname') == null) ? null : resultNode.selectSingleNode('q1:fullname').text;
        var systemuserid = (resultNode.selectSingleNode('q1:systemuserid') == null) ? null : resultNode.selectSingleNode('q1:systemuserid').text;
    }

    query = '' +
' <q1:EntityName>businessunit</q1:EntityName>' +
' <q1:ColumnSet xsi:type=\'q1:ColumnSet\'>' +
' <q1:Attributes>' +
' <q1:Attribute>name</q1:Attribute>' +
' </q1:Attributes>' +
' </q1:ColumnSet>' +
' <q1:Distinct>false</q1:Distinct>' +
' <q1:Criteria>' +
' <q1:FilterOperator>And</q1:FilterOperator>' +
' <q1:Conditions>' +
' <q1:Condition>' +
' <q1:AttributeName>businessunitid</q1:AttributeName>' +
' <q1:Operator>Equal</q1:Operator>' +
'<q1:Values>' +
'<q1:Value xsi:type="xsd:string">' + businessUnitId + '</q1:Value>' +
'</q1:Values>' +
' </q1:Condition>' +
' </q1:Conditions>' +
' </q1:Criteria>' +
'';
    result = ExecuteRequest(query);
    if (result != null) {
        resultNode = result[0];
        var businessUnitName = (resultNode.selectSingleNode('q1:name') == null) ? null : resultNode.selectSingleNode('q1:name').text;
    }
    var Retorno = {
        user: {
            id: systemuserid,
            name: fullname
        },
        businessunit: {
            id: businessUnitId,
            name: businessUnitName
        }
    }
    return Retorno;
}

Até a próxima! ;)

Hello world!

Boa noite pessoal (feliz natal),

Fui convidado pelo Juliano Bassetto a participar do blog Dynamics CRM Brasil, e compartilhar sobre desenvolvimento na plataforma Dynamics CRM.

Para começar bem, uma roupa nova ao blog rsrs

Para quem não me conhece é só acessar:
dynamicscrmbr.wordpress.com/ricardoalves

Espero que aproveitem o conteúdo, abraços!

Atualize o Dynamics CRM 2011 Beta pelo Microsoft Update

Excelente notícia: O Microsoft Dynamics CRM 2011 Beta é atualizável via Microsoft Update. De acordo com o Blog oficial do Dynamics CRM (http://blogs.msdn.com/b/crm/archive/2010/09/29/microsoft-dynamics-crm-2011-client-beta-updates-available-on-microsoft-update.aspx), as atualizações serão enviadas para os usuários que optarem por utilizar o Microsoft Update, ao invés do Windows Update.

Será o fim dos ROLLUPS?

Microsoft Dynamics CRM 2011 ONLINE Beta entre nós

Olá pessoal,

Qual foi a minha surpresa ao descobrir que se cadastrando no site oficial do Beta do Microsoft Dynamics CRM 2011 (http://www.crm2011beta.com)  eu receberia um convite para o CRM ONLINE TOTALMENTE funcional e com licenças praticamente ilimitadas.

image

Com isto estou testando todos os recursos da ferramenta, sem ter que me preocupar com máquinas virtuais e infraestrutura e estou aproveitando tudo que a Nuvem tem para me oferecer de melhor!

Recomendo a todos o cadastro no site, especialmente aqueles que não possuem recurso computacional para executar em suas próprias máquinas virtuais. O convite para o Beta, chega em aproximadamente 2 a 3 dias.

Até a próxima!

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.