Slides do 1º evento presencial da comunidade Portugal-a-Programar

by Pedro Azevedo 29. June 2013 17:00

Boas pessoal,

Realizei a apresentação e o workshop no primeiro evento da comunidade Portugal-a-Programar, primeiro queria felicitar toda a organização que permitiu realizar este evento. Havia uma grande mistura entre profissionais e estudantes.

A apresentação correu muito melhor que a minha anterior experiência, não tão nervoso e o discurso a sair mais fluído. Infelizmente a minha gravação não foi disponibilizada pois sei que havia alguns problemas com os equipamentos de gravação, mas ficam os meus slides:

 

O workshop não funcionou tão bem devido a falta de internet na sala. Mas deu para ser uma sessão mais descontraída e com muito interacção com os participantes. Podem ver aqui os resultados do evento.

E da minha participação:

 

 

 

Até a próxima.

Tags: , ,

Tudo sobre WebResources II

by Pedro Azevedo 25. June 2013 22:07

 Boas pessoal,

Vamos continuar o exemplo anterior e vamos tentar complicar um pouco para percebermos como tirar o maior partido desta funcionalidade.

Vamos então perceber como podemos referenciar um WebResource directamente. Agora quero colocar “OLA Nome do Cliente Potencial”. Para isso vou usar jQuery então adicionei a biblioteca do jQuery a solução através de um WebResource e adicionei o seguinte código:

$(document).ready(function() {
  var nomeCompleto = window.parent.Xrm.Page.getAttribute("fullname").getValue();
  $('#sayHello').append(nomeCompleto);
});

Se voltar abrir um Cliente Potencial vai dar o erro seguinte:

Isto porque mesmo tendo na solução um WebResource com a biblioteca jQuery, o CRM não vai carregar, por essa razão vamos ter que adicionar uma referência ao WebResource que tem a biblioteca jQuery, desta maneira:

<SCRIPT type=text/javascript src="ret_jquery"></SCRIPT>

Gravando, publicando e abrindo novamente o registo temos este resultado:

 

Este tipo de referenciação funciona se tivermos numa estrutura flat. Se tivermos os WebResources em pastas teremos que nos posicionar. Imaginemos que o WebResource ret_testewr estava em html/ret_testewr e que a biblioteca jQuery estava em scripts/ret_jquery, então teríamos que referenciar da seguinte maneira:

<SCRIPT type=text/javascript src="../scripts/ret_jquery"></SCRIPT>

Aqui estamos a usar um URL relativo e é assim que devemos usar, outra maneira era referenciarmos o WebResource da seguinte maneira:

<SCRIPT type=text/javascript src="http://<server>/<organization>/webresources/ret_jquery"></SCRIPT>

Colocar todo o caminho vai funcionar e muitas das vezes é o URL que eu coloco no browser para testar. Mas isto é muito mau, basta dizer que você não vai conseguir passar esse código para outro ambiente de desenvolvimento, sem ir alterar o código, o que é mau, por isso devemos sempre usar o URL relativo. Já para não falar se tivermos os dois tipos de deploy (online e on-premise) que o URL muda completamente.

Uma pergunta válida é o porquê de querermos estruturar os WebResources na forma de pastas. Não é uma obrigação mas sim uma boa prática, principalmente se um utilizador pertencer a mais que uma organização num servidor. Isto porque quando colocamos /WebResources/<nome web resource> ele vai aceder a organização por defeito do utilizador. Isto poderá gerar um erro do tipo “File Not Found” caso ele esteja aceder a uma organização que não a de por defeito e que esse WebResource não exista na organização por defeito. Então como boa prática deveria-se ter a a seguinte estrutura:

“_<prefixo da organização>”/<nome da pasta>/<nome do Recurso Web>

Já vimos que conseguimos aceder ao formulário então e como conseguimos aceder a coisas do CRM fora do formulário, por exemplo saber o nome da organização, para isso usamos a seguinte função:

Xrm.Page.context.getOrgUniqueName()

Se executarmos este código obtemos o seguinte erro:

 

Mas em cima colocamos o prefixo window.parent mesmo pondo este prefixo não funciona porque ele serve para aceder ao formulário. Para que isto funcione necessitamos de referenciar uma outra biblioteca (não esquecer que estou numa estrutura flat de WebResources, se este WebResource tivesse dentro de uma pasta teria que reposicionar):

 

<SCRIPT src="ClientGlobalContext.js.aspx"></SCRIPT>

 

Esta biblioteca permite acedermos a outros parâmetros, vejam aqui a lista:

  •     getAuthenticationHeader

