locked
Relacionamentos hierárquicos entre entidades (produto / produto da cotação) RRS feed

  • Pergunta

  • eu li no forum a seguinte citação ..



    "Relações limitações
    1.
     
    Quando você cria uma relação de pelo menos uma das entidades deve ser uma entidade personalizada.Você não pode criar relações entre dois out-of-the-box entidades Microsoft Dynamics CRM. Estes são também conhecidas como entidades do sistema ". Essas entidades já têm todas as relações possíveis entidade definido."

    porem estou tentando criar um relacionamento de um campo personalizado(do tipo conjunto de opções) que esta no formulário de Produtos para o campo secundário no produto da cotação (também do tipo conjunto de opções) mas não estou conseguindo, porque será ?

    Obs.: nativamente o produto da cotação já traz o nome do produto e a unidade, eu gostaria de fazer o mesmo só que com uma entidade personalizada (tipo do produto), como eu poderia fazer isso no formulário de produto da cotação?

    desde ja agradeço.

    sexta-feira, 25 de julho de 2014 18:53

Respostas

  • Boas Thiago,

    Então é assim, o que eu estou a tentar fazer é que no formulário de produto da proposta apanhar o evento onchange do campo Produto, por isso a primeira coisa a fazer é no evento onload do formulário chamares por exemplo este método, que vai registar no evento onload do campo produto:

    function loadEvent() {
       Xrm.Page.getAttribute("productid").addOnChange(onchange_product);
    }
    

    Quando o produto modificar queres ir buscar a propriedade tipo de produto, no meu caso eu estou a ir buscar a propriedade QuantityOnHand:

    function onchange_product() {
    	var prodId = Xrm.Page.getAttribute("productid").getValue()[0].id;
    	var url = Xrm.Page.context.getClientUrl();
    	var attributeGet = "QuantityOnHand";
    	var odataSelect = url + "/XRMServices/2011/OrganizationData.svc/ProductSet(guid'" + prodId + "')?$select=" + attributeGet;
    
        $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: odataSelect,
            beforeSend: function (XMLHttpRequest) {
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                alert(data.d[attributeGet]);
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                errorHandler(XMLHttpRequest, textStatus, errorThrown);
            }
        });
    }

    O que estou a fazer é a criar uma query odata (variável odataselect), depois estou a executar um requisição AJAX para executar esta query. Em caso de sucesso vai dar ao sucess: no meu caso estou a fazer alert do valor da propriedade QuantityOnHand. Se colocares este código exactamente como ele está vais ver esse alert. O que tu podes fazer é colocar no campo alvo este valor, ou seja, fazeres algo do género para substituir o alert:

    Xrm.Page.getAttribute("nome do campo").setValue(data.d[attributeGet]);

    No meu código então tens que colocar no campo attributeGet o campo que queres ir buscar a entidade produto, tens que respeitar letras maiúsculas e minúsculas. E depois tens que substituir a string "nome do campo" pelo campo do formulário produto da proposta que vai ficar com este valor.

    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 terça-feira, 29 de julho de 2014 10:34
    • Marcado como Resposta Thiago_Lima terça-feira, 29 de julho de 2014 12:10
    terça-feira, 29 de julho de 2014 10:34
  • Boas Thiago,

    O código completo é este:

    function onchange_product() {
    	var prodId = Xrm.Page.getAttribute("productid").getValue()[0].id;
    	var url = Xrm.Page.context.getClientUrl();
    	var attributeGet = "QuantityOnHand";
    	var odataSelect = url + "/XRMServices/2011/OrganizationData.svc/ProductSet(guid'" + prodId + "')?$select=" + attributeGet;
    
        $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: odataSelect,
            beforeSend: function (XMLHttpRequest) {
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                var valueProd = data.d[attributeGet].ProductTypeCode.Value;
    			var OptionSetControl = XrmServiceToolkit.Soap.RetrieveAttributeMetadata("Product", "ProductTypeCode", true);
    			for(var i = 0; i < OptionSetControl[0].OptionSet.Options.length; ++i) {
    				   if(OptionSetControl[0].OptionSet.Options[i].value == valueProd) {
    					  Xrm.Page.getAttribute("name").setValue(OptionSetControl[0].OptionSet.Options[i].Label.UserLocalizedLabel.Label);
    				   }
    			}
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                errorHandler(XMLHttpRequest, textStatus, errorThrown);
            }
        });
    }

    Neste código a única coisa que tens que fazer é substituir "name" pelo campo onde queres colocar esta informação. Quando eu falei do evento onload é que eu no código estou a usar a biblioteca XrmServiceToolkit e por isso terás que referenciar o WebResource que terá esta biblioteca. Tens que referenciar esta biblioteca antes do WebResource que terá este código.

    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, 31 de julho de 2014 22:51
    • Marcado como Resposta Thiago_Lima segunda-feira, 18 de agosto de 2014 17:39
    quinta-feira, 31 de julho de 2014 22:51

