terça-feira, 22 de dezembro de 2009

Apresentação de NF-e para o Ax 2009

Como prometi, aqui vai o link para a apresentação que fizemos ontem na Micrososft.
Fique ligado no blgo para mais informações sobre a NF-e no Ax 2009



Este conteúdo foi publicado "as is", podendo o produto final ser modificado indefinidamente e sem aviso prévio, sem garantias ou direitos.

segunda-feira, 21 de dezembro de 2009

Palestra na Microsoft

Boa noite pessoal,


Vimos ontem a palestra sobre NF-e e Livros Fiscais do Rodrigo Matiazo e Fábio Vázquez respectivamente.

Aliás, parabéns para os dois - ótimas palestras! =)

Enquanto o Matiazo vai passar mais informações sobre NF-e aqui, gostaria de destacar, de uma maneira concisa, alguns pontos da apresentação do Fábio Vazquez sobre Integração com Livros Fiscais.

São eles:
  • Manutenção do Database de integração: Será possível criar/atualizar o database por completo (lembrando que há uma pequena configuração de permissão no db) e limpar as tabelas temporárias do database de integração.
  • Controle de versão: Teremos disponível informações contendo versão atual da integração por parte do AX (major.minor version) e versão do banco de integração (major.minor version). As versões devem ser IGUAIS, uma vez que o job de exportação as valida, caso contrário não haverá integração.
  • Manutenção das empresas: Será possível manutenir as empresas realizando o de/para (dataarea do AX para empresa/estabelecimento) através do AX, ou seja, não teremos mais intervenção técnica.
Impacto das melhorias
  • Facilita o setup/manutenção de novos ambientes uma vez que teremos mais controle sobre a integração.
  • Eliminam certos problemas de integração uma vez que alguns processos eram manuais (ex.: de/para de empresas errado, versão do banco errada, etc.)
O Fábio Vazquez já disponibilizou em seu blog o ppt apresentado.

Até a próxima.

Este conteúdo foi publicado "as is", podendo o produto final ser modificado indefinidamente e sem aviso prévio, sem garantias ou direitos.

quinta-feira, 10 de dezembro de 2009

Palestra AX 2009 – Nota Fiscal Eletrônica

Vamos realizar uma palestra para apresentar a Nota Fiscal Eletrônica para o AX 2009 –, será realizada no dia 21 de dezembro, das 14:00 às 18:00, na Microsoft São Paulo.

A palestra tem o intuito de demonstrar as funcionalidades adicionadas a localização brasileira para emissão da NF-e diretamente com o SEFAZ.  Serão apresentados os pré-requisitos, a configuração, as validações que são feitas para o envio, o cancelamento e inutilização da NF-e, a emissão da NF-e em modo de contigência e a impressão da DANFE.  Além disso, serão listadas as mudanças na integraçào com os Livros Fiscais

O conteúdo da palestra é técnico, portanto também serão apresentados os modelos relacional e objetos relacionados à funcionalidade.

Data: 21 de dezembro de 2009
Hora: das 14:00 às 18:00
Local: Microsoft São Paulo 31º andar – Av. Nações Unidas, 12901, Torre Norte – Brooklin – São Paulo/SP


Palestrantes:
Rodrigo Matiazo
Desenvolvedor de aplicações de negócios e ERPs desde 2001, trabalha com Dynamics AX desde 2003, participando do projeto de localização do sistema para o Brasil e também de várias implementações locais e internacionais. Ingressou na Microsoft em 2008, como System Development Engeneer do Global Financial Management Team, trabalhando no release do AX 2009 para o Brasil.


Fábio Vazquez
Trabalha com desenvolvimento, implantação e consultoria em aplicações empresariais desde 1995, especialmente com soluções de ERP, Orçamento Empresarial e BI. Autor de 2 livros e diversos artigos sobre desenvolvimento e engenharia de software em publicações nacionais e internacionais. Durante 5 anos consecutivos foi Microsoft MVP (Most Valuable Professional) em Visual FoxPro e C#. Atualmente, é Software Development Engineer no Dynamics AX Global Financial Team.


