30 Postagens em Janeiro!

header_home01.jpg

Sim, a linha é tênue, compartilhar informações relevantes com qualidade é muito difícil, mas realmente sinto motivos para ficar contente.

Não é fácil ter postado na média praticamente um artigo por dia com qualidade. 

Sei que o conteúdo pôde realmente ser relevante aos frequentadores deste Blog.

Agradeço a todos que não só consultaram, mas enviaram meus artigos com a referência deste link para outros interessados no mundo do VBA.

A algum tempo atrás fiz questão de colocar o número de pessoas que visitam este blog, para que os mais atenciosos percebam que estão retirando informações de um local bem consultado e altamente relevante para a comunidade desenvolvedora.






Continuarei postando o necessário e o possível, compartilhar conhecimento é algo realmente muito importante. Tem causado a promoção de muitas pessoas e aberto oportunidade de iúmeras outras ampliarem o seu conhecimento sobre VBA, Office, programação, desenvolvimento, Dashboard, Reports, etc...

Continuem a vir aqui para esclarecer suas dúvidas!


Atenciosamente,








A&A® - Work smart, not hard.
 Skype: inanyplace
Twitter: @bernardess

VBA Access - Exportando registros para PARADOX - VBA Code to Import Paradox Table into Access

Teaching_Training_Header.jpg


Exportando registros a partir de uma query do MS Office Access para o banco de dados Paradox. Como posso fazê-lo?

Geralmente utilizo um query com dados a partir do MS Office Excel (*.xls), mas hoje quero enviar dados de planilhas que conectei ao MS Office Access.

Let ReportName = "qrySample"
Let ReportFilter = "RecordID = 1"
Let ExcelPath = "/Bernardes/" & Session.SessionID & ".xls"

Set MSAccess = Server.CreateObject("Access.Application")

MSAccess.OpenCurrentDatabase Application("DB")

MSAccess.DoCmd.SetWarnings False
MSAccess.DoCmd.OpenReport ReportName, 2, , ReportFilter
MSAccess.DoCmd.OutputTo 3, ReportName, "MicrosoftExcel(*.xls)", Server.MapPath(ExcelPath), False
MSAccess.DoCmd.Close 3, ReportName, 2
MSAccess.DoCmd.SetWarnings True

MSAccess.CloseCurrentDatabase

MSAccess.Quit 2

Set MSAccess = Nothing

Bem, uma breve recapitulação de alguma teoria neste ponto seria útil:

O Microsoft Jet e os Tipos de Dados
O Jet suporta uma grande quantidade de diferentes tipos de dados, garantindo total compatibilidade tanto com o Microsoft Access quanto com os tipos de dados definidos pelo padrão ANSI da SQL. A figura abaixo ilustra os tipos de dados disponíveis no mecanismo Jet e no padrão SQL associado, além de sua compatibilidade com os diversos tipos de dados do VB.

FIG14_0.GIF

Modos de Interação da Aplicação com o Microsoft Jet Engine
O Visual Basic oferece duas formas de comunicação entre aplicações e o mecanismo Jet: o controle Data e os objetos de acesso a dados (DAO).

O controle Data faz parte da caixa de ferramentas padrão e pode ser inserido em formulários como qualquer outro controle. Seu papel é fazer intermediação entre a aplicação e um banco de dados de modo a automatizar tarefas comuns como inclusões, alterações, exclusões e navegação em meio à massa de registros.

Enquanto o controle Data lhe dá poder para acessar bancos de dados existentes com pouca programação, o modelo DAO é uma completa interface de programação que lhe dá total controle sobre o banco de dados. Esses dois recursos, porém, não são mutuamente exclusivos, podendo em muitas ocasiões até mesmo ser desejável combiná-los. Trataremos de início dos objetos de acesso a dados por ser um estudo que nos dará elementos para compreender melhor o uso do controle Data.

Biblioteca de Objetos de Acesso a Dados (DAO)
Um dos mais importantes recursos do Visual Basic é a sua biblioteca de objetos de acesso a dados ou DAO (Data Access Objects). São objetos que você pode criar em tempo de execução para acessar dados tanto em arquivos de banco de dados do Access - o banco de dados nativo do Visual Basic - como em outros tipos de banco de dados locais como dBase, Paradox e também acessar dados em bancos de dados cliente-servidor como o Microsoft SQL Server usando a tecnologia ODBC.

