Progress – usar comandos SQL para obter o maio valor

Antes de mostrar como usar comandos SQL para obter o maio valor vamos apresentar um contexto onde este comando seria util.

Digamos que temos uma tabela onde controlamos a chave primaria manualmente, então, antes de acresentar um novo registro, deve-se obter o ultimo ou maior código registrado.

Poderia ser usado um find last para obter o ultimo ID utilizado como o exemplo a seguir:

DEFINE VARIABLE vCodigo AS INTEGER no-undo initial 1.

find last ttTabela no-lock no-error.

if available ttTabela then do:
    assign vCodigo = ttTabela.codigo + 1.
end.

O problema do find last é que o ultimo registro pode não ter o maior código.

Pode ocorrer de ter sido criado um registro com o código 8, depois o código 10 e algum controle ou processo manual ter criado o registro com código 9, neste caso o resultado do find last seria o vCodigo = 10 e poderia gerar um conflito de chave.

Outra solução poderia ser usar um for each combinado com um by da seguinte forma:

DEFINE VARIABLE vCodigo AS INTEGER no-undo initial 1.

for each ttTabela no-lock
    by ttTabela.codigo:
    assign vCodigo = ttTabela.codigo + 1.
end.

Ou talvez um for each combinado com break by onde ao atender uma validação entra na lógica:

for each ttTabela no-lock
    break by ttTabela.codigo:
    if last-of(ttTabela.codigo) then do:
        assign vCodigo = ttTabela.codigo + 1.
    end.
end.

Em ambas as situações do for each o sistema passaria por todos os registros da tabela sem necessidade com a única diferença sendo que no primeiro a variável receberia a soma a cada registro e na segunda receberia a soma apenas o ultimo registro.

Então finalmente vamos usar o recurso select com MAX para buscar o maior valor do campo de forma definitiva:

DEFINE VARIABLE vCodigo AS INTEGER no-undo initial 1.
SELECT MAX(ttTabela.codigo) 
INTO vCodigo
FROM ttTabela.
assign vCodigo = vCodigo + 1.

Simples, rápido e elegante.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.