GARANTIR DESCONTO

Fórum Violação de chave primária. #343075

27/06/2007

0

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

Responder

Post mais votado

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


Nightshade

Nightshade
Responder

Gostei + 1

Mais Posts

27/06/2007

Jpauloss

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?


Responder

Gostei + 0

27/06/2007

Gandalf.nho

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?


Responder

Gostei + 0

27/06/2007

Jpauloss

[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.


Responder

Gostei + 0

27/06/2007

Nightshade

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ç


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar