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
Leave a reply