Novos métodos na API de Javascript – Processos II

by Pedro Azevedo 14. November 2016 16:38

Boas pessoal,

Depois do post anterior a falar sobre a barra de processos e de ter falado apenas do processo vamos agora falar sobre os stages. Vamos ver a que dados podemos aceder, sobre os stages:

var StageCollection = activeProcess.getStages();
 
StageCollection.forEach(function (stage, n) {
    Xrm.Utility.alertDialog("Categoria Stage -> " + stage.getCategory().getValue());
    Xrm.Utility.alertDialog("Id do Stage -> " + stage.getId());
 
    Xrm.Utility.alertDialog("Nome da Entidade da Stage -> " + stage.getEntityName());
    Xrm.Utility.alertDialog("Nome da Stage -> " + stage.getName());
    Xrm.Utility.alertDialog("Estado da Stage -> " + stage.getStatus());
 
    Xrm.Utility.alertDialog("Número de Steps -> " + stage.getSteps().getLength());
});

E este é o resultado:

image_thumb11_thumb

image_thumb13_thumb

image_thumb15_thumb

image_thumb16_thumb

image_thumb17_thumb

image_thumb18_thumb

image_thumb23_thumb

image53_thumb_thumb

image_thumb24_thumb

Não coloquei aqui os passos todos, podemos ver todas as informações do primeiro stage, que é o que está ativo, depois mostro o próximo stage e vejam que já está noutra entidade e que neste momento está inativo.

Vamos ver como podemos obter apenas o stage que está ativo:

function onload() {
    var activeStage = Xrm.Page.data.process.getActiveStage();
    Xrm.Utility.alertDialog(activeStage.getId() + " - " + activeStage.getName());
}

image_thumb1_thumb

Como podemos ver na imagem temos o guid e o nome do stage que está ativo. Claro que podemos ativar um stage com o seguinte código:

Xrm.Page.data.process.setActiveStage("15322A8F-67B8-47FB-8763-13A28686C29D", function(result) {
    if(result == "success") {
        Xrm.Utility.alertDialog("Success");
    } else {
        Xrm.Utility.alertDialog("Invalid");
    }
});

No post anterior não referi mas a função que colocar outro stage ativo e semelhança do que coloca o processo ativo, a função para além do sucesso e insucesso, e principalmente no caso de insucesso ele dá-nos mais razões para o insucesso, vamos ver o exemplo para este caso que outros valores podem ser passados a função:

  • crossEntity – o stage terá que ser sobre a entidade corrente;
  • invalid – pode ser três razões:
    • O Id do stage não é válido
    • O stage ativo não é o que está selecionado
    • O registo não está salvo
  • unreachable – o passo está noutro path
  • dirtyForm – se os dados da página não está gravado

Um método interessante é o getActivePath que nos dá qual é o caminho dos stages que faltam baseado nas regras de ramificações (mediante valores do formulário o nosso processo de negócio pode ter várias ramificações) e os dados presentes no registo, vejam um exemplo:

var activePathCollection = Xrm.Page.data.process.getActivePath();
activePathCollection.forEach(function (stage, n) {
    Xrm.Utility.alertDialog("Id do Stage -> " + n);
    
    var stageSteps = stage.getSteps();
    stageSteps.forEach(function (step, i) {
        Xrm.Utility.alertDialog("Nome do Passo -> " + step.getName());
        Xrm.Utility.alertDialog("Atributo do Passo -> " + step.getAttribute());
        Xrm.Utility.alertDialog("Passo Necessário -> " + step.isRequired());
    })
});

Com o método anterior, também vemos os métodos que podem ser executados sobre cada step, ou seja, podemos ver o nome do passo, qual o atributo e saber se esse atributo é necessário ou não.

Só nos falta falar nos eventos, aqui a API possibilita-nos saber quando um processo é alterado ou selecionado, da seguinte maneira:

Xrm.Page.data.process.addOnStageChange(function () {
    Xrm.Utility.alertDialog("O Stage foi modificado");
});
 
Xrm.Page.data.process.addOnStageSelected(function () {
    Xrm.Utility.alertDialog("O Stage foi selecionado");
});

image_thumb[3]

image_thumb[1]

A primeira mensagem é quando eu digo que quero mudar de processo, ou seja, disse que quero ir para a próxima fase. A segunda mensagem é quando eu seleciono, ou seja, por exemplo quero ver o que está na próxima fase, ou o que já foi escolhido na fase anterior.