Todas as Respostas

  • Boas Thiago,

    Não sei se entendi bem o seu problema, mas aquilo que percebi é que você quer passar o tipo de produto existente na entidade produto para a entidade produto da cotação. Infelizmente neste caso os mapeamentos não estão disponíveis se fores por exemplo ver a relação entre Lead e Oportunidade podes definir quais são os campos que passam da Lead para Oportunidade quando uma Oportunidade for criada.

    Mais de resto esse tipo de relacionamento você não consegue fazer. Para este caso eu recomendava você usar Javascript onde quando fosse escolhido um produto, fosses buscar o tipo de produto associado a esse produto. Para este efeito o melhor é usar ODATA. Se precisar de ajuda coloque aqui.

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


    Pedro Azevedo Crm Specialist 4.0\2011

    sábado, 26 de julho de 2014 07:43
  • Ola Pedro obrigado por responder!

    Sim, eu gostaria de fazer exatamente isso que você comentou, pegar o valor do tipo do Produto (que no meu caso é 'Desktop' este valor está em um campo do tipo Picklist)  e jogar no produto da cotação referenciando o produto em questão.

    como eu poderia fazer isso por Javascript ? ou ODATA ?  eu uso a versão online 13'' do MS Dynamics, funciona assim mesmo ? 

    segunda-feira, 28 de julho de 2014 01:37
  • Boas Thiago,

    Com Odata é muito simples dá uma olhadela:

    function onchange_product() {
    	var prodId = Xrm.Page.getAttribute("productid").getValue()[0].id;
    	var url = Xrm.Page.context.getClientUrl();
    	var attributeGet = "QuantityOnHand";
    	var odataSelect = url + "/XRMServices/2011/OrganizationData.svc/ProductSet(guid'" + prodId + "')?$select=" + attributeGet;
    
        $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: odataSelect,
            beforeSend: function (XMLHttpRequest) {
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                alert(data.d[attributeGet]);
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
            }
        });
    }

    Se tiveres alguma dúvida diz. No código "bastava" alterares a variável attributeGet para a propriedade que queres.

    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 segunda-feira, 28 de julho de 2014 14:17
    segunda-feira, 28 de julho de 2014 14:17
  • Ola Pedro !

    como não sei nada sobre códigos Odata, gostaria que me orientasse a aplicar este código a minha situação

    pelo que entendi, ele está pegando o ID do produto selecionado, e fazendo algo que não entendi muito bem, este código ele vai no formulário de produto da cotação ?

    como este código estará buscando "Tipo de Produto" que eu desejo obter o valor e "setando" no campo do "produto da cotação" ?


    • Editado Thiago_Lima segunda-feira, 28 de julho de 2014 18:41 atualização
    segunda-feira, 28 de julho de 2014 17:39
  • Boas Thiago,

    Então é assim, o que eu estou a tentar fazer é que no formulário de produto da proposta apanhar o evento onchange do campo Produto, por isso a primeira coisa a fazer é no evento onload do formulário chamares por exemplo este método, que vai registar no evento onload do campo produto:

    function loadEvent() {
       Xrm.Page.getAttribute("productid").addOnChange(onchange_product);
    }
    

    Quando o produto modificar queres ir buscar a propriedade tipo de produto, no meu caso eu estou a ir buscar a propriedade QuantityOnHand:

    function onchange_product() {
    	var prodId = Xrm.Page.getAttribute("productid").getValue()[0].id;
    	var url = Xrm.Page.context.getClientUrl();
    	var attributeGet = "QuantityOnHand";
    	var odataSelect = url + "/XRMServices/2011/OrganizationData.svc/ProductSet(guid'" + prodId + "')?$select=" + attributeGet;
    
        $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: odataSelect,
            beforeSend: function (XMLHttpRequest) {
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                alert(data.d[attributeGet]);
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                errorHandler(XMLHttpRequest, textStatus, errorThrown);
            }
        });
    }

    O que estou a fazer é a criar uma query odata (variável odataselect), depois estou a executar um requisição AJAX para executar esta query. Em caso de sucesso vai dar ao sucess: no meu caso estou a fazer alert do valor da propriedade QuantityOnHand. Se colocares este código exactamente como ele está vais ver esse alert. O que tu podes fazer é colocar no campo alvo este valor, ou seja, fazeres algo do género para substituir o alert:

    Xrm.Page.getAttribute("nome do campo").setValue(data.d[attributeGet]);

    No meu código então tens que colocar no campo attributeGet o campo que queres ir buscar a entidade produto, tens que respeitar letras maiúsculas e minúsculas. E depois tens que substituir a string "nome do campo" pelo campo do formulário produto da proposta que vai ficar com este valor.

    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 terça-feira, 29 de julho de 2014 10:34
    • Marcado como Resposta Thiago_Lima terça-feira, 29 de julho de 2014 12:10
    terça-feira, 29 de julho de 2014 10:34
  • Olá Pedro, mais uma vez obrigado por responder !

    Seu código funcionou perfeitamente, como você comentou ele me retornou o valor da propriedade QuantityOnHand,

    porem coloquei a propriedade "ProductTypeCode" e o evento me retornou " [object Object] " , acredito que tenho que colocar um ".text" em algum lugar pra ele me retornar o valor do campo, o que eu poderia fazer para obter o valor do campo ?

    Mais uma vez obrigado pela atenção!


    • Editado Thiago_Lima terça-feira, 29 de julho de 2014 12:16 .
    terça-feira, 29 de julho de 2014 12:09
  • Boas Thiago,

    Realmente neste caso como é um optionset é diferente. Aliás bastante diferente, ir buscar o valor é fácil o pior é ir buscar o texto do optionset. Mas vamos por partes, primeiro para ir buscar o valor do optionset bastava fazeres assim:

    data.d[attributeGet].ProductTypeCode.Value

    Como presumo que queiras o texto vamos ter que consultar os metadados para obter essa informação, para isso eu sugiro que adiciones a bilbioteca XrmServiceToolkit que facilita muitas queries e aos metadados inclusivé. Depois de adicionares esta biblioteca a tua solução e a chamares antes de chamares o método onload, aplica o seguinte código em vez da linha acima:

    var valueProd = data.d[attributeGet].ProductTypeCode.Value;
    var OptionSetControl = XrmServiceToolkit.Soap.RetrieveAttributeMetadata("Product", "ProductTypeCode", true);
    for(var i = 0; i < OptionSetControl[0].OptionSet.Options.length; ++i) {
    	   if(OptionSetControl[0].OptionSet.Options[i].value == valueProd) {
    		  Xrm.Page.getAttribute("name").setValue(OptionSetControl[0].OptionSet.Options[i].Label.UserLocalizedLabel.Label);
    	   }
    }
    Tens aqui mais alguma informação.

    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 terça-feira, 29 de julho de 2014 23:30
    terça-feira, 29 de julho de 2014 23:30
  • Ola Pedro, onde exatamente vai este codigo ?

    var valueProd = data.d[attributeGet].ProductTypeCode.Value;
    var OptionSetControl = XrmServiceToolkit.Soap.RetrieveAttributeMetadata("Product", "ProductTypeCode", true);
    for(var i = 0; i < OptionSetControl[0].OptionSet.Options.length; ++i) {
    	   if(OptionSetControl[0].OptionSet.Options[i].value == valueProd) {
    		  Xrm.Page.getAttribute("name").setValue(OptionSetControl[0].OptionSet.Options[i].Label.UserLocalizedLabel.Label);
    	   }
    }

    eu tentei executar dentro do outro código na parte "success", quando você fala antes do evento Onload eu ate tentei mas não consegui, ficou me retornando um erro

    quinta-feira, 31 de julho de 2014 17:41
  • Boas Thiago,

    O código completo é este:

    function onchange_product() {
    	var prodId = Xrm.Page.getAttribute("productid").getValue()[0].id;
    	var url = Xrm.Page.context.getClientUrl();
    	var attributeGet = "QuantityOnHand";
    	var odataSelect = url + "/XRMServices/2011/OrganizationData.svc/ProductSet(guid'" + prodId + "')?$select=" + attributeGet;
    
        $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: odataSelect,
            beforeSend: function (XMLHttpRequest) {
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                var valueProd = data.d[attributeGet].ProductTypeCode.Value;
    			var OptionSetControl = XrmServiceToolkit.Soap.RetrieveAttributeMetadata("Product", "ProductTypeCode", true);
    			for(var i = 0; i < OptionSetControl[0].OptionSet.Options.length; ++i) {
    				   if(OptionSetControl[0].OptionSet.Options[i].value == valueProd) {
    					  Xrm.Page.getAttribute("name").setValue(OptionSetControl[0].OptionSet.Options[i].Label.UserLocalizedLabel.Label);
    				   }
    			}
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                errorHandler(XMLHttpRequest, textStatus, errorThrown);
            }
        });
    }

    Neste código a única coisa que tens que fazer é substituir "name" pelo campo onde queres colocar esta informação. Quando eu falei do evento onload é que eu no código estou a usar a biblioteca XrmServiceToolkit e por isso terás que referenciar o WebResource que terá esta biblioteca. Tens que referenciar esta biblioteca antes do WebResource que terá este código.

    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, 31 de julho de 2014 22:51
    • Marcado como Resposta Thiago_Lima segunda-feira, 18 de agosto de 2014 17:39
    quinta-feira, 31 de julho de 2014 22:51