RELACIONAMENTO NO ACCESS
Como trabalhar com relacionamento n access? eu tenho as tabelas ja relacionadas mas como utilizar? não achei nenhuma fonte na net!!!
WOLFFIRE,
Muito simples, vou explicar:
Se você grava (INSERT), modifica (UPDATE) ou apaga (DELETE) algo que não está conforme o que foi definido no relacionamento das tabelas, dá um erro na tela e NÃO deixa o usuário fazer a ação nociva preservando assim a integridade referencial do banco e também não deixando que seja criados registros órfãos (FILHOS SEM PAI).
Exemplo de cada um:
- INSERT: Inserir um registro filho sem pai. Exemplo na prática Colocar um novo item em uma nota fiscal sem informar o número da nota fiscal.
- UPDATE: Alterar um registro perdendo a chave pai (informando uma chave que não existe).
- DELETE: Apagar um registro pai. Exemplo na prática: Apagar o nome de um fornecedor que tem pendências de entrega.
No caso de buscar informação (SELECT) os relacionamentos ajudam a buscar dados de uma tabela tendo código de uma outra através do [Ô]INNER JOIN[Ô], por exemplo.
é isso?
[][ô]s,
Tunusat.
Muito simples, vou explicar:
Se você grava (INSERT), modifica (UPDATE) ou apaga (DELETE) algo que não está conforme o que foi definido no relacionamento das tabelas, dá um erro na tela e NÃO deixa o usuário fazer a ação nociva preservando assim a integridade referencial do banco e também não deixando que seja criados registros órfãos (FILHOS SEM PAI).
Exemplo de cada um:
- INSERT: Inserir um registro filho sem pai. Exemplo na prática Colocar um novo item em uma nota fiscal sem informar o número da nota fiscal.
- UPDATE: Alterar um registro perdendo a chave pai (informando uma chave que não existe).
- DELETE: Apagar um registro pai. Exemplo na prática: Apagar o nome de um fornecedor que tem pendências de entrega.
No caso de buscar informação (SELECT) os relacionamentos ajudam a buscar dados de uma tabela tendo código de uma outra através do [Ô]INNER JOIN[Ô], por exemplo.
é isso?
[][ô]s,
Tunusat.
rsrsrsrs .... não mas valeu a ideia.
E o seguinte: Tenho uma tabela cadastro de Membros, Igrejas e outra Endereços. Ambas as tabelas usam relacionamento com a tabela endereço, pois um membro pode morar no endereço da igreja, e vários membros pode morar em um mesmo endereço também. Para evitar o crescimento do banco com dados repetidos, eu criei um relacionamento baseado no CEP. Minha dúvida é:
Como faço para escrever nas duas tabelas ao mesmo tempo? vou ter que abrir as duas tabelas ao mesmo tempo ou existe um processo que eu desconheça para fazer este procedimento?
OBS: No access quando a gente cria um formulário contento todos os dados (das duas tabelas) quando a gente realiza a operação ele trabalha nas duas tabelas. Por isso da minha duvida, pois sempre existem caminhos ou atalhos que não conhecemos.
E o seguinte: Tenho uma tabela cadastro de Membros, Igrejas e outra Endereços. Ambas as tabelas usam relacionamento com a tabela endereço, pois um membro pode morar no endereço da igreja, e vários membros pode morar em um mesmo endereço também. Para evitar o crescimento do banco com dados repetidos, eu criei um relacionamento baseado no CEP. Minha dúvida é:
Como faço para escrever nas duas tabelas ao mesmo tempo? vou ter que abrir as duas tabelas ao mesmo tempo ou existe um processo que eu desconheça para fazer este procedimento?
OBS: No access quando a gente cria um formulário contento todos os dados (das duas tabelas) quando a gente realiza a operação ele trabalha nas duas tabelas. Por isso da minha duvida, pois sempre existem caminhos ou atalhos que não conhecemos.
Cara não tem como não aumentar. Para cada membro um novo registro, aumento.
Para cada nova igreja, aumento.Para cada novo endereço, aumento.
Então cara,para não repetir cadastro tanto de membros,igrejas ou endereço criar
campos para este fim.Como Cep para endereçõ,CNPJ para igreja e Cpf para membros.
Ai quando for registrar qualquer basta buscar nas referidas tabelas, se houver já
existe um registro com cep,cnpj ou cpf.Basta colocar a codificação correta.
Quanto AMBAS AS TABELAS com disse, não pode ser pois tem 3 tabelas.
Isto é fácil de fazer.
Vai ser como mastigar água.
Valeu.
Para cada nova igreja, aumento.Para cada novo endereço, aumento.
Então cara,para não repetir cadastro tanto de membros,igrejas ou endereço criar
campos para este fim.Como Cep para endereçõ,CNPJ para igreja e Cpf para membros.
Ai quando for registrar qualquer basta buscar nas referidas tabelas, se houver já
existe um registro com cep,cnpj ou cpf.Basta colocar a codificação correta.
Quanto AMBAS AS TABELAS com disse, não pode ser pois tem 3 tabelas.
Isto é fácil de fazer.
Vai ser como mastigar água.
Valeu.
o problema é que quando utiliza um endereço novo vai ter que aumentar .... na tabela endereço. Se o endereço é o mesmo utiliza se apenas o id da tabela endereço. tupo isso vai ter que ser manipulado via codigo ....... eu queria algum atalho pra evitar codigo ...
Boa tarde WOLFFIRE. é legal preoculpar-se em abstrair os dados de um banco, por mais que ele seja simples como o access. Ainda não entendi qual a regra de negócio que você utiliza pra fazer um relacionamento através do cep, não quero dizer que está errado, até porque é a sua regra de negócio, mas acredito que isso possa trazer problemas futuramente para o seu projeto. De qualquer forma, a imagem acima é um exemplo de um banco em access bem relacionadinho, que você pode relacionar com qualquer tabela(pessoas, usuários, clientes, etc...)
Quanto ao método pra se fazer um insert em todas as tabelas com um comando, até agora desconheço, mas caso consiga achar posta aà pra gente! O que eu faço é criar um formulário bem organizado pra que o usuário final perceba que ele tenha que selecionar ou cadastrar o endereço antes de salvar os dados.
Pra se usar este banco de exemplo em anexo você pode criar, no form, uma combobox para o estado, outro para a cidade outro para o bairro, e outro para o endereço, e ao lado de cada combobox, colocar um botão para adicionar e outro pra excluir suas respectivas informações.
Qualquer coisa me manda um e-mail que te envio uma imagem do meu form só pra vc ter uma idéia de como faço.
Quanto ao método pra se fazer um insert em todas as tabelas com um comando, até agora desconheço, mas caso consiga achar posta aà pra gente! O que eu faço é criar um formulário bem organizado pra que o usuário final perceba que ele tenha que selecionar ou cadastrar o endereço antes de salvar os dados.
Pra se usar este banco de exemplo em anexo você pode criar, no form, uma combobox para o estado, outro para a cidade outro para o bairro, e outro para o endereço, e ao lado de cada combobox, colocar um botão para adicionar e outro pra excluir suas respectivas informações.
Qualquer coisa me manda um e-mail que te envio uma imagem do meu form só pra vc ter uma idéia de como faço.
Olá acciolly .... entendi o que vc quer dizer, eu até vou usar combo tambem nos forms.
A regra é o seguinte: Quando o usuário digita o CEP, automaticamente procura-se no banco de dados a Rua, Bairro, Cidade, Estado e PaÃs, ficando o usuário digitar o complemento. Caso o CEP não exista, automaticamente ele salva na tabela relacionada .... bom é essa a idéia.
No caso existir um cadastro de uma famÃlia inteira que mora no mesmo endereço, a tabela principal terá apenas o indice da tabela endereço (cujo tabela do CEP que me referi anteriormente) e ai o banco de dados não aumentará relativamente, isto em relação se for uma tabela única.
Será que fui claro agora? rsrsrsrss
A regra é o seguinte: Quando o usuário digita o CEP, automaticamente procura-se no banco de dados a Rua, Bairro, Cidade, Estado e PaÃs, ficando o usuário digitar o complemento. Caso o CEP não exista, automaticamente ele salva na tabela relacionada .... bom é essa a idéia.
No caso existir um cadastro de uma famÃlia inteira que mora no mesmo endereço, a tabela principal terá apenas o indice da tabela endereço (cujo tabela do CEP que me referi anteriormente) e ai o banco de dados não aumentará relativamente, isto em relação se for uma tabela única.
Será que fui claro agora? rsrsrsrss
Estive pensado nisto:[txt-color=#e80000]eu queria algum atalho pra evitar codigo ... [/txt-color]
ADODC tente.
ADODC tente.
qdo disse que queria pouco codigo, eu me referi em salvar dados em duas tabelas rsrsrs
Então você deve utilizar estruturas de decisão [Ô]If else endif[Ô]. Vc deve estar usando o vb6 né? em todo caso a regra é a mesma. Coloque no evento lost focus do campo do CEP uma estrutura de decisão que verifica se o mesmo exista. Pois assim que o cursor do teclado sair do textbox do cep ele fará esta busca.
Crie uma variavel booleana de classe, ou seja, fora de qualquer método, para ela poder ser acessada por qualquer método para que possa te auxiliar na hora de gravar os dados. Tipo assim quando o evento lost focus do cep for acionado e não encontrar o cep então você atribui false para ela caso contrário você atribui true.
Então na hora de gravar os dados vc monta uma estrutura de decisão como essa:
se sua_variavel = true entao
grava somente a pessoa
senao se sua_variavel = false entao
grava primeiro os dados de endereço
faz um select no banco pra recuperar o ultimo endereco cadastrado
grava os dados da pessoa
fim se
aà vc deve estar se perguntando porque caso minha variavel seja falsa devo gravar primeiro os dados de endereço pra depois busca-lo novamente? porque a tabela de pessoas vai necessitar de uma chave estrangeira relacionada ao endereço antes de gravar os dados. Simples assim! Mamão caçucar! rsrsr
se era isso que estás precisando é esta a lógica não vão ser poucas linhas de comando, mas tenha fé e perseverança que vai conseguir!
Crie uma variavel booleana de classe, ou seja, fora de qualquer método, para ela poder ser acessada por qualquer método para que possa te auxiliar na hora de gravar os dados. Tipo assim quando o evento lost focus do cep for acionado e não encontrar o cep então você atribui false para ela caso contrário você atribui true.
Então na hora de gravar os dados vc monta uma estrutura de decisão como essa:
se sua_variavel = true entao
grava somente a pessoa
senao se sua_variavel = false entao
grava primeiro os dados de endereço
faz um select no banco pra recuperar o ultimo endereco cadastrado
grava os dados da pessoa
fim se
aà vc deve estar se perguntando porque caso minha variavel seja falsa devo gravar primeiro os dados de endereço pra depois busca-lo novamente? porque a tabela de pessoas vai necessitar de uma chave estrangeira relacionada ao endereço antes de gravar os dados. Simples assim! Mamão caçucar! rsrsr
se era isso que estás precisando é esta a lógica não vão ser poucas linhas de comando, mas tenha fé e perseverança que vai conseguir!
WOLFFIRE,
Li o que o você e o pessoal postou, achei legal e talz. Mas achei dois pontos que TALVEZ eu possa acrescentar.
1º) Realmente não sei como gravar em duas tabelas ao mesmo tempo com um INSERT só, mas...
... tem um esquema que não vi o pessoa escrever aqui. é muito usado no SQL Server e no Oracle. Chamam-se: [Ô]BeginTrans[Ô], [Ô]RollbackTrans[Ô] e [Ô]CommitTrans[Ô].
Você pode dois disparos de INSERT, para gravar nas suas duas tabelas, mantendo o sincronismo e a integridade. Tipo: Se der erro em uma gravação, não grave ou desfaça a gravação da outra tabela automaticamente. O exemplo clássico é a baixa de dinheiro em uma conta corrente e a transferência de dinheiro para outra conta corrente. Temos que ter certeza que as duas fizeram o trabalho certo senão o banco explode! KKKKK!
==========================================
How To Speed Up Data Access by Using BeginTrans & CommitTrans
Como acelerar o acesso a dados usando BeginTrans & CommitTrans
https://support.microsoft.com/en-us/kb/146908
https://support.microsoft.com/en-us/kb/146908/pt-br
==========================================
BeginTrans, CommitTrans, and RollbackTrans Methods (ADO)
https://msdn.microsoft.com/en-us/library/windows/desktop/ms680895(v=vs.85).aspx
==========================================
ADO - Usando Transações - BeginTrans, CommitTrans e RollBack.
http://www.macoratti.net/ado_trs.htm
==========================================
Transaction in Access
http://stackoverflow.com/questions/5949465/transaction-in-access
==========================================
2º) Você pode ter uma lista de endereços SEM repetição e nesta lista usar como Chave Primária o CEP, normal. Mas para identificar que uma Pessoa more naquela rua precisa de algo como, por exemplo: CEP + { Número da Casa OU (Número do Prédio + Número do apartamento) }.
Então o que aconteceria? Você precisaria gravar dentro da tabela Pessoas UMA chave estrangeira: O Número do CEP. Isto identificaria que aquela pessoa mora naquela rua, que a rua pertence a um e somente um bairro, que o bairro pertence a uma e somente uma cidade, que a cidade que pertence a um e somente um estado e respectivamente, o estado que pertence a um e somente um paÃs. Beleza!
Mas como saber em que Casa mora a Pessoa? Pelo { Número da Casa OU (Número do Prédio + Número do apartamento) } que está gravado na tabela das Pessoas!
Bom ... não sei se é isso...
[][ô]s,
Tunusat.
Li o que o você e o pessoal postou, achei legal e talz. Mas achei dois pontos que TALVEZ eu possa acrescentar.
1º) Realmente não sei como gravar em duas tabelas ao mesmo tempo com um INSERT só, mas...
... tem um esquema que não vi o pessoa escrever aqui. é muito usado no SQL Server e no Oracle. Chamam-se: [Ô]BeginTrans[Ô], [Ô]RollbackTrans[Ô] e [Ô]CommitTrans[Ô].
Você pode dois disparos de INSERT, para gravar nas suas duas tabelas, mantendo o sincronismo e a integridade. Tipo: Se der erro em uma gravação, não grave ou desfaça a gravação da outra tabela automaticamente. O exemplo clássico é a baixa de dinheiro em uma conta corrente e a transferência de dinheiro para outra conta corrente. Temos que ter certeza que as duas fizeram o trabalho certo senão o banco explode! KKKKK!
==========================================
How To Speed Up Data Access by Using BeginTrans & CommitTrans
Como acelerar o acesso a dados usando BeginTrans & CommitTrans
https://support.microsoft.com/en-us/kb/146908
https://support.microsoft.com/en-us/kb/146908/pt-br
==========================================
BeginTrans, CommitTrans, and RollbackTrans Methods (ADO)
https://msdn.microsoft.com/en-us/library/windows/desktop/ms680895(v=vs.85).aspx
==========================================
ADO - Usando Transações - BeginTrans, CommitTrans e RollBack.
http://www.macoratti.net/ado_trs.htm
==========================================
Transaction in Access
http://stackoverflow.com/questions/5949465/transaction-in-access
==========================================
2º) Você pode ter uma lista de endereços SEM repetição e nesta lista usar como Chave Primária o CEP, normal. Mas para identificar que uma Pessoa more naquela rua precisa de algo como, por exemplo: CEP + { Número da Casa OU (Número do Prédio + Número do apartamento) }.
Então o que aconteceria? Você precisaria gravar dentro da tabela Pessoas UMA chave estrangeira: O Número do CEP. Isto identificaria que aquela pessoa mora naquela rua, que a rua pertence a um e somente um bairro, que o bairro pertence a uma e somente uma cidade, que a cidade que pertence a um e somente um estado e respectivamente, o estado que pertence a um e somente um paÃs. Beleza!
Mas como saber em que Casa mora a Pessoa? Pelo { Número da Casa OU (Número do Prédio + Número do apartamento) } que está gravado na tabela das Pessoas!
Bom ... não sei se é isso...
[][ô]s,
Tunusat.
Tópico encerrado , respostas não são mais permitidas