Até a próxima

Tags: , ,

Novos métodos na API de Javascript–Processos I

by Pedro Azevedo 4. October 2016 19:30

Boas pessoal,

Há algum tempo atrás realizei alguns posts sobre a API de Javascript no CRM 2013, com o CRM 2015 apareceram novos métodos. A principal alteração foi ao nível da barra de processos de negócio, vamos conhecer melhor estas alterações:

image

Assinalado a vermelho vemos o que foi adicionado entre as versões 2013 e 2015, que tem a ver com os processos, em que estes podem ser divididos em fases (stages) e passos (steps).

image

Começando pelo Xrm.Page.ui.process, onde conseguimos controlar a visibilidade e colocar expandida ou recolhida:

Xrm.Page.ui.process.setDisplayState("collapsed");
Xrm.Page.ui.process.setVisible(false);

image

image

Podemos ver o comportamento com cada um dos código individualmente executados. Para além de definirmos, podemos ver o estado:

//Pode retornar "collapsed" ou "expanded"
Xrm.Page.ui.process.getDisplayState();
 
//Devolve true ou false mediante estar visível ou não
Xrm.Page.ui.process.getVisible();

Passando para o Xrm.Page.data.process, vamos saber qual é o processo selecionado, para isso vamos chamar o seguinte script:

var activeProcess = Xrm.Page.data.process.getActiveProcess();
Xrm.Utility.alertDialog(activeProcess.getId() + " - " + activeProcess.getName());

image

Como podemos ver na imagem temos o guid e o nome do processo que está ativo. Agora vamos forçar que o processo mude para o próximo ou anterior stage, com o seguinte código:

function onload()
    var activeProcess = Xrm.Page.data.process.getActiveProcess;
    if (activeProcess != null) {
        Xrm.Page.data.process.movePrevious(function (result) {
            ReadResult(result)
        });
    }
    
    var activeProcess = Xrm.Page.data.process.getActiveProcess();
    if (activeProcess != null) {
        Xrm.Page.data.process.moveNext(function (result) {
            ReadResult(result)
        });
    }
}
 
function ReadResult(result){
    if (result == "success") {
        Xrm.Utility.alertDialog("Funciona");
    } else {
        Xrm.Utility.alertDialog("Temos um problema");
    }
}

image

Na imagem vemos o que aconteceu quando tentamos ir para o próximo stage do nosso processo. Aqui dá um problema porque para avançar a Lead é necessário Qualificar, ou seja, necessita de uma oportunidade criada.

Neste momento temos estado a mexer no processo que está selecionado. Mas uma das funcionalidades mais interessantes é o utilizador poder mudar de processo, então como posso eu mudar de processo com código? Vamos começar por obter todos os processos que um utilizador pode mudar, com o seguinte código:

Xrm.Page.data.process.getEnabledProcesses(function (processes) {
    for (var processId in processes) {
        Xrm.Utility.alertDialog("id: " + processId + " name: " + processes[processId]);
    }
});

image

image

Com um Id do processo que quero mudar, posso mudar com o seguinte código:

Xrm.Page.data.process.setActiveProcess("c0d9760e-b261-4a3b-8355-f75eb45b9c1c", function(result) {
    if(result == "success") {
     alert("Success");
    } else {
     alert("Invalid");
    }
});

image

Em relação a apenas a parte do processo é tudo, no próximo artigo falarei, sobre os Stages.

 

Até a próxima

Tags: , ,

CRM 2013 Javascript Object Model - Lookup

by Pedro Azevedo 19. November 2014 19:50

Boas pessoal,

Continuando o conjunto de posts sobre a API de Javascript e também continuando o post de lookups no CRM 2013, hoje vou falar sobre o que temos na API de Javascript para interagir com os lookups. Este post já tinha sido feito para a versão 2011, por isso não vou voltar a falar das funções addCustomView, setDefaultView isso porque os métodos mantém os mesmos parâmetros e objetivos.

Ainda dentro dos métodos que existiam no CRM 2011, existe o getDefaultView, segue um exemplo:

function onload() {
        alert('default view->' + Xrm.Page.getControl('parentaccountid').getDefaultView());
}

Depois temos os métodos addCustomFilter, addPreSearch, removePreSearch, estes métodos com já foi dito aparecem na versão 2013. Para usar temos que fazer a combinação entre o addCustomerFilter e addPreSearch, para adicionamos um pré filtro temos que chamar o addPreSearch onde temos que adicionar um event handler que vai adicionar um filtro através do método addCustomerFilter:

