Ir para conteúdo

Arquivado

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

Aprendizporumavida

Chave Estrangeira

Recommended Posts

Bom dia pessoal..

 

Seguinte.. estou montando uma aplicação, e estou com algumas dúvidas no relacionamento de minhas tabelas.

 

Preciso criar um relacionamento entre tabela tb_mov_itens_entrada e tabela tb_entrada.. por exemplo:

 

Tabela tb_mov_itens_entrada

 

XCD_INT_MOV_ITENS identity

 

XCD_INT_NF INTEGER NOT NUll chave primária composta

XCD_INT_PRODUTO INTEGER Not null chave primária composta --> (referenciado a tabela produto)

XNF VARCHAR(6) NOT NULL chave primária composta

XCFOP VARCHAR(4) NOT NULL chave primária composta

XALIQUOTA_ICMS DECIMAL(18,2) not null chave primária composta

.

.

.

demais campos..

 

Tabela Tb_entrada

 

XCD_INT_NF IDENTITY

XDT DATE NOT NULL ,

XALIQUOTA_ICMS DECIMAL(18,2) DEFAULT '00.00' NOT NULL , chave primária composta

XNF VARCHAR(6) NOT NULL , chave primária composta

XCD_INT_FORNECEDOR INTEGER NOT NULL , chave primária composta

XCFOP VARCHAR(4) NOT NULL , chave primária composta

XDT_EMISSAO DATE NOT NULL ,

XVALOR_CONTABIL DECIMAL(18,2) NOT NULL ,

.

.

.

demais campos

 

minha dúvida é a seguinte..

na tabela tb_entrada tenho o campo xcd_int_nf e o mesmo não faz parte da chave primária, no entanto tenho este mesmo campo na tabela

tb_mov_itens_entrada, e nesta tabela ele será parte da chave composta.

No caso o campo xcd_int_nf da tabela tb_mov_itens_entrada esta referenciado a tabela tb_entrada..

Existe esta possibilidade de poder dizer que o campo integrante da chave composta de uma tabela, só pode existir se na tabela correspondente tiver pré-cadastrado, mas mesmo ele não sendo na tabela correspondente uma chave primária ?

 

Ou seja, eu posso relacionar tabelas, usando campos, que não são chaves primárias..

Ex:

vou relacionar a tabela de produtos a fornecedor,

na tabela fornecedor a chave primária é XCD_INT_FORNECEDOR...no entanto quero que grave na tabela produtos ao invés deste código do fornecedor, grave o campo XCNPJ que não é chave.

 

Posso obter este tipo de relacionamento, pois não estou conseguindo montar..

 

Desde já..obrigado pessoal..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola aprendiz.

 

qdo você diz:

"vou relacionar a tabela de produtos a fornecedor,

na tabela fornecedor a chave primária é XCD_INT_FORNECEDOR...no entanto quero que grave na tabela produtos ao invés deste código do fornecedor, grave o campo XCNPJ que não é chave.

 

Posso obter este tipo de relacionamento, pois não estou conseguindo montar"

 

Que msg de erro gera?! Que tipo de dados são estes campos?

 

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exemplo tenho a tabela fornecedor

 

tb_fornecedor

xcd_int_fornecedor campo identity (chave primária) not nul

xrazao campo varchar not nul

xcnpj varchar not nul

xendereco varchar null

.

.

.

demais campos

 

tabela produtos

 

tb_produtos

xcd_int_produtos campo identity (chave primária) not nul

xdescricao campo varchar not nul

xquantidade varchar not nul

xpeso varchar null

xcd_int_fornecedor campo integer (chave estrangeira) só pode cadastrar se existente na tabela fornecedor

.

.

.

demais campos

 

Minha dúvida é a seguinte, ao invés de usar o campo xcd_int_fornecedor na tabela produtos como chave estrageira, utilizar o XCNPJ.

ou seja retiro o xcd_int_fornecedor e informo xcnpj e relaciono a fornecedor, mesmo na tabela fornecedor o XCNPJ não sendo primária ?

 

Posso fazer isto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola aprendiz.

 

Poder você pode, soh de uma olha no impacto que isso pode trazer na sua aplicacao.

Nao eh necessario que o campo seja chave para ser "estrangeira" em outra tabela.

Se gerar algum erro, de uma olhada nos tipos de campos.

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Encontrei uma matéria dizendo que é possível mas desde que o campo que será chave estrangeira seja um indice unico

 

Ou seja como eu iria usar o campo xcnpj para ser a chave estrangeira, ele também não poderia se repetir dentro da tabela do fornecedor, e eu deveria dizer ao banco que ele é um indice unico.

 

Mas se eu quiser usar um outro campo que se repete dentro da tabela fornecedor eu posso? tipo RAZAO ou Telefone.. apenas a exemplo, posso utilizar um campo como chave estrangeira que se repete ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aprendiz,

Nunca tentei fazer um relaciomento deste modo, porem, eu nao tenho esta pratica de usar campos do tipo text ou char pra fazer relaciomentos. Tive um problema com performance qdo utilizei estes tipos de campos.

você jah tentou usar o xcnpj como postou acima??? Faz um teste rapido em um ambiente de teste. Estou sem meu pc hj entao nao estou conseguindo testar =\

 

Em uma tabela eu nao preciso ter necessiramente ter somente um indice. eu tenho tabelas em que foi necessario criar mais indices, tanto para performance (pq eram tabelas com mais de 500 mil registros) como para PK/FK.

 

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

A situação que coloquei acima é apenas hipotética

 

Estou com uma situação real que é a seguinte.

 

