DárioSe 0 Denunciar post Postado Setembro 22, 2009 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
sakashita 0 Denunciar post Postado Setembro 22, 2009 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
DárioSe 0 Denunciar post Postado Setembro 23, 2009 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
Chrnos 30 Denunciar post Postado Setembro 23, 2009 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
DárioSe 0 Denunciar post Postado Setembro 23, 2009 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
Everson Novka 0 Denunciar post Postado Setembro 26, 2009 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