Os objetos de acesso a dados estão organizados numa hierarquia, na qual muitos objetos pertencem a coleções de objetos, que também, por sua vez, pertencem a outros objetos que lhes estão acima na ordem hierárquica. A completa hierarquia da DAO está ilustrada abaixo.

FIG14_1.GIF

Estamos usando a palavra objeto para nos referirmos aos data access objects, mas na verdade não são objetos e sim de classes. Do mesmo modo como você cria instâncias de suas próprias classes, você o faz com os objetos de acesso a dados. Veremos isso nos exemplos. Antes faremos uma breve introdução aos objetos da DAO.

O Objeto DBEngine
No topo da hierarquia da DAO está o objeto DBEngine e corresponde ao dispositivo Microsoft Jet de acesso a dados. O objeto DBEngine é usado para ajustar os parâmetros do sistema de banco de dados utilizado pelo VB e para definir a área de trabalho default. O DBEngine é o único objeto que você não pode instanciar. Ele é criado automaticamente quando sua aplicação faz a primeira referência a um objeto da DAO.

O Objeto Workspace
Logo abaixo do objeto DBEngine, na hierarquia da DAO, está o objeto Workspace (área de trabalho). Esse objeto é utilizado para criar e identificar uma sessão de trabalho para um usuário. Ele contém os bancos de dados abertos e provê controle sobre transações simultâneas e segurança de acesso.

Um objeto Workspace default - Workspace(0) - é criado automaticamente na primeira referência a um objeto DAO pela aplicação. Ele pode ser inicializado com um Username (nome de usuário) e com uma Password (senha). Ao contrário de outros objetos Workspace, a área de trabalho default está sempre disponível, não podendo ser fechada nem removida da coleção Workspaces.

Objeto Database
O objeto Database representa um banco de dados, nativo do Jet ou não. É utilizado para definir as tabelas do banco de dados, relacionamentos entre tabelas, consultas armazenadas, além de permitir a abertura de objetos Recordset - que veremos mais adiante.

Objeto TableDef
O objeto TableDef corresponde a uma definição de tabela armazenada. Cada TableDef da coleção TableDefs representa a definição de uma tabela no banco de dados corrente, ou uma tabela externa anexada à base de dados. Neste último caso o objeto TableDef não pode ter seus atributos alterados.

Objeto QueryDef
O objeto QueryDef representa uma consulta escrita em linguagem SQL armazenada no banco de dados. Uma consulta armazenada é um comando SQL pré-compilado. É possível ler e modificar o código SQL de um objeto QueryDef, ajustar seus parâmetros e, então , executar a consulta.

Objeto Recordset
O objeto Recordset corresponde a uma visão ponteirada de uma tabela ou do conjunto de registros resultantes de uma consulta a uma ou mais tabelas. Uma visão ponteirada é o armazenamento de registros numa área de memória (buffer), apontando para um registro de cada vez, chamado registro corrente. O ponteiro (registro corrente) pode ser reposicionado em qualquer registro utilizando-se os métodos move, seek ou find. Ele permite a navegação, atualização e remoção das tabelas subjacentes ao recordset. Como a visão dos dados de um banco, o Recordset não contém ele mesmo os dados: apenas aponta para eles. Nesse sentido não é armazenado no banco, tendo utilização temporária. Quando um recordset é fechado, ele é removido da coleção Recordsets e todos os recursos associados são removidos da memória.

É possível a criação de três tipos de recordsets:

Tipo tabela: Um recordset tipo tabela corresponde a uma tabela do banco de dados. Quando um recordset desse tipo é aberto, o programador passa a ter acesso à tabela subjacente.

Tipo dynaset: Um recordset do tipo dynaset corresponde a uma tabela "virtual" resultante de uma consulta feita a uma ou mais tabelas. Ao ser atualizada, todas as alterações feitas no objeto se refletem imediatamente nas tabelas subjacentes.

