Usuário com melhor resposta
Relacionamento entre Produto e Produto da fatura

Pergunta
-
Bom dia pessoal,
preciso criar um campo no cadastro de Produtos e outro na entidade Produtos da Fatura, e que o valor desse campo seja copiado ao inserir um produto na fatura. Acreditei que poderia fazer um mapeamento entre os campos criados na entidade Produto e Produto da Fatura, mas percebi que o CRM não permite criar mapeamento entre essas entidades. Como posso fazer essa cópia?
[]s
Pedro
Att: Pedro Andrade
Respostas
-
Olá Pedro,
Complementando a sugestão do Ulysses, segue exemplo do uso do Ajax no CRM para busca e preenchimento da informação: http://gtezini.blogspot.com/2008/12/crm-40-ajax-preenchimento-automtico-de.html
[]s
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com)- Sugerido como Resposta Ivan Duarte quarta-feira, 20 de maio de 2009 19:36
- Marcado como Resposta Carlos Amorim Junior domingo, 31 de janeiro de 2010 00:49
-
Olá Gilberto!
Finalmente funcionou! Usei o exemplo de FetchXml que vc indicou. O código que funciona está abaixo.
Muito obrigado pela sua ajuda! Sem ela esta funcionalidade não teria sido implementada.
Até mais!
if(crmForm.all.customerid.DataValue != null) { // Prepare variables to fetch accounts. var fetchMapping = "logical"; var entityName = "contact"; // entidade contato var firstColumn = "defaultpricelevelid"; // id da lista de preço default deste contato var filterType = "and"; var conditionAttribute = "contactid"; var operator = "eq"; // operador = var value = crmForm.all.customerid.DataValue[0].id; var authenticationHeader = GenerateAuthenticationHeader(); // Prepare the SOAP message. var xml = "<?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'>"+ authenticationHeader+ "<soap:Body>"+ "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+ "<fetchXml><fetch mapping='"+fetchMapping+"'>"+ "<entity name='"+entityName+"'>"+ "<attribute name='"+firstColumn+"'/>"+ "<filter type='"+filterType+"'>"+ "<condition attribute='"+conditionAttribute+"'"+ " operator='"+operator+"' value='"+value+"'/>"+ "</filter>"+ "</entity>"+ "</fetch></fetchXml>"+ "</Fetch>"+ "</soap:Body>"+ "</soap:Envelope>"; // Prepare 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); // Capture the result. var resultXml = xHReq.responseXML; // Check for errors. var errorCount = resultXml.selectNodes('//error').length; if (errorCount != 0) { alert('errorCount = ' + errorCount); var msg = resultXml.selectSingleNode('//description').nodeTypedValue; alert(msg); } // Process and display the results. else { // Capture the result and UnEncode it. var resultSet = new String(); resultSet = resultXml.text; resultSet.replace('<','<'); resultSet.replace('>','>'); // Create an XML document that you can parse. var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM"); oXmlDoc.async = false; // Load the XML document that has the UnEncoded results. oXmlDoc.loadXML(resultSet); // Display the results. var results = oXmlDoc.getElementsByTagName('result'); try{ var priceLevelID = results[0].selectSingleNode('./defaultpricelevelid').nodeTypedValue; var lookupData = new Array(); var lookupItem= new Object(); lookupItem.id = priceLevelID; lookupItem.typename = 'pricelevel'; lookupItem.name = 'Padrão'; lookupData[0] = lookupItem; crmForm.all.pricelevelid.DataValue = lookupData; } catch(excecao) { crmForm.all.pricelevelid.DataValue = null; } } } else { crmForm.all.pricelevelid.DataValue = null; }
Att,
Ivan Luís Duarte
Vamos compartilhar! "Quem amarra conhecimento promove a ignorância!"- Sugerido como Resposta Ivan Duarte quarta-feira, 20 de maio de 2009 19:34
- Marcado como Resposta Carlos Amorim Junior domingo, 31 de janeiro de 2010 00:49
Todas as Respostas
-
Pedro,
A parte de MAPEAMENTOS funciona apenas para "trazer" dados de um registro "pai" para um registro "filho".
Exemplo:
A partir de uma CONTA, se criarmos um CONTATO, alguns dados da CONTA serão COPIADOS para o novo CONTATO criado.
Se tratando de PRODUTO, PRODUTO DA FATURA e FATURA, sendo esta uma relação N:N (muitos para muitos), não há possibilidade via mapeamento, pois quando criamos um novo produto da fatura, a única informação que temos é a fatura. Somente depois é que escolhemos o produto.
O que você precisa fazer é desenvolver uma funcionalidade em AJAX para que, toda vez que escolher um produto pelo formulário de produto da fatura, esta função busque dados do produto e traga para o produto da fatura.
Ok?
Qualquer dúvida estou à disposição!
Abraços,
Ulysses Neto
Microsoft Dynamics CRM Specialist | http://DynamicsCRM.Blog.br- Sugerido como Resposta Ivan Duarte quarta-feira, 20 de maio de 2009 19:36
-
Olá Pedro,
Complementando a sugestão do Ulysses, segue exemplo do uso do Ajax no CRM para busca e preenchimento da informação: http://gtezini.blogspot.com/2008/12/crm-40-ajax-preenchimento-automtico-de.html
[]s
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com)- Sugerido como Resposta Ivan Duarte quarta-feira, 20 de maio de 2009 19:36
- Marcado como Resposta Carlos Amorim Junior domingo, 31 de janeiro de 2010 00:49
-
Gilberto,
E se não fosse um campo do tipo lookup? Como ficaria o código?
Com o codigo que disponibilizou, estamos tendo problemas com permissão de acesso(a tela de login aparece solicitando login e senha, mas após a digitação continua não funcionando...), de acordo com outra explicação sua, limpei os registros cookies no navegador mas não adiantou.
Tem idéia do que mais posso fazer!?
Ivan Duarte -
Olá Ivan,
Na função de exemplo (StateChangeAccountPriceLevel) basta pegar o valor [oNodes[0].text] e alimentar no campo que deseja.
Qto a permissão, se vc substituir:
xmlhttp.open("POST", "http://" + server + "/mscrmservices/2007/crmservice.asmx", true);
por
xmlhttp.open("POST", "/mscrmservices/2007/crmservice.asmx", true);
Consegue resultado?
[]
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com) -
-
Ivan,
Sua máquina está em um Domínio diferente do Domínio onde o CRM está instalado?
Por hora, adicione a URL de acesso ao CRM na área [Trusted Sites] do seu IE.
Verifique também se as configurações do seu IE estão muito restritas. Por exemplo, se [Enable Native XMLHTTP Support] e [Use HTTP 1.1 through proxy connections] estão habilitadas em Tools -> Internet Options -> Advanced.
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com) -
Olá Gilberto!
Infelizmente não funcionou, estamos no mesmo domínio do CRM e aquelas opções do internet explorer já estavam marcadas. Desmarquei para testar e nada...
Daqui 20 dias mais ou menos estaremos montando um servidor de cliente e esperamos não ter novamente estes problemas, talvez seja só uma configuração de segurança aqui dentro e não conseguimos encontrá-la.
De qualquer forma, agradeço a atenção!
Sou recém formado em Sistemas de Informação e acabo de me iniciar no CRM 4.0. Estou procurando material para estudo, se puder me indicar algum site, apostila ou outro, ficaria grato. Atualmente estou iniciando estudo do curso 8969 e antes passei pela 8912.
Agora estou com dúvidas em fluxo de trabalho, mas isso vou postar em outra pergunta...
Novamente agradeço a atenção para meu problema!
Ivan Luís Duarte -
Olá Gilberto!
Retorno ao problema da lista de preços...
No código da função StateChangeAccountPriceLevel() tem um if(xmlhttp.readyState == 4)... Pois é... minha xmlhttp.readyState está vindo com valor 1(um).
O que significa o valor 4? E porque o meu está vindo com valor 1? E o que significa o 1?
Agradeço a atenção!
Ivan Luís Duarte -
-
Ivan,
Segue referência para os valores - http://msdn.microsoft.com/en-us/library/ms534361(VS.85).aspx
No seu código, vc executou a função [send] ?
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com) -
Olá Gilberto!
Uso o metodos send() sim (xmlhttp.send(soapXml);). Exatamente como no seu exemplo(http://gtezini.blogspot.com/2008/12/crm-40-ajax-preenchimento-automtico-de.html).
E esta chamada de método ocorre após a execução do método "StateChangeAccountPriceLevel()" que contém o "if(xmlhttp.readyState == 4)"... Também como no exemplo.
No meu caso devo mudar de método ou de pergunta? Ou devo mudar outra parte do código?
Agradeço a atenção!
Ivan Luís Duarte -
Gilberto!
Uso o este comando "var oNodes = xmlhttp.responseXML.selectSingleNode("//RetrieveResult").childNodes;" mas somente se "xmlhttp.readyState == 4".
Devo substituir o 4 por 1 e o responseXML.selectSingleNode("//RetrieveResult").childNodes por send(soapXml)? Ou é algo mais complexo!?
Ivan Luís Duarte -
-
-
O AJAX (assíncrono) muda o status automaticamente.
Se vc der um [ alert(xmlhttp.readyState) ] dentro da função [StateChangeAccountPriceLevel] aparecem quais alertas?
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com) -
Gilberto!
Parece que de fato é algo assíncrono! coloquei o alert que vc indicou bem no inicio da função "StateChangeAccountPriceLevel" e o resultado foi o seguinte:
Primeiro apresentou valor 1;
Então abriu uma caixa de login e senha. Se informo meu login e senha, não passa! Então, cancelo!
Depois, apresenta o valor2;
Em seguida 3;
E finalmente 4, e entra no if;
Mas não passa por essa linha "var oNodes = xmlhttp.responseXML.selectSingleNode("//RetrieveResult").childNodes;" pois coloquei um alerte após ele para testar e não apareceu!
De acordo com este senário... O que há de errado no meu ambiente!? Permissões?
Agradeço a atenção!
Ivan Luís Duarte -
Gilberto!
Sempre fica pedindo login quando o script roda... Aqui usamos o AD... tem como indicar no script que o usuário a ser usado é o usuário do AD?
E outra coisa... para entrar no crm uso o endereço "http://p-crm03:5555/bhsteste/" e quando o script roda ele me pede senha para o servidor nome de "p-crm03.bhs.corp". Isso pode ser o problema? nomes diferentes para um mesmo servidor?
Agradeço a atenção!
Ivan Luís Duarte -
Ivan,
Verifique dois pontos:
1 - No código JScript, qual o conteúdo da variável [server] qdo vc testa?
2 - No IIS do servidor do CRM, entre em Properties -> Directory Security; Clique no botão [Edit] referente a autenticação; verifique se [somente] o opção [Integrated Windows Authentication] está Habilitada.
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com) -
Gilberto!
O conteúdo da variável server é "p-crm03:5555".
Somente a opção "Integrated Windows Authentication" está habilitada no IIS.
Ah! Seu eu insistir em digitar meu usuário e senha, dá o seguinte erro em uma página toda branca que abre: "HTTP Error 401.1 - Unauthorized: Access is denied"
Ivan Luís Duarte -
Faça os seguintes testes:
1 - Substitua a linha:
xmlhttp.open("POST", "http://" + server + "/mscrmservices/2007/crmservice.asmx", true);
por:
xmlhttp.open("POST", "http://" + server + "/NOMEDASUAORG/mscrmservices/2007/crmservice.asmx", true);
2 - Se não funcionar, na alteração feita acima, adicione o [usr] e [senha] no comando [Open]. São os dois últimos parâmetros do método.
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com) -
Olá Gilberto!
Finalmente parou de pedir login e senha, apenas inserindo o nome da organização.
Mas quando chega na linha "var oNodes = xmlhttp.responseXML.selectSingleNode("//RetrieveResult").childNodes;" ele não retorna(não acontece o alert que inseri após esta linha)... E então a lista de preços não retorna.
Porque isto acontece? Tem outra dica!?
Ivan Luís Duarte -
Boa, falta pouco! rsrs
Comente a linha:
var oNodes = xmlhttp.responseXML.selectSingleNode("//RetrieveResult").childNodes
e analise o retorno com [alerts], por exemplo:
alert(xmlhttp.responseXML.xml);
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com) -
Gilberto!
Fiz o que pediu! Este alert retornou o seguinte XML:
<?xml version="1.0"?>
<Soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>Server was unable to process request.</faultstring>
<detail>
<erro>
<code>0x80040203</code>
<description>Url does not contain MSCRMServices</description>
<type>Platform</type>
</erro>
</detail>
<soap:Fault/>
</soap:Body>
</Soap:Envelope>
Não sei se entendi certo, mas está dizendo que o serviço não está lá!?
O problema está no servidor!? Qual a solução para isso?
Ivan Luís Duarte -
Ivan,
Mesmo problema do seu outro post (Como alterar um registro via Web Service em uma entidade customizada do CRM 4.0).
Segundo o erro [ <description>Url does not contain MSCRMServices</description> ], não existe a classe [CrmService]...
Penso em duas opções:
1 - Abrir um chamado junto a Microsoft;
2 - Desinstalar / Reinstalar o CRM (inclusive mudando o nome do servidor do crm, sem caracteres com o "-", espaços e outros).
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com) -
Tente tb:
1 - Substitua a linha:
xmlhttp.open("POST", "http://" + server + "/mscrmservices/2007/crmservice.asmx", true);
por:
xmlhttp.open("POST", "/mscrmservices/2007/crmservice.asmx", true);
2 - Se não funcionar, na alteração feita acima, adicione o [usr] e [senha] no comando [Open]. São os dois últimos parâmetros do método.
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com) -
-
Olá Gilberto!
Como vc já viu, graças a Deus, e claro, a você, o outro post foi resolvido!
Acho estranho o CrmService ser encontrado para o plugin e não ser encontrado para o script...
Quanto ao chamado junto à Microsoft é uma boa idéia, mas vou testar primeiro a opção 2(instalação e desistalação em uma máquina virtual).
Obrigado pela atenção, darei retorno do resultado!
Ivan Luís Duarte -
Ivan,
Boa idéia, faça um teste em uma VM.
Antes da VM, no seu ambiente p-crm03, faça um teste de chamada da função FETCHXML do CRM em JScript. Pegue o exemplo em http://technet.microsoft.com/en-us/library/cc677073.aspx, e veja se funciona...
[]
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com) -
Gilberto!
Testei este outro script que vc indicou, funcionou perfeitamente! Testei tanto na máquina virtual quanto em minha empresa de testes...
Mas o script que traz a lista de preços continua sem funcionar... testei na maquina virtual e nada! Pede senha ou simplesmente não passa do comando "var oNodes = xmlhttp.responseXML.selectSingleNode("//RetrieveResult").childNodes;", de acordo com a URL qeu coloco em "xmlhttp.open("POST", "...mscrmservices/2007/crmservice.asmx", true);".
É estranho funcionar para o outro script e não funcionar para este... como "CAMPO_RETORNO" usei o campo "DefaultPriceLevelId", quando fez o seu, usou este também!? Vai ver estou tentando acessar pelo valor errado...
Obrigado pela atenção!
Ivan Luís Duarte -
Ivan,
Pode não estar funcionando devido a organização que não é passada no código. Porém, vc pode usar o exemplo que te passei, e funcionou, de FETCHXML via JScript para retornar o precisa.
[]
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com) -
Gilberto,
Onde e como passar a organização no código que não funciona? Qual linha daquele código pode receber o codigo da organização como parametro? Tipo... se eu tenho o codigo da organização na minha mão, onde insiro? Qual método?
Obrigado pela atenção!
Ivan Luís Duarte
Att, Ivan Luís Duarte _____________________________________ Vamos compartilhar! "Quem amarra conhecimento promove a ignorância!" -
Olá Ivan,
Ainda preciso fazer mais testes referentes a isto, porém, gostaria de te sugerir o uso do recurso que já te passei, o FetchXml via JScript, que realmente é eficiente e funcional.
[]
Gilberto Tezini - MCP ASP.NET (C#/VB.NET) / MCP CRM - (http://gtezini.blogspot.com) -
Olá Gilberto!
Finalmente funcionou! Usei o exemplo de FetchXml que vc indicou. O código que funciona está abaixo.
Muito obrigado pela sua ajuda! Sem ela esta funcionalidade não teria sido implementada.
Até mais!
if(crmForm.all.customerid.DataValue != null) { // Prepare variables to fetch accounts. var fetchMapping = "logical"; var entityName = "contact"; // entidade contato var firstColumn = "defaultpricelevelid"; // id da lista de preço default deste contato var filterType = "and"; var conditionAttribute = "contactid"; var operator = "eq"; // operador = var value = crmForm.all.customerid.DataValue[0].id; var authenticationHeader = GenerateAuthenticationHeader(); // Prepare the SOAP message. var xml = "<?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'>"+ authenticationHeader+ "<soap:Body>"+ "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>"+ "<fetchXml><fetch mapping='"+fetchMapping+"'>"+ "<entity name='"+entityName+"'>"+ "<attribute name='"+firstColumn+"'/>"+ "<filter type='"+filterType+"'>"+ "<condition attribute='"+conditionAttribute+"'"+ " operator='"+operator+"' value='"+value+"'/>"+ "</filter>"+ "</entity>"+ "</fetch></fetchXml>"+ "</Fetch>"+ "</soap:Body>"+ "</soap:Envelope>"; // Prepare 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); // Capture the result. var resultXml = xHReq.responseXML; // Check for errors. var errorCount = resultXml.selectNodes('//error').length; if (errorCount != 0) { alert('errorCount = ' + errorCount); var msg = resultXml.selectSingleNode('//description').nodeTypedValue; alert(msg); } // Process and display the results. else { // Capture the result and UnEncode it. var resultSet = new String(); resultSet = resultXml.text; resultSet.replace('<','<'); resultSet.replace('>','>'); // Create an XML document that you can parse. var oXmlDoc = new ActiveXObject("Microsoft.XMLDOM"); oXmlDoc.async = false; // Load the XML document that has the UnEncoded results. oXmlDoc.loadXML(resultSet); // Display the results. var results = oXmlDoc.getElementsByTagName('result'); try{ var priceLevelID = results[0].selectSingleNode('./defaultpricelevelid').nodeTypedValue; var lookupData = new Array(); var lookupItem= new Object(); lookupItem.id = priceLevelID; lookupItem.typename = 'pricelevel'; lookupItem.name = 'Padrão'; lookupData[0] = lookupItem; crmForm.all.pricelevelid.DataValue = lookupData; } catch(excecao) { crmForm.all.pricelevelid.DataValue = null; } } } else { crmForm.all.pricelevelid.DataValue = null; }
Att,
Ivan Luís Duarte
Vamos compartilhar! "Quem amarra conhecimento promove a ignorância!"- Sugerido como Resposta Ivan Duarte quarta-feira, 20 de maio de 2009 19:34
- Marcado como Resposta Carlos Amorim Junior domingo, 31 de janeiro de 2010 00:49
-