quinta-feira, 5 de fevereiro de 2009

>> CRM 4.0 - Manipulação de Anexos (SDK)

A versão 4.0 do Dynamics CRM simplificou para nós, desenvolvedores, o uso de diversos recursos do SDK. Um deles é a busca e manipulação de Anexos nas entidades do produto.

Para este caso, note que em cada Anotação (relacionada a uma entidade do CRM) existe um campo chamado documentbody que armazena o conteúdo do arquivo anexado pelo usuário (BASE64 Format).

Para demonstrar isto, segue função genérica (C#) que retorna as Anotações (de uma determinada Entidade) que contém anexos. A função retorna o conteúdo de cada anexo (pelo processo de Decoding do .NET).

P.S.: Lembrando que a função consegue ler o conteúdo de anexos no formato do CRM (BASE64). Arquivos com formatos diferentes precisam de tratamentos específicos para leitura. Exemplo, os arquivos do Office2007, como xlsx (http://michaelmalloy.blogspot.com/2008/04/c-read-excel-2007-xlsx-files.html).

Chamada da função que busca as Anotações:

BusinessEntityCollection notes = getEntityNotes(new Guid("272526EA-ED6B-43CC-A8DC-A2965405A463"));

foreach (BusinessEntity be in notes.BusinessEntities)
{
annotation annot = be as annotation;
if (!string.IsNullOrEmpty(annot.documentbody))
{
string attachBody = DecodeByteArryToString(annot.mimetype, annot.documentbody);
}
}



Função que busca as Anotações da Entidade:


public static BusinessEntityCollection getEntityNotes(Guid entityId)
{
// Set up the CRM Service.
CrmAuthenticationToken token = new CrmAuthenticationToken();
token.AuthenticationType = 0;
token.OrganizationName = "OrgName";
CrmService service = new CrmService();
service.Url = "http://localhost:5555/mscrmservices/2007/crmservice.asmx";
service.CrmAuthenticationTokenValue = token;
service.Credentials = System.Net.CredentialCache.DefaultCredentials;

BusinessEntityCollection notes = null;

ConditionExpression caseCondition = new ConditionExpression();
caseCondition.AttributeName = "objectid";
caseCondition.Operator = ConditionOperator.Equal;
caseCondition.Values = new object[] { entityId };

FilterExpression filter = new FilterExpression();
filter.FilterOperator = LogicalOperator.And;
filter.Conditions = new ConditionExpression[] { caseCondition };

QueryExpression query = new QueryExpression();
query.EntityName = EntityName.annotation.ToString();
query.ColumnSet = new AllColumns();
query.Criteria = filter;

RetrieveMultipleRequest retrieve = new RetrieveMultipleRequest();
retrieve.Query = query;

RetrieveMultipleResponse retrieved = (RetrieveMultipleResponse)service.Execute(retrieve);
notes = retrieved.BusinessEntityCollection;

return notes;
}

public static string DecodeByteArryToString(string mimeType, string documentbody)
{
Byte[] ByteArry = System.Convert.FromBase64String(documentbody);
Decoder byteArryDecoder = null;

if (mimeType.IndexOf("text/") >= 0)
{
byteArryDecoder = Encoding.UTF7.GetDecoder();
}
else
{
byteArryDecoder = Encoding.Unicode.GetDecoder();
}

int charCount = byteArryDecoder.GetCharCount(ByteArry, 0, ByteArry.Length);
char[] bodyChars = new Char[charCount];
int charsDecodedCount = byteArryDecoder.GetChars(ByteArry, 0, ByteArry.Length, bodyChars, 0);
return new string(bodyChars);
}

Nenhum comentário:

Postar um comentário

<< Ao enviar um comentário, favor clicar na opção [Enviar por e-mail comentários de acompanhamento para gtezini@gmail.com] >>