none
CRM 2011 - Integração com o CRM Dynamics RRS feed

  • Pergunta

  • Boa noite pessoal,

    Estou organizando um forma prática de integra uma aplicação que possui um banco de dados próprio com o CRM da Microsoft (Dynamics), enfim gostaria de saber qual é a melhor forma de realizar essa integração. Nesse etapa só será necessário inserir os registros que estão na minha aplicação no CRM.

    Pelo o que eu vi existe algumas formas de realizar essa integração, WebService, XML, CSV por formulário e etc.. O único problema é que ao inserir algum registro na aplicação eu tenho que inserir no CRM também. 

    Agradeço desde já pela ajuda.




    quarta-feira, 23 de janeiro de 2013 21:50

Respostas

  • Diego,

    Existe um modo simplificado de adicionar atributos em uma entidade, faça assim:

    entidade["subject"] = this.plano;
    entidade["lastname"] = this.nome_completo;
    entidade["new_sexoprofissional"] = this.sexo;
    entidade["new_datadenascimento"] = this.data_nascimento;

    Apenas garanta que os tipos de dados do CRM estão iguais as variáveis que está usando, por exemplo: DateTime para a data de nascimento.

    Att,


    Tiago Michelini Cardoso MVP - MCC - MCTS
    https://tiagomcardoso.wordpress.com/

    quinta-feira, 14 de fevereiro de 2013 19:42
    Moderador
  • Diego tente da seguinte maneira, mas acredito que o seu campo "new_sexoprofissional" seja um conjunto de opções e não um inteiro. Se for use:

    entidade.Attributes.Add(new KeyValuePair<string, object>("subject", "assunto"));
    entidade.Attributes.Add(new KeyValuePair<string, object>("lastname", "diego"));
    entidade.Attributes.Add(new KeyValuePair<string, object>("new_sexoprofissional", new OptionSetValue(0)));

    entidade.Attributes.Add(new KeyValuePair<string, object>("new_datadenascimento", DateTime.Now));

    Abraço.


    Atenciosamente,
    Rodrigo Hentz - MCP.MCPS.MCNPS.MCTS.MBSS.MBSP.MCITP
    Profile
    Blog

    sexta-feira, 15 de fevereiro de 2013 11:02
    Moderador