Tenho duas tabelas, uma TB_MOV_ENTRADA que é a tabela de entrada de NF

e outra que é TB_MOV_ITENS ENTRADA.

 

TB_MOV_ENTRADA

 

"XCD_INT_NF" IDENTITY DEFAULT '0',

"XALIQUOTA_ICMS" DECIMAL(18,2) DEFAULT '00.00' NOT NULL chave composta

"XNF" VARCHAR(6) NOT NULL , chave composta

"XCD_INT_FORNECEDOR" INTEGER NOT NULL , chave composta (e estrangeira da tabela fornecedor)

"XCFOP" VARCHAR(4) NOT NULL , chave composta

"XDT_EMISSAO" DATE NOT NULL ,

"XDT" DATE NOT NULL ,

"XVALOR_CONTABIL" DECIMAL(18,2) NOT NULL ,

 

ou seja nesta tabela minha chave primária é composta de 4 campos e um dos campos é estrangeiro a tabela fornecedor que é o campo

xcd_int_fornecedor, mas até aqui tudo bem, consegui criar sem problemas, o problema inicia ao criar

esta segunda tabela.

 

 

 

TB_MOV_ITENS_ENTRADA

 

"XCD_INT_MOV_ITENS" IDENTITY NOT NULL ,

"XCD_INT_NF" INTEGER NOT NULL , chave composta(e estrangeira da tabela ACIMA TB_MOV_ENTRADA)

"XCD_INT_PRODUTO" INTEGER NOT NULL , chave composta(e estrangeira da tabela produto)

"XQUANTIDADE" DECIMAL(18,2),

"XICMS" VARCHAR(50) CASE ,

"XDESCONTO" VARCHAR(50) CASE ,

"XPRECO_CUSTO" VARCHAR(50) CASE ,

"XCUSTO_MEDIO" VARCHAR(50) CASE ,

"XCUSTO_FINAL" VARCHAR(50) CASE ,

 

nesta tabela minha chave primária é composta de 2 campos e um dos campos é estrangeiro a tabela produtos que é o campo

xcd_int_produto e o outro é estrangeira a tabela TB_MOV_ENTRADA que é o campo XCD_INT_NF, nesta segunda tabela não consigo criar o relacionamento, a tabela e as chaves primárias eu consigo, mas o relacionamento não, li um post dizendo que se a chave estrangeira não for primária na tabela de origem(que fornece o valor) tem que ser uma unique index, criei também o indice unico, mas não consigo montar o relacionamento, nem manual, nem pelo scrip.

 

Posso montar este tipo de relacionamento ? onde estou errando ?

 

desde já Obrigado pessoal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aprendiz,

 

o relacionamento que ker montar esta correto.

Qdo você cria pelo enterprise, desmarque a opção "check existing data on creation".

você jah tem dados nestas tabelas?! Se tiver, nao tem dados duplicados?! pode ser um dos problemas.

Qdo você gera, que erro gera?!

Pq insisto tanto mas msg de erro?!

Muitas vezes a msg de erro traz um código onde eh possivel identificar o operador e a linha que esta dando erro.

 

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando rodo o script

 

ALTER TABLE TB_MOV_ITENS_ENTRADA ADD CONSTRAINT FK_XCD_INT_NF foreign key ("XCD_INT_NF")

references tb_mov_entrada("xcd_int_nf")

 

ele me apresenta o erro

 

[LNA][Pervasive][ODBC Engine Interface][Data Record Manager] The application

encountered an incompatible mode error (Btrieve Error 88)

 

mas já estou começando a achar que é problema do banco que utilizo..

Vou mudar a forma que estou trabalhando pra poder dar sequência.

 

 

Eu consigo criar, uma chave primária com um único campo

 

e uma secundária..não sei nem se existe chave secundária..

Composta de 4 campos ?

 

Como proceder..

 

obrigado Jus..por mais esta..

 

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso jah tah pior que novela mexicana rs http://forum.imasters.com.br/public/style_emoticons/default/devil.gif

 

Seguinte, poder você pode ter "n" chaves secundarias em sua tabela, mas você vai cair em problema de performance.

Qual o banco q você esta rodando isso? 2000? 2005? Oracle? Access?

O erro em questao eh sobre tipos de dadosmas eu rodei em sql 2000 e rodou http://forum.imasters.com.br/public/style_emoticons/default/upset.gif

 

Um modo RTA de se fazer, eh criar estas chaves secundarias, mas soh toma cuidado com performance ok?!

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu amigo..eu diria que pior que novelas do SBT..

 

Eu uso o banco PERVASIVE, desisti de fazer desta forma..

 

o que eu fiz foi definir o campo XCD_INT_NF da tabela TB_MOV_ENTRADA como chave primária e os campos que

compunham a chave composta eu defini como uma unique index..

 

E funcionou que é uma beleza..

 

 

Acredito que eu até possa fazer do jeito que eu estava fazendo no SQL server 2005, pois rodei

meus scripts no sql 2005 e não obtive nenhum problema..mas no pervasive..vixi..deixa pra lá..

 

Mas o importante que solucionei..

 

Obrigado pelo help jus2ka

 

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aprendiz,

realmente em SQL 2000 ou SQL 2005 vai que eh uma beleza. Nao conheco este banco "Pervasive" =\

As dicas e posts que eu te indiquei foram para SQL, pq eu pensei que você estava usando SQL :(

 

Mas o bom ehq você resolveu. QQ duvida eh soh perguntar ^^ estamos aki para ajudar (ou tentar pelo menos)

 

abs e boa sorte

 

Júnior

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.