Tipo snapshot: Um recordset do tipo snapshot é um conjunto estático de dados, similar ao dynaset porém não admite atualização. Outra diferença é que os snapshots têm o conjunto de registros carregado na memória. Se de um lado isso os torna mais rápidos, por outro cria o problema de haver conflitos com limitações de memória. Ajustam-se melhor para pequenas quantidades de registros que não precisam ser editados.

Objeto Field
O objeto Field corresponde a uma coluna de dados contendo um tipo de dado comum e um conjunto de atributos. É apenas um campo do banco de dados. Nesse sentido, os objetos TableDef, QueryDef, Recordset, e Index possuem coleções Fields. A coleção de objetos Field associada ao ponteiro de um recordset descreve um registro. Os dados do recordset são lidos e atualizados através da propriedade Value do objeto Field. Quando o ponteiro do recordset é movido e passa a apontar para um novo registro, todos os objetos Field da coleção Fields são automaticamente atualizados.

Objeto Index
O objeto Index representa um índice associado a um objeto TableDef ou Recordset, sempre do tipo tabela. O Índice corrente pode ser especificado num recordset tabela atribuindo-se um dos índices da coleção Indexes à sua propriedade Index. A atribuição da propriedade Index permite reordenar rapidamente os registros de uma tabela.

Objeto Parameter
O objeto Parameter representa um parâmetro de consulta armazenada no banco de dados. A coleção Parameters dos objetos QueryDef e Recordset permite ao programador acessar as informações contidas no parâmetro da consulta .

Um modo mais fácil de se importar, é por abrir o MS Office Access, escolher a opção importar e depois escolher o tipo de arquivo Paradox.

MS Office Access Jet, através do MS Office Access, usando DAO / RDO / ADO), permite a abertura, manipulação, vinculação, e importação dos dados do Paradox. Caso a versão do Paradox seja superior a 5.0, poderá requer o BDE instalado. Nas versões anteriores funciona com ISAM nativo do Jet, não sendo necessário instalar a BDE.

Conexões strings ADO

Abaixo disponibilizarei exemplo de strings de conexão ADO que poderá usar ao se conectar a alguns dos tipos mais comuns de banco de dados.

Conectar qualquer fonte de dados usando um DSN ODBC (Data Source Name):

Você deve primeiro criar o DSN, isso pode ser feito usando o "ODBC Data Source Administrator" que se encontra no Painel de Controles ou nas Ferramentas Administrativas do seu computador.

Certifique-se de criar um DSN SYSTEM (não um DSN USER) ao criar uma solução ASP.

cn.Open "DSN=SystemDataSourceName;" & "Uid=userid;Pwd=userpassword"

PARADOX

Conectando o banco de dados Paradox via ODBC:

cn.Open "driver={Microsoft Paradox Driver (*.db )};" & 
"driverid=538;fil=Paradox 5.X;" & "defaultdir=c:\foldername\;" & "dbq=c:\foldername\;collatingsequence=ASCII"

O espaço extra após os caracteres *.db é necessário.
Para atualizar os dados no Paradox ISAM será necessário o BDE (Borland Database Engine).

Já que vamos aprender a conectar o Paradox, podíamos aprender a fazer conexão a outras bases de dados, que tal?

Microsoft Office ACCESS

Conectando uma base de dados Access usando o padrão de segurança (standard security) OLEDB:

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=c:\foldername\databasename.mdb;" & "User Id=admin;Password="

Conectando uma base de dados Access usando o padrão de segurança (standard security) ODBC:

cn.Open "driver={Microsoft Access Driver (*.mdb)};" & "dbq=c:\foldername\databasename.mdb;uid=admin;pwd="

Conectando uma base de dados Access usando um banco de dados do sistema de grupo de trabalho (workgroup system database) OLEDDB:

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & 
"Data Source=c:\foldername\databasename.mdb;" & 
"Jet OLEDB:System Database=c:\foldername\systemdatabasename.mdw", 
"userid", "userpassword"

Conectando uma base de dados Access usando um banco de dados do sistema de grupo de trabalho (workgroup system database) ODBC:

cn.Open "driver={Microsoft Access Driver (*.mdb)};" & "dbq=c:\foldername\databasename.mdb;" & "systemdb=c:\foldername\systemdatabasename.mdw;", "userid", "userpassword"

MS SQL

Conectando um servidor MS SQL usando o padrão de segurança (standard security) OLEDB:

