A validação de colunas é especificada em dicField.CustomConstraint.

Estão disponíveis todos os recursos do ArScript, além de:

  • As colunas da tabela sendo alterada como variáveis variants (escrita e leitura)
  • A variável x, somente leitura, com o novo valor da coluna.

Se ocorrer um erro imprevisto na execução do script, Argow mostra a seguinte mensagem:

Ocorreu um erro ao avaliar a restrição dos valores válidos da coluna %s ...
Por esta razão, não é possível determinar a validade dos dados modificados.

e o usuário pode optar por atualizar a tabela ou não. Para não dar esta alternativa e evitar a gravação, atribua T na variável de configuração global SCRIPT_ONERROR_STOP.

A forma de escrever a validação pode ser:

  • In-line,
  • Notação rápida, e
  • Referência a dicScript

In-line

Nesta notação o script está em dicField.CustomConstraint. O script deve conter uma função, chamada Constraint, que retorna um valor booleano e recebe um parâmetro, o valor da coluna, como variant. O código abaixo verifica a validade de CPF (Cadastro de Pessoa Física) (note a semelhança com Delphi):

dicField
tableNamefieldNamecustomConstraintconstraintErrorMessage
tbCLIENTECPFfunctio soNum... 

function soNumeros( const cStr: string ): boolean;
  var i: integer;
begin

  result:= true;
  i:= 1;
  while ( i <= length( cStr) ) and result do begin
    result:= ( ( '0' <= cStr[i] ) and ( cStr[i] <='9' ) );
    i:= i + 1;
  end;

end;
//---------------------------------------------------------------
function digitoVerificador( const cStr: string; const iStart, iModulo: integer ): char;
  var i, iSoma, iPeso, iDV: integer;
begin

  iSoma:= 0;
  iPeso:= iStart;
  for i:= 1 to length( cStr ) do begin
    iSoma:= iSoma + (( ord( cStr[i] ) - ord( '0' )) * iPeso );
    iPeso:= iPeso - 1;
  end;
  iDV:= iModulo - ( iSoma mod iModulo );
  if ( iDV > 9 ) then begin
    result:= '0';
  end else begin
    result:= chr( iDV + ord( '0' ) );
  end;

end;
//---------------------------------------------------------------
//-- Valida CPF -------------------------------------------------
//---------------------------------------------------------------
function validaCPF( const cCPF: string ): boolean;
  var cMsg: string;
begin

  result:= false;
  cMsg:= 'CPF inválido, favor informar de novo';

  if ( length( cCPF ) < 11 ) then begin
    cMsg:= cMsg + ' (faltam digitos).'
  end else if ( length( cCPF ) > 11 ) then begin
    cMsg:= cMsg + ' (sobram digitos).'
  end else if not soNumeros( cCPF ) then begin
    cMsg:= cMsg + ' somente números.'
  end else if not ( digitoVerificador( Copy( cCPF, 1, 9 ), 10, 11 ) = cCPF[10] ) then begin
    cMsg:= cMsg + '.'
  end else if not ( digitoVerificador( Copy( cCPF, 1, 10 ), 11, 11 ) = cCPF[11] ) then begin
    cMsg:= cMsg + '.'
  end else begin
    result:= true;
  end;

  if not result then msg_warning( [ cMsg ], 'CPF' );

end;

//---------------------------------------------------------------
//-- CONSTRAINT -------------------------------------------------
//---------------------------------------------------------------
function constraint( const x: variant ): boolean;
begin

  result:= validaCPF( x );

end;

No exemplo a seguir, não é feita exatamente uma validação, mas é aproveitado o contexto (antes da atualização da tabela) para mudar o valor de uma coluna DATA_MODIF se a coluna STATUS mudou de valor ou estiver sendo inserida:

function Constraint( x: variant ): boolean;
begin
  if sf.ActiveDataSet.isAppending then begin
    DATA_MODIF:= now;
  end else if not ( x = sf.ActiveDataSet.oldValue['STATUS'] ) then begin
    DATA_MODIF:= now;
  end;
  result:= true;
end;

Notação rápida

A notação rápida foi projetada para facilitar as validações simples. O script, composto de uma só linha, deve resultar em uma expressão booleana. O valor da coluna sendo validada está representado por x.

length( x ) > 4

Se a condição não é cumprida, Argow mostra uma mensagem com o texto de dicField.ConstraintErrorMessage.

Internamente, Argow converte a linha informada, em um script in-line, com as seguintes características:

{$I {configuração global SCRIPT_INCLUDE} }
function Constraint( x: variant ): boolean;
begin
  result:= {dicField.CustomConstraint};
  if not result then msg_warning( [ {dicField.ConstraintErrorMessage} ], {Nome da Tabela});
end;

Se dicField.ConstraintErrorMessage não for especificado, Argow fornece a mensagem: 'A restrição para os valores válidos da coluna "%s" não é satisfeita com os dados informados.'.

Referência

Nesta notação o valor de dicField.CustomConstraint e uma referência à tabela dicScript, com a seguinte notação:

scriptName[.functionName]

Onde scriptName é uma entrada em dicScript, e functionName é a função, contida em dicScript.scriptBody, que retorna um valor booleano e recebe um parâmetro, o valor da coluna, como variant. Se functionName não for especificado, será utilizado Constraint.