Inscrições: Para inscrições e maiores informações, envie um e-mail para mbs@microsoft.com.br


Powered by Qumana

quinta-feira, 26 de novembro de 2009

WCF Configuration Editor tool

Como comentei antes, a integração da NF-e do Ax com o SEFAZ usa o service reference do AIF que por sua um WFC client pra se conectar aos web services do SEFAZ.


Como os webservices usam https é necessario configurar o client para que utilize o certificado de segurança também na conexão (ele também é usado para assinar a nf-e).


Caso vocês não queiram editar XML na mão, é necessario instalar o SDK do .NET 3.5 para poder configurar os services references utilizando a ferramenta de configuração do client WCF.


Aqui vai o link do MSDN com a documentção do configuration editor tool.


Em breve volto com mais informações sobre a integração da NF-e do Ax diretamente com o SEFAZ.


[]s


Powered by Qumana

terça-feira, 17 de novembro de 2009

Dax DataModel

Modelo de dados bem detalhado do AX4.0.

Explica o que são os campos, relacionamentos e o mais legal, que ele faz isso por processo.

Referência obrigatória.

O post é bem velhinho, porém só vi agora e vivi até hoje sem esse documento...
Não sei como...

sábado, 24 de outubro de 2009

Treinamento para desenvolvedores.


Oi pessoal, tudo certo?

Hoje estive em mais uma reunião do grupo dotnetarchitects e dessa vez o assunto foi Coding dojo.
Sabemos que o treino leva a perfeição. Então aqui vai a pergunta.

Você treina suas habilidades como desenvolvedor?

Se a resposta é não então esta na hora de conhecer o Coding Dojo.

O que é? 
O Dojo é um espaço onde programadores se reúnem para treinar e aprender, com reuniões periódicas focadas em um desafio de programação.

Como funciona?
Durante a reunião todos podem colaborar para resolver o desafio proposto, mas a idéia é aprender com as experiências e não terminar o problema.

Como pode me ajudar?
Alem do treinamento o Conding Dojo usa uma abordagem com TDD e princípios de programação ágil como XP.Algumas empresas já utilizam o Coding Dojo para evoluir e entrosar seu time de desenvolvedores.

Meu objetivo não é dar uma visão completa sobre o assunto, para quem se interessou pelo assunto:
http://www.youtube.com/watch?v=E-jFKkaAc7k  (Palestra na Locaweb)
http://www.dtsato.com/blog/2007/08/27/dojo-treino-para-programadores/ (Programadores não treinam)
http://www.dtsato.com/blog/2007/10/21/dojosp-screencast-01/  (Screencast)
http://www.dojosp.org/ (Coding Dojo@SP)



Por enquanto é só! Até o próximo post!

terça-feira, 20 de outubro de 2009

WCF, Certificado Digital e Nf-e

Estou trabalhando na implementação da Nf-e para o Ax 2009 nos últimos tempos, por isso ando afastado do blog.

Gostaria de compartilhar algumas informações que serão necessárias para que a comunicação aconteça de forma correta entre o Ax e os web services do governo.

O Ax utiliza um WCF client para se conectar com os web services. Para configura-lo é necessário ter o .Net Framework 3.5 SDK instalado na máquina.

O WCF precisa ser configurado de maneira a utilizar o certificado digital instalado no momento que esta se conectando ao web service do SEFAZ através de https.

O Ax executa o batch que se comunica com o SEFAZ utilizando as credenciais do usuário do serviço que executa o AOS. Para que o Ax consiga acessar o certificado digital, ele deve ser instalado no repositório LocalMachine.

Para assinar o XML é necessario que o usuário que executa o serviço do Ax tenha acesso a chave privada do certificado.

Tanto a instalação como acesso a chave privada podem ser feitas através do console Certificates.

Mais informações em breve!

Este conteúdo foi publicado "as is", podendo o produto final ser modificado indefinidamente e sem aviso prévio, sem garantias ou direitos.

terça-feira, 8 de setembro de 2009

Ponteiros no Dynamics AX

