GARANTIR DESCONTO

Fórum Violação de chave estrangeira #326640

02/08/2006

0

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.

´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

Edivaldo_ap

Responder

Posts

02/08/2006

Marco Salles

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

Tab Cidade
Campo Cidade -->> PK
Outros campos

Tab Clientes
Campo Codigo ---->>PK
campo Cidades --->>> FK


será que estou enganado :oops: :oops: :oops:


Responder

Gostei + 0

03/08/2006

Edivaldo_ap

Correto... você está certo eu é que me expressei mal. Porém continuo com o problema.


Será que alguém pode me ajudar?

Edivaldo.


Responder

Gostei + 0

03/08/2006

Marco Salles

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

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.


Responder

Gostei + 0

09/08/2006

Edivaldo_ap

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:

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????


Responder

Gostei + 0

09/08/2006

Marco Salles

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


Responder

Gostei + 0

13/08/2006

Edivaldo_ap

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

/******************************************************************************/
/****               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.


Responder

Gostei + 0

14/08/2006

Marco Salles

Provavelmente isto esta ocorrendo pq voce criou uma reduntancia na definição do seu Banco...

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


Responder

Gostei + 0

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

Aceitar