sexta-feira, 30 de janeiro de 2009

Query com range de valores

Olá!
Antes de mais nada, Feliz 2009 a todos!!!

Em posts anteriores, nos foi mostrado como se pode negar valores utilizando o objeto Query, hoje vamos ver como podemos fazer um range de valores com este objeto.

Do mesmo jeito que existe uma função queryValue(AnyType A), também existe a função queryRange(anyType _From, AnyType _To), que faz uma chamada a função SysQuery::range(_From,_To), que por sua vez, trata os valores passados como parâmetro. Por exemplo:


queryRange(1,10); //Retorna “1..10”


Com isso em mente podemos fazer um pequeno código que busca as NFs faturadas em um determinado range de datas:



static void RangeTest(Date _from, Date _to)
{
Query query = new query();
QueryRun queryRun;
QueryBuildDataSource qbds;
CustInvoiceJour custInvoiceJour;
;
qbds = query.addDataSource(TableNum(CustInvoiceJour));
qbds.addRange(FieldNum(CustInvoiceJour,InvoiceDate)).value(queryRange(_from,_to);
queryRun = new queryRun(query);

while(queryRun.next())
{
custInvoiceJour = queryRun.get(TableNum(CustInvoiceJour));
print (CustInvoiceJour.InvoiceDate);
}
pause;
}


Mas, num caso em que precisarmos buscar NFs faturadas a partir de/até uma determinada data, fazemos a chamada a queryRange utilizando outra função estática de SysQuery, a valueUnlimited(). No exemplo abaixo buscamos por NFs geradas a partir da data X passada como parâmetro.


static void RangeTest(Date X)
{
Query query = new query();
QueryRun queryRun;
QueryBuildDataSource qbds;
CustInvoiceJour custInvoiceJour;
;
qbds = query.addDataSource(TableNum(CustInvoiceJour));
qbds.addRange(FieldNum(CustInvoiceJour,InvoiceDate)).value(queryRange(X,SysQuery::valueUnlimited()));
queryRun = new queryRun(query);

while(queryRun.next())
{
custInvoiceJour = queryRun.get(TableNum(CustInvoiceJour));
print (CustInvoiceJour.InvoiceDate);
}
pause;
}



A classe SysQuery possui outras funções estáticas muito interessantes que ajudam, e muito, o desenvolvedor a montar suas Queries, como por exemplo:
- valueEmptyString();
- valueNot(AnyType A);
- valueNotEmptyString();

Espero que tenha ajudado!
Abs

terça-feira, 2 de dezembro de 2008

MSBuild tasks for Dynamics Ax updated!!!

Fiz um upload de um projeto de exemplo hoje, ele limpa um AOS, pega a ultima versão do SourceSafe, gera um xpo, importa e compila, deixando o diretório com um aod pronto, porém falta completar o projeto para copiar o aod pronto para a pasta de build, alguem se habilita?

Coloquei o feed do projeto no nosso blog, assim so vou postar major updates no blog, o resto da atualizações podem ser conferidas pelo feed.

Abs,
Rodrigo

Blog Dynamics Funcional

Pessoal,


Nosso amigo Cristo Cavazzana Melios, que já trabalhou com muitos dos autores do Axapta Brasil, criou em parceria com o Márcio Hipólito Nojima, um blog dedicado à questões funcionais do AX.

Uma excelente referência para os consultores funcionais e até mesmo novos desenvolvedores conhecerem os processos de negócio, na linguagem do Microsoft Dynamics AX.

O blog oferece uma visão prática dos processos brasileiros dentro do sistema, sendo um excelente complemento ao material oficial.

Essencial!


domingo, 23 de novembro de 2008

MSBuild tasks for Dynamics Ax project released!

O objetivo do projeto é disponbilizar um conjunto de tasks para compilar, criar builds e fazer o deploy do Dynamics Ax.

O codigo fonte pode ser acessado na pagina do projeto: http://www.codeplex.com/daxMsBuild

Interessados em contribuir entrar em contato comigo através do site do projeto.

MSBuild é a ferramenta que o Visual Studio utiliza para construir (build) seus projetos através de arquivos XML que podem ser criados e adaptados para criar builds para qualquer tipo de projto não somente os de .net. Mais informações sobre o MSBuild em: http://msdn.microsoft.com/en-us/library/wea2sca5.aspx

sexta-feira, 24 de outubro de 2008

Smart customizations Ax

Seguindo meu post sobre upgrade de versão, segue um link de um webcast feito por Michael Fruergaard, arquiteto do time de Ax da microsoft, que explica como customizar o Ax de uma maneira a simplicficar futuros upgrades.
Com o lançamento do Ax 2009, é muito importante todos os desenvolvedores de Ax pensarem também como lidar com o upgrade das customizaçòes feitas para seus clientes.

Dynamics AX 4.0 - Smart customizations

Rodrigo

segunda-feira, 20 de outubro de 2008

Removendo Dados de Utilização de Usuários

Boa tarde a todos,


Uma das funcionalidades mais impressionantes, por assim assim dizer, que o DAX possuí é a capacidade do usuário de realizar diferentes tipos de pesquisas, sejam quais forem os critérios. Muitas vezes você terá relacionamentos 1:n ou n:1 disponíveis e com isso o proprio operador do sistema tem em mãos pesquisas completamente personalizadas, valendo-se sempre a ressalva:"Desde de que saiba-se o que está fazendo".
Hoje, utilizando essas pesquisas , me deparei com um problema um tanto quanto inusitado. Quando são utilizadas as queries do sistema para filtrar-se as informações, se novas tabelas forem incluídas e a consulta seja salva, não é mais possível deleta-las de um modo simples e voltar para a funcionalidade standard.


fig.1 - Proposta de pagamento standard




Utilizando como base o filtro da proposta de pagamento do contas a receber, incluí uma nova tabela (linhas do diário). Na figura 2 vemos o exemplo do formulário assim que a tabela é incluida com a opção de exclusão habilitada. Já a figura 3 mesmo contando com as mesmas tabelas da figura 2 não tem mais disponível a opção de exclusão.


fig.2 - Opção de exclusão habilitada



fig.3 - Opção de exclusão inexistente



Caso utilize-se o debug do processo, a "volta" pelas classes do sistema será grande e com certeza passará por muitos objetos SYS, o que não é muito bom por assim dizer, tendo como adendo o tempo gasto, que será alto e muitas vezes sem qualquer conclusão. Nesse caso, o DAX oferece de uma forma até que bem simples para que a pesquisa standard sejá reestabelecida.

Para isso, basta entrar na tela de opções do usuário (Administração > Usuários > Opções do usuário) ou ir direto utilizando o menu (Ferramentas > opções). Na sequencia utilizando o botão Dados de utilização visualizamos o formulário, onde todas as informações especificas do usuário que fogem do padrão do sistema, então caso você tenha mudado a ordem dos campos em uma grid ou no nosso caso alterado os critérios de pesquisa, podemos visualizar utilizando esse formulário. Fica o alerta para não usar o botão de Redefinição indiscriminadamente, pois como o formuláruo frisa, TODAS as configurações do usuário selecionado serão excluídas.
No momento em que altera-se a pesquisa padrão, a tabela SysLastValue é preenchida com as novas configurações, e o que tem-se a fazer é encontrar o registro e remove-lo na sequencia conforme a figura 4. Após esse procedimento, a pesquisa em questão volta ao seu status standard.


fig.4 - Visualização das configurações do usuário




Vale lembrar que esse mesmo procedimento pode ser utilizado para recuperar as configurações originais de tamanho de tela, campos que estão invisíveis, botões, campos em grid, etc etc etc.

Até o próximo post,

Daniel Zanni

quarta-feira, 15 de outubro de 2008

Query negando valores

Pessoal,


Uma dúvida recorrente entre o pessoal que está iniciando no Ax é : como negar valores num objeto Query?


Fiz esse pequeno exemplo para ilustrar uma possível forma.
No snippet abaixo, ele traz todos os clientes não iniciados pelo caractere '3'.


Obs: A utilização da function queryValue(anyType A) faz uma chamada estática a SysQuery::value(a), que por sua vez irá tratar os dados enviados no parâmetro A, como por exemplo, se eu envio um Enum, queryValue(MeuEnum) retorna o valor correspondente, e assim por diante.


static void exemploQueryRunNegativo(Args _args)
{
Query query = new query();
QueryRun queryRun;
QueryBuildDataSource qbds;
CustTable custTable;

;
qbds = query.addDataSource(TableNum(CustTable));
qbds.addRange(FieldNum(CustTable, AccountNum)).value("!" + queryValue("3") + "*");
queryRun = new queryRun(query);

while(queryRun.next())
{
custTable = queryRun.get(TableNum(CustTable));
print(custTable.AccountNum);
}
pause;
}

sexta-feira, 3 de outubro de 2008

Rejeitar sessões do AOS.

Para evitar que os usuários se conectem no AOS, por exemplo em uma manutenção, vá até a tela 
Administração / Usuários Online.

Clique no botão Rejeitar novos Clientes.

E se você fez isso e saiu da sua sessão ? :-(

Atualize o campo [Status] para 1 na tabela SysServerSessions pelo SQL e acesse o AX normalmente.

Um Abraço!

terça-feira, 16 de setembro de 2008

Microsoft Brasil abre vagas para núcleo de desenvolvimento de software Dynamics em SP

A Microsoft Brasil amplia sua área de desenvolvimento local de software Dynamics, localizada em São Paulo, e contrata mais engenheiros de software.

Os pré-requisitos para concorrer às vagas incluem conhecimento em linguagem de programação orientada a objetos (C#, C++, .Net, Java) e criação de códigos; graduação em Ciências da Computação, Engenharia ou Tecnologia da Informação; excelente capacidade de comunicação; e inglês fluente. A experiência no desenvolvimento de aplicações de negócios pode ser uma vantagem no processo de seleção.

Os profissionais criarão novas funcionalidades das soluções de gestão empresarial e do relacionamento com o cliente, Dynamics ERP e Dynamics CRM, respectivamente.

O centro de desenvolvimento de software foi inaugurado em 2006 e agora, com as novas contratações, dobrará de tamanho. A divisão Microsoft Business Solutions, responsável pela linha de produtos Dynamics, é a que mais cresce em todo o mundo, sendo que registrou 140% de aumento no volume de negócios no último ano fiscal, encerrado em junho de 2008.

Para se candidatar, os interessados devem acessar: http://ms.peoplehr.com.br.

terça-feira, 29 de julho de 2008

Parâmetro Ultimo preço de custo - Form de Itens

Os diários de inventário utilizam o custo padrão quando o usuário faz um ajuste positivo (entende-se: entrada) no estoque.

Em muitos casos o custo padrão (Item\Aba Price/Discount\Grupo de campos Cost\Price) pode estar com o valor zero, fazendo com que o custo total deste ajuste positivo também seja zero, como consequencia, o custo médio no estoque pode sofrer uma séria distorção.

Para que o sistema atualize o custo automaticamente a cada entrada (produção/compra/diarios de estoque), basta marcar a opção 'Ultimo preço de custo'. O custo da ultima transação é atualizado nesse campo.

Exemplo, após a entrada de um ordem de produção de 100 pcs com valor total de $2500, o campo é atualizado com o valor $25

--- Editado ---
Na versão 2009, o valor utilizado é o custo médio (Item\On-Hand\Aba On-Hand\Cost price) ao invés do custo da transação.

Exemplo, o custo atual do inventário é de $1000 para 1 peça, após a entrada de um ordem de produção de 1 pc com valor total de $800, o campo é atualizado com o valor $900