Caros,
Esse artigo foi originalmente publicado por VANYA KASHPERUK, em seu blog http://kashperuk.blogspot.com/ e apenas traduzido por mim.

No Dynamics AX 2009 a Microsoft introduziu um novo tipo de dados chamado UtcDateTime, que substituirá 2 tipos existentes, date e time, os quais ainda estão presentes.

Obviamente que a introdução destes dois novos tipos requer um tutorial sobre como eles podem ser usados nos formulários, como você pode filtrar campos com esse tipo de dados, como também quais funções estão disponíveis para serem usadas.

Então, eu fiz esse tutorial e espero que seja bastante útil para os desenvolvedores migrando para o AX 2009.

Faça o download do xpo usado no tutorial (SkyDrive)

O tutorial consistem em um único formulário que contem os seguintes elementos:

• uma grid, exibindo dados da CustTable;
• 4 botões para ações de filtro;
• 3 controles que permitirão especifica filtros condicionais para os dados.

No formulário você pode ver como os controles baseados no UtcDateTime são exibidos tanto em um grupo como também em um grid.

Abaixo uma explicação sobre a funcionalidade implementada, na forma de perguntas e repostas:

1.)
Q: Eu posso fazer um filtro no novo tipo UtcDateTime especificando apenas a Data?

R: Sim. Você simplesmente tem que especificar o valor da data quando for fazer o filtro, como abaixo. Note que isto também funciona quando você for fazer filtros pela interface normal (CTRL + F). qbdsCustTable.addRange(fieldNum(CustTable, CreatedDateTime)).value(queryValue(DateFilter.dateValue()));

O que é interessante é como o kernel processa este range. No infolog abaixo, você pode ver que o quando é visualizada na query, é exibido uma condição “==”, mas na realidade, como você pode ver no SQL Trace, um range condicional “>= && <=" é aplicado para varrer o dia inteiro. Perceba também, que os valores são exibidos no trace usando o TimeZone que eu estou, assim como o horário de verão.

2.)
Q: Eu posso filtrar usando apenas a hora?

R: Não, isto não é possível usando o UtcDateTime. O valor usado quando você especifica só a hora é o valor menor possível na combinação DateTime, ou seja, ‘1900-01-01 00:00:00’.

3.)
Q: Eu posso usar funções similares as anteriores em queries para o typo UtcDateTime?

R: Sim. Todas as principais funções existentes para trabalhar com QueryBuildRange também suportam o tipo UtcDateTime. Por exemplo, no infolog abaixo você pode ver como o range é aplicado nas duas UtcDateTime. Você também pode usar o método Global::QueryValue. Perceba que novamente o SQL converteu as datas para serem comparadas com as horas da minha localidade.

4.)
Q: Como o tipo de dados UtcDateTime é armazenado no Banco de Dados? É exibido da mesma forma que é exibido nos formulários?

R: Os campos UtcDateTime são sempre armazenados em UTC. Sempre que é exibido no formulário e ligado ao campo de uma tabela, os dados são convertidos para o tipo configurado nas preferencias do usuário. Nota, você precisa tomar cuidado com as conversões se o controle não estiver atrelado a um campo de uma tabela. Por exemplo, veja o método init() do tutorial.

5.)
Q: Quais funções estão presentes para trabalhar com o tipo de dado UtcDateTime?

R: A principal é a classe DateTimeUtil, ela permite adicionar dia/mês/ano, assim como aplicar um offset, pegar as preferências do usuário, converter de/para outros tipos e etc… Um exemplo pode ser visto abaixo:

1
2
3
4
5
6
// getSystemDateTime() returns the current DateTime set in the system, not the current machine dateTime.
// Note that getSystemDateTime() returns a UTC date and time, not your local date time.
// In order to receive your local DateTime value, you should use methods applyTimeZoneOffset and specify the preferred time zone.
utcDateTimeFilter.dateTimeValue(DateTimeUtil::applyTimeZoneOffset(
                                DateTimeUtil::getSystemDateTime(),
                                DateTimeUtil::getUserPreferredTimeZone()));

6.)
Q: Isto significa que o suporte aos tipos Date e Time foram removidos?
R: Não, como mencionado anteriormente você pode usá-los.

7.)

Q: Eu não vejo o filtro atual no log do SQL no lugar eu vejo “?”. Como eu posso também limitar o número de dados/campos selecionados na base de dados?

R: Isto é apenas material extra, não relacionado a UtcDateTime, mas continua útil conhecer e prestar atenção!

CustTable tem um grande número de campos, e eu estou apenas exibindo 4 deles no formulário, então é ignorante eu retornar todos os campos. Felizmente, o DataSource tem a propriedade OnlyFetchActive, o qual controla o comportamento da query selecionando apenas os campos atualmente exibidos no formulário. Nota, você deve evitar usar isto com datasources editáveis, veja nos comentários deste post para maiores detalhes.

Quanto aos “?” no trace SQL – acontece devido ao uso dos placeholders. Isto geralmente melhora a performance das queries, criando um plano de execução e quardando para uso futuro. Mas é possível, e é necessário em alguns casos específicos, forçar o uso das literais (mostrar os valores reais na query). Isso pode ser feito usando o método literals na query.

[]s
Pichler