Criar relacionamentos entre as tabelas, usando o CONSTRAINT
Nota importante: para ter acesso aos vídeos e arquivos exemplos deste site, adquira um dos planos apresentados abaixo. Você pode comprar em até 5x no Cartão de Crédito.
Veja como comprar e saiba mais sobre o material oferecido, clicando aqui.
No exemplo abaixo foi criado o relacionamento de Um para Muitos. O lado Um tem a tabela exemplo tblClientes e o lado Muitos tem a tabela exemplo tblClienteContatos. Observe que estou usando a conexão ADO para que funcionem as declarações ON UPDATE e ON DELETE.
Faça o login aqui para ter acesso ao código.
O nome rel (pode ser qualquer nome) serve para identificar o relacionamento e foi utilizado no código abaixo para excluir o relacionamento. A declaração ON UPDATE CASCADE marca a opção "Propagar atualizações dos campos relacionados" e ON DELETE CASCADE marca a opção "Propagar exclusão dos registros relacionados". Veja na imagem abaixo:
Para excluir o relacionamento, utilize o DROP CONSTRAINT:
currentdb.Execute "ALTER TABLE tblClienteContatos DROP CONSTRAINT rel"
Também é possível utilizar o CreateRelation do DAO para criar os relacionamentos. Observe o código abaixo:
Faça o login aqui para ter acesso ao código.
Segue abaixo, a tabela dos atributos que podemos configurar no CreateRelation:
Nome Atributo | Valor | Descrição |
dbRelationDeleteCascade | 4096 | Exclusão em cascata |
dbRelationDontEnforce | 2 | Relação não imposta (sem integridade referencial) |
dbRelationInherited | 4 | Existe relação no banco de dados que contém as duas tabelas vinculadas |
dbRelationLeft | 16777216 | Exibir LEFT JOIN como tipo de associação padrão |
dbRelationRight | 33554432 | Exibir RIGHT JOIN como tipo de associação padrão |
dbRelationUnique | 1 | Relação um para um |
dbRelationUpdateCascade | 256 | Atualização em cascata |
Bom estudo!
Os dez artigos mais visitados
MontaRibbons v.7.0 - Assistente completo para criar ribbons no Access
Vídeo - Controle personalizado de Acesso de Usuários
Vídeo - Aprenda sobre filtragens
Vídeo - Segurança máxima, usando o OPEN
Uma ajuda para quem está começando um negócio ou um projeto
Integrando o Access com Servidor MySQL - Introdução
Desabilitando a faixa(ribbon) superior do Access
Vídeo - Programação de relatórios - Parte 1
Como carregar o seu menu sem que ele vá para lista de suplementos
Adquira o kit UsandoAccess e aprenda em alta velocidade
7 comentário(s) Fabio Matos 26/11/2023 12:49:13 Funcionou perfeitamente!! Obrigado mais uma vez. Avelino Sampaio 26/11/2023 09:39:37 Fabio, teste sem a exclamação antes do parênteses: relNew.Fields(VarCF).ForeignName = VarFN No aguardo Fabio Matos 26/11/2023 08:17:07 Mestre, segue conforme solicitado: --------------------------------------- Public Sub fncCriarRelac() Dim bd As DAO.Database Dim relNew As DAO.Relation Dim NomeRelac As String Dim VarTbl As String Dim VarTblEstrangeira As String Dim Comando1 As Integer Dim VarCF As String Dim VarFN As String NomeRelac = "teste" 'DLookup("[nomerelac]", "cs_versaobe_criarRelac", "[Seq]=" & 1) VarTbl = "tbl_movestoque_lanccaixa" 'DLookup("[tblprimaria]", "cs_versaobe_criarRelac", "[Seq]=" & 1) VarTblEstrangeira = "tbl_rot_lanccaixa" 'DLookup("[tblEstrangeira]", "cs_versaobe_criarRelac", "[Seq]=" & 1) Comando1 = 2 'DLookup("[comando1]", "cs_versaobe_criarRelac", "[Seq]=" & 1) VarCF = "cod_lancCaixa_movestoqueLancCaixa" 'DLookup("[PK]", "cs_versaobe_criarRelac", "[Seq]=" & 1) VarFN = "cod_lancCaixa" 'DLookup("[FK]", "cs_versaobe_criarRelac", "[Seq]=" & 1) Set bd = DBEngine.OpenDatabase(DLookup("Path_0", "tblCaminhoBe"), False, False, ";PWD=xpto") Set relNew = bd.CreateRelation(NomeRelac, VarTbl, VarTblEstrangeira, _ Comando1) relNew.Fields.Append relNew.CreateField(VarCF) relNew.Fields!(VarCF).ForeignName = VarFN bd.Relations.Append relNew MsgBox "Banco de Dados do Sistema, Atualizado com Sucesso.", vbInformation, "Eleve Sys - FLM SISTEMAS" Set bd = Nothing Set relNew = Nothing End Sub ------------------------------------ Deixei o DlookUp como comentário para ficar mais claro os dados que ele está buscando. Na parte "relNew.Fields!(VarCF).ForeignName", se eu colocar o valor real da variável, que é "cod_lancCaixa_movestoqueLancCaixa", aí funciona normalmente. Avelino Sampaio 26/11/2023 07:32:29 Fabio, cole aqui seu código completo da função CreateRelation() No aguardo Fabio Matos 26/11/2023 07:13:31 Mestre, ocorreu o erro: "Erro de Compilação: Caractere de declaração de tipo não correspondente ao tipo de dados declarado" Li o artigo, mas vi que nenhum dos exemplos tem um controle como neste ex: (VarCampo).ForeignName Estou tentando da seguinte forma: relNew.Fields!(VarCampo).ForeignName Avelino Sampaio 26/11/2023 02:02:08 Fabio, utilize o parênteses conforme dica deste meu artigo: http://www.usandoaccess.com.br/tutoriais/referenciar-formularios-e-relatorios-propriedades.asp?id=1#inicio Sucesso! Fabio Matos 25/11/2023 18:47:22 Mestre Avelino, boa noite. Consegui fazer o CreateRelation no BackEnd normalmente, porém, quero automatizar o processo de cada atualização do meu front, mas para isso, substituí os comandos por variáveis que buscam os dados via Dlookup... Ex: CreateRelation(VarNomeRelac, VarTabela, VarTabelaFK, _ VarTipoRelac) Até aqui funcionou perfeitamente. Só estou com um problema muito "simples", mas que não consegui resolver. Na parte "relNew.Fields!IdCliente.ForeignName" eu não consigo substituir este campo 'Idcliente' por uma variável (ex: relNew.Fields!VarCampo.ForeignName), pois informa o seguinte erro: "Item não encontrado nesta seleção" Existe uma forma de fazer isso? |