Violação de chave primária.
Estou com problema com chave primária. Faço o primeiro registro tudo ok, ele grava no banco de dados. Mas quando vou gravar o segundo registro da um erro de violação de chave primária. Acho que o problema está com minha procedure INCREMENTAR. Quem puder ajudar da um olhadinha no código:
procedure TF_FATURAMENTO.gravarClick(Sender: TObject);
var
v_total, v_honoraRio, v_serv_extra, v_moto_boy, v_segunda_via, v_copias : Real;
begin
//v_cod := id_cod.text;
v_honorario := strtofloat(honorario.TEXT);
v_serv_extra:= strtofloat(serv_extra.TEXT);
v_moto_boy := strtofloat(moto_boy.TEXT);
v_segunda_via :=strtofloat(segunda_via.TEXT);
v_copias:= strtofloat(copias.TEXT);
v_total:=v_honorario + v_serv_extra + v_moto_boy + v_segunda_via + v_copias;
total.text:=floattostr(V_TOTAL);
begin
try
transacao.TransactionID:=1;
transacao.IsolationLevel:= xilREPEATABLEREAD;
dm.CONEXAO.StartTransaction(transacao);
INCREMENTAR;
dm.SDS_FATURAMENTO.close;
dm.SDS_FATURAMENTO.CommandText:=
´insert into faturamento ( id_cod, id_cliente,´ +
´id_mes, id_ano, id_valor, id_servico_extra, id_motoboy, ´ +
´id_segunda_via, id_copia, id_total) values( :id_cod, :id_cliente,´ +
´:id_mes, :id_ano, :id_valor, :id_servico_extra, :id_motoboy,´ +
´:id_segunda_via, :id_copia, :id_total)´;
dm.SDS_FATURAMENTO.ParamByName(´id_cod´).AsString:=v_cod;
dm.SDS_FATURAMENTO.ParamByName(´id_cliente´).AsString:=cliente.KeyValue;//campo de outra tabela --> cliente //esta em um DBLookupListBox1 é recomendavel
dm.SDS_FATURAMENTO.ParamByName(´id_mes´).AsString:=mes.Text;
dm.SDS_FATURAMENTO.ParamByName(´id_ano´).AsString:=ano.Text;
dm.SDS_FATURAMENTO.ParamByName(´id_valor´).AsFloat:=(v_honorario); //campo de outra tabela --> servicos
dm.SDS_FATURAMENTO.ParamByName(´id_servico_extra´).AsString:=serv_extra.Text;
dm.SDS_FATURAMENTO.ParamByName(´id_motoboy´).AsString:=moto_boy.text;
dm.SDS_FATURAMENTO.ParamByName(´id_segunda_via´).AsString:=segunda_via.Text;
dm.SDS_FATURAMENTO.ParamByName(´id_copia´).AsString:=copias.Text;
dm.SDS_FATURAMENTO.ParamByName(´id_total´).AsFloat:=v_total; //quero que faça as somas dos campos id_valor até id_copia
dm.SDS_FATURAMENTO.ExecSQL;
dm.CONEXAO.Commit(transacao);
ShowMessage (´Faturamento gravado´);
except
on Exc:Exception do
begin
ShowMessage(´Ocorreu um erro na tentativa de inclusão do registro: ´+Exc.Message);
dm.CONEXAO.Rollback(transacao);
end;
end;
end;
end;
procedure TF_FATURAMENTO.incrementar;
Begin
dm.CDS_FATURAMENTO.Close;
dm.CDS_FATURAMENTO.open;
dm.CDS_FATURAMENTO.Insert;
dm.CDS_FATURAMENTO.CommandText:=´select max(id_cod)+1 from faturamento´;
v_cod:=dm.CDS_FATURAMENTO.FieldByName(´id_cod´).AsString;
if v_cod=´´ then
v_cod:=´1´;
end;
procedure TF_FATURAMENTO.gravarClick(Sender: TObject);
var
v_total, v_honoraRio, v_serv_extra, v_moto_boy, v_segunda_via, v_copias : Real;
begin
//v_cod := id_cod.text;
v_honorario := strtofloat(honorario.TEXT);
v_serv_extra:= strtofloat(serv_extra.TEXT);
v_moto_boy := strtofloat(moto_boy.TEXT);
v_segunda_via :=strtofloat(segunda_via.TEXT);
v_copias:= strtofloat(copias.TEXT);
v_total:=v_honorario + v_serv_extra + v_moto_boy + v_segunda_via + v_copias;
total.text:=floattostr(V_TOTAL);
begin
try
transacao.TransactionID:=1;
transacao.IsolationLevel:= xilREPEATABLEREAD;
dm.CONEXAO.StartTransaction(transacao);
INCREMENTAR;
dm.SDS_FATURAMENTO.close;
dm.SDS_FATURAMENTO.CommandText:=
´insert into faturamento ( id_cod, id_cliente,´ +
´id_mes, id_ano, id_valor, id_servico_extra, id_motoboy, ´ +
´id_segunda_via, id_copia, id_total) values( :id_cod, :id_cliente,´ +
´:id_mes, :id_ano, :id_valor, :id_servico_extra, :id_motoboy,´ +
´:id_segunda_via, :id_copia, :id_total)´;
dm.SDS_FATURAMENTO.ParamByName(´id_cod´).AsString:=v_cod;
dm.SDS_FATURAMENTO.ParamByName(´id_cliente´).AsString:=cliente.KeyValue;//campo de outra tabela --> cliente //esta em um DBLookupListBox1 é recomendavel
dm.SDS_FATURAMENTO.ParamByName(´id_mes´).AsString:=mes.Text;
dm.SDS_FATURAMENTO.ParamByName(´id_ano´).AsString:=ano.Text;
dm.SDS_FATURAMENTO.ParamByName(´id_valor´).AsFloat:=(v_honorario); //campo de outra tabela --> servicos
dm.SDS_FATURAMENTO.ParamByName(´id_servico_extra´).AsString:=serv_extra.Text;
dm.SDS_FATURAMENTO.ParamByName(´id_motoboy´).AsString:=moto_boy.text;
dm.SDS_FATURAMENTO.ParamByName(´id_segunda_via´).AsString:=segunda_via.Text;
dm.SDS_FATURAMENTO.ParamByName(´id_copia´).AsString:=copias.Text;
dm.SDS_FATURAMENTO.ParamByName(´id_total´).AsFloat:=v_total; //quero que faça as somas dos campos id_valor até id_copia
dm.SDS_FATURAMENTO.ExecSQL;
dm.CONEXAO.Commit(transacao);
ShowMessage (´Faturamento gravado´);
except
on Exc:Exception do
begin
ShowMessage(´Ocorreu um erro na tentativa de inclusão do registro: ´+Exc.Message);
dm.CONEXAO.Rollback(transacao);
end;
end;
end;
end;
procedure TF_FATURAMENTO.incrementar;
Begin
dm.CDS_FATURAMENTO.Close;
dm.CDS_FATURAMENTO.open;
dm.CDS_FATURAMENTO.Insert;
dm.CDS_FATURAMENTO.CommandText:=´select max(id_cod)+1 from faturamento´;
v_cod:=dm.CDS_FATURAMENTO.FieldByName(´id_cod´).AsString;
if v_cod=´´ then
v_cod:=´1´;
end;
Jpauloss
Curtidas 0
Melhor post
Nightshade
27/06/2007
qual o banco tu tas usando?
uma pergunta.. pq tu nao utiliza uma rotina de autoincremento gerenciada pelo banco..
sta tua ta uma baita gambiarra heheeh
serio quando começei programar fazia este controle manualmente, mas nao vale a pena.
exemplo em firebird:
generator:
CREATE GENERATOR GEN_CLIENTES_ID;
trigger:
CREATE TRIGGER CLIENTES_BI FOR CLIENTES
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID_CLIENTE IS NULL) THEN
NEW.ID_CLIENTE = GEN_ID(,1);
END
procedure:
CREATE PROCEDURE SP_GEN_CLIENTES_ID
RETURNS (ID INTEGER)
AS
BEGIN
ID = GEN_ID(, 1);
SUSPEND;
END
banco de dados nao eh meu forte.. mas ajudo com o q eu sei :p
uma pergunta.. pq tu nao utiliza uma rotina de autoincremento gerenciada pelo banco..
sta tua ta uma baita gambiarra heheeh
serio quando começei programar fazia este controle manualmente, mas nao vale a pena.
exemplo em firebird:
generator:
CREATE GENERATOR GEN_CLIENTES_ID;
trigger:
CREATE TRIGGER CLIENTES_BI FOR CLIENTES
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID_CLIENTE IS NULL) THEN
NEW.ID_CLIENTE = GEN_ID(,1);
END
procedure:
CREATE PROCEDURE SP_GEN_CLIENTES_ID
RETURNS (ID INTEGER)
AS
BEGIN
ID = GEN_ID(, 1);
SUSPEND;
END
banco de dados nao eh meu forte.. mas ajudo com o q eu sei :p
GOSTEI 1
Mais Respostas
Jpauloss
27/06/2007
qual o banco tu tas usando?
uma pergunta.. pq tu nao utiliza uma rotina de autoincremento gerenciada pelo banco..
sta tua ta uma baita gambiarra heheeh
serio quando começei programar fazia este controle manualmente, mas nao vale a pena.
exemplo em firebird:
generator:
CREATE GENERATOR GEN_CLIENTES_ID;
trigger:
CREATE TRIGGER CLIENTES_BI FOR CLIENTES
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID_CLIENTE IS NULL) THEN
NEW.ID_CLIENTE = GEN_ID(,1);
END
procedure:
CREATE PROCEDURE SP_GEN_CLIENTES_ID
RETURNS (ID INTEGER)
AS
BEGIN
ID = GEN_ID(, 1);
SUSPEND;
END
banco de dados nao eh meu forte.. mas ajudo com o q eu sei :p
Não consigo fazer o auto incremento pelo banco, sempre da um erro.
Uso firebird 1.5
Que posso fazer?
GOSTEI 0
Gandalf.nho
27/06/2007
Não consigo fazer o auto incremento pelo banco, sempre da um erro.
Uso firebird 1.5
Que posso fazer?
Que tipo de erro ocorre?
GOSTEI 0
Jpauloss
27/06/2007
[quote:7c4c89b020=´jpauloss´]Não consigo fazer o auto incremento pelo banco, sempre da um erro.
Uso firebird 1.5
Que posso fazer?
Que tipo de erro ocorre?[/quote:7c4c89b020]
Vai aí o erro:
----------------------------------------------------------
Project FINANCEIRO.exe raised exception class EUIBError with message ´ violation of PRIMARY or UNIQUE KEY constraint ´PK_FATURAMENTO´.
Invalid insert or update value(s): object columns are contrained - no 2 table rows can have duplicate column values.
Erro Code: 345.
---------------------------------------------------------------
Esse erro só da quando vou gravar o segundo registro.
No primeiro registro grava belezinha sem dar erros.
GOSTEI 0
Nightshade
27/06/2007
sim ele esta escrevendo o mesmo valor na PK
ela não possibilita inserção devido a regra dela ser unica..
ele não ta incrementando o valor..
insere akeles codigos que postei recentemente..
so adapte eles pra sua primary key.. garanto que ira funcionar.
abç
ela não possibilita inserção devido a regra dela ser unica..
ele não ta incrementando o valor..
insere akeles codigos que postei recentemente..
so adapte eles pra sua primary key.. garanto que ira funcionar.
abç
GOSTEI 0