Após cadastrar 5 funcionarios, meu IB trava.. so reiniciando

Delphi

15/07/2004

gente tenho um sistema desenvolvido com o interbase, tudo funciona direitinho, porem, após cadastrar 05 funcionários ele trava e tenho que reiniciar o sistema, alguem pode me ajudar? :oops:


Mariocanel

Mariocanel

Curtidas 0

Respostas

Otto

Otto

15/07/2004

Mario, nos informe mais detalhes....

qual a versão do seu IB , windows...
cole sua rotina de insert...
usa table ou query.... :wink:


GOSTEI 0
Persist

Persist

15/07/2004

Será que vc não faz uma conexão a cada inserção e seu IB suporta somente 5 conexões?


GOSTEI 0
Mariocanel

Mariocanel

15/07/2004

meu interbase é o que vem no delphi 7(6.5)
meus códigos:
CREATE TABLE POLICIAL (
POLICIAL_ID DM_CHAVE_PRIMARIA /* INTEGER NOT NULL */,
NOME CHAR(80) CHARACTER SET OCTETS,
ENDERECO CHAR(60) CHARACTER SET OCTETS,
MATRICULA CHAR(15) CHARACTER SET OCTETS,
........
........
);

ALTER TABLE POLICIAL ADD PRIMARY KEY (POLICIAL_ID);

/******************************************************************************/
/**** Triggers ****/
/******************************************************************************/


SET TERM ^ ;




/* Trigger: INSERT_MATRICULA_POLICIAL */
CREATE TRIGGER INSERT_MATRICULA_POLICIAL FOR POLICIAL
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (exists
(select MATRICULA from POLICIAL
where MATRICULA=NEW.MATRICULA)) then
exception NOME_MATRICULA_JA_EXISTE;
end
^

/* Trigger: INSERT_NOME_POLICIAL */
CREATE TRIGGER INSERT_NOME_POLICIAL FOR POLICIAL
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (exists
(select NOME from POLICIAL
where NOME=NEW.NOME)) then
exception NOME_POLICIAL_JA_EXISTE;
end
^

/* Trigger: NEW_POLICIAL_ID */
CREATE TRIGGER NEW_POLICIAL_ID FOR POLICIAL
ACTIVE BEFORE INSERT POSITION 0
AS
begin
new.policial_id =gen_id(gen_policial,1);
end
^

/* Trigger: UPDATE_MATRICULA_POLICIAL */
CREATE TRIGGER UPDATE_MATRICULA_POLICIAL FOR POLICIAL
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if (old.MATRICULA<>new.MATRICULA) then
if (exists
(select MATRICULA from POLICIAL
where MATRICULA=NEW.MATRICULA)) then
exception NOME_MATRICULA_JA_EXISTE;
end
^

/* Trigger: UPDATE_NOME_POLICIAL */
CREATE TRIGGER UPDATE_NOME_POLICIAL FOR POLICIAL
ACTIVE BEFORE UPDATE POSITION 0
as
begin
if (old.NOME<>new.NOME) then
if (exists
(select NOME from POLICIAL
where NOME=NEW.NOME)) then
exception NOME_POLICIAL_JA_EXISTE;
end
^


SET TERM ; ^



/******************************************************************************/
/**** Privileges ****/
/******************************************************************************/


/* Privileges of users */
GRANT ALL ON POLICIAL TO MARIOCANEL WITH GRANT OPTION;



Tudo issi feito no IBEXPERT,porem quando levo para o Delphi, taí, nao se se tenho que criar uma proceure para ativar a trigger, ou deixando assim ele resolve, porem, dá KEY VIOLATION
aí baseado no datacar(clubedelphi, usei tal código)
procedure TDM.Incrementa(Nome_Tabela: String; Chave_Primaria: TField);
var Qry : TSQLQuery;
begin
if Chave_Primaria.DataSet.State <> dsInsert then
exit; //termina a execução caso não esteja em modo de inserção
Qry:=TSQLQuery.Create(nil); //cria uma instância do objeto
try
Qry.SQLConnection:=SQLConnect; //componente de conexão
Qry.SQL.Add(´SELECT MAX(´+Chave_Primaria.FieldName+´) FROM ´+Nome_Tabela);
Qry.Open;
if Qry.Fields[0].IsNull then //se a tabela está vazia retornará nulo
Chave_Primaria.AsInteger:=1 //então este será o primeiro registro
else Chave_Primaria.AsInteger:=Qry.Fields[0].AsInteger+1;
finally
FreeAndNil(Qry); //tira o objeto da memória
end;


Obs:TDM é meu datamodule


GOSTEI 0
Persist

Persist

15/07/2004

Não sei se tem algo a ver, mas vc está dando Qry.Open, atualiza a chave de auto-incremento e depois FreeAndNil(Qry) sem dar Qry.Close.
Verifique também o número de conexões no banco após a terceira inserção.


GOSTEI 0
Mariocanel

Mariocanel

15/07/2004

gente ainda nao sei como usar a trigger, pois, como uso esse nesse procedimento no delphi, ou seja, trago para o delphi do interbase, ou nao precisa? como faço?


GOSTEI 0
POSTAR