Cabeçalho de autenticação SOAP para os WebServices do Dynamics CRM 4.0.

  •     getOrgLcid

Retorna o valor LCID da linguagem de base da organização.

  •     getOrgUniqueName

Retorna o nome da organização.

  •    getQueryStringParameters

Retorna um array de chave valor representando os argumentos em query string passados a página.

  •   getServerUrl

Retorna o URL base do servidor. Quando se está no modo offline ele retorna localhost.

  •   getUserId

Retorna o Guid do utilizador actual.

  •    getUserLcid

Retorna o valor LCID da linguagem seleccionada pelo utilizador.

  •   getUserRoles

Retorna um array de Guid que representam as roles associadas ao utilizador.

 Existe outra forma de referenciar WebResources através da directiva “$webresource:<Nome do WebResource>”, devemos usar sempre este tipo de referenciação, pois ele resolve as dependências de solução. Mas apenas podemos usar quando estamos a usar o SiteMap ou Ribbon. A questão das dependências é muito importante porque ele vai conseguir gerar o URL e com isso vai possibilitar haver cache do WebResource, vejam o URL para referenciar o WebResource:

/<organização>/%7B635318792490000000%7D/WebResources/ret_testewr

Se colocarmos um URL absoluto para além dos problemas anteriores ainda vamos perder a capacidade de fazer cache. Existe um artigo muito bom e que explica também como podemos gerar este URL.

Em relação a como aplicamos a directiva na prática vamos ver mais detalhes no próximo post.

 

Até a próxima

 

Fontes:

http://msdn.microsoft.com/en-us/library/gg328541.aspx

Tags: , , ,

Tudo sobre WebResources I

by Pedro Azevedo 11. June 2013 00:43

Boas pessoal,

Vou criar uma série de posts sobre o conceito de Recurso Web (WebResource) que apareceu com o CRM 2011. Esta nova funcionalidade permite adicionar e referenciar componentes externos ao CRM, os WebResources ficam gravados na BD do CRM.

Os WebResources permite aumentar a usabilidade do Dynamics CRM. Cada WebResource tem um tipo que pode ser uma imagem, ficheiros javascript, html ou até silverlight. A seguir uma lista dos vários tipos:

Tipo de Ficheiro

Extensões

Descrição

Webpage (HTML)

.htm, .html

Páginas Web que apenas pode conter código do lado do cliente

Style Sheet (CSS)

.css

Mudar a aparência do CRM

StyleSheet (XSL)

.xsl, .xslt

Script (JScript)

.js

Utilizado em eventos do formulário e campos mas também numa WebPage ou comandos da Ribbon

Data (XML)

.xml

Podermos referenciar ficheiros XML

Image (PNG)

.png

Pode ser usado na ribbon, sitemap ou para ter imagens na própria entidade.

Image (JPG)

.jpg

Image (GIF)

.gif

Image (ICO)

.ico

Silverlight (XAP)

.xap

Possibilita enriquecer os formulários através do Silverlight

 

Como o WebResource é um dos componentes de uma solução permite facilmente passa-los de um ambiente para o outro. Para que isto aconteça com eficiência teremos que saber como referenciá-los, mas este assunto vamos retomar mais adiante.

Uma pergunta que tive e que faz todo o sentido: “Vamos deixar de usar o iFrame?”, pois ainda não, apesar de diminuir muito a sua utilização, ainda não podemos dizer que vamos deixar totalmente a sua utilização. Penso que a sua utilização vai limitar-se para podermos mostrar páginas aspx. Vejam aqui um bom artigo sobre este tema.

Para criarmos um WebResource temos que escolher uma solução. Depois disso escolhemos um nome, o tipo de documento. Se o tipo de documento for de edição de texto podemos editar directamente ou carregar um documento externo. O output depois de gravarmos é o URL para esse WebResource, se colocarmos esse URL no browser podemos ver o conteúdo. Este URL pode ser utilizado para o referenciar por exemplo em outro WebResource.

Eu ou editar directamente o WebResource por isso vou escolher a opção “Editor de texto” e colocar o seguinte código HTML:

 

Para finalizar basta gravarmos e publicarmos.

Para visualizarmos o resultado teremos que gravar e publicar o WebResource e depois adiciona-lo a um formulário:

 

Reparem que eu tenho uma secção seleccionada então ele vai colocar no final dessa secção. Podemos adicionar uma nova secção e colocar lá o nosso WebResource. Para finalizar gravamos e publicamos e vamos ver o seguinte resultado:

 

