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.