function addPreFilter() {
	var city = Xrm.Page.getAttribute("address1_city").getValue();

	var filter ="<filter type='and'>" +
	             "<condition attribute='address1_city' operator='eq' value='" + city + "'/>" +
	             "</filter>";

	Xrm.Page.getControl("parentaccountid").addCustomFilter(filter);
}


function addPreSearchFilter() {
	Xrm.Page.getControl("parentaccountid").addPreSearch(addPreFilter);
}

Vejam as imagens em que na primeira não existe qualquer pré-filtro e na segunda aplicando o método anterior, ou seja, em vez de aparecer todos os registos consegue-se aplicar um filtro mais eficaz e com mais possibilidade de escolher sem ter que abrir uma nova janela.

 

Para se retirar este pré filtro temos que chamar o método removePreSearch e passar o event handler que passamos no método addPreSearch.

function removePreSearchFilter() {
	Xrm.Page.getControl("parentaccountid").removePreSearch(addPreFilter);
}

Este métodos podem ser de grande ajuda quando bem utilizados.

 

Até a próxima

Tags: , , , , ,

Gráficos no Microsoft Dynamics CRM

by Pedro Azevedo 12. October 2014 16:53

Boas pessoal,

Os fóruns de discussão têm servido de inspiração para posts que tenho realizado no blog e este não é exceção, numa thread recente foi colocada uma questão sobre os gráficos, a questão envolvia mexermos diretamente no XML e mesmo assim não consegui dar uma resposta válida, na minha opinião por limitação desta funcionalidade que apareceu no CRM 2011. Este será um post introdutório e em próximos posts explorarmos mais esta funcionalidade.

Como já referi a possibilidade de criarmos gráficos surgiu na versão 2011, onde nos possibilita de criarmos um gráfico com base num conjunto de registos, esta funcionalidade é muito poderosa pois permite-nos realizar drill-down, ver quais os registos que estão por base para aquele gráfico, mas vamos ver estes detalhes todos neste conjunto de posts.

Para começar vamos ver como acedemos a esta funcionalidade, numa lista qualquer temos uma barra lateral para abrirmos os gráficos:

Esta barra é customizável pela barra de comandos, em que podemos fixar a barra e desligar a barra de gráficos para esta entidade:

Para vermos os gráficos basta carregar sobre a barra para ela abrir:

 

Para algumas entidades já existem alguns gráficos pré-definidos, mas por exemplo para as entidades customizadas não vamos ver nenhum gráfico por defeito. De referir também que os dados que estamos a visualizar correspondem a vista que está selecionada e não para os registos todos.

Para além dos gráficos ainda podemos ver um mapa e já agora com o gráfico ancorado no topo:

 

Como opções sobre os gráficos e começando do lado esquerdo para o direito, temo um selector para escolher o relatório já gravados, depois nos ícones temos a opção de adicionar um novo gráfico, expandir ou fechar o gráfico, gravar alguma alteração e importar ou exportar o gráfico.

Neste post vamos entrar apenas na criação de gráficos:

Este é o aspecto da criação de um gráfico, temos a possibilidade de dar um nome a este gráfico, temos uma área para pré-visualizarmos os dados e depois uma área para configurarmos o gráfico:

 

 

Temos vários tipos de gráficos: colunas; barras; área; linha; circular e funil. Dentro dos três primeiros ainda temos mais três opções: “normal”, empilhado e empilhado a 100%.

Para além do tipo de gráfico podemos configurar se queremos aplicar regras para obter por x elementos superiores ou inferiores e temos por defeito as seguintes opções: 3, 5 ou um número personalizado. De referir também a última opção que vai limpar estas regras. Estas regras são úteis sobretudo quando temos muitos valores e para fixarmos um alvo concreto.

Estas opções estão disponibilizadas na configuração de uma série, onde podemos adicionar novas séries, para configurarmos temos que escolher o campo e depois qual a função de agregação que queremos aplicar:

Depois de selecionar o campo é disponibilizado opções de qual a operação de agregação que se quer aplicar, neste caso temos um campo de texto selecionado e por essa razão as operações numéricas não podem ser aplicadas. De notar a diferença entre a Contagem tudo e Não-Vazio em que a opção Não-Vazio não conta os elementos que não têm valor aplicado nesse campo.