Para finalizar relatar uma limitação relativamente ao tamanho do ficheiro do WebResource que é definido com o tamanho máximo de upload de ficheiros nos emails. Esta configuração está em Definições->Sistema->Administração->Definições de Sistema->Correio Electrónico no campo “Definir limite de tamanho do ficheiro para anexos”.

Neste primeiro post falamos de um modo genérico sobre WebResources, nos próximos vamos aprofundar um pouco mais.

 

Até a próxima

Tags: , , ,

Referência Rápida - Códigos de Erro

by Pedro Azevedo 7. June 2013 00:40

Boas pessoal,

Mais um post de referência rápida, desta vez para quando recebermos uma mensagem de erro com um código de erro possamos saber mais informação através da tabela abaixo.

O CRM pode-nos dar informações dos erros de duas maneiras:

  •        Decimal (por exemplo: -2147206371)
  •        Hexadecimal (com ou sem prefixo 0x, por exemplo 0x80043B1D)

     Nesse sentido é necessário passarmos o código de erro na forma de inteiro para Hexadecimal, para isso siga estes passos:

  1.        Abra a calculadora no modo científico ou programador
  2.        Escolha a opção Dec (Decimal)
  3.        Faça copiar e colar na calculadora

4.       Seleccione o Hex (Hexadecimal) para converter para hexadecimal, pois a tabela está neste tipo. Depois é retirar os FFFFFFFF e tem o código que pode pesquisar na tabela.

 

Tabela de referência para o CRM 2011:

ErrorId

ManagedErrorName

ErrorMessage

UnManagedErrorName

800401ff

SearchTextLenExceeded

Search Text Length Exceeded.

IDS_SEARCHTXTLENEXCEEDED

80040200

RequiredFieldMissing

Required field missing.

IDS_REQUIREDFIELDMISSING

80040201

InvalidXml

Invalid XML.

IDS_INVALID_XML

80040202

EmptyXml

Empty XML.

IDS_EMPTY_XML

80040203

InvalidArgument

Invalid argument.

IDS_INVALIDARG

80040204

InvalidUserAuth

User does not have the privilege to act on behalf another user.

IDS_INVALID_USERAUTH

80040205

InvalidParent

The parent object is invalid or missing.

IDS_INVALID_PARENT

80040206

InvalidParentId

The parent id is invalid or missing.

IDS_INVALID_PARENTID

80040207

unManagedidsinvaliduserid

The user id is invalid or missing.

IDS_INVALID_USERID

80040208

unManagedidsinvalidteamid

Invalid team id.

IDS_INVALID_TEAMID

80040209

unManagedidsinvalidbusinessid

Invalid business id.

IDS_INVALID_BUSINESSID

8004020a

unManagedidsinvalidorgid

Invalid organization id.

IDS_INVALID_ORGID

8004020b

unManagedidsinvaliditemid

Invalid item id.

IDS_INVALID_ITEMID

8004020c

InvalidSharee

Invalid share id.

IDS_INVALID_SHAREEID

8004020d

InvalidAccessRights

Invalid access rights.

IDS_INVALID_ACCESSRIGHTS

8004020e

unManagedidsinvalidvisibility

Invalid visibility.

IDS_INVALID_VISIBILITY

8004020f

unManagedidsfailureinittoken

Failure in obtaining user token.

IDS_FAILURE_INITTOKEN

80040210

InvalidAssigneeId

Invalid assignee id.

IDS_INVALID_ASSIGNEEID

80040211

unManagedidsinvalidassociation

Invalid association.

IDS_INVALID_ASSOCIATION

80040212

unManagedidsinvalidowninguser

Item does not have an owning user.

IDS_INVALID_OWNINGUSER

80040213

unManagedidsinvalidvisibilitymodificationaccess

User does not have access to modify the visibility of this item.

IDS_INVALID_VISIBILITY_MODIFICATION_ACCESS

80040214

CannotShareWithOwner

An item cannot be shared with the owning user.

IDS_CANNOT_SHARE_OBJECT_WITH_OWNER

80040215

MissingOwner

Item does not have an owner.

IDS_MISSING_OWNER

80040216

UnExpected

An unexpected error occurred.

IDS_UNEXPECTED

80040217

ObjectDoesNotExist

The specified object was not found.

IDS_OBJECT_DOES_NOT_EXIST

80040218

InvalidPointer

The object is disposed.

IDS_INVALID_POINTER

80040219

NotImplemented

The requested functionality is not yet implemented.

IDS_NOT_IMPLEMENTED

 

Até a próxima.

 

Fontes:

http://mscrmuk.blogspot.pt/2009/01/crm-error-codes.html

http://msdn.microsoft.com/en-us/library/gg328182%28v=crm.5%29.aspx

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