Violação de chave primária.

Delphi

27/06/2007

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;


Jpauloss

Jpauloss

Curtidas 0

Melhor post

Nightshade

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


GOSTEI 1

Mais Respostas

Jpauloss

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

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

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

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ç


GOSTEI 0
POSTAR