Prezados amigos.
Estou dando manutencao num projeto onde a logica de negocios está toda no banco de dados Firebird, inclusive as mensagens de erro.
O problema é que dentro do scriptcase eu nao consigo ver essas mensagens adequadamente.
Por exemplo, se uma trigger dispara uma mensagem de erro, a tela de formulario ou controle fica vazia. Dai eu habilito o debug para descobrir que o firebird disparou uma mensagem de erro relativo a logica de negocios, por exemplo “Saldo nao pode ficar negativo”.
Existe alguma maneira de capturar essa mensagem de erro e mostrar no scriptcase como se fosse um alerta?
Não se emite mensagens em triggers.
Oi Haroldo.
Dentro de uma trigger do firebird tem isso aqui
if (valor_liquido < 0) then BEGIN
exception mensagem ‘VALOR LIQUIDO NAO PODE FICAR NEGATIVO’;
END
Pois é, não é uma boa prática executar exceptions em triggers.
E o SC não vai identificar esses erros.
problema é como eu falei, a logica de negocios ta toda no banco, os calculos e validacoes
. Ja peguei assim.
Então vc está em uma verdadeira encrenca.
Neste caso, o que vc sugere para tentar resolver esse problema?
Se vc tem a possibilidade de mexer no banco de dados, remnover os exceptions e no lugar gravar uma tabela de erro com registros por sessão php, no formulário capturar esse registro e exibir a mensagem.
Outra forma seria em fez de forumulario usar controle e tratar toda relação com o banco manualmente aplicando adequandamente transações e roollbacks para garantir a integridade do sistema.
Eu, particularmente aboli regras de negócio no banco de dados a muito tempo.
Metodologias como MVC, MVVM, VIPER trazem mais segurança, melhor documentação e portabilidade a regras de negócio.
Na verdade, isso acontece dentro de um controle. No evento onValidateSuccess é chamada uma stored procedure que inclui registros no banco de dados. Durante esses inserts e updates, os triggers envolvidos acabam disparando mensagns de erro.
E se houver um exception o que ocorre?
Desfaz todo o processo?
Se não usar as macros do SC e usar código php na unha consegue controlar os exceptions.
Evento onvalidatesucess, o nome já diz, evento executado quando não houve erros.
Se houver uma exception disparada por trigger ou procedure, a transacao inteira é desfeita.
Vou tentar chamar a procedure no metodo on validate
Mesmo assim com as macros do SC executando a SP não vai capturar o erro.
tem que usar aldo do tipo…
try {
$db->query($stored_procedure);
}
catch (PDOException $err) {
//sua msg $err
}
consegui.
Usei o sc_lookup, em vez de sc_exec_sql
Exemplo :
sc_lookup(ds,“chamado da procedure”);
if ({ds}===false) {
$mensagem = {ds_erro};
// Aqui eu posso formatar a mensagem
sc_error_message($mensagem);
}
Deu certo !!!
So mais um detalhe que nao esta muito claro na documentacao do scriptcase.
A variavel de retorno do erro segue o mesmo nome da variavel dataset.
Entao, se eu usar sc_lookup(dscliente, “alguma coisa”) o erro vem para a variavel {dscliente_erro} e assim por diante
Se sua SP faz o controle de transação, ótimo então.