Fórum U.F.O : Key Violation em chave estrangeira??? vc já viu? #286401

29/06/2005

0

Oi, A coisa é de loko:
Numca vi um erro de Key violation em Chave estrangeira, pois esse é o erro q ta dando na tbl.
eu tenho uma tbla Dtail de Diciplinas do Curso, a estrutura é assim:

**codCurso,**CodDiciplina,NomeDiciplina,*CodProfessor,Cargahoraria

**= Chave Primaria
* = Chave Estrangeira

quando eu cadastro duas diciplinas com o mesmo professor ele me mostra o erro Key Violation.

Como se resolve isso?


Daniel Martins

Daniel Martins

Responder

Posts

29/06/2005

Motta

[quote:29e512e7ce=´DAniel S Martins´]... quando eu cadastro duas diciplinas com o mesmo professor ele me mostra o erro Key Violation....[/quote:29e512e7ce]

Professor não devia estar na PK ?!


Responder

Gostei + 0

29/06/2005

Daniel Martins

O CodProfessor é chave Estrangeira a tbl DiciplinaCurso tem ChaveComposta por: CodCurso, CodDiciplina
uso DBXpress para o Acesso no Banco IB6


Responder

Gostei + 0

29/06/2005

Marlon Spiess

Vc está usando table e datasource :?:
Vc está usando mastertable :?:
Vc está usando paradox :?:
Vc definiu na tables a foreingkey :?:

Um pouco mais de detalhes ajuda :!:


Responder

Gostei + 0

29/06/2005

Daniel Martins

ok
estou usando os componentes:
SQLQuery1, DataSetProvider1, ClientDataSet1, DataSource1
todos com as suas respectivas conexoes. no componente SQLQuery1 uso o sql:

SELECT DC.*,
(SELECT P.NM_PROFESSOR FROM PROFESSOR P WHERE P.ID_PROFESSOR = DC.ID_PROFESSOR) AS PROFESSOR
FROM DICIPLINA_CURSO DC
WHERE DC.ID_CURSO =:CODCURSO

a estrutura das telas e conexoes e configuração dos componentes é a mesma do artigo de capa da edição 61 da Clube Delphi...
Pra quem ja leu, eu Utilizei todas as dicas q foram mostradas.


Responder

Gostei + 0

29/06/2005

Daniel Martins

Inclusive as Configurações do DataSetprovider...


Responder

Gostei + 0

29/06/2005

Jairroberto

Olá, Daniel!

Esse ´key violation´ a que você se refere deve ser ´violation of primary key´, pois como disse o Motta, se você não colocar o ID_PROFESSOR na chave primária e incluir dois ID_DISCIPLINA iguais para dois ID_CURSO iguais, seja qual for o professor, vai violar a chave primária. Veja:

Curso    Disciplina    Professor
1        1             1
1        1             2  -> Violação (Curso=1 e Disciplina=1)



Um abraço,
Jair


Responder

Gostei + 0

30/06/2005

Daniel Martins

Amigo, Compreendi completamente o qvc disse, porem o erro ocorre assim:
Curso Diciplina Nome Professor
1 1 teste 1
1 2 teste2 2
1 3 teste3 1 =>Key Violation (Duas materias com o mesmo professor)

o ID_PROFESSOR num ta na chave primaria por que ele é chave estrangeira.


Responder

Gostei + 0

30/06/2005

Jairroberto

Olá, Daniel!

Qual é exatamente a mensagem de erro que você está recebendo?

Obs.: um campo que pertence a uma chave estrangeira também pode pertencer à chave primária.


Um abraço,
Jair


Responder

Gostei + 0

01/07/2005

Daniel Martins

Tabela Curso
**CodCurso |NomeCurso
        1          Cuspe a Distancia
______________________________________________
Tabela Diciplinas do Curso:
**CodCurso | **CodDiciplina | Nome                     | CodProfessor
      1                     1               Técnicas de cuspe             1
      1                     2               Tipos de Cuspe                 2
      1                     3               Tipo de Alvos                    1 =>(Key V)
_ _____________________________________________
Tabela Professor:
**CodProfessor | NomeProfessor
         1                  Fulano
         2                  Beltrano
         3                  Ciclana
         ...                  ...

A Estrutura das Tabelas informadas acima mostra o como esta o programa e onde realmente da o erro.
Qdo é Cadastrado uma 2 diciplinas Diferentes, mas com o mesmo professor ele da esse erro, isso é um problema por q , pode um professor dar duas diciplinas diferentes....
Deu entender?
A coisa é estranha mesmo...
na verdade eu acho que o problema pode ser no SqL...
Obs: o DataSetProvider esta Configurado como´ whereKeyOnly´


Responder

Gostei + 0

01/07/2005

Luciohc

Daniel,
Já vi esse erro e demorei para achar uma solução, mas encontrei.
Não sei se vai ser útil a você, vamos lá.

A minha solução foi setar a propriedade INKEY do SQLDATASET E CLIENTDATASET PARA FALSE. Campos que repetem os dados não podem ter INKEY = true. No meu caso resolveu, espero que te ajude.


Lúcio ...


Responder

Gostei + 0

02/07/2005

Daniel Martins

Valeu, tentarei isso e depois digo se resolveu
obrigado pela dica


Responder

Gostei + 0

05/07/2005

Daniel Martins

Saudações!
Escrevo para dizer o q fiz para resolver o meu problema....
eu disse que tinha a query
Qry1:
SELECT DC.*,
(SELECT P.NM_PROFESSOR FROM PROFESSOR P WHERE P.ID_PROFESSOR = DC.ID_PROFESSOR) AS PROFESSOR
FROM DICIPLINA_CURSO DC
WHERE DC.ID_CURSO =:CODCURSO

Com esse Sql dava o erro Key Violation qdo a variavel ID_PROFESSOR era preenchida...
fiz uma outra Query com o sql:
Qry2:
SELECT DC.*,
FROM DICIPLINA_CURSO DC
WHERE DC.ID_CURSO =:CODCURSO
deforma q so listaria as variaveis: IdCurso,IdDiciplina,IdProfessor

Ao Salvar o Novo Registro Preencho estas variaveis na Qry2 e salvo.
e Atualizo a Qry1 para o Usuario.
Resumo:
Utilizei 2 Querys. 1 para o Cadastro e Outra para a Listagem....

Lokura né?? mas resolveu....


Responder

Gostei + 0

05/07/2005

Ivanh

na propriedade providerflags vc tem que dizer quem é chave primaria:

pfInKey := true



Responder

Gostei + 0

10/07/2005

Daniel Martins

Ja tentei...


Responder

Gostei + 0

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

Aceitar