Fórum Violação de chave primária. #343075
27/06/2007
0
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
Curtir tópico
+ 0Post mais votado
27/06/2007
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
Gostei + 1
Mais Posts
27/06/2007
Jpauloss
Não consigo fazer o auto incremento pelo banco, sempre da um erro.
Uso firebird 1.5
Que posso fazer?
Gostei + 0
27/06/2007
Gandalf.nho
Que tipo de erro ocorre?
Gostei + 0
27/06/2007
Jpauloss
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
27/06/2007
Nightshade
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
Clique aqui para fazer login e interagir na Comunidade :)