Arquivo

Textos com Etiquetas ‘ax class’

AxClass (Parte 2)

27, janeiro, 2010 Sem comentários

Fala pessoal,

Continuando o post anterior, vamos fazer um exemplo prático de utilização da AxClass.
Vamos lá…

Primeiramente crie uma tabela com a seguinte estrutura:
Exemplo AxClass

Após ter criado a tabela, vamos criar a AxClass que irá manipular os dados desta tabela.
O nome da class será AxTimesFutebol (de acordo com a nomenclatura), e a mesma extende a AxInternalBase que é o base deste Framework.

Antes de continuar preciso citar os métodos que são necessários para que o framework seja implementado corretamente.
Alguns são extendidos da AxInternalBase e outros serão criados por você!

Os métodos são:

  • currentRecord() (Extendido da AxInternalBase) – Pega e recebe o registro atual da Ax[Tabela].
  • emptyRecord() (Extendido da AxInternalBase) – Retorna um registro em branco para a tabela que a Ax[Tabela] se refere.
  • setField() (Extendido da AxInternalBase) – Atribui um valor para um campo na currentRecord() que é atribuído à Ax[Tabela].
  • Os métodos parm referente a cada campo de sua tabela (por ele que que você insere os dados)
  • E uma método que será seu tableBuffer dentro do framework

Vamos começar:

1
2
3
4
5
6
//Inicio <DynamicsAXBR>
class AxTimesFutebol extends AxInternalBase
{
    TimesFutebol        timesFutebol;
}
//Fim <DynamicsAXBR>
1
2
3
4
5
6
7
8
9
10
11
//Inicio <DynamicsAXBR>
public TimesFutebol currentRecord(TimesFutebol _timesFutebol = timesFutebol)
{
    if (!prmisdefault(_timesFutebol))
    {
        currentRecordIsSet = true;
    }
 
    return _timesFutebol;
}
//Fim <DynamicsAXBR>
1
2
3
4
5
6
7
8
9
//Inicio <DynamicsAXBR>
protected TimesFutebol emptyRecord()
{
    TimesFutebol localTimesFutebol;
    ;
 
    return localTimesFutebol;
}
//Fim <DynamicsAXBR>
1
2
3
4
5
6
7
8
9
10
11
//Inicio <DynamicsAXBR>
public AddressCity parmCidade(AddressCity _cidade = '')
{
    if (!prmisdefault(_cidade))
    {
        this.setField(fieldnum(TimesFutebol, Cidade), _cidade);
    }
 
    return timesFutebol.Cidade;
}
//Fim <DynamicsAXBR>
1
2
3
4
5
6
7
8
9
10
11
//Inicio <DynamicsAXBR>
public AddressStateId parmEstado(AddressStateId _estado = '')
{
    if (!prmisdefault(_estado))
    {
        this.setField(fieldnum(TimesFutebol, Estado), _estado);
    }
 
    return timesFutebol.Estado;
}
//Fim <DynamicsAXBR>
1
2
3
4
5
6
7
8
9
10
11
//Inicio <DynamicsAXBR>
public Name parmNome(Name _nome = '')
{
    if (!prmisdefault(_nome))
    {
        this.setField(fieldnum(TimesFutebol, Nome), _nome);
    }
 
    return timesFutebol.Nome;
}
//Fim <DynamicsAXBR>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Inicio <DynamicsAXBR>
protected void setField(fieldId _fieldId, anytype _anytype)
{
    timesFutebol    currentRecord = this.currentRecord();
    ;
 
    if (fieldTouched.exists(_fieldId))
    {
        if (this.inputStatus() == InternalExternal::Internal && fieldTouched.lookup(_fieldId) == InternalExternal::External)
        {
            return ;
        }
    }
 
    currentRecord.(_fieldId) = _anyType;
    this.setFieldAsTouched(_fieldId);
}
//Fim <DynamicsAXBR>
1
2
3
4
5
6
7
8
9
10
11
//Inicio <DynamicsAXBR>
public TimesFutebol timesFutebol(TimesFutebol _timesFutebol = timesFutebol)
{
    if (!prmisdefault(_timesFutebol))
    {
        currentRecordIsSet = true;
    }
 
    return _timesFutebol;
}
//Fim <DynamicsAXBR>



Após ter criado a classe com os métodos acima, vamos criar um Job para testar as funcionalidades da AxClass:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Inicio <DynamicsAXBR>
static void jobAxTimesFutebol(Args _args)
{
    AxTimesFutebol  axTimesFutebol = new AxTimesFutebol();
    ;
    //Primeiro pegamos todos os valores utilizando os parms da classe criada;
    axTimesFutebol.parmNome("Internacional");
    axTimesFutebol.parmEstado("RS");
    axTimesFutebol.parmCidade("Porto Alegre");
 
    //Caso tenha validação ele valida os campos;
    axTimesFutebol.validateInput(true);
    //Salva o registro na tabela;
    axTimesFutebol.save();
}
//Fim <DynamicsAXBR>

Bom pessoal espero tenham gostado. E caso tenha restado alguma dúvida COMENTEM sua dúvida que terei o prazer em responder.

Mais informações sobre a classe AxInternalBase no msdn

Abrs,
Peterson Ferreira

Categories: X++ Tags: ,

AxClass (Parte 1)

21, janeiro, 2010 Sem comentários

Eai pessoal,
Hoje vou falar sobre uma “API” do ax, que serve como uma interface em forma de objetos para as tabelas, que se chama AxClass.
A abordagem nesse post será um mais conceitual, para entendermos sobre os objetivos e características da AxClass, e no próximo post teremos um exemplo prático do uso dessa “API”.

Cada tabela pode ter a sua AxClass, que gerencia os dados e encapsulam as regras de negócio.
Já existe no Dynamics Ax uma nomenclatura para esses objetos, que funcionam da seguinte maneira: Ax[Tabela].
A principal função da AxClass é possuir qualquer regra de negócio que esteja vinculada com a alteração dados ligada com a tabela, e possui as seguintes funcionalidades:

  • Dados Default: gera valores default para campos que não explicitamente setados pelo pelo código que a chama.
  • -Seqüenciamento: seta valores na ordem correta prevenindo que valores setados explicitamente sejam sobrescritos por procedimentos de dados default.
  • Validação: mantém a integridade no banco de dados e certifica que qualquer regra de negócio em nível de campo ou de registro seja seguida. Ex: NumberSequence.
  • Mapeamento de valores: “traduz” o valor de campos específicos de acordo com regras de negócio pré-definidas.
  • Processamento de erros: consolidando as mensagens de erro quando operações aplicadas à múltiplos campos.

Obs: Definição feita por Guilherme Fernandes.

Características adicionais:

  • Manipulam dados da tabela diretamente.
  • Podem ler e escrever nas tabelas relacionadas, a não ser onde a lógica de negócios do Ax seja violada por updates externos. Ex. na tabela TaxTrans.
  • São auto-contidas e suas operações são independentes do contexto de onde estão sendo chamadas.
  • Implementam a classe AxInternalBase.
  • Não faz a validação se o usuário que está chamando está classe tem acesso aos dados da tabela. Essa verificação dever feita pelo código que chama a classe Ax[Tabela].

É isso ai, então até o próximo post, onde iremos fazer um exemplo prático da AxClass.

Abrs,
Peterson Ferreira

Categories: X++ Tags: ,