triger

Firebird

23/03/2005

é o seguinte pessoal tenho uma tabela mestre detalhe so q o detalhe nao pode ter mais de 1 registro intao decidi fazer um triger q vai ser acionada quando adiciona um novo registro e essa triger vai fazer o seguinte:
vai localizar todos os registros onde cod (mestre) = coditem(detalhes) ce ele acha ele da uma mensagen e se nao achar deixa cadastrar normalmente !!! Como faço isso pelo amor de deus !!!


Guilherme

Guilherme

Curtidas 0

Respostas

Afarias

Afarias

23/03/2005

|tenho uma tabela mestre detalhe so q o detalhe nao pode ter mais de 1
|registro

eu não chamaria isso de ´mestre-detalhe´ :)

vc nào precisa fazer nada não, apenas coloque um índice único na tabela detalhe (na ´chave estrangeira´)


T+


GOSTEI 0
Guilherme

Guilherme

23/03/2005

so q qando vai inserir um nov registro da um erro como faço para ´personalizar´ essa mensagen


GOSTEI 0
Gandalf.nho

Gandalf.nho

23/03/2005

Se só pode ter um registro no ´detalhe´, não seria mais simples passar os campos todos para a tabela principal? Daí não seria necessário se preocupar com essa validação.


GOSTEI 0
Guilherme

Guilherme

23/03/2005

certo...
mais tem como resolver esse problema q ja criei ????


GOSTEI 0
Gandalf.nho

Gandalf.nho

23/03/2005

Faça como o afarias disse e crie o índice único, depois intercepte a mensagem de erro (usando o evento OnPostError, por exemplo), teste qual a mensagem de erro retornada e depois passe sua mensagem de erro personalizada pro usuário.


GOSTEI 0
Guilherme

Guilherme

23/03/2005

como q eu faço porq eu vo la no evento e coloco a mensagen so q ai ele primeiro aparece a mensagen do erro do delphi pra depois a mensagen q personalizei


GOSTEI 0
Gandalf.nho

Gandalf.nho

23/03/2005

Como vc fez seu código?


GOSTEI 0
Guilherme

Guilherme

23/03/2005

isso q quero saber como fazer o codigo !!!! o meu ta assim

showmessage(´ERRO !!!´)



GOSTEI 0
Gandalf.nho

Gandalf.nho

23/03/2005

Observe que nos eventos usados para interceptar mensagens de erro existe sempre um parâmetro que armazena a mensagem e o código do erro. No caso do evento OnPostError, o parâmetro é do tipo EDatabaseError. Geralmente se testa esse parâmetro para ver o código do erro e determinar qual é a mensagem de erro. Daí usa-se uma estrutura IF ou CASE para testar os valores esperados e fazer o tratamento do erro. Por exemplo, esse trecho de código pode ser usado com um componente BDE:

var
  iDBIError    : Integer;
begin
   IDBIError := (E as EDBEngineError).Errors[0].Errorcode; //Obtem o código do erro
  case iDBIError of
      eRequiredFieldMissing: //Algum campo requerido não preenchido.
       begin
           //Faça o tratamento do erro aqui
       end;
   end;
end;


A sintaxe exata depende muito dos componentes de acesso usados e do banco utilizado


GOSTEI 0
Afarias

Afarias

23/03/2005

se vc estiver depurando o sitema (RUN) a exceção sempre vai aparecer antes da ´mensagem tratada´


T+


GOSTEI 0
Guilherme

Guilherme

23/03/2005

o codigo e nosso amigo gandalf.nho deixou sera os seguintes erros :


[Error] cli_fi.pas(1014): Undeclared identifier: ´EDBEngineError´
[Error] cli_fi.pas(1016): Undeclared identifier: ´eRequiredFieldMissing´



GOSTEI 0
Gandalf.nho

Gandalf.nho

23/03/2005

Só uma coisa, vc está usando qual tecnologia de acesso ao dados? Esse exemplo que passei é para usar com BDE.


GOSTEI 0
Afarias

Afarias

23/03/2005

|codigo e nosso amigo gandalf.nho

AMIG[color=red:11a41867eb][b:11a41867eb]A[/b:11a41867eb][/color:11a41867eb]


|deixou sera os seguintes erros

esse código trata de erros para quem usa BDE, adicione as units relativas ao BDE na uses da unidade.


T+


GOSTEI 0
Guilherme

Guilherme

23/03/2005

mas eu usso o interbase !!!!!!


desculpe ai nen sabia q era mulher foi mal galera me desculpa !


GOSTEI 0
Gandalf.nho

Gandalf.nho

23/03/2005

mas eu usso o interbase !!!!!!


Tudo bem, mas vc usa o que para acessar os seus dados? BDE, IBX, DBExpress, ADO?


GOSTEI 0
Guilherme

Guilherme

23/03/2005

IBX


GOSTEI 0
Gandalf.nho

Gandalf.nho

23/03/2005

Nesse caso, substitua (E as EDBEngineError).Errors[0].Errorcode por (E as EIBError).IBErrorCode. Não esqueça de declarar IB na cláusula uses. Daí você vai ter que testar o código retornado para ver o valor e fazer o tratamento adequado.


GOSTEI 0
Guilherme

Guilherme

23/03/2005

alterei la o codigo como nossA amigA disse so q ainda estando esse erro aki ô

[Error] cli_fi.pas(1016): Undeclared identifier: ´eRequiredFieldMissing´ 



GOSTEI 0
Afarias

Afarias

23/03/2005

´eRequiredFieldMissing´ não é uma constante de código de erro no IBX

Dê uma olhada na unit IB.pas para ver as constantes válidas. Note q IBErrorCode é um INTEGER, vc pode ver os valores de erro tb nos manuais do Interbase 6.0


T+


GOSTEI 0
Guilherme

Guilherme

23/03/2005

nao achei nada relativo


GOSTEI 0
Gandalf.nho

Gandalf.nho

23/03/2005

nao achei nada relativo


Como assim?


GOSTEI 0
Guilherme

Guilherme

23/03/2005

o cara pediu pra min procura numa unit so q nao achei nada !!!! vc sabe o q subistitui o codigo q esta dando erro no post q esta acima ???


GOSTEI 0
Gandalf.nho

Gandalf.nho

23/03/2005

Primeiro vc tem que verificar exatamente qual é a mensagem de erro que está dando para poder olhar a documentação de erros e ver qual o código de erro correspondente. Se vc olhar na documentação do Interbase vc verá que cada mensagem de erro do banco equivale a um código, tipo [i:6be2123215]isc_not_valid[/i:6be2123215] representa o erro de valor inválido ou inexistente


GOSTEI 0
Guilherme

Guilherme

23/03/2005

eu fiz como vc disse la pra subistitui ops termos so q estando esse erro

[Error] cli_fi.pas(1016): Undeclared identifier: ´eRequiredFieldMissing´ 



GOSTEI 0
Gandalf.nho

Gandalf.nho

23/03/2005

Como o afarias disse lá em cima eRequiredFieldMissing é usado pelo BDE. Para o IBX vc tem que ver qual é a constante correspondente a mensagem de erro retornada ao tentar postar mais de um registro.


GOSTEI 0
POSTAR