[firebase-br] Como prevenir o erro "Arithmetic exception, numeric overflow, or string truncation. string right truncation."

Luciano franca luapfirebird em yahoo.com.br
Qua Ago 10 19:31:57 -03 2016


Colega fico muito grato pelo exemplo.
Tenho alguns lugares que acredito ser possível aplicar sua ideia porém outros não por se tratar de um ERP muito grande e o mais pratico seria por CHECK nos Domains  ou por Triggers   assim eu poderia centralizar o bloqueio desse tipo de erro,  pena que o Firebird não permite isso.
Eu acredito ser um BUG do Firebird pois acho que o Check e Trigger deveria ser disparado antes de qualquer coisa e não é o que acontece com uma String maior que o tamanho físico do campo. 

    Em Quarta-feira, 10 de Agosto de 2016 17:45, Gladiston Santana <gladiston em vidy.com.br> escreveu:
 

 Há varias maneiras de se criar uma variavel para ser usada numa procedure, o que eu disse anteriormente era usar parametros de tamanhos generosos então digamos que minha tabela FOO o campo codigo seja 30 caracteres, descricao 40 e cep 8:
create or alter procedure sp_foo (
  p_codigo varchar(255) = '',
  p_descricao varchar(255) = '',  p_cep varchar(255))returns (    result_value smallint)asbegin  result_value=0;  p_codigo=left(:p_codigo,30); -- pode usar cast em outras ocasiões  p_descricao=left(iif(:p_descricao<>'',:p_descricao,'(parmetro esquecido)'), 60); -- pode mudar um valor que ficaria vazio  p_cep=left(replace (:p_cep ,  '-', ''),8); -- pode remover characteres indesejados  (...)
  insert into FOO(codigo, descricao, cep) values (:p_codigo, :p_descricao, :p_cep);  (...)end;
Digamos que queira dar uma exception quando estrapolar o tamanho:
create or alter procedure sp_foo (
  p_codigo varchar(255) = '',
  p_descricao varchar(255) = '',  p_cep varchar(255))returns (    result_value smallint)asbegin  result_value=0;
  if (octet_length(p_codigo) > 30) then  begin     exception ERR 'O campo codigo aguardava tamanho de 30, mas recebeu '||octet_length(p_codigo) ||' caracteres.';     suspend;     exit;  end  (...)
end;

É isso.
Agora, ao fazer isso, você perderá a versatilidade que esse modelo te traz, claro que quando ocorre o famoso "Arithmetic exception, numeric overflow, or string truncation. string right truncation." pensamos nisso como um erro a ser corrigido, mas eu penso nele como 'o que foi que eu deixei passar'. Se eu desligo isso, estou abrindo mão de saber onde estãos os erros no lado cliente, já que os estou consertando na procedure.

inte+



Em 9 de agosto de 2016 16:01, Luciano franca <luapfirebird em yahoo.com.br> escreveu:

E como seria essa SP  você poderia me mostar uma SP simples apenas disparando um Exception caso o tamanho da String seja maior que o campo
pois em meus testes aqui a SP funciona igual a Trigger e não consegue ser disparado antés de dar o erro "Arithmetic Exception" 

    Em Terça-feira, 9 de Agosto de 2016 8:57, Gladiston Santana <gladiston em vidy.com.br> escreveu:
 

 Do mesmo jeito que já vem fazendo, veja um exemplo:
  m:=TFDQuery.Create(Self);  m.Connection:=q1.Connection;  m.SQL.Clear;
  m.SQL.Add('SELECT result_value FROM SP_CLASSIFICACAO_CV(');  m.SQL.Add(QuotedStr(Operacao)+ ',');  // INCLUIR,ALTERAR,EXCLUIR, CONSULTAR  m.SQL.Add(QuotedStr( CLASSIFICACAO.Text)+',');    m.SQL.Add(QuotedStr(tipo_cv. Text)+',');  m.SQL.Add(QuotedStr(Trim( DESCRICAO.text))+',');  m.SQL.Add(QuotedStr(TEXTO_ EXPLICATIVO.Lines.Text)+',');  m.SQL.Add(FBSQLNUMBER(PERC_ PIS_COFINS.Value,2)+',');  m.SQL.Add(FBSQLNUMBER(PERC_ LUCRO.Value,2)+',');  m.SQL.Add(QuotedStr(SimNao(se_ servicos.Checked,'-','S','N')) +',');  m.SQL.Add(QuotedStr(SimNao(SE_ RT.Checked,'-','S','N'))+',');  m.SQL.Add(QuotedStr(SimNao(SE_ RT_ENGENHARIA.Checked,'S','S', 'N'))+',');  m.SQL.Add(QuotedStr(SimNao( STATUS.Checked,'-','C','A'))+' );');  try    m.open;    sResult:=m.FieldbyName(' result_value').AsString;    Result:=(sResult<>'');    if not Aplicado      then Aplicado:=Result;    if Assigned(q1.Connection) then    begin      if q1.Connection.InTransaction        then q1.Connection.CommitRetaining;    end;  except  on e:exception do     begin        ExibeErro('Erro ao executar o procedimento:',e.message,m. SQL.Text);     end;  end;  m.Close;  FreeAndNil(m);
Se puder ser parametrizada do jeito que você faz melhor ainda.Outra vantagem que não mencionei são as permissões, você dá permissão do usuário à procedure, e não precisa se preocupar com as permissões do usuários às tabelas envolvidas. Claro que dará permissão às tabelas à procedure, mas isso se faz uma única vez e tais grant podem ficar em forma de comentário dentro da procedure caso precise aplicá-las novamente.

   



-- 
--
B em B@BU     iB em M@B.  B em MBBO   MBBMMB em B@BZLr    E@@@@i      r@@@BU
vB em M@O     E em B@Bu   BBBM em 0   G em MMM@N8MBB em ZP5r  B em B@k      8B@@O
 OB em B@q   2 em BBBM    B em B@BO   BB em B@B,.:,7B em B@@L uB em B@,    OB em B@.
 ,@@@B@   @BBB@,    @BBB em 8   M em M@@@     PB em B@B  @@@BN   iB em B@L
  U em B@B2 LB em B@X     B em MBBO   MBBM em B     i em BBB@. 7 em B@Bi  B em B@E
   B@@@BiM em M@B.     @BBM em G   M em MMB@     v@@M em B,  G em B@Z v em B@B.
   7B em B@O em B@B5      B em B@B8   BBBM em B     Z@@@B@   iB@@@2 em B@Br
    NB em M@B em B8       @B em B@8   M em B@B em i:i75 em B@B em r    E@@B em B@Bq
    . em B@@@B@:       B em B@B@   @B@@@B em B@B@@@ME;     .BB em MBB@
     55.ANOS        OMOGBS   PBZGGOOMOO117,        7 em BBB@r
     ==============================================r@@@@F=====
     Gladiston Santana                             8 em B@B,
     Supervisor de TI                             G em B@B7
     Tel.:+551147873122 R:228                    :@B em B0
     Grupo VIDY - SGQ ISO9001 - 55 ANOS          @B em B@.
     Visite nosso site: www·vidy·com·br         BB@@@u
     Visite também : www·expolabor·com·br      GB em B@N




  


Mais detalhes sobre a lista de discussão lista