Como criar tabelas pelo CREATE TABLE
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.
Com a instrução CREATE TABLE é possível definir uma nova tabela e seus campos. Isto é particularmente útil para atualização de um back-end (já em uso) pelo front-end.
a) para criar a tabela no próprio front-end, utilize o método Execute do Currentdb para executar a instrução. Observe, com atenção, o código para criar a tabela tblProdutos no front-end.
Public Sub fncCriarTabela() Dim strSql$ On Error GoTo trataErro
strSql = "CREATE TABLE tblProdutos (" & _
"idProduto AUTOINCREMENT," & _ "NomeProduto CHAR," & _ "DataLançamento DATE," & _ "QuantidadeEstoque INTEGER," & _ "ValorUnitário CURRENCY," & _ "Observação MEMO," & _ "Descontinuado YESNO)"
'-----------------------------------------------
'Executa a consulta e cria a tabela no front-end
'----------------------------------------------- CurrentDb.Execute strSql
'-------------------------------------------
'Caixa de mensagem temporizada da dica 61
'------------------------------------------- MsgBoxTimer 2, "Tabela tblProdutos criada...", vbOKOnly, "Aviso" sair: Exit Sub trataErro:
'-------------------------------------------------------------
'Informa que a tabela já existe. Caixa de mensagem da dica 61
'-------------------------------------------------------------- If Err.Number = 3010 Then MsgBoxTimer 2, "A tabela já existe ...", _
vbSystemModal, "Aviso" Resume sair: End Sub
Veja, na tabela, os nomes que identificam os Tipos de Dados:
Tipos de Dados | Identificação SQL |
Texto | TEXT, ALPHANUMERIC, CHAR, CHARACTER, STRING ou VARCHAR |
Memorando | LONGTEXT, MEMO, LONGCHAR ou NOTE |
Byte | BYTE ou INTEGER1 |
Inteiro | SHORT, INTEGER2 ou SMALLINT |
Inteiro Long | COUNTER, INTEGER, INT ou AUTOINCREMENT |
Simples | SINGLE, FLOAT4 ou REAL |
Duplo | DOUBLE, FLOAT ou NUMBER |
Data/Hora | DATETIME, DATE, TIME ou TIMESTAMP |
Moeda | CURRENCY ou MONEY |
Auto Numeração | AUTOINCREMENT ou COUNTER |
Sim/Não | YESNO, BIT, LOGICAL, LOGICAL1 ou BOOLEAN |
Objeto OLE | LONGBINARY, OLEOBJECT ou GENERAL |
Não existe um comando para criar campo do tipo ANEXO pelo CREATE TABLE. Uma alternativa é a de usar o TableDefs do DAO. Veja as partes em vermelho, acrescentadas ao código:
Public Sub fncCriarTabela() Dim tbl As dao.TableDef Dim bd As dao.Database
Dim strSql$ On Error GoTo trataErro
'------------------------------------------------------------------
'O CreateField só funciona se o Currentdb for passado para variável
'------------------------------------------------------------------
Set bd = CurrentDb
strSql = "CREATE TABLE tblProdutos (" & _
"idProduto AUTOINCREMENT," & _ "NomeProduto CHAR," & _ "DataLançamento DATE," & _ "QuantidadeEstoque INTEGER," & _ "ValorUnitário CURRENCY," & _ "Observação MEMO," & _ "Descontinuado YESNO)"
'-------------------------------------
'Executa a consulta, criando a tabela
'------------------------------------- bd.Execute strSql
'---------------------------------------------------------
'A variável tbl assume as definições da tabela tblProdutos
'---------------------------------------------------------- Set tbl = bd.TableDefs!tblProdutos
'------------------------------------------------
'Cria o campo do tipo Anexo na tabela tblProdutos
'------------------------------------------------ tbl.Fields.Append tbl.CreateField("Foto", dbAttachment)
'------------------------------------------
'Esvazia as variáveis, limpando a memória
'------------------------------------------ Set tbl = Nothing
set bd = Nothing
'----------------------------------------------
'Usa a caixa de mensagem temporizada da dica 61
'---------------------------------------------- MsgBoxTimer 2, "Tabela tblProdutos criada...", vbOKOnly, "Aviso" sair: Exit Sub trataErro:
'-------------------------------------------------------------
'Informa que a tabela já existe. Caixa de mensagem da dica 61
'-------------------------------------------------------------- If Err.Number = 3010 Then MsgBoxTimer 2, "A tabela já existe ..", _
vbSystemModal, "Aviso" Resume sair: End Sub
b) Para criar a tabela no back-end pelo front-end, utilize o método Execute do OpenDatabase para executar a instrução. Observe, com atenção, o código para criar a tabela tblProdutos no back-end.
Public Sub fncCriarTabela3() Dim tbl As dao.TableDef Dim bd As dao.Database
Dim strSql$ On Error GoTo trataErro
'-------------------------------------------
'Abre o back-end pelo comando OpenDatabase
'-------------------------------------------
Set bd = OpenDatabase("c:\MinhaPasta\Back-end.accdb", False, False,";PWD=123")
strSql = "CREATE TABLE tblProdutos (" & _
"idProduto AUTOINCREMENT," & _ "NomeProduto CHAR," & _ "DataLançamento DATE," & _ "QuantidadeEstoque INTEGER," & _ "ValorUnitário CURRENCY," & _ "Observação MEMO," & _ "Descontinuado YESNO)"
'-------------------------------------------------
'Executa a consulta, criando a tabela no back-end
'------------------------------------------------- bd.Execute strSql
'---------------------------------------------------------
'A variável tbl assume as definições da tabela tblProdutos
'--------------------------------------------------------- Set tbl = bd.TableDefs!tblProdutos
'------------------------------------------------
'Cria o campo do tipo Anexo na tabela tblProdutos
'------------------------------------------------ tbl.Fields.Append tbl.CreateField("Foto", dbAttachment)
'-----------------------------------------
'Esvazia as variáveis, limpando a memória
'----------------------------------------- Set tbl = Nothing
set bd = Nothing
'----------------------------------------------
'Usa a caixa de mensagem temporizada da dica 61
'---------------------------------------------- MsgBoxTimer 2, "Tabela tblProdutos criada...", vbOKOnly, "Aviso" sair: Exit Sub trataErro:
'-------------------------------------------------------------
'Informa que a tabela já existe. Caixa de mensagem da dica 61
'-------------------------------------------------------------- If Err.Number = 3010 Then MsgBoxTimer 2, "A tabela já existe ..", _
vbSystemModal, "Aviso" Resume sair: End Sub
Nota: Veja neste meu artigo como proceder de forma mais segura, com a senha do back-end no OpenDatabase.
Para excluir uma tabela utilize o DROP TABLE.
CurrentDb.execute "DROP TABLE tblProdutos;"
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
6 comentário(s) Fabio Matos 23/11/2023 04:26:27 Mestre Avelino, eu estava tão frustrado e cansado que não havia encontrado esta super joia. Já testei e já funcionou de cara. Tu é realmente o cara e me salvou mais uma vez. MUITO OBRIGADO!!!! Avelino Sampaio 23/11/2023 00:22:18 Fabio, veja neste meu outro artigo: http://www.usandoaccess.com.br/dicas/criar-relacionamentos-tabelas-constraint-vba.asp Sucesso! Fabio Matos 22/11/2023 16:24:55 Mestre Avelino, boa noite. Estudei por quase toda a internet por vários dias e não consegui encontrar uma solução para o meu problema. Estou parado nisso para atualizar o BackEnd dos meus clientes... Como eu posso criar um Relacionamento com Integridade referencial via VBA?? =( Parei em: docmd.runSQL "ALTER TABLE tbl_cad_listProdVenda ADD CONSTRAINT CodVenda FOREIGN KEY (codVenda) REFERENCES tbl_venda (codVenda) ON DELETE CASCADE;" Neste exemplo é um simples relacionamento entre a Tabela de Vendas (tbl_venda) PK> codVenda e a tabela onde armazena os produtos da Venda (tbl_cad_listProdVenda) FK> codVenda. O erro que aparece é: '3289' Erro de síntese na cláusula CONSTRAINT. Me ajude, please!! Marcelo David 25/04/2023 15:38:30 Muito bom! Obrigado por compartilhar! Avelino Sampaio 03/10/2021 02:38:17 Alonso sim, veja neste meu artigo: https://www.usandoaccess.com.br/dicas/criar-chave-primaria-indice-valor-padrao-alter-table.asp Sucesso! Anibal Assis 19/01/2020 06:43:32 Boa tarde Como formatar, e definir as casas decimais com o Alter Table ? Tem como? http://www.maximoaccess.com/t35099-resolvidoadicionar-um-campo-em-tabela-via-vba#240412 Obrigado |