cn.Open "Provider=sqloledb;" & 
"Data Source=servername;" & 
"Initial Catalog=databasename;" & 
"User Id=userid;Password=userpassword"

Conectando um servidor MS SQL usando o padrão de segurança (standard security) ODBC:

cn.Open "driver={SQL Server};" & "server=servername;database=databasename;" & "uid=userid;pwd=userpassword"

Oracle

Conectar a um banco de dados Oracleusando o provedor OLEDB Microsoft corrente:

cn.Open "Provider=msdaora;" & "Data Source=servername.world;" & "User Id=userid;Password=userpassword"

Conectar a um banco de dados Oracleusando o provedor OLEDB Oracle corrente:

cn.Open "Provider=OraOLEDB.Oracle;" & "Data Source=servername.world;" & "User Id=userid;Password=userpassword"

Conectar a um banco de dados Oracleusando o driver ODBC Microsoft corrente:

cn.Open "driver={Microsoft ODBC for Oracle};" & "server=servername.world;" & "uid=userid;pwd=userpassword"

Conectar a um banco de dados Oracleusando o driver ODBC Oracle corrente:

cn.Open "driver={Oracle ODBC Driver};" & "dbq=databasename;" & "uid=userid;pwd=userpassword"

Lembre-se: É necessário definir o nome do banco de dados (databasename DBQ) no arquivo tnsnames.ora.

Sybase

Conectando um banco de dados Sybase ASE utilizando um provedor OLEDB:

cn.Open "Provider=Sybase.ASEOLEDBProvider;" & Srvr=servername,5000;" & "Catalog=databasename;" & "User Id=userid;Password=userpassword"

Conectando um banco de dados Sybase utilizando o driver ODBC Sybase System 12:

 cn.Open "driver={SYBASE ASE ODBC Driver};" & 
"srvr=servername;" & 
"uid=userid;pwd=userpassword"

Conectando um banco de dados Sybase utilizando o driver ODBC Sybase System 11:

cn.Open "driver={SYBASE SYSTEM 11};" & 
"srvr=servername;" & 
"uid=userid;pwd=userpassword"

My SQL

Conectando o servidor OLEDB MySQL:

cn.Open "Provider=MySQLProv;" & "Data Source=MYSQLDB;" & "User Id=userid;Password=userpassword" 

MS Excel

Conectando via OLEDB numa planilha Excel:

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & 
"Data Source=c:\foldername\workbookname.xls;" & 
"Extended Properties=""Excel 8.0;HDR=Yes"""

Use "Excel 8.0" para planilhas criadas na versão Excel 97 ou posterior.

Use "Excel 5.0"  para planilhas criadas na versão Excel 5 ou 95.

Use "HDR=Yes" se o data source tiver uma linha de cabeçalho ou um range nomeado.

Se "HDR=No" o recordset retornará conteúdo na primeira linha.

cn.Open "driver={Microsoft Excel Driver (*.xls)};" & 
"driverid=790;dbq=c:\bernardes\Dashboard_Source.xls;" & "
defaultdir=c:\foldername"

DBASE

Conectando o banco de dados dBase via ODBC:

cn.Open "driver={Microsoft dBase Driver (*.dbf)};" & 
"driverid=277;dbq=c:\bernardes"

 
Especifique o nome do arquivo quando você abrir o recordset
rs.Open "select * from tablename.dbf", cn, , , adCmdText

Você precisará do BDE (Borland Database Engine) para atualizar os arquivos DBASE.

ARQUIVO TEXTO

Conectando um arquivo texto via OLEDB:

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
    "Data Source=c:\foldername\;" & _ 
    "Extended Properties=""text;HDR=Yes;FMT=Delimited"""
    rs.Open "select * from filename.csv", cn, adOpenStatic, adLockReadOnly, adCmdText

Conectando um arquivo texto via ODBC:

cn.Open "driver={Microsoft Text Driver (*.txt; *.csv)};" & _
    "dbq=c:\foldername\;" & _
    "extensions=asc,csv,tab,txt,log,*."
  rs.Open "select * from filename.csv", cn, adOpenStatic, adLockReadOnly, adCmdText

Schema.ini