Se escolhermos um campo do tipo data temos mais algumas opções:

 

Aqui podemos partir a data em partes do ano.

Por fim não se esqueçam de colocar uma descrição para o gráfico, dá sempre jeito para percebermos qual o seu objetivo ainda mais quando temos uma configuração importada, como vamos ver mais a frente o que vamos configurar no XML não será visível.

Depois de criarmos um gráfico, tal como acontece com as vistas não fica disponibilizado para toda a organização, por isso ficamos com outras opções sobre os gráficos “locais”:

Como podemos observar temos agora opção de editar, eliminar, atribuir e partilhar que não temos sobre um gráfico de sistema.

Vamos apenas ver um pequeno exemplo, onde queremos saber o total do orçamento por classificação por cada Oportunidade Potencial

Como podem ver estou ainda a configurar e já estou a pré-visualizar os resultados. Estes resultados são fidignos, vejam a visualização do gráfico para um utilizador:

Para criar um gráfico de sistema teremos que ir as customizações, aqui temos praticamente as mesmas opções:

Nas customizações para além de podermos criar novos gráficos podemos editar os gráficos existentes de sistema.

Este post teve como grande objetivo mostrar a configuração básica, como podem ver não temos muitas opções. Nos próximos para além da edição do XML vamos ver por exemplo onde podemos utilizar os gráficos.

 

PS: Para este post utilizei o Microsoft Dynamics CRM Online, mas os conceitos são idênticos para o CRM 2011, apenas com outra interface.

 

Até a próxima.

Tags: , , , ,

CRM 2013 Javascript Object Model - Data

by Pedro Azevedo 8. August 2014 02:34

 Boas pessoal,

Continuando a “saga” dos métodos Javascript vamos agora ver os métodos Xrm.Page.data.

Xrm.Page.data.getIsValid()

function getIsValidTest() {
                Xrm.Utility.alertDialog(Xrm.Page.data.getIsValid());
}

Xrm.Page.data.refresh(save).then(successCallback, errorCallback)

Esta função refresh recebe um booleano para dizer se queremos que ele salve depois do formulário ser refrescado. Depois existe a possibilidade de passar funções quando houver sucesso ou insucesso na execução da função.

function refreshTest()
{
                Xrm.Page.data.refresh(false).then(function() {
                                               Xrm.Utility.alertDialog("Sucesso no refrescamento");
                               },
                               function() {
                                               Xrm.Utility.alertDialog("Erro no refrescamento");
                });
}

Esta caixa aparece porque como estou a colocar o evento no onchange de um campo do CRM, ele verifica que estamos a querer refrescar a página sem guardarmos as alterações.

Xrm.Page.data.save().then(successCallback, errorCallback)

function saveTest() {
                Xrm.Page.data.save().then(function() {
                                               Xrm.Utility.alertDialog("Sucesso no save");
                               },
                               function() {
                                               Xrm.Utility.alertDialog("Erro no save");
                });
}

As duas últimas funções são muito rápidas isto porque o refrescamento é só dos dados e não da página inteira.

 

Até a próxima.

Tags: , , , , ,

CRM 2013 Javascript Object Model - Data.Entity

by Pedro Azevedo 9. July 2014 02:24

Boas pessoal,

Mais um capítulo dos métodos de Javascript desta vez sobre o Xrm.Page.data.entity

Xrm.Page.data.entity.addOnSave([function reference])

function showMessage() {
                Xrm.Utility.alertDialog("Função do evento save");
}

 

function addOnSaveTest() {
                Xrm.Page.data.entity.addOnSave(showMessage);
}

Xrm.Page.data.entity.removeOnSave([function reference])

function removeOnSaveTest() {
                Xrm.Page.data.entity.removeOnSave(showMessage);
}

 

Xrm.Page.data.entity.getDataXml()

function getDataXmlTest() {
                Xrm.Page.data.entity.addOnSave(function(){
                               Xrm.Utility.alertDialog(Xrm.Page.data.entity.getDataXml());
                });
}

Neste XML só aparecem os campos que eu alterei e aquelas que serão enviadas para o registo ser guardado.

Xrm.Page.data.entity.getEntityName()

function getEntityNameTest() {
                Xrm.Utility.alertDialog(Xrm.Page.data.entity.getEntityName());
}

Xrm.Page.data.entity.getId()

