Violação de chave estrangeira
Galera seguinte estou com um problemão.
Tenho um sistema contábil, e está dando erro de violação de chave estrangeira.
Banco de Dados Firebird 2.0. Utilizo, o IBDataBase + IBTransaction + IBDataSet + DataSource.
Tenho uma tabela de CLIENTES cuja chave primária é COD_CLIENTE e nessa tabela eu tenho o campo chamado CIDADE, que é ´CHAVE ESTRANGEIRA´ da minha tabela de CIDADES.
Quando eu tento salvar um registro na tabela de CLIENTES, da o seguinte erro.
O campo cidades, no meu form clientes, é um TDBLookupComboBox.
Procurei aqui no fórum e não consegui achar uma luz.
Ve se alguém consegue me ajudar.
Tenho um sistema contábil, e está dando erro de violação de chave estrangeira.
Banco de Dados Firebird 2.0. Utilizo, o IBDataBase + IBTransaction + IBDataSet + DataSource.
Tenho uma tabela de CLIENTES cuja chave primária é COD_CLIENTE e nessa tabela eu tenho o campo chamado CIDADE, que é ´CHAVE ESTRANGEIRA´ da minha tabela de CIDADES.
Quando eu tento salvar um registro na tabela de CLIENTES, da o seguinte erro.
´violation of FOREIGN KEY constraint "FK_CLIENTES_CIDADES" on table "CLIENTES".
O campo cidades, no meu form clientes, é um TDBLookupComboBox.
Procurei aqui no fórum e não consegui achar uma luz.
Ve se alguém consegue me ajudar.
Edivaldo_ap
Curtidas 0
Respostas
Marco Salles
02/08/2006
So uma pergunta .... Posso estar enganado
mas voce disse
Tenho uma tabela de CLIENTES cuja chave primária é COD_CLIENTE e nessa tabela eu tenho o campo chamado CIDADE, que é ´CHAVE ESTRANGEIRA´ da minha tabela de CIDADES.
[b:659dfc9fa9]Não seria assim :[/b:659dfc9fa9]
Tenho uma tabela de CLIENTES cuja chave primária é COD_CLIENTE e
Tenho Uma tabela Cidades . nessa tabela eu tenho o campo chamado CIDADE, que é chave primária e é ´CHAVE ESTRANGEIRA´ da tabela de Clientes.
Ficando assim o Relacionamento
será que estou enganado :oops: :oops: :oops:
mas voce disse
Tenho uma tabela de CLIENTES cuja chave primária é COD_CLIENTE e nessa tabela eu tenho o campo chamado CIDADE, que é ´CHAVE ESTRANGEIRA´ da minha tabela de CIDADES.
[b:659dfc9fa9]Não seria assim :[/b:659dfc9fa9]
Tenho uma tabela de CLIENTES cuja chave primária é COD_CLIENTE e
Tenho Uma tabela Cidades . nessa tabela eu tenho o campo chamado CIDADE, que é chave primária e é ´CHAVE ESTRANGEIRA´ da tabela de Clientes.
Ficando assim o Relacionamento
Tab Cidade Campo Cidade -->> PK Outros campos Tab Clientes Campo Codigo ---->>PK campo Cidades --->>> FK
será que estou enganado :oops: :oops: :oops:
GOSTEI 0
Edivaldo_ap
02/08/2006
Correto... você está certo eu é que me expressei mal. Porém continuo com o problema.
Será que alguém pode me ajudar?
Edivaldo.
Será que alguém pode me ajudar?
Edivaldo.
GOSTEI 0
Marco Salles
02/08/2006
blz ... Voce disse estar usando um Campo Look
Então , no seu dataset tem o campo Cidade e o Campo LookCidades :!: :!:
O campo cidades é um campo fisico da tabela , ja o campo lookCidades é um campo Virtual...
eu não ´tenho certeza´ , mas ´acho´ a que pode estar [b:db79774cef]ai[/b:db79774cef] o motivo da reclamação por parte do banco.
Então , no seu dataset tem o campo Cidade e o Campo LookCidades :!: :!:
O campo cidades é um campo fisico da tabela , ja o campo lookCidades é um campo Virtual...
Quando voce vai dar um Post , voce atribui o valor do campo lookCidades ao Campo Cidades ....Tipo isto ????
SeuDataSetCidade.asstring:=SeuDataSetLookCidades.AsString
eu não ´tenho certeza´ , mas ´acho´ a que pode estar [b:db79774cef]ai[/b:db79774cef] o motivo da reclamação por parte do banco.
GOSTEI 0
Edivaldo_ap
02/08/2006
Seguninte galera eu tentei inserir um novo registro direito no IBExpert, e mesmo assim ta dando erro, no campo CIDADE não sei como resolver, pior é que nessa mesma tabela de CLIENTES eu tenho um campo ESTADO e um campo COD_PESSOA que também são chave estrangeiras. ficando minha tabela de CLIENTES assim:
Porém só o campo cidade é que ta dando erro.
O que pode ser esse erro????
PK COD_CLIENTE INTEGER NOT NULL, RAZAO_NOME VARCHAR(80) NOT NULL, ENDERECO VARCHAR(50), COMPLEMENTO VARCHAR(20), CEP VARCHAR(10), FK COD_PESSOA INTEGER, TELEFONE VARCHAR(14), FAX VARCHAR(14), HOME_PAGE VARCHAR(80), E_MAIL VARCHAR(80), CPF_CNPJ VARCHAR(20) NOT NULL, NUMERO VARCHAR(10), FK CIDADE INTEGER, RG_INSC_MUNICIPAL VARCHAR(30), INSC_ESTADUAL VARCHAR(30), FK ESTADO INTEGER, BAIRRO VARCHAR(40), CELULAR VARCHAR(14)
Porém só o campo cidade é que ta dando erro.
O que pode ser esse erro????
GOSTEI 0
Marco Salles
02/08/2006
como o erro acontece ate usando o IbExpert , seria talves interresante mostrar como esta a DLL dessas tres tabelas , para que possamos tentar simular o erro ...
Mas so duas perguntinhas ,.
1)
quando voce esta inserindo os dados pelo IbExpert , no campo Cidade da Tabela Clientes , voce digita o nome da cidade ou usa a <SETA> que aparece , devido ao relacionamentos
2)
Sua tabela Cidades ja tem dados inseridos nela...
Mas so duas perguntinhas ,.
1)
quando voce esta inserindo os dados pelo IbExpert , no campo Cidade da Tabela Clientes , voce digita o nome da cidade ou usa a <SETA> que aparece , devido ao relacionamentos
2)
Sua tabela Cidades ja tem dados inseridos nela...
GOSTEI 0
Edivaldo_ap
02/08/2006
Respondendo as duas perguntas.
1) Quando estou inserindo no IBExpert eu uso a SETA para selecionar o item.
2) Sim, minha tabela de Cidades tem todas as cidades do Brasil cadastradas, e a tabela de Estados tem todos os estados pré-cadastrados.
Aí vai a DLL das três tabelas.
TABELA DE CLIENTES
TABELA DE ESTADOS
TABELA DE CIDADES
Espero que alguém possa me ajudar ou me dar alguma dica.... Obrigado pelo esforço gente.
Edivaldo André Pereira.
1) Quando estou inserindo no IBExpert eu uso a SETA para selecionar o item.
2) Sim, minha tabela de Cidades tem todas as cidades do Brasil cadastradas, e a tabela de Estados tem todos os estados pré-cadastrados.
Aí vai a DLL das três tabelas.
TABELA DE CLIENTES
/******************************************************************************/ /**** Generated by IBExpert 13/8/2006 23:38:19 ****/ /******************************************************************************/ SET SQL DIALECT 3; SET NAMES NONE; /******************************************************************************/ /**** Tables ****/ /******************************************************************************/ CREATE GENERATOR ID_CLIENTE; CREATE TABLE CLIENTES ( COD_CLIENTE INTEGER NOT NULL, RAZAO_NOME VARCHAR(80) NOT NULL, ENDERECO VARCHAR(50), COMPLEMENTO VARCHAR(20), CEP VARCHAR(10), COD_PESSOA INTEGER, TELEFONE VARCHAR(14), FAX VARCHAR(14), HOME_PAGE VARCHAR(80), E_MAIL VARCHAR(80), CPF_CNPJ VARCHAR(20) NOT NULL, NUMERO VARCHAR(10), CIDADE INTEGER, RG_INSC_MUNICIPAL VARCHAR(30), INSC_ESTADUAL VARCHAR(30), ESTADO INTEGER, BAIRRO VARCHAR(40), CELULAR VARCHAR(14) ); /******************************************************************************/ /**** Primary Keys ****/ /******************************************************************************/ ALTER TABLE CLIENTES ADD CONSTRAINT PK_CLIENTES PRIMARY KEY (COD_CLIENTE); /******************************************************************************/ /**** Foreign Keys ****/ /******************************************************************************/ ALTER TABLE CLIENTES ADD CONSTRAINT FK_CLIENTES_CIDADES FOREIGN KEY (CIDADE) REFERENCES CIDADES (COD_CIDADE) ON DELETE SET NULL ON UPDATE CASCADE; ALTER TABLE CLIENTES ADD CONSTRAINT FK_CLIENTES_ESTADOS FOREIGN KEY (ESTADO) REFERENCES ESTADOS (COD_ESTADO) ON DELETE SET NULL ON UPDATE CASCADE; ALTER TABLE CLIENTES ADD CONSTRAINT FK_COD_PESSOA FOREIGN KEY (COD_PESSOA) REFERENCES PESSOA (COD_PESSOA) ON DELETE SET NULL ON UPDATE CASCADE; /******************************************************************************/ /**** Triggers ****/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /**** Triggers for tables ****/ /******************************************************************************/ /* Trigger: CLIENTES_BI */ CREATE TRIGGER CLIENTES_BI FOR CLIENTES ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.COD_CLIENTE IS NULL) THEN NEW.COD_CLIENTE = GEN_ID(ID_CLIENTE,1); END ^ SET TERM ; ^ /******************************************************************************/ /**** Privileges ****/ /******************************************************************************/
TABELA DE ESTADOS
/******************************************************************************/ /**** Generated by IBExpert 13/8/2006 23:39:49 ****/ /******************************************************************************/ SET SQL DIALECT 3; SET NAMES NONE; /******************************************************************************/ /**** Tables ****/ /******************************************************************************/ CREATE GENERATOR ID_ESTADO; CREATE TABLE ESTADOS ( COD_ESTADO INTEGER NOT NULL, DESCRICAO VARCHAR(30), SIGLA VARCHAR(2) ); /******************************************************************************/ /**** Primary Keys ****/ /******************************************************************************/ ALTER TABLE ESTADOS ADD CONSTRAINT PK_ESTADOS PRIMARY KEY (COD_ESTADO); /******************************************************************************/ /**** Triggers ****/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /**** Triggers for tables ****/ /******************************************************************************/ /* Trigger: ESTADOS_BI */ CREATE TRIGGER ESTADOS_BI FOR ESTADOS ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.COD_ESTADO IS NULL) THEN NEW.COD_ESTADO = GEN_ID(ID_ESTADO,1); END ^ SET TERM ; ^ /******************************************************************************/ /**** Privileges ****/ /******************************************************************************/
TABELA DE CIDADES
/******************************************************************************/ /**** Generated by IBExpert 13/8/2006 23:40:20 ****/ /******************************************************************************/ SET SQL DIALECT 3; SET NAMES NONE; /******************************************************************************/ /**** Tables ****/ /******************************************************************************/ CREATE GENERATOR ID_CIDADE; CREATE TABLE CIDADES ( COD_CIDADE INTEGER NOT NULL, DESCRICAO VARCHAR(40), COD_ESTADO INTEGER ); /******************************************************************************/ /**** Primary Keys ****/ /******************************************************************************/ ALTER TABLE CIDADES ADD PRIMARY KEY (COD_CIDADE); /******************************************************************************/ /**** Foreign Keys ****/ /******************************************************************************/ ALTER TABLE CIDADES ADD CONSTRAINT FK_COD_ESTADO FOREIGN KEY (COD_ESTADO) REFERENCES ESTADOS (COD_ESTADO) ON DELETE SET NULL ON UPDATE CASCADE; /******************************************************************************/ /**** Triggers ****/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /**** Triggers for tables ****/ /******************************************************************************/ /* Trigger: CIDADES_BI */ CREATE TRIGGER CIDADES_BI FOR CIDADES ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.COD_CIDADE IS NULL) THEN NEW.COD_CIDADE = GEN_ID(ID_CIDADE,1); END ^ SET TERM ; ^ /******************************************************************************/ /**** Privileges ****/ /******************************************************************************/
Espero que alguém possa me ajudar ou me dar alguma dica.... Obrigado pelo esforço gente.
Edivaldo André Pereira.
GOSTEI 0
Marco Salles
02/08/2006
Provavelmente isto esta ocorrendo pq voce criou uma reduntancia na definição do seu Banco...
Qaundo voce inseri um Dado na Tabela Clientes , voce coloca o Valor No Campo COD_CLIENTE ou Deixa o Gerador determinar este valor ???
Antes de prosseguir , sugiro que voce coloque um[b:ae55610607] valor manulamente [/b:ae55610607]no Campo COD_CLIENTE e veja se vai dar erro...Tenho 99,99¬ que ele aceita....
TabClientes
FKCidade
FKEstado --->>>reduntante
TabelaCidades
FKEstado
TabelaEstado
PKEstado
Qaundo voce inseri um Dado na Tabela Clientes , voce coloca o Valor No Campo COD_CLIENTE ou Deixa o Gerador determinar este valor ???
Antes de prosseguir , sugiro que voce coloque um[b:ae55610607] valor manulamente [/b:ae55610607]no Campo COD_CLIENTE e veja se vai dar erro...Tenho 99,99¬ que ele aceita....
GOSTEI 0