Ola pessoal, Depois de apanhar um pouquinho para conseguir utilizar uma API para impressora fiscal BEMATECH, descobri pesquisando no próprio AX (Classe WinAPI) que é possível utilizar ponteiros para pegar o valor de uma variável passada por referencia. No Ax 2009 já existe o KeyWord byRef postado no Blog Dynamics AX

Segue o exemplo simplório a baixo:

static void Ponteiro_DynamicsAX(Args _args)
{
#define.TamanhoPonteiro(255)
str StringTeste;
binary Ponteiro = new Binary(#TamanhoPonteiro);
boolean funcPonteiro(Binary _ReturnPointer)
{
_ReturnPointer.string(0,'TESTE');
return true;
}
;
if (funcPonteiro(Ponteiro))
{
StringTeste = Ponteiro.string(0);
}
INFO(StringTeste);
}

terça-feira, 1 de setembro de 2009

Tratamento de Exceção

Olá a todos,

No X++, a exemplo de outras linguagens, também utiliza blocos try e catch para tratar exceções, ou seja, para tratar uma situação que normalmente não ocorre e representa algo de estranho ou inesperado no sistema.
Por default o Ax traz a enum Exception com os tipos fixos de exceção que poderiam ocorrer. Mas ela pode ser considerada insuficiente para determinados casos ou determinadas customizações.


Por isso observe o código abaixo e tente visualizar o que eh exibido no final de sua execução.


public static void ErrorTest(Args _args)
{;
Try
{
throw SalesPurch_BR::Purch;
info("Sem exception");
}
catch(Salespurch_BR::Sales)
{
info(enum2value(SalesPurch_BR::Sales));
}
catch(Salespurch_BR::Purch)
{
info(enum2value(SalesPurch_BR::Purch));
}
}


No infolog aparece a mensagem Compra. Com isso em mente podemos expandir o exemplo para algo mais representativo, algo que atenda as necessidades de nossas customizações.

Por exemplo:

Public void open(FileName _fileName)
{
container openRecord;
;
Try{
file = CustVendOutPaym::newFile(_filename, 'w', 'CommaIO');

if (!file || file.status() != IO_Status::Ok)
{
throw IOException::FileOpenException;
}
openRecord = conins(openRecord,1,'Open Statement');
}
catch(IOException::FileOpenException)
{
error(strfmt("@SYS75767",_filename));
}
}

Onde IOException é um novo Enum Type e FileOpenException é um de seus Elements. Lembrando que o bloco catch poderia muito bem estar em um escopo superior.

Para dar continuidade a este desenvolvimento de exceções, também se poderia criar classes especialistas para cuidar da exception, assim como a classe Error que está na AOT. Dessa forma teríamos uma classe IOException com um método FileOpenException que se responsabilizará por finalizar o processamento de forma segura para a aplicação.


segunda-feira, 17 de agosto de 2009

Artigo sobre integração contínua

Ótimo artigo para começar a melhorar seu processo de desenvolvimento!

http://martinfowler.com/articles/continuousIntegration.html

quarta-feira, 12 de agosto de 2009

Drag a class, drop it into any menu item type and create a menu item!

Vivendo e aprendendo!

No Ax 2009, crie uma classe que implemente o método Main.

Arraste a essa classe para qualquer um dos 3 tipos de Menu Items e voilà, nada nesta manga, nada nesta manga: um novo menu item é criado com mesmo nome e configurado para executar sua nova classe!

Não sei quando foi implementado mas vou testar no mínimo na 4.0.

terça-feira, 28 de julho de 2009

Tech Ed Brasil - Sessões de Ax

Teremos um track somente sobre Dynamics no TechEd Brasil, maior evento técnico do Brasil. Informações sobre inscrição e agenda completa no site do TechEd

2 sessões de Ax:
25/08/2009 15:00 - 16:15 - Microsoft Dynamics AX 2009 – Arquitetura técnica, Cenários de instalação e Gerenciamento. Carlos Shimoda

27/08/2009 10:30 - 11:45 - Utilizando o Windows Workflow Foundation para automatizar processos de negócio no Microsoft Dynamics AX 2009. Rodrigo Matiazo.

Eu devo apresentar como desenvolver um template de workflow no Ax, assim como conceitos sobre a arquitetura e integração com o Windows Workflow Foundation.

2 sessões de CRM:
26/08/2009 08:45 - 10:00 - Turbinando o Microsoft Dynamics CRM 4.0 com soluções Open Source: Aceleradores, BI e Mobilidade. Fabio Fritoli

26/08/2009 13:15 - 14:30 - Microsoft Dynamics CRM 4.0 – Infra-Estrutura, Implantação e Funcionalidades. Rodrigo Lugarinho


Indico outras 3 sessões não relacionadas ao Ax mas apresentadas por meu amigos desenvolvedores do time de Ax da Microsoft:

27/08/2009 08:45 - 10:00 - Automatizando seu build com Team System. Eduardo Miranda e Fabio Vazquez

26/08/2009 13:15 - 14:30 - Unit Testing – boas práticas e patterns. Fábio Vazquez e Cezar Guimaraes

27/08/2009 13:15 - 14:30 - Contruindo uma aplicação com Silverlight 3. Cezar Guimarães e Eduardo Miranda

sexta-feira, 3 de julho de 2009

Novidades da localizaçao do Dynamics Ax2009 - Project Accounting

Localizamos o módulo de Project Accounting para o Brasil, agora é possivel registrar notas fiscais de projetos utilizando os impostos brasileiros!

O Project Accounting permite que o controle da contabilidade de projetos, registro de horas e materiais consumidos nos projetos além de acompanhar o desempenho financeiro financeiramente as receitas e custos de projetos de preço fixo, time and material, além do acompanhamento dos custos de projetos internos da empresa.

O módulo é extenso e tem funcionalidades complexas para o acompanhamento financeiro de diversos tipos de projeto, não pretendo aqui mostrar com é funcionamento dessas funcionalidades e sim comentar um pouco de algumas funcionalidades importantes que foram localizadas para permitir o faturamento de projetos no Brasil.

O cálculo de impostos é aplicado no momento do faturamento nas transações de projetos, como:

1. Horas postadas em diários de horas
2. Produtos consumidos em diários de estoque
3. Custos do projeto apontados em diários de custo da contabilidade
4. Transações 'On Account', que são faturamentos antecipados ou parcelas fixas

Ainda necessário para o faturamento foi inclúido o códigos de serviço na Categoria de Projeto, isso permite que o tipo de serviço prestado possa ser definido na estrutura que define extamente a natureza das receitas e despesas do projeto. O grupo de impostos de item também é definido na categoria de projeto.

Funcionalidade de quebra de nota fiscal por código de serviço foi adicionada quando se cria a proposta de faturamento, essa funcionalidade permite que a proposta seja quebrada por código de serviço, possibilitando que cada nota fiscal somente tenha um código de serviço. O CFOP também é utilizados nessa quebra, de forma que CFOPs de venda para o mesmo estado não sejam faturados juntamnete com CFOPs de venda para outro estado.

Outra funcionalidade bem interessante é a que agrupa todas as transações faturadas por categoria de projeto, por empregado ou sem agrupamento, além do código de serviço quando a opção de quebra por código de serviço for utilizada.
Essa funcionalidade permite uma adminsitração da granularidade maior ou menor das linhas da nota fiscal.

THIS POST IS PROVIDED AS-IS; AND CONFERS NO RIGHTS.

segunda-feira, 29 de junho de 2009

Oportunidades para trabalhar com Microsoft Dynamics AX no Brasil

Olá!


Existem algumas oportunidades de carreira para desenvolvimento com Microsoft Dynamics AX em consultoria na grande São Paulo.

Um resumo dos pré-requisitos são:
Conhecimentos em plataforma .Net/C#, programação orientada a objetos, raciocínio lógico.
Diferenciais técnicos: SQL, X++, MorphX/Intellimorph.
Caso haja interesse em participar do processo de seleção, entre em contato.

Vencido pelo twitter

http://twitter.com/rmatiazo

domingo, 28 de junho de 2009

Dúvidas de como configurar workflow no Ax 2009?

Me valendo do ditado de que a sua dúvida pode ser a dúvida de muitos ai vai:

Como eu configuro?
Setting up and maintaining Workflow

Quais Workflows o Ax ja tem pré definidos?
Workflow templates

Pensando em colocar workflow em novos desenvolvimentos?
Implementing Workflow for Microsoft Dynamics AX


Erro: Stopped (error): Calendar token must be set?
Antes de criar qualquer Workflow configuration tenha CERTEZA que pelo menos um calendário esta corretamente configurado em Basic>Calendar, verifique que se os calendários tem Working Times corretamente configurados.

Requisição de compra?
- Accounts Payable>Setup>Workflow configurations
Crie uma nova configuração e utilize o template Purchase requisition approval
Não esqueçe de adicionar:

  • Submission instructions para o workflow (basta clicar em create instruction e utilizar alguma mensagem padrão
  • Work Item Subject e Instuctions devem ser preenchidos para cada elemento
Integração do RFQ (Request for Quote) com Requisição de compra?
Somente é possivel gerar um request for quote antes da requisição estiver aprovada e completa.

Debug? - Existem classes que eu não consigo debugar ainda, quando tiver uma resposta eu posto aqui.
- No AOT, abra a macro Workflow
- Procure pela macro WorkflowRunAsDebug e troque de false para true
- Procure a classe SysWorkflowHelper e recompile (necessário para atualizar o valor da macro)
- Vá em Basic>Inquire>Batch Job e apague as entradas para o workflow
- No AOT, abra o form Tutorial_WorkflowProcessor, esse form processa o workflow sem ser por batch
- Abra o debugger manualmente antes de processar (Tools > Development Tools > Debugger)

terça-feira, 23 de junho de 2009

Podcasts e Webcasts

Microsoft Dynamics AX 2009 AIF Web Services Screencast
Um webcast bem didadico sobre AIF e com passos basicos para criar e consumir um webservice usando o AIF, vale conferir.

Working Effectively with Legacy Code with Michael Feathers
Scott's in Norway this week and he sits down with Michael Feathers. Michael is the author of "Working Effectively with Legacy Code." What is legacy code? Are you writing legacy code right now?

Podcast do Scott Hanselman, program manager da divisão de desenvolvimento da Microsoft com o autor do livro "Working Effectively with Legacy Code", excelente livro que demontra técnicas muito práticas de como criar testes unitários para código não testado aplicando métodos que tem o objetivo de diminuir a dependencia do entre classes, melhorando a testabilidade e o design da solução. Tem sido meu livro de referência ultimamente.

segunda-feira, 22 de junho de 2009

Paralelo: Desenvolvimento ERP x SCRUM

Saudações!

Após muito tempo sem postar, resolvi retomar a participação colaborativa na crescente comunidade Dynamics Brasil.

Durante esse tempo, tive algumas experiências legais participando da gestão de projetos de desenvolvimento Dynamics AX.

Isso me levou a refletir sobre metodologias ágeis aplicadas ao cenário ERP, baseado em situações e problemas recorrentes encontrados nas maneiras tradicionais de desenvolvimento e entrega, tais como falhas de comunicação, divergências entre expectativa do cliente e produto final, etc.

As características do desenvolvimento ERP diferem um tanto com relação ao desenvolvimento “from scratch”, pois sua dinâmica consiste muito mais na modificação do produto existente, do que na concepção de algo totalmente novo.

Antes de entrar nas características do SCRUM, é importante citar algumas diferenças que existem entre o mundo ERP e o mundo do desenvolvimento de software tradicional.

Para desenvolvimento ERP, normalmente existe uma figura diferente das existentes no mundo de desenvolvimento tradicional, que é o Consultor Funcional, ou Analista de Negócio.

A figura do consultor funcional é muito importante para refinar o desenho da solução, pois ele age como a engrenagem entre o usuário final e o desenvolvedor, trabalhando as questões políticas e expectativas do cliente com relação ao produto, e deixando o desenvolvedor focado na qualidade da solução e a ser entregue. Assim, o desenvolvimento pode ser abordado com base nos processos de negócio e sua integração com as funcionalidades já existentes dentro do sistema.

Voltando ao tópico principal, sobre utilização da metodolgia scrum no cenário ERP, podemos fazer a aplicação com alguns diferenciais sutis, como descreverei abaixo.

Em tempo, é importante ressaltar que não irei descrever todos os elementos da metodologia nesse post, pois existem excelentes referências na internet com o conteúdo bem abrangente e detalhado sobre SCRUM, portanto, decidi me concentrar em alguns pontos-chave que teriam alguma peculiaridade entre o desenvolvimento tradicional e o aplicado às customizações/processos de negócio.

Ferramentas e elementos

Scrum Team
É composto pelos elementos abaixo, atribuindo-se aos seguintes papéis:

Scrum Master: Este papel pode ser atribuído ao gerente técnico, que é o responsável pela manutenção da metodologia dentro da equipe.

Product Owner: Normalmente, é o responsável pela manutenção do Product Backlog.
Para desenvolvimento de customizações de ERPs, esse papel pode ser atribuído ao gerente de desenvolvimento, em par com o gerente de projetos, para que o time concentre as respostas relativas às entregas em uma única pessoa, facilitando a gestão da comunicação entre as partes.

Team: São as pessoas responsaveis pela concepção e desenvolvimento da solução.
No mundo ERP: Consultores funcionais ou Analistas de Negócio, em conjunto com os consultores técnicos ou desenvolvedores.


Product Backlog
Em poucas palavras, o product backlog consiste em uma lista contendo todos os requisitos levantados, descritos e priorizados em nível um nível mais abrangente.
Quando falamos no desenvolvimento em sistemas ERP, pouca coisa é desenvolvida integralmente, sendo a maioria do trabalho baseado na customização das funcionalidades existentes.

Nesse caso, o Product Backlog pode ser uma lista de todos os processos não aderentes no core do ERP, previamente mapeados pela equipe funcional em campo, e, sempre que possível dividindo as atividades por processos de negócios, com controle de status de “atendidos” ou “não atendidos”.

Sprint backlog

A dinâmica do scrum é dividida em sprints periódicos (normalmente semanais), onde as entregas do período são extraídas do Product Backlog de acordo com sua prioridade.

Em resumo, é uma condensação dos objetivos estabelecidos no product backlog, para entrega definida em um espaço reduzido de tempo.
De maneira análoga ao conceito do Product Backlog, o sprint backlog eventualmente pode ser definido por processo de negócio.

Impediments
São fatores que impedem a equipe de continuar determinada tarefa como por falta de recursos técnicos, infra-estrutura, definições de regras de negócio etc.

É muito importante que o Scrum Master e o gerente do projeto se unam e sejam facilitadores ativos entre o Scrum Team e o cliente final na gestão dos impedimentos, e provisão das respectivas soluções.
O Consultor Funcional também exerce um papel importante ao atuar junto do usuário final com o objetivo de extrair as respostas rápidas às eventuais dúvidas que surgirão ao longo do processo de desenvolvimento da solução.

Os outros elementos podem ser aplicados tais como concebidos na definição geral de SCRUM, como as medidas através dos “Burn Down Charts”, bem como a dinâmica dos Meetings.

Por fim, os objetivos principais são os mesmos de todas as metodologias ágeis, ou seja, através da aplicação de uma metodologia menos burocrática, promover maior integração e transparência entre o time e o cliente-final, evitando retrabalho ocasionado por ruídos de comunicação, através das entregas segmentadas em menores espaços de tempo, e todos os elementos que facilitam de maneira ampla o trabalho da equipe, atendendo plenamente às expectativas do cliente final.

domingo, 31 de maio de 2009

Single Record Cache

Quando estamos desenvolvendo é bom ter em mente o impacto do código que estamos escrevendo em termos de performance do banco de dados. A infraestrura de acesso a dados do Ax permite que o AOS faça o caching de registros pesquisados no banco de dados, diminuindo assim as idas e voltas no banco de dados.


Independente da opção de cache o AOS somente faz o cache do registro quando o select utiliza TODAS as chaves presentes na primary index da tabela e somente se o operador == for utilizado em todas elas, pois o AOS faz o cache de um registro por vez, isto significa que >, <, != não tem efeito nenhum sobre o cache.


Toda vez que o modificador forUpdate é utilizado, caso não tenha sido utilizado previamente na mesma transação, o AOS atualiza o cache.


Como o Ax trabalha com o cache depende da propriedade da tabela chamada CacheLookup. As seguintes opções estão definidas:
1. None - sem cache
2. Found
3. FoundAndEmpty
4. NotInTTS
5. EntireTable


Utilizando Found and FoundAndEmpty o cache é preservado depois do uso do ttsBegin, ttsCommit e ttsAbort.


A opção FoundAndEmpty contém mais um detalhe, caso um select não devolva nenhum resultado, isto é, o registro com aquela PK não existe no banco, aquela PK é marcada como cacheada todos os selects subsequentes são "lidos" do cache e o cache é atualizado somente quando forUpdate seja chamado.


Utilizando NotInTTS o cache é atualizado no primeiro select após o ttsBegin.


A opção EntireTable somente deve ser utilizada para tabelas que não são atualizadas com frequência, como tabelas de parametros, grupos, etc, pois o AOS faz um cache completo da tabela quando a tabela for lida pela primeira vez, o AOS então cacheia a tabela toda do servidor, quando um client le a tabela cacheada no AOS ele envia a linha cacheada para o client sem ir ao banco de dados.


O AOS faz um flush do cache toda vez que um update, delete ou insert é feito na tabela, ela volta a ser toda cacheada na próxima vez que for lida.


O join entre tabelas com esse tipo de cache com tabelas que não tem o tipo de cache EntireTable sempre força o AOS a atualizar o cache não importa o momento do select.

Procurem sempre utilizar os métodos Find e Exists das tabelas pois eles sempre são escritos utilziando a PK da tabelas e garantem o uso do cache para aquela tabela.

Utilizando essas poucas regras e tendo elas em mente quando estão desenvolvendo para seus clientes, sempre tentem verificar se o modo que estão acessando o banco de dados pode ou não afetar a performance geral da fucnionalidade que estão desenvolvendo.

Até a próxima.

segunda-feira, 4 de maio de 2009

AX6 sneak preview - SQL AOD

Preview de uma das grandes mudanças na proxima versão SQL AOD

THIS POST IS PROVIDED AS-IS; AND CONFERS NO RIGHTS.

terça-feira, 14 de abril de 2009

test post

algum problema com o feed burner

segunda-feira, 13 de abril de 2009

Testes unitários e integração continua

Normalmente não escrevo sobre temas totalmente fora do mundo Ax, porém hoje eu gostaria de comentar sobre um tema que não esta ligado diretamente ao Ax e sim ao desenvolvimento de software em geral, um tema que tenho dado bastante atenção nos últimos tempos.

Hoje em dia existe uma série de boas praticas de desenvolvimento sendo aplicadas mundo afora que também poderiam ser aplicadas no desenvolvimento de customizações para o Ax, uma destas boas praticas esta no desenvolvimento de testes unitários.

A criação de teste unitário tem um papel importante no desenvolvimento centrado em testes (TDD), ele não substitui o teste integrado ou teste funcional mas é importante em todas as fases de desenvolvimento forçando o desenvolvedor a escrever métodos de uma maneira mais testável, mais simples, da mais confiança quando é necessário adicionar novas funcionalidades, previne regressão do código, isto é, o que estava funcionando, deve continuar a funcionar após uma modificação.

Existem toneladas de informação sobre unit tests na internet e eu encorajo todos os desenvolvedores a introduzirem o uso de unit teste no desenvolvimento de suas customizações.

Gostaria indicar 2 screencasts e 1 artigo, mesmo que básicos:
Dynamics AX 4.0 - Unit testing - Introduces the Unit Test Framework in Dynamics AX 4.0. – mostra como criar unit tests no Ax para testar seu código.

Continuous Integration por Martin Fowler – bom artigo para iniciar em integração continua

Continuous Integration and Better Unit Testing – visão geral sobre integração continua e a maneira que os testes unitários podem ser integrados ao processo de build, não é ligado ao Ax, mas da uma boa idéia de como se criar algo semelhante com o Ax (alguém se habilita?)

segunda-feira, 23 de março de 2009

Dica de performance

Uma dica legal de performance é, desabilitar a chave de configuração “Manter objetos atualizados” (SysDeletedObjects40).

Essa chave controla se objetos obsoletos da aplicação são deletados ou não. Objetos obsoletos possuem o prefixo “DEL_”, e são automaticamente deletados na próxima versão do AX, ou seja, quando você atualizou para o Microsoft Dynamics AX versão 4.0, todos os itens com a Chave de Configuração SysDeltedObjects30 foram excluídos e os objetos controlados por SysDeletedObjects40 serão excluídos quando você desabilitar essa chave ou atualizar com a próxima versão do Microsoft Dynamics AX.

Esses objetos são necessários, portanto, apenas para importar e atualizar dados de antigas versões do Microsoft Dynamics AX. De modo geral, eles desperdiçam espaço e diminuem a performance - alguns destes registros estão relacionados a tabelas com grande volume de transações (como a TaxTrans por exemplo) – e podem ser removidos.


A chave de configuração pode ser ajustada na seguinte localização:
Administração > Configuração > Sistema > Configuração.

quinta-feira, 12 de fevereiro de 2009

Mais upgrade!

Com o lançamento do Ax 2009 no Brasil muitos desenvolvedores terão que trabalhar no upgrade das customizações feitas para seus clientes no Ax 4.0 para a 5.0. Deixo aqui a dica para verem o ultimo post no blog Palle Agermark on AX, principlamente se vocês planejam mudar aquele desenvolvimento feito para o cliente x na camada cus para a camada var, por exemplo, para reutilizar em outros clientes.



Abs

segunda-feira, 2 de fevereiro de 2009

Smart customizations pt. 2

Toda implantação de um ERP exige algum nivel de customização para o cliente: seja um novo processo um modificação de um processo existente ou um novo relatório, os desenvolvedores devem seguir alguns principios no desenvolimento de suas customizações para fazer isso de uma maneira mais eficaz, tanto na manutenção, quanto no upgrade, aqui vão algumas dicas:


  1. Mantanha a lógica do negócio e logica de interface separados - isto significa: não escreva lógica relacionada a funcionalidade que esta criando em forms, utilizar o máximo possível classes.

  2. Quando for utilizar tabelas, trabalhe com um registro por vez em table instance methods (custInvoiceJour.initFromSalesTable por exemplo), enquanto table static methods devem cuidar de um grupo de registros.

  3. Sempre tente utilizar field groups nos formulários. eles são automaticamente atualizados nos formulários quando um novo campo é inserido.

  4. Classes: lógicas que envolvam diferentes tabelas como processos de atualização (faturamento ou um cálculo de comissão) devem estar escritos em classes. Tente utilizar o princípio de "Single Responsibility (SRP)" em suas classes, esse principio diz que uma classe deve ser implementada tendo apenas um único e exclusivo objetivo, portanto não faça das suas novas classes um canivete suiço.
  5. Evite overlaying em suas classes e tabelas: caso você modifique um método que ja exista em uma camada abaixo da que esta trabalhando e depois acabe desistindo dessa modificação não esqueça de remover a modificação da camada que esta trabalhando, caso o método permaneça em uma camada acima mesmo sem nenhuma alteração, caso ele seja alterado em sua camada original, seja por uma nova versão ou fix, o Ax não vai executar essa nova alteração. O overlaying também pode acontecer quando se imposta um XPO, portanto, verifique sempre se os metodos alterados realmente contém alterações!

Um bom lugar para iniciar o estudo sobre desenvolvimento no Ax é a página do MSDN do Dynamics Ax, ele é aberto ao publico e e tem informações que vão desde a arquitetura do Ax, cutomizações basicas e desenvolvimento em X++.

Vale a pena dar uma revisada no meu post sobre upgrade.

Até a próxima.

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