function getIdTest() {
                Xrm.Utility.alertDialog(Xrm.Page.data.entity.getId())
}

Xrm.Page.data.entity.getIsDirty()

function getIsDirtyTest() {
                Xrm.Utility.alertDialog(Xrm.Page.data.entity.getIsDirty());
}

 

O primeiro teste foi no evento onload do formulário e como se está a espera o formulário não está dirty. O segundo é invocado após alteração do campo como seria de esperar o CRM diz que o formulário está dirty.

Xrm.Page.data.entity.getPrimaryAttributeValue()

function getPrimaryAttributeValueTest() {
                Xrm.Utility.alertDialog(Xrm.Page.data.entity.getPrimaryAttributeValue());
}

Xrm.Page.data.entity.save( null | "saveandclose" |"saveandnew" )

Aqui é definido o comportamento da função save, se passarmos null ele deve simular o gravar normal, o saveandclose e o saveandnew dizem tudo destas duas opções.

function saveTest() {
                Xrm.Page.data.entity.save();

                Xrm.Page.data.entity.save("saveandclose");

                Xrm.Page.data.entity.save("saveandnew");
}

Já tínhamos visto a função Xrm.Page.data.save() a diferença é que esta corre assincronamente enquanto o save dentro da entity é síncrono e com opções diferentes.

 

Até a próxima.

Tags: , , , , , ,

Como fazer debug de um plugin no CRM Online

by Pedro Azevedo 11. June 2014 06:14

Boas pessoal,

Hoje vou mostrar como podemos efectuar debug num plugin do CRM Online, como vão ver não é um debug em real time mas mesmo assim permite-nos ver como é que os dados fluem no nosso plugin. Basicamente é capturado todos os dados num ficheiro e vamos carregar esse ficheiro na ferramenta “Plugin Registration”. Vou já mostrar com a nova interface da ferramenta que apareceu com o SP1 do Microsoft Dynamics CRM Online. É bom relembrar que apenas temos esta opção devido ao facto de a única maneira que temos para fazer deploy dos plugins é no modo sandbox.

Tendo em conta que já temos um plugin registado e queremos realizar o debug deste plugin através da ferramenta “Plugin Registration”. Esta ferramenta está na instalação do SDK, para ter acesso a nova interface relembro que têm que fazer no mínimo o download do SDK do SP1. Depois de instalar tem acesso aplicação nesta pasta …\SDK\Tools\PluginRegistration\PluginRegistration.exe.

Depois de iniciar aplicação terá este aspecto:

 Aqui carregamos no botão “CREATE NEW CONNECTION”, depois disto teremos que introduzir as nossas credenciais:

 

Depois da autenticação é listado a lista de Plugins registados e seleccionamos o plugin sobre o qual queremos realizar o debug e carregamos em “Install Profile”:

 

Depois do profile instalado irá aparecer um nó com o “Plugin-in Profiler”, sobre o passo registado dizemos que queremos começar o profile, carregando no botão “Start Profiling”:

 

Vai aparecer uma janela de settings que podemos aceitar os por defeito:

 

O nó do passo altera-se como vamos ver mais adiante, agora vamos até a nossa instância de CRM Online e vamos despoletar o nosso plugin, ao correr vai aparecer uma janela com o título “Erro de Processo de Negócio” onde vamos fazer download do ficheiro:

De seguida vamos ao nosso Visual Studio e vamos fazer “attach” ao processo da ferramenta “Plugin Registration”:

 

E colocamos um breakpoint onde vamos querer parar e fazer debug. Voltando a ferramenta e voltando ao passo do plugin, verificamos que o passo está marcado como “Profiled”, e seleccionamos o “Debug”:

 

Na janela a seguir vamos então seleccionar o ficheiro que fizemos download anteriormente e colocamos no campo: “Profile Location” e vamos também dizer onde está a DLL respeitante ao nosso plugin, depois de carregar o plugin temos a opção de escolhermos a classe responsável pelo plugin. Ao seleccionarmos o botão “Start Execution” ele vai correr o plugin com base no ficheiro de profile que disponibilizamos e podemos fazer step by step com os dados que inserimos:

 

 

 Assim vimos como podemos realizar debug de um plugin no CRM Online. Não é o ideal mas dá uma tremenda ajuda.

 

Até a próxima.

Tags: , , , , ,

CRM 2013 Javascript Object Model - Contexto

by Pedro Azevedo 28. May 2014 20:04

