Ir para conteúdo
Fórum Script Brasil
  • 0

Relacionando Tabelas - Sql -


4njo

Pergunta

Ola ..saudações a todos...

Pessoal, estou querendo trabalhar com a seguinte situação:

criei duas tabelas: [estoque e saida]. quero que , quando registrar a saida de um item, a tabela estoque seja alterada tambem.

pelo que sei , nesses casos posso utilizar relacionamento através de chave primária..

Minha duvida é: existe um relacionamento nas tabelas que criei? ou eu fiz c4g4d4 de novo?

Uma coisa interessante acontece: no Delphi, quando crio as conexoes ,tabelas etc.. form da tabela estoque, insere,grava, deleta..normal....mas o form da tabela saida, fica inativo. E sim! todos os componentes conectados.

segue código das tabelas criadas

CREATE TABLE "estoque" (

"DATA" DATE NOT NULL,

"TIPO" VARCHAR(30),

"MARCA" VARCHAR(30) NOT NULL,

"REPRESENTANTE" VARCHAR(20),

"Valor_Unit" FLOAT,

"QUANTIDADE" VARCHAR(20),

"VALOR TOTAL" FLOAT,

CONSTRAINT "PK_ESTOQUE" PRIMARY KEY ("MARCA")

);

----------------------------------------------------------------------

CREATE TABLE "SAIDA" (

"DATA" DATE NOT NULL,

"TIPO" VARCHAR(30),

"MARCA" VARCHAR(30) NOT NULL,

"VALOR_UNIT" FLOAT,

"QUANTIDADE" VARCHAR(20) NOT NULL,

"VALOR_TOTAL" FLOAT,

PRIMARY KEY ("MARCA", "QUANTIDADE")

);

-------------------------------------------------------------

valeu ..se puderem ajudar...

abraço a todos

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0
pessoal, estou querendo trabalhar com a seguinte situação:

criei duas tabelas: [estoque e saida]. quero que , quando registrar a saida de um item, a tabela estoque seja alterada tambem.

pelo que sei , nesses casos posso utilizar relacionamento através de chave primária..

deseja alterar algum campo na tabela estoque quando registrar um item na saida, é isto? Se form, esta resposta pode depender do banco que você está utilizando.

Se trabalhar com Paradox ou Access, então você terá que fazer este controle no código do programa (para qualquer banco isto pode se aplicar). Se estiver um banco de dados "de verdade" como MySQL, Interbase ou Firebird poderia fazer o uso de trigger.

A questão do relacionamento, realmente envolve o uso de uma chave primária (PK) na tabela master e uma chave estrangeira (FK) na tabela detalhe, viabilizando o uso de integridade referencial (ou seja, o item informado na tabela detalhe tem que existir na tabela master, do contrário é erro).

- uma definição aqui no forum - link;

- um pouco sobre chaves - link

O Paradox até tem recurso para criação de relacionamentos (via Database Desktop) mas, que eu saiba, quase ninguém usa. O pouco que li sobre isso há alguns anos, mostrava que os arquivos mantidos pelo Paradox, para guardar esta informação, corrompiam freqüentemente.

O Access suporta relacionamentos (tem uma opção no menu) e nunca tive problemas.

Se utilizar os bancos de "verdade", você vai criar a Foreign Key definindo a relação a sintaxe:

alter table <tabela_detalhe>

add foreign key (<campo_relacao>) references <tabela_master>(<campo_relacao>),

[foreign key (<campo_relacao>) references <tabela_master>(<campo_relacao>)]

Este relacionamento explícito irá fazer com que o banco de dados garanta a integridade referencial.

Mas o que significa integridade referencial? Em poucas palavras, significa dizer que você não vai fazer a inserção de um campo na tabela detalhe que não exista na tabela master, ou que você não vai poder excluir uma linha da tabela master, sem que antes exclua os itens na tabela detalhe.

No programa o controle pode ser feito utilizando a ligação da tabela detalhe, via propriedade MasterSource (e campos associados), a tabela master.

Se utilizar componentes tipo query, você pode parametrizar a consulta - na cláusula where você coloca o campo de relação.

O mais importante é você ter bem em mente como é este esquema de relacionamento de dados.

CREATE TABLE "estoque" (
  "DATA"    DATE NOT NULL,
  "TIPO"    VARCHAR(30),
  "MARCA"    VARCHAR(30) NOT NULL,
  "REPRESENTANTE"    VARCHAR(20),
  "Valor_Unit"    FLOAT,
  "QUANTIDADE"    VARCHAR(20),
  "VALOR TOTAL"    FLOAT,
CONSTRAINT "PK_ESTOQUE" PRIMARY KEY ("MARCA"));

