|
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 |
| tableName | fieldName | customConstraint | constraintErrorMessage |
| tbCLIENTE | CPF | functio 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.
|