Greetings,
Gostaria de discutir um pouco aqui a funcionalidade do campo RecVersion. Desde que comecei no mundo AX vejo este campo em todas as tabelas, mas nunca me dei conta do seu proposito.

O conceito é um tanto simples:
Como é de conhecimento de todos, toda tabela criada no AX “ganha” automaticamente o campo “RecVersion”. Este campo é preenchido com o valor “1” no novo registro criado, e é atualizado para um número aleatório toda vez que fazemos uma seleção do registro para atualização usando a palavra-chave “forUpdate”. Quando o registro é atualizado(usando os métodos update() ou doUpdate()), o kernel irá verificar se o recVersion original daquele registro é o mesmo que consta no banco de dados. Caso seja, significa que o registro não foi modificado por outro processo, e a atualização pode prosseguir. Caso contrário, será lançada uma exception do tipo “UpdateConflict”.

Veja o código abaixo:

static void Teste_RecVersion(Args _args)
{
    CustTable custTable;
    ;
 
    ttsbegin;
    select forUpdate custTable
        where custTable.AccountNum == "00001";
 
    print custTable.orig().recVersion;
 
    custTable.CreditMax = 1000;
    custTable.update();
    ttscommit;
 
    print custTable.recVersion;
    pause;
}

Ao executa-lo, o código irá imprimir o recVersion do registro original (recuperado pelo método orig()) e o novo recVersion criado apos a chamada da instrução “forUpdate”.

Usando um exemplo mais claro, vamos imaginar que um processo “A” esteja em execução e seleciona um registro da “CustTable” para atualizar o limite de credito de um cliente:

Registro original:

AccountNum Name CreditMax recVersion
00001 Cliente para teste 500 5622

.

. (processo de calculo do novo limite de crédito)

.

Após update:

AccountNum Name CreditMax recVersion
00001 Cliente para teste 1000 68413

 

No momento que é feito o “select forUpdate” o Ax criou um novo número de versão do registro, neste caso o número 68413. Ao chamarmos o método de atualização, será verificado se a versão original do registro continua com o número 5622. Caso não esteja, significa que o registro foi selecionado por um processo “B” enquanto o processo “A” estava ainda calculando o novo limite de crédito. Caso isso acontença, será lançado uma exceção do tipo “UpdateConflict”. Caso contrário, a atualização segue normalmente.

Espero que tenham gostado.

Abs,
Anderson Joyle