Páginas

Cálculo de Fatorial

Olá,

Hoje o Francisco teve a brilhante idéia de reinventar a roda fazendo uma classe para calcular o Fatorial de um número.

Porém buscando no fantástico mundo do AX descobri que existe um método (factorial) na classe Global que faz exatamente o que ele precisa.

Abaixo um exemplo simples para quem não conhece como utilizar o método junto com a classe Dialog:
  1. static void factorial(Args _args)
  2. {
  3.     int         factorial;
  4.     Dialog      dialog;
  5.     DialogField dialogField;
  6.     ;

  7.     dialog = new Dialog("Cálculo de Fatorial");

  8.     dialogField = dialog.addField(typeId(Amount),"Digite o valor");
  9.     dialogField.value(factorial);

  10.     if(dialog.run())
  11.     {
  12.         factorial = dialogField.value();

  13.         info(strfmt("O fatorial é de %1 é: %2", factorial, num2str(Global::factorial(factorial),2,2,2,1)));
  14.     }
  15. }
[]'s
Alexssander

Criar um info ao iniciar o Dynamics AX

Para criarmos um infolog ao iniciarmos o AX basta alterar o método workspaceWindowCreated da classe Info.

Um exemplo, para obter o kernel:
  1. void workspaceWindowCreated(int _hWnd)
  2. {
  3.     // Put workspace window specific initialization here.
  4.     UserInfo userInfo;
  5.     str kernelVersion;
  6.     str applicationVersion;
  7.     str hotfixVersion;
  8.     ;
  9.  
  10.     kernelVersion = xInfo::releaseVersion() + '.' + this.getKernelBuildNo();
  11.     WinAPI::SetWindowText(_hWnd, strFmt("%1 - %2",WinAPI::getWindowText(_hWnd), xInfo::configuration()));
  12.  
  13.     ApplicationVersion = ApplicationVersion::buildNo();
  14.  
  15.     if(ApplicationVersion::GLSAppl()!='')
  16.     {
  17.         applicationVersion += ApplicationVersion::GLSAppl();
  18.     }
  19.     info(strfmt("%1 - %2 %3/ %4 %5", "Kernel", "Esperado:", "5.0.1500.1330", "Obtido:", kernelVersion));
  20.     info(strfmt("%1 - %2 %3/ %4 %5", "Application", "Esperado:", "5.0.1500.1313", "Obtido:", applicationVersion, hotfixVersion));
  21.  
  22.     select firstonly AutoLogOff
  23.         from userInfo
  24.             where userInfo.Id == curuserid();
  25.  
  26.     if (userInfo && userInfo.AutoLogOff)
  27.         this.setTimeOut(identifierstr(autologoff), userInfo.AutoLogOff*1000*60, true);
  28.  
  29.     this.setTimeOut(identifierstr(watchDog), #watchdogInterval, false);
  30. }

O resultado é o seguinte:
 
 
[]'s
Alexssander

Valores null para diversos tipos de dados

Para comparar tipos de dados com valores null:


O retorno dos dados é o seguinte:


[]'s
Alexssander

Gerar arquivo txt em formato ANSI ou Unicode?

Se você usar a classe TextIO você pode especificar uma página de códigos. O argumento codepage padrão corresponderá a arquivos que estão sendo escritas no formato Unicode.
Se você usar a classe AsciiIO você estará codificado em ACP (página de código ANSI).

file = new TextIO(_fileName, 'W');

file = new AsciiIO(_fileName, 'W');

[]'s
Alexssander

Preencher strings (direita e esquerda)

Frequentemente precisamos preencher alguma string com zeros a esquerda ou algo similar. Um lugar onde frequentemente vemos isto é quando vamos trabalhar com CNAB, onde devemos mandar X casas e só temos (X-5), ex.: Preciso mandar 000003, mas o número que tenho no AX é 3, e para isso, muitos (me incluo nestes) acabam reinventando a roda e fazendo loops para preencher e etc.

O uso é bem simples como podem ver abaixo:
  1. static void Job2(Args _args)
  2. {
  3.     int i = 1;
  4.     str formatedLeft, formatedRight;
  5.     str finalResultLeft, finalResultRight;
  6.     ;
  7.     formatedLeft = strRFix(int2str(i), 5, "0");
  8.     formatedRight = strLFix(int2str(i), 5, "0");
  9.     finalResultLeft = strFmt("NUM-%1", formatedLeft);
  10.     finalResultRight = strFmt("NUM-%1", formatedRight);
  11.     info(strFmt("%1 - %2", finalResultLeft, finalResultRight));
  12. }
[]'s
Alexssander

Como utilizar o Gravador de Tarefas (Task Recorder) no Dynamics AX

Muitas pessoas não conhecem, mas o AX possui uma ferramenta muito boa que é o Gravador de Tarefas (Task Recorder) e que pode ajudar muitos desenvolvedores e funcionais. Segue um tutorial de como utilizá-la.

Crie um documento word em branco e salvar.

Clique no item de menu Microsoft Dynamics AX -> Tools -> Task Recorder.


Clique no botão Start Recorder (vermelho) para iniciar a gravação.


Agora execute sua tarefa normalmente, como por exemplo um cadastro de Funcionário.


Após a execução, clique no botão Stop depois clique em Yes para salvar sua nova tarefa, nomeie sua tarefa e clique em Save.

Agora clique no botão Recorded Tasks, para exibir as tarefas salvas:


Selecione a tarefa que deseja gerar o documento e clique em Generate document e selecione o documento word que criamos para que ele seja gerado.


Depois clique em OK e o arquivo será gerado passo a passo com a tarefa que foi realizada.


O arquivo não fica 100%, pois se você faz algum passo errado ele também traz no documento, mas fazendo alguns ajustes no passo a passo vira uma documentação muito boa.

[]'s
Alexssander

Comparar um valor null utilizando a Classe SysQuery

Uma certa vez tive um problema ao tentar comparar um valor com null.
Para resolver utilizei a classe SysQuery da seguinte maneira:
  1. static void classFiscal(Args _args)
  2. {
  3.     InventTable inventTable;
  4.     str item;
  5.     ;
  6.     while select inventTable
  7.         where inventTable.TaxFiscalClassificationId == sysquery::valueEmptyString()
  8.     {
  9.         item = inventTable.ItemId + ' - ' + inventTable.TaxFiscalClassificationId;
  10.         info(item);
  11.     }
[]'s
Alexssander

Criar uma sequência numérica via X++

Há um tempo atrás precisei criar uma sequência numérica para ser impressa na geração de um arquivo .txt e para isso fiz o seguinte:

Criar uma seqüência numérica no caminho:

Básico > Configuração > Seqüências Numéricas > Seqüências Numéricas

Criei uma classe para a geração de arquivo .txt, no método que retorna os valores para a string inclui a chamada do método newGetNumFromCode que está na classe NumberSeq.
Para utilizar esse método passamos a sequência numérica que criamos no formulário de Seqüências Numéricas como argumento e ao gerar o arquivo ele retorna o próximo número da sequência.

str linha;
;
linha += strRFix(CompanyInfo::find().Name, 14, " "));
linha += NumberSeq::newGetNumFromCode('MinhaSeqNumerica').num();
linha + date2str(CompanyInfo::find().ConversionDate,123,2,0,2,0,2)
+ '\n';

[]'s
Alexssander

A diferença entre o AutoDesignSpecs para o Generated Design.

Quando você usa AutoDesignSpecs, o layout do relatório é gerado quando o relatório é executado. O seu conteúdo e o layout é baseado na consulta utilizado para o relatório.

No GeneratedDesign, o layout é ditado pela concepção da estrutura criada no Visual Report Designer e não por uma consulta ou modelo de relatório.

Um relatório que é criado usando a opção GeneratedDesignSpecs tem várias diferenças de uma criada usando AutoDesignSpecs.

• Uma diferença principal é que um design personalizado não é afetado pela estrutura da consulta subjacente. A concepção é definida pelo dono da obra e não gerado automaticamente.

• Outra diferença é que as alterações ao modelo de relatório padrão, se ela é usada, não afeta o desenho de um relatório usando a opção GeneratedDesignSpec.

[]'s
Alexssander

Bem vindos!

  1. static void Job1(Args _args)
  2. {
  3.     ;
  4.     info("Hello world!");
  5. }
Estou iniciando o blog a partir de hoje (ainda vou melhorar o layout e as informações) e espero expandir cada vez mais o conhecimento e poder compartilhar dúvidas, soluções sobre essa ótima ferramenta que é o Microsoft Dynamics AX e espero contar com a ajuda de todos também.

[]'s
Alexssander