O formato do arquivo de texto é determinada usando um arquivo de informações de esquema (schema information file). O arquivo de informações sobre o esquema, que é sempre chamado Schema.ini e sempre mantido na mesma pasta da fonte de dados de texto, fornece informações sobre o formato geral do arquivo, o nome da coluna e informações sobre o tipo de dados, além de uma série de outras características de dados.

Um arquivo Schema.ini é sempre necessária para acessar os dados de largura fixa.
Você deve usar um arquivo Schema.ini quando a tabela contém valor de Moeda, DateTime, Decimal ou dados, ou quando você quiser mais controle sobre a manipulação dos dados na tabela.

O exemplo de arquivo Schema.ini abaixo é um arquivo chamado filename.txt cujos os dados estão delimitados por tabulação, e os nomes das colunas estão na primeira linha:

[filename.txt]
Format=TabDelimited
ColNameHeader=True
MaxScanRows=0
CharacterSet=ANSI

O exemplo de arquivo Schema.ini abaixo é um arquivo chamado filename.txt cujos os dados estão delimitados por ponto-e-vírgula, e os nomes das colunas estão na primeira linha:

[filename.txt]
Format=Delimited(;)
ColNameHeader=True
MaxScanRows=0
CharacterSet=ANSI

O exemplo de arquivo Schema.ini abaixo é um arquivo chamado filename.txt cujos os dados têm largura fixa, e os nomes das colunas estão na primeira linha:

[filename.txt]
Format=FixedLength
ColNameHeader=False
Col1=FieldName1 Char Width 30
Col2=FieldName2 Date Width 15
Col3=FieldName3 Integer Width 15
Col4=FieldName4 Float Width 20
CharacterSet=ANSI


Referência: Erlandsen

TagsMicrosoft Office Access, Access, connecting, conect, DAO, ADO, RDO, ISAM, Jet, BDE, ODBC, DSN, Data Source Name, DSN ODBC, DSN USER, OLEDB, MS SQL, Oracle, Paradox, My SQL, DBASE, schema, .ini

André Luiz Bernardes
A&A® - Work smart, not hard.


VBA Access - Função Format (com Datas)

header-training.jpg

No MS Office Access, a função Format faz o tratamento de um conteúdo, retornando-o na expressão que desejarmos.

A syntaxe para a função Format é:

Format ( expressão, [ format, [ firstdayofweek, [primeirasemanadoano] ] ] )

Expressão é o valor a ser "formatado".

Format é opcional, existem valores defaults para este, como observado abaixo:

Format Explanação 
General Date Mostra a data formatada segundo a configuração do seu sistema.
Long Date Mostra a data formatada segundo a configuração do seu sistema para 'Data longa'.
Medium Date Mostra a data formatada segundo a configuração do seu sistema para 'Data média'.
Short Date Mostra a data formatada segundo a configuração do seu sistema para 'Data curta'.
Long Time Mostra a data formatada segundo a configuração do seu sistema para 'hora longa'.
Medium Time Mostra a data formatada segundo a configuração do seu sistema para 'hora média'.
Short Time Mostra a data formatada segundo a configuração do seu sistema para 'hora curta'.

firstdayofweek é opcional, existem valores defaults para este, como observado abaixo:

Constant                    Valor    Explanação 
vbUseSystem       0      Usa a configuração da API NLS. 
vbFirstJan1          1      A semana que contém Janeiro 1. 
vbFirstFourDays   2      A primeira semana que tem 4 dias no ano. 
vbFirstFullWeek   3     A primeira semana cheia do ano. 

Por exemplo:
Format (#17/04/2009#, "Short Date") Retornará '17/04/2004' 
Format (#17/04/2009#, "Long Date") Retornará 'Abril 17, 2004' 
Format (#17/04/2009#, "yyyy/mm/dd") Retornará '2004/04/17' 

Código VBA:
A função Format pode ser utilizada no VBA como código:

Dim LValue As String
Let LValue = Format (Date, "dd/mm/yy")

No exemplo acima a variável chamada LValue contém a data de hoje formatada como dd/mm/yy.

Utilização direta na query:
O mesmo pode ser utilizado nas nossas querys.


TagsMicrosoft Office Access, Access, Format

André Luiz Bernardes
A&A® - Work smart, not hard.


diHITT - Notícias