QUOTE(4njo @ 30/06/2007 - 10:42)

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 -
linkO 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.
CODE
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?[quote]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:

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