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.