CREATE TABLE "SAIDA" (
  "DATA"    DATE NOT NULL,
  "TIPO"    VARCHAR(30),
  "MARCA"    VARCHAR(30) NOT NULL,
  "VALOR_UNIT"    FLOAT,
  "QUANTIDADE"    VARCHAR(20) NOT NULL,
  "VALOR_TOTAL"    FLOAT,
 PRIMARY KEY ("MARCA", "QUANTIDADE"));

Minha duvida é: existe um relacionamento nas tabelas que criei? ou eu fiz c4g4d4 de novo?

eu diria existe uma possibilidade de relacionamento entre as duas tabelas, mas...

Percebi que as duas tabelas são iguais, exceção a chave primária criada. Estas tabelas são hipotéticas, apenas para exemplificação, ou são reais? É que me parece estranho a tabela ter um campo chave que aparentemente irá ocorrer n vezes - chaves primárias não admitem repetição, são únicas (viu o link acima). Também estranhei você guardar Quantidade como um VARCHAR.

A título de exemplo visual de relacinamento, vou por uma imagem que tenho de um em Access. Observe que o campo que relaciona os itens é NrMatricula em Pessoa:

1183271965_relacionamento_mini.JPG

A definição das tabelas do banco de dados, e seus relacinamentos, não deve ser uma coisa que vai acontecendo...

Tem que ser planejada - por (pelo menos) no papel ajuda bastante.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --4njo --

C4r4l3o Micheus....que é isso cara? po...vou ler seu texto depois te dou um retorno, mas SIM.....to usando um DB de homem...rs.r.s....InterBase.

VALEU BROTHER!

Grande Micheus..rs. :ph34r:

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --4njo --

Micheus...atraves do link percebi o seguinte: me corrija se estiver errado:

Pelo jeito minha tabela "saida" se transforma automaticamente em chave estrangeira , quando a chave primária e o mesmo campo (exemplo: "MARCA") certo?....

o lance das tabelas terem os campos iguais..eu fiquei meio no ar..... exemplo: os itens inseridos na tabela estoque , não podem deixar de registrar a "baixa" de um produto na tabela "saida", que por sua vez são os mesmos.

Tipo, sai 1 acucar da marca brasil, na tabela saida , automaticamente a tabela estoque recebe esse registro e diminui a quantidade do acucar brasil no banco. meu pensamento esta certo..? to achando meio estranho o que estou fazendo....depois de ter lido seu texto....

mas depois eu posto sobre o restante e sober a evoluçao das coisas...... vou pensando aqui....

abraço.....

Link para o comentário
Compartilhar em outros sites

  • 0
Pelo jeito minha tabela "saida" se transforma automaticamente em chave estrangeira , quando a chave primária e o mesmo campo (exemplo: "MARCA") certo?....
do ponto de vista do conceito sim. Então é isto mesmo.

Fique atento ao que coloquei com relação a chave primária da tabela principal - tem que ser única. Se existirem n itens nesta tabela, e o campo da chave poder ser repetido, então ela não será única e, ao tentar inserir um outro registro com este valor você receberá um "Key Vialation". A chave estrangeira (também é um índice), em termos de modelagem de dados, contém todos os campos da chave primária da tabela relacionada (principal) e normalmente (não necessariamente) mais algum.

Já que utiliza "DB de homem", avalie a criação das integridades referenciais (como mencionei antes), mas vai implicar na correta observação do que disse no parágrafo anterior.

Mas esse lance de modelagem de dados, aplicação das regras de normalização do banco de dados estão fora do meu escopo - tem que pesquisar por ai. ;) (se não me engano já posteis links sobre isso - post

o lance das tabelas terem os campos iguais..eu fiquei meio no ar..... exemplo: os itens inseridos na tabela estoque , não podem deixar de registrar a "baixa" de um produto na tabela "saida", que por sua vez são os mesmos.

Tipo, sai 1 acucar da marca brasil, na tabela saida , automaticamente a tabela estoque recebe esse registro e diminui a quantidade do acucar brasil no banco. meu pensamento esta certo..? to achando meio estranho o que estou fazendo....depois de ter lido seu texto....

isso pode depender da sua lógica. Então, fica complicado eu opnar, até porque a única implementação que fiz neste sentido era muito simplória.

Espero que outros colegas que trabalham/trabalharam com isto possam lhe ajudar.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...