Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DárioSe

Chave primaria duplicada

Recommended Posts

Olá gente estou com um problema aqui eu criei duas tabela uma mestre e outra detalhe, gravei as informações tudo certo, o numero da tabela da tabela mestre foi para tabela detalhe uma belezuca, o erro ocorre quando eu fecho o programa, o meu contador na tabela mestre ele volta a 1 e da violação de chave primaria. já procurei na net e não encontrei assunto a respeito. Se tiverem uma luz ai please!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poderia explica melhor o problema??

 

Esse campo da chave primaria está com autoincremento??? Ou você está fazendo isso via codigo ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá grato por resposder, é o seguinte, eu coloquei os sql das minhas tabelas e o codigo de autoincremento que uso no delphi, estou procurando informações no google a respeito do auto incremento CREATE GENERATOR.

Vou tentar explicar o erro melhor:

1:Eu abro o programa e cadastro cinco pedidos. ele criar uma numeração sequencial atravez do codigo abaixo.

2:Quando fecho o programa e abro outra vez ele reicia o valor sequencial para um provocando o erro de chave primaria duplicada.

Então t+ http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

/* Table: SAIDAMESTRE, Owner: SYSDBA */

 

CREATE TABLE "SAIDAMESTRE"

(

"NRVENDA" INTEGER NOT NULL,

"CODCLIE" INTEGER,

"DATASAIDA" DATE,

PRIMARY KEY ("NRVENDA")

);

 

CREATE TABLE "SAIDAFILHA"

(

"NRVENDA" INTEGER NOT NULL,

"NRITEM" INTEGER NOT NULL,

"CODPRO" INTEGER,

"VALOR_UNIT" DECIMAL(16, 2),

"VALOR_TOTAL" DECIMAL(16, 2),

"UN" VARCHAR(2) CHARACTER SET ISO8859_1,

"QTDI" DECIMAL(16, 2),

PRIMARY KEY ("NRVENDA", "NRITEM")

);

ALTER TABLE "SAIDAFILHA" ADD FOREIGN KEY ("NRVENDA") REFERENCES SAIDAMESTRE ("NRVENDA");

 

 

 

Dtm_movimentos.DtSetMestre.last;

x:=Dtm_movimentos.DtSetMestre.FieldByName('NRVENDA').AsInteger + 1;

Dtm_movimentos.DtSetMestre.append;

Dtm_movimentos.DtSetMestre.FieldByName('NRVENDA').AsInteger:=x;

Edt_cod_cl.SetFocus;

Dtm_movimentos.DtSetMestreDATASAIDA.Value:=date;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual BD está utilizando? Ele não possui um campo autoincremento próprio para o controle disto?

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

meu banco de dados ele é firebird convesso que ate pouco tempo não sabia como fazer auto incremento pelo fire mas a pergunta de sakashita de uma luz, procurei um tuto no google e criei um novo banco com auto incremento, estou tentando nesse momento colocar no delphi. Qualquer dica pode dizer ai! Valeu!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá..

 

Pelo visto você está usando Interbase ou Firebird, não é???

 

Se for, crie sua tabela com um GENERATOR e uma Trigger, aí vai um exemplo com uma tabela com dois campos.

 

/******************************************************************************/

/**** Criação do GENERATOR ****/

/******************************************************************************/

 

CREATE GENERATOR GEN_CLIENTE_INC;

 

CREATE TABLE CLIENTE (

CLI_COD INTEGER NOT NULL,

CLI_DESCRICAO VARCHAR(100)

);

 

/******************************************************************************/

/**** Criação da Primary Key ****/

/******************************************************************************/

 

ALTER TABLE CLIENTE ADD CONSTRAINT PK_CLIENTE PRIMARY KEY (CLI_COD);

 

 

/******************************************************************************/

/**** Triggers ****/

/******************************************************************************/

 

 

SET TERM ^ ;

 

 

 

/******************************************************************************/

/**** Criação de uma trigger BEFORE INSERT ****/

/******************************************************************************/

/* Trigger: UTR_CLIENTE_INC */

CREATE OR ALTER TRIGGER UTR_CLIENTE_INC FOR CLIENTE

ACTIVE BEFORE INSERT POSITION 0

as

begin

if (new.cli_cod is null) then

new.cli_cod = gen_id(gen_cliente_inc,1);

end

^

 

 

SET TERM ; ^

 

O Generator é simplesmente um campo no seu banco de dados q irá guardar seu ultimo código da PK. A Trigger será disparada antes do insert, somando +1 em seu generator e trazendo esse valor para o field da PK.

 

Qualquer coisa, grite!!!

 

Everson Novka

http://www.eversonnovka.com

 

Olá grato por resposder, é o seguinte, eu coloquei os sql das minhas tabelas e o codigo de autoincremento que uso no delphi, estou procurando informações no google a respeito do auto incremento CREATE GENERATOR.

Vou tentar explicar o erro melhor:

1:Eu abro o programa e cadastro cinco pedidos. ele criar uma numeração sequencial atravez do codigo abaixo.

2:Quando fecho o programa e abro outra vez ele reicia o valor sequencial para um provocando o erro de chave primaria duplicada.

Então t+ http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

/* Table: SAIDAMESTRE, Owner: SYSDBA */

 

CREATE TABLE "SAIDAMESTRE"

(

"NRVENDA" INTEGER NOT NULL,

"CODCLIE" INTEGER,

"DATASAIDA" DATE,

PRIMARY KEY ("NRVENDA")

);

 

CREATE TABLE "SAIDAFILHA"

(

"NRVENDA" INTEGER NOT NULL,

"NRITEM" INTEGER NOT NULL,

"CODPRO" INTEGER,

"VALOR_UNIT" DECIMAL(16, 2),

"VALOR_TOTAL" DECIMAL(16, 2),

"UN" VARCHAR(2) CHARACTER SET ISO8859_1,

"QTDI" DECIMAL(16, 2),

PRIMARY KEY ("NRVENDA", "NRITEM")

);

ALTER TABLE "SAIDAFILHA" ADD FOREIGN KEY ("NRVENDA") REFERENCES SAIDAMESTRE ("NRVENDA");

 

 

 

Dtm_movimentos.DtSetMestre.last;

x:=Dtm_movimentos.DtSetMestre.FieldByName('NRVENDA').AsInteger + 1;

Dtm_movimentos.DtSetMestre.append;

Dtm_movimentos.DtSetMestre.FieldByName('NRVENDA').AsInteger:=x;

Edt_cod_cl.SetFocus;

Dtm_movimentos.DtSetMestreDATASAIDA.Value:=date;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.