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
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.
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.
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.
O 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 Oracle* usando o provedor OLEDB Microsoft corrente:
cn.Open "Provider=msdaora;" & "Data Source=servername.world;" & "User Id=userid;Password=userpassword"
Conectar a um banco de dados Oracle* usando 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 Oracle* usando 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 Oracle* usando 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"
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:
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:
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:
Col1=FieldName1 Char Width 30
Col2=FieldName2 Date Width 15
Col3=FieldName3 Integer Width 15
Col4=FieldName4 Float Width 20
Referência: Erlandsen
Tags: Microsoft 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
A&A® - Work smart, not hard.