Todas as Respostas

  • Boas,

    Não sei que tecnologia vais usar e independentemente disso penso que a melhor opção é usar os WebServices do CRM, pode ver os vários exemplo no SDK: http://www.microsoft.com/en-us/download/details.aspx?id=24004. Usando os WebServices garantes que alguma validação feitas em plugins são executados.

    Tens WebServices de CRUD sobre qualquer entidade, por isso sempre que criares um registo na aplicação externa ao CRM tem "apenas" que chamar o WebService correspondente.

    Tens aqui vários exemplo do seu uso por aplicações externas (baseadas em .NET) ao CRM:

    http://blogs.msdn.com/b/crminthefield/archive/2011/05/18/how-to-create-a-simple-webpage-leveraging-the-crm-2011-iorganizationservice-web-service.aspx

    http://msdn.microsoft.com/en-us/library/gg695806.aspxhttp://blogs.msdn.com/b/apurvghai/archive/2011/08/26/create-your-custom-web-service-and-integrate-with-crm-2011-online.aspx

    http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=23416

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP quinta-feira, 24 de janeiro de 2013 00:37
    quinta-feira, 24 de janeiro de 2013 00:36
  • Diego,

    O CRM provê uma camada entre a aplicação e o banco de dados, temos o WCF (Web Service) para comunicação, você pode consultar ou inserir registros através desta interface.

    Veja maiores detalhes nos links:

    http://msdn.microsoft.com/en-us/library/gg327974.aspx (este artigo é só a ponta do iceberg, nele existem vários links que o levarão para entender em detalhes o modelo de extensão do CRM)

    http://tiagomcardoso.wordpress.com/2012/06/12/crm-2011-acessar-web-service/

    Att,


    Tiago Michelini Cardoso MVP - MCC - MCTS
    https://tiagomcardoso.wordpress.com/

    quinta-feira, 24 de janeiro de 2013 00:40
    Moderador
  • Diego, bom dia. Aqui na empresa estamos fazendo estas integrações com alguns ERPs de mercado. por exemplo Datasul, Protheus, Mega, etc. A solução usa estes itens citados pelo pessoal. webservice principalmente. depende de como quer arquitetar. usar um banco intermediario, troca de arquivos. 

    Atenciosamente,
    Rodrigo Hentz - MCP.MCPS.MCNPS.MCTS.MBSS.MBSP.MCITP
    Profile
    Blog

    quinta-feira, 24 de janeiro de 2013 13:35
    Moderador
  • Agradeço pela ajuda de vocês, desde quando eu comecei a ler a documentação do CRM, percebi que a melhor forma de realizar essa integração seria pelo webservice e graças a ajuda de vocês pude confirmar esse fato. Não tenho muita experiência com o CRM, na verdade nenhuma, mas surgiu uma outra dúvida.

    Quais são os dados que eu preciso que o cliente passe, para poder utilizar esse webservice? e não entendi ao certo a forma que aplicação realiza a autenticação para incluir os registros no CRM.

    Nesse projeto utilizaremos o C#.

    • Editado Diego S Peres quinta-feira, 24 de janeiro de 2013 14:38
    quinta-feira, 24 de janeiro de 2013 14:37
  • Boas,

    Os exemplos que eu e o Tiago colocamos está lá como deves ligar ao WebService:

    ClientCredentials Credentials = new ClientCredentials();
    //Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
    Credentials.Windows.ClientCredential = new NetworkCredential("LOGIN", "PASSWORD", "DOMAIN");

    O DefaultNetworkCredentials é quando o teu usuário de rede está criado em CRM, se quiser "emular" um utilizador utiliza o de baixo.

    Vê os exemplo que demos e vê o SDK que tem muito samples.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP quinta-feira, 24 de janeiro de 2013 14:58
    quinta-feira, 24 de janeiro de 2013 14:58
  • Diego. tem que criar uma solução no Visual Studio, colocar as DLLs do CRM que estão no SDK e pode pegar pelos exemplo aí do pessoal.

    Nele voce faz o seguinte, este código seria para o online, no SDK voce encontra tambem outras formas:

    Para criar a conexao com o CRM:

    ClientCredentials deviceCredentials = new ClientCredentials();
    deviceCredentials.UserName.UserName = this.Device;
    deviceCredentials.UserName.Password = this.DevicePassword;
    
    creds.UserName.UserName = "usuario@dominio.onmicrosoft.com";
    creds.UserName.Password = "pass@word1";
    Uri serviceUrl = new Uri(string.Format("{0}{1}", "https://empresa.crm.dynamics.com/", "xrmservices/2011/organization.svc"));
    service = new Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy(serviceUrl, null, creds, deviceCredentials);
    service.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
    service.Timeout = new TimeSpan(0, 10, 0);

    para criar alguma entidade seria:

    Entity product = new Entity("product");

    product.Attributes.Add(new KeyValuePair<string, object>("name", ""));

    service.Create(product);

    E assim por diante para update, delete, ...

    Usa o SDK que nao tem erro.


    Atenciosamente,
    Rodrigo Hentz - MCP.MCPS.MCNPS.MCTS.MBSS.MBSP.MCITP
    Profile
    Blog

    quinta-feira, 24 de janeiro de 2013 15:14
    Moderador
  • Estou ainda no desenvolvendo a aplicação e estou passando por um problema no momento que vou inserir um atributos diferente de "string" ou "datetime", ocorre uma exception. Nesse caso estou tentando inserir um "int" Segue o exemplo abaixo.

    " entidade.Attributes.Add(new KeyValuePair<string, object>("subject", this.plano));
    entidade.Attributes.Add(new KeyValuePair<string, object>("lastname", this.nome_completo));
    entidade.Attributes.Add(new KeyValuePair<string, object>("new_sexoprofissional", this.sexo));
    entidade.Attributes.Add(new KeyValuePair<string, object>("new_datadenascimento", this.data_nascimento); "

    Nesse exemplo os atributos "plano" e "nome_completo" é string, "sexo" é "int" e "data_nascimento" é "datetime". Já tentei mudar a "KeyValuePair" para "<string, int>" mas o visual studio 2010 acusa que a melhor overload é "<string, object>".

    Será que o problema se encontra nesse momento? pois como não "modelamos" as entidades do CRM, não sabemos se a pessoa encarregada realizou essa tarefa corretamente.

    quinta-feira, 14 de fevereiro de 2013 18:43
  • Diego,

    Existe um modo simplificado de adicionar atributos em uma entidade, faça assim:

    entidade["subject"] = this.plano;
    entidade["lastname"] = this.nome_completo;
    entidade["new_sexoprofissional"] = this.sexo;
    entidade["new_datadenascimento"] = this.data_nascimento;

    Apenas garanta que os tipos de dados do CRM estão iguais as variáveis que está usando, por exemplo: DateTime para a data de nascimento.

    Att,


    Tiago Michelini Cardoso MVP - MCC - MCTS
    https://tiagomcardoso.wordpress.com/

    quinta-feira, 14 de fevereiro de 2013 19:42
    Moderador
  • Tiago obrigado pela resposta mas ocorreu a mesma exception, "Incorrect attribute value type System.Int32."

    quinta-feira, 14 de fevereiro de 2013 20:14
  • Diego,

    Você tem certeza que o atributo "sexo" é um inteiro, costuma ser um booleano...

    Att,


    Tiago Michelini Cardoso MVP - MCC - MCTS
    https://tiagomcardoso.wordpress.com/

    quinta-feira, 14 de fevereiro de 2013 22:46
    Moderador
  • Diego tente da seguinte maneira, mas acredito que o seu campo "new_sexoprofissional" seja um conjunto de opções e não um inteiro. Se for use:

    entidade.Attributes.Add(new KeyValuePair<string, object>("subject", "assunto"));
    entidade.Attributes.Add(new KeyValuePair<string, object>("lastname", "diego"));
    entidade.Attributes.Add(new KeyValuePair<string, object>("new_sexoprofissional", new OptionSetValue(0)));

    entidade.Attributes.Add(new KeyValuePair<string, object>("new_datadenascimento", DateTime.Now));

    Abraço.


    Atenciosamente,
    Rodrigo Hentz - MCP.MCPS.MCNPS.MCTS.MBSS.MBSP.MCITP
    Profile
    Blog

    sexta-feira, 15 de fevereiro de 2013 11:02
    Moderador
  • Rodrigo,

    Coloquei da forma que informou e funcionou corretamente.

    sexta-feira, 15 de fevereiro de 2013 18:35
  • Estou tendo outro problema, no momento que vou inserir uma entidade que se relaciona com a "lead" ocorre a exception abaixo.

    “Required member 'LogicalName' missing for field 'Target'”

    Acredito que esteja faltando um campo (atributo) obrigatório que aplicação não esteja passando para o CRM.

    terça-feira, 19 de fevereiro de 2013 19:55
  • Boas Diego,

    Quando relaciona uma entidade com a outra necessitas de fazer um entityreference, como aqui:

    new KeyValuePair<string, object>("TargetId", new EntityReference() { Id = new Guid(), LogicalName = "account" })

    Não de que entidades estás a referir, mas aqui estou a fazer uma referência com uma conta, ou seja, o guid corresponde a uma conta.

    Espero ter ajudado.


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP terça-feira, 19 de fevereiro de 2013 22:38
    terça-feira, 19 de fevereiro de 2013 22:38
  • continua dando a mesma exception, “Required member 'LogicalName' missing for field 'Target'”.

    mas não entendi ao certo a sua resposta no caso, oq eu tenho que passar no "TargetId" e pq é preciso instanciar uma Guid, não é necessário passar nada para o construtor desse objeto?

    quarta-feira, 20 de fevereiro de 2013 17:44
  • Boas Diego,

    Podes colocar aqui o código que está dar erro? Assim consigo ser mais especifico. O código que dei foi um exemplo, em vez do new Guid() deve estar o Guid para account neste caso. Mas se puder colocar aqui o código poderei ajudar mais.


    Pedro Azevedo Crm Specialist 4.0\2011

    quarta-feira, 20 de fevereiro de 2013 17:57
  • Resumindo a aplicação no momento que inseri a entidade é isso, caso não consiga entender me fale.

    private const string ENTIDADE = "new_vagas"; //Nome da entidade

    private static QueryExpression query;
    private Entity entidade = new Entity();

    query = new QueryExpression(ENTIDADE);
    query.ColumnSet = new ColumnSet(true);

    public override void InserirEntidade()
    {

    // INSERI OS ATRIBUTOS NA ENTIDADE
    this.entidade.Attributes.Add(new KeyValuePair<string, object>("new_vaga", this.cod_vaga));
    this.entidade.Attributes.Add(new KeyValuePair<string, object>("new_clientepotecial", this.cliente)); //campo ao qual devo passar o nome do cliente para realizar o relacionamento.

    this.entidade.Attributes.Add(new KeyValuePair<string, object>("new_endereovaga", this.endereco));
    this.entidade.Attributes.Add(new KeyValuePair<string, object>("new_nvaga", this.endereco_numero));
    this.entidade.Attributes.Add(new KeyValuePair<string, object>("new_complementovaga", this.endereco_complemento));
    this.entidade.Attributes.Add(new KeyValuePair<string, object>("new_bairrovaga", this.bairro));
    this.entidade.Attributes.Add(new KeyValuePair<string, object>("new_cidadevaga", this.cidade));
    this.entidade.Attributes.Add(new KeyValuePair<string, object>("new_estado", this.estado));
    this.entidade.Attributes.Add(new KeyValuePair<string, object>("new_cepvaga", this.CEP));

    crmhelper.Service.Create(this.entidade);

    }


    • Editado Diego S Peres quarta-feira, 20 de fevereiro de 2013 18:29
    quarta-feira, 20 de fevereiro de 2013 18:26
  • Boas Diego,

    Tenta o seguinte, em vez de:

    ...
    this.entidade.Attributes.Add(new KeyValuePair<string, object>("new_clientepotecial", this.cliente));
    ...

    Coloca assim:

    ...
    this.entidade.Attributes.Add(new KeyValuePair<string, object>("new_clientepotecial", new EntityReference("lead", this.cliente.leadid))); 
    ...

    Estou a considerar que o objecto cliente é do tipo "Cliente Potencial" - Lead.

    Espero ter ajudado


    Pedro Azevedo Crm Specialist 4.0\2011


    quarta-feira, 20 de fevereiro de 2013 22:48
  • na verdade o cliente é uma string, nao teria como fazer dessa forma nesse caso.

    quinta-feira, 21 de fevereiro de 2013 00:32
  • Boas Diego,

    Como falavas em relacionamento pensava que tinhas por exemplo um lookup para o Cliente Potencial. Então não tens nenhum lookup nesta entidade? É tudo strings? Esse erro costuma aparecer quando estás a tentar afectar um campo que tem Guid (e que no form CRM tem lookup). A exception dá quando? Se estás a fazer debug qual é a linha que dá o erro? Tenta activar o trace para ver se dá mais pistas.


    Pedro Azevedo Crm Specialist 4.0\2011

    quinta-feira, 21 de fevereiro de 2013 10:48
  • A exception ocorre no momento em que a aplicação tenta inserir a entidade, tem como você passar um exemplo de como inserir uma entidade relacionada, não esxiste nenhum lookup nessa entidade, tudo string.
    quinta-feira, 21 de fevereiro de 2013 18:43
  • Diego, boa tarde. Esta thread já foi marcada como respondida. Por favor crie uma outra thread para que possamos te ajudar mas no escopo devido ok?

    Atenciosamente,
    Rodrigo Hentz - MCP.MCPS.MCNPS.MCTS.MBSS.MBSP.MCITP
    Profile
    Blog

    quinta-feira, 21 de fevereiro de 2013 18:47
    Moderador
  • Diego o Rodrigo tem razão coloca esta questão noutra thread para que mais utilizadores possam ajudar. Coloca todas as pistas de foste dando e o código. E já agora coloca o trace que pode dar mais uma ajuda. Vê aqui como activar. Outra coisa é você verificar o nome de todos os campos e da entidade.

    Uma entidade relacionada começa logo na definição da entidade, quando você cria uma entidade e quando vai inserir atributos, você pode criar uma relantionship (imagina entre a new_vaga e o cliente potencial) e se for N:1 ele cria um campo automático do tipo lookup, assim fica relacionada e o seu valor é um GUID. Se necessitar de mais informação coloque noutra thread.

    Espero ter ajudado.

    Peço desculpa Rodrigo devia ter avisado logo que devia criar uma nova thread.


    Pedro Azevedo Crm Specialist 4.0\2011

    sexta-feira, 22 de fevereiro de 2013 09:47