Códigos de erro

Quando a função ParseInput não consegue produzir um resultado válido, define ResultType como otInvalid e devolve um valor diferente de zero em ErrorCode. Todas as condições de erro são comunicadas desta forma; a função ParseInput nunca lança uma exceção em compilações de versão final.

Referência de códigos de erro

Constante Valor Condição
ERR_NONE 0 Sucesso. Sem erros.
ERR_INVALID_FORMAT 1 Não foi possível converter um token para o TInputType declarado.
ERR_INVALID_RANGE 2 O limite esquerdo do intervalo é maior do que o limite direito.
ERR_LIST_SEPARATOR_CONFLICT 3 Foram encontrados tanto um separador de lista (, ou ;) como o separador de intervalo na mesma entrada.
ERR_NULL_NOT_ALLOWED 4 opNotNull foi definido e pelo menos um token foi resolvido como NULL.
ERR_EMPTY_NOT_ALLOWED 5 opRequired foi definido e toda a entrada estava vazia.
ERR_INVALID_RANGESEP 6 O caractere RangeSep é um dos caracteres reservados: ,, ;, -, ., ' (aspas simples) ou espaço.

ERR_INVALID_FORMAT (1)

A entrada contém um token que não pode ser analisado como o tipo declarado.

Causas comuns:

R := ParseInput('3.14', itInteger);
// R.ResultType = otInvalid
// R.ErrorCode  = ERR_INVALID_FORMAT

ERR_INVALID_RANGE (2)

Aplica-se a itInteger, itDecimal, itFloat, itDate, itTime e itDateTime quando a entrada é um intervalo e o limite esquerdo é estritamente maior do que o limite direito.

Os intervalos de itString e itBoolean nunca são verificados quanto à ordem.

R := ParseInput('100~1', itInteger);
// R.ResultType = otInvalid
// R.ErrorCode  = ERR_INVALID_RANGE

R := ParseInput('2026-12-31~2026-01-01', itDate);
// R.ResultType = otInvalid
// R.ErrorCode  = ERR_INVALID_RANGE

São permitidos limites iguais: 10~10 produz BETWEEN 10 AND 10.

ERR_LIST_SEPARATOR_CONFLICT (3)

A entrada contém tanto um separador de lista (, ou ;) como o separador de intervalo fora de regiões entre aspas. O parser não consegue determinar se a entrada é uma lista ou um intervalo.

R := ParseInput('1,2~3', itInteger);
// R.ResultType = otInvalid
// R.ErrorCode  = ERR_LIST_SEPARATOR_CONFLICT

Este erro pode ser evitado utilizando um separador de intervalo que não apareça na entrada, ou colocando entre aspas os valores que contenham os caracteres em conflito.

ERR_NULL_NOT_ALLOWED (4)

O opNotNull foi definido e pelo menos um token na saída foi resolvido como NULL. Isto acontece quando uma posição da lista está vazia (1,,3), um limite do intervalo está vazio (~100) ou toda a entrada está vazia para um tipo que não seja string.

Para itString, os tokens vazios produzem '' (não NULL), a menos que opEmptyStringNull também esteja definido.

R := ParseInput('1,,3', itInteger, [opNotNull]);
// R.ResultType = otInvalid
// R.ErrorCode  = ERR_NULL_NOT_ALLOWED

ERR_NULL_NOT_ALLOWED não é definido quando ERR_EMPTY_NOT_ALLOWED já tiver sido devolvido para a mesma chamada.

ERR_EMPTY_NOT_ALLOWED (5)

opRequired foi definido e toda a entrada (após opTrim, quando presente) está vazia ou contém apenas espaços em branco.

R := ParseInput('', itDate, [opRequired]);
// R.ResultType = otInvalid
// R.ErrorCode  = ERR_EMPTY_NOT_ALLOWED

R := ParseInput('   ', itDate, [opRequired, opTrim]);
// R.ResultType = otInvalid
// R.ErrorCode  = ERR_EMPTY_NOT_ALLOWED

ERR_INVALID_RANGESEP (6)

O caractere RangeSep passado à sobrecarga 1 de ParseInput é um dos caracteres reservados: ,, ;, -, ., ' (aspas simples) ou espaço. Estes caracteres estão reservados porque são utilizados por outras partes do parser:

Quando este erro ocorre, SQLExpression está vazio e Values e SQLValues são nil.

R := ParseInput('a,b', itString, ',', [], sopEqual, sqlElevateDB);
// R.ResultType = otInvalid
// R.ErrorCode  = ERR_INVALID_RANGESEP

Tratamento de erros

O padrão recomendado é verificar primeiro ResultType e, em seguida, ramificar com base em ErrorCode para apresentar mensagens ao utilizador:

R := ParseInput(Edit1.Text, itDate, [opRequired]);
case R.ResultType of
  otEmpty:
    ; // sem entrada; não é necessária nenhuma cláusula WHERE
  otInvalid:
    case R.ErrorCode of
 ERR_EMPTY_NOT_ALLOWED:
 ShowMessage('Por favor, introduza uma data.');
      ERR_INVALID_FORMAT:
 ShowMessage('O formato da data não foi reconhecido.');
 ERR_INVALID_RANGE:
 ShowMessage('A data de início não pode ser posterior à data de fim.');
    else
 ShowMessage('Entrada inválida (erro ' + IntToStr(R.ErrorCode) + ').');
    end;
else
  Query1.SQL.Text := 'SELECT * FROM Orders WHERE OrderDate ' + R.SQLExpression;
  Query1.Open;
end;

O ParseInput nunca lança uma exceção por entrada inválida nas compilações de versão final. A exceção EDemoRestriction é lançada apenas pelas compilações de demonstração quando a entrada excede o limite de comprimento da demonstração ou quando o IDE do Delphi não está a ser executado.

(C) 2026 Easygate, Lda