Boas pessoal,

Chegou a vez de falarmos sobre o Xrm.Page.context. Aqui temos que obter primeiro o objecto de contexto.

context.client.getClient()

Valores de retorno possíveis deste método:

Cliente

Valor

Browser

Web

Outlook

Outlook

Mobile

Mobile

function getClientTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.client.getClient());

}

De referir que este método veio tornar o método isOutlookClient obsoleto.

 

context.client.getClientState()

Valores de retorno possíveis deste método:

Cliente

Valor

Web, Outlook, Mobile

Online

Outlook, Mobile

Offline

function getClientStateTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.client.getClientState());

}

Tal como o método anterior este método veio tornar obsoleto o método isOutlookOnline.

 

context.getClientUrl()

Valores possíveis no retorno:

Cliente

Valor

Microsoft Dynamics CRM (on-premises)

http(s)://server/org

Microsoft Dynamics CRM Online

https://org.crm.dynamics.com

Microsoft Dynamics CRM for Outlook with Offline Access when offline

http://localhost:2525

Na documentação o método getServerURL não vem documentado mas ainda funciona apesar de estar obsoleto deve-se usar sempre o getClientUrl.

 

context.getCurrentTheme()

Este método serve essencialmente para podermos customizar os nossos Recursos Web mediante o theme do Outlook. Valores possíveis de retorno para este método:

Valor

Theme

default

Microsoft Dynamics CRM web application

Office12Blue

Microsoft Dynamics CRM for Outlook 2007 or 2010 Blue Theme

Office14Silver

Microsoft Dynamics CRM for Outlook 2007 or 2010 Silver or Black Theme

function getCurrentThemeTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.getCurrentTheme());

}

Devem ter atenção que alguns destes métodos não funcionam por exemplo nos tablets por isso os métodos acima passam a ser essenciais. Por exemplo este método em específico não funciona nos tablets.

 

context.getOrgLcid()

Esta função permite devolver a linguagem base da organização.

 

function getOrgLcidTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.getOrgLcid());

}

Este valor representa o Português de Portugal. Já agora o Português do Brazil é o 1046.

 

context.getOrgUniqueName()

function getOrgUniqueNameTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.getOrgUniqueName());

}

context.getQueryStringParameters()

Este método serve para ler os query strings passados ao formulário para além dos parâmetros que o CRM envia pode-se passar parâmetros customizados, por exemplo usando a função que já testamos a openEntityForm.

 

function getQueryStringParametersTest() {

                var params = Xrm.Page.context.getQueryStringParameters();

                for(var par in params) {

                               Xrm.Utility.alertDialog("QueryString:" + par + " com o valor " + params[par]);

                }

}

 

 

context.getUserId()
function getUserIdTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.getUserId());

}

 

context.getUserId() 
function getUserLcidTest() {

                Xrm.Utility.alertDialog(Xrm.Page.context.getUserLcid());

}

 

context.getUserName()
Esta função retorna o nome do utilizador.
function getUserNameTest() {

                    Xrm.Utility.alertDialog(Xrm.Page.context.getUserName());

}

 

context.getUserRoles()

function getUserRolesTest() {

                var roles = Xrm.Page.context.getUserRoles();

                for(var role in roles) {

                               Xrm.Utility.alertDialog("Role ID:" + role);

                }

}

context.prependOrgName(sPath)

 

function prependOrgNameTest() {

Xrm.Utility.alertDialog(getClientUrlTest() + Xrm.Page.context.prependOrgName("/XRMServices/2011/OrganizationData.svc/"));

}

 

Neste contexto ainda tenho a referir que o método getAuthenticationHeader foi retirado definitivamente, este tinha permanecido por causa de compatibilidades com o CRM 4.0.

 

Até a próxima

 

Tags: , , , , , , ,

CRM 2013 Javascript Object Model - Utility

by Pedro Azevedo 22. April 2014 01:22

Boas pessoal,

Como vos tinha prometido aqui vão exemplos de chamada a cada uma das funções Javascript que apresentei no post sobre o novo object modelo do CRM. Vou dividir em vários posts e vou dividir pelo mesmo critério que separei em tabelas:

Por isso vou começar pelo Xrm.Utility

Xrm.Utility.alertDialog(message,onCloseCallback)

function testAlertDialog(){
                Xrm.Utility.alertDialog("Mensagem a dizer que vou mudar o Nome da Empresa", function () {
                               Xrm.Page.getAttribute("companyname").setValue("Novo Nome");
                });
}

Por isso já sabem pessoal deixem de utilizar o alert e passem a usar esta função suportada.

Xrm.Utility.confirmDialog(message,yesCloseCallback,noCloseCallback)

function confirmDialogTest() {
                Xrm.Utility.confirmDialog("Quer mudar o Nome da Empresa?", function () {
                                               Xrm.Page.getAttribute("companyname").setValue("Mudei o nome da empresa");
                               },
                               function () {
                                               Xrm.Page.getAttribute("companyname").setValue("Não mudei o nome da empresa");
                               }
                );
}

 

Xrm.Utility.isActivityType(entityName)

function isActivityTypeTest() {
                Xrm.Utility.alertDialog("Cliente Potencial é uma entidade de actividade" + Xrm.Utility.isActivityType("lead"));
                Xrm.Utility.alertDialog("Email é uma entidade de actividade" + Xrm.Utility.isActivityType("email"));
}

Xrm.Utility.openEntityForm(name,id,parameters)

Esta função já merece uma descrição mais pormenorizada, para além do que o nome sugere que é a abertura de um formulário com um determinado registo, caso não coloquemos nada no parâmetro id ele abre um formulário de criação. No parâmetro parameters pode receber alguns parâmetros:

  • formid para poder especificar um formulário, quando existe mais que um;
  • parâmetros para passar valores por defeito quando existe um formulário de criação;
  • parâmetros query string quando um formulário está configurado para receber query string customizadas – não vou dar nenhum exemplo pois implica outras alterações, já está marcado para realizar um post mais tarde.
function openEntityFormTest() {
                Xrm.Utility.openEntityForm("account");
                Xrm.Utility.openEntityForm("account","D045613F-3CBF-E311-88C5-D89D67632EAC");

                var parameters = {};
                parameters["name"] = "este é o meu nome";
                parameters["telephone1"] = "(351) 123456789";
                Xrm.Utility.openEntityForm("account", null, parameters);
}

 

Xrm.Utility.openWebResource(webResourceName,webResourceData,width, height) e Xrm.Utility.openWebResourceDialog(webResourceName, webResourceData, width, height)

Nesta função apenas referir que se o Recurso Web receber dados teremos que o passar no segundo parâmetro.

function openWebResourceTest() {
                Xrm.Utility.openWebResource("new_controlhtml", null, 600,300);
}

 

Começamos com duas funções que utilizávamos muito os métodos de Javascript, ou seja, alert e confirm. Devemos usar estas novas funções pois assim vamos garantir que vão funcionar em todos os ambientes.

 

PS: Todos os testes foram realizados no evento onload da entidade Oportunidade Potencial.

 

Até a próxima.

Tags: , , , , , ,

Release Preview Guide CRM 2013

by Pedro Azevedo 24. September 2013 23:36

 Boas pessoal,

O CRM 2013 está quase quase a sair… entretanto saiu o Release Preview Guide do CRM 2013. Este guia resume as novidades que fui dando pelos vários posts que já escrevi em posts anteriores e tem algumas nuances novas.

Estes são os quatro principais princípios da Microsoft:

 

·         Pró-activo – um CRM deve ser capaz de prever tendências, facilitar e sugerir decisões num negócio. Resumidamente não deve ser um sistema passivo nem apenas um repositório de dados.

·         Produtivo – um CRM deve ter uma boa usabilidade para o utilizador final e ter integração completa com as tecnologias Microsoft.

·         Ubíquo – um CRM deve ser possível experienciar entre vendas, serviço e marketing independentemente do dispositivo, browser e localização.

·         Flexível – deve ser possível utilizar a Cloud ou uma instalação on-premise u ter uma instalação hibrida, dependendo das características do cliente.

 

As áreas que a Microsoft promete resolver com a vinda do CRM 2013:

Ao nível da experiência do utilizador e nos formulários o que temos de novo:

 

Rapidamente consegue-se saber o assunto de um registo, com o título em evidência, do lado direito caixas com as propriedades mais importantes (neste caso quando devemos responder, qual o valor estimado do negócio, estado). Com a barra de processos sabemos em que fase está o nosso registo. Depois temos o ecrã divido em três partes, onde do lado esquerdo temos informações do registo, no meio temos o que está acontecer e o que se passou neste registo e do lado direito informação secundária, por exemplo os registos associados. No fundo temos uma barra de estado onde temos o estado e se o registo está gravado ou não.

Com o novo modo de navegação, através da barra de navegação que foi também optimizada para o toque. Facilmente sabemos onde estamos e facilmente conseguimos navegar para outro registo.

Com formulários rápidos tanto para a criação (apenas preenchendo os dados mais importantes) com para leitura (pode visualizar dados relacionados rapidamente):

 

Criação e edição directa na grids:

Outro ponto de destaque e um dos mais importantes já introduzidos no Polaris é a possibilidade de termos uma barra de processos, agora para todas as entidades.

Esta barra para além de verificarmos onde esse registo se encontra permite vermos quais as acções que se já foram realizadas e as que falta verificar nessa etapa:

Podemos ter vários processos de negócio por entidade e ter processos de negócio que podem abranger mais que uma entidade, por exemplo da passagem de cliente potencial para oportunidade. Todos estes processos são configuráveis:

Como podem ver em cada etapa posso configurar quais os passos que posso dar e se esse passo é obrigatório ou não.

As aplicações mobile é outro forte onde temos uma aplicação com o mesmo aspecto para diferentes dispositivos:

Estas aplicações são configuráveis no cliente web do CRM e não é necessário um programador para aplicações móveis. As regras de negócio também são aplicadas incluindo o código Javascript.

Uma das grande apostas da Microsoft foi a compra da Yammer que permite podermos “conversar” à lá facebook num determinado registo:

Realmente uma grande ajuda para podermos discutir em equipa ficando registado no próprio registo.

Vamos ver outras melhorias:

·         Upgrade guiado – Antes de haver o upgrade para o CRM 2013 (online) os administradores podem escolher quando desejam receber o update e vão recebendo alertas 90, 30, 15 e 7 dias antes do upgrade. Isto para terem tempo de formarem os utilizadores.

·         Regras de negócio – Agora é possível afectar valores a campos, definir níveis de obrigatoriedade, mostrar e esconder campos, activar e desactivar campos, validar dados e mostrar mensagens de erro sem recorrer ao Javascript, tudo recorrendo apenas a interface gráfica.

·         Acesso de equipas – Até hoje quando queremos que uma equipa (que poderia ser multidisciplinar) criava uma equipa e esta ficava proprietária de registos. Com esta nova funcionalidade podemos criar equipas que têm acesso a registos.

·         Workflows real-time – Então e como são os workflows actuais? São assíncronos, estes são colocados uma fila para serem processados. Com esta feature os workflows são síncronos, comportamento semelhante com o que acontece com os plugins. Mas com a vantagem de não ser necessário nenhum programador.

·         Acções – Um novo tipo de processo que vai permitir expandir o CRM com novas mensagens para além das “normais” que são Create, Update, Delete, Retreive, Associate e Assign. As novas mensagens são criadas com base nas mencionadas e podemos ter novas mensagens como Escalate, Approve, Route e Schedule. Estas novas acções estão disponíveis através dos webservices.

·         Autosave – A funcionalidade do Autosave está activa por defeito e deixa de haver o botão de save, pois o formulário é gravado de 30 em 30 segundos ou quando navegamos para outro registo. Esta funcionalidade pode ser desactivada ao nível da organização ou em cada formulário através de código.

·         Aplicações móveis customizadas – Com suporte ao protocolo OAuth vem trazer mais flexibilidade, pois ao sermos autenticados através do OAuth poderemos usar os endpoints REST e SOAP, com esta melhoria principalmente ao protocolo REST ODATA vem facilitar o suporte aplicações mobile e a clientes ricos externos.

·         Medidas de Confiança – Existe um grande esforço por parte da Microsoft para garantir a segurança de informação nos seus datacenters e poder-se diferenciar também neste campo da concorrência. Desta vez está de acordo com o FIPS 140-2 (Federal Information Processing Standard) que garante a encriptação das credenciais guardadas por exemplo para o Yammer ou outros fornecedoresde email.

·         Compatibilidade Office 2013 – Uma das grandes vantagens do Dynamics CRM é a sua integração com as ferramentas do Office e agora a compatibilidade total com o Microsoft Office 2013.

 

Até a próxima.

Tags: , ,

About

Muito bem casado, Pai babado e um gosto muito grande pela tecnologia.

Tenho um lema "Sharing is Learning"

Mais aqui -> http://www.psazevedo.com

Month List