01/02/2012

VBA Tips - Como converto números para horas?

bgHeaderClock2.png

Como no Access a exibição de horas é limitada (só vai até 23:59), é uma prática comum usar números Single nos cálculos. A exibição nos relatórios, porém, precisa ser no formato de horas.

Para converter um número Single para uma String no formato de horas, a seguinte função pode ser usada:

 '**************************************************

'Funções para se trabalhar com horas acima de 24h

'************************************************** 

Public Function HrStr (dblHora As Double) As String

'Pega um valor numérico e o converte para Horas/Minutos

'Ex: 123,5 = "123:30"

'Ex: 23,9833333333333 = "23:59"

Dim strHoras As String

Dim strMinutos As String

'Pega as horas (parte inteira)

strHoras = CStr(Fix(dblHora))

'Pega os minutos

strMinutos = Format$(Abs((dblHora - Fix(dblHora)) * 60), "00")

'Verifica se o total de minutos é 60

If strMinutos = "60" Then

strMinutos = "00"

strHoras = CStr(CDbl(strHoras) + 1)

End If

'Concatena os dois

HrStr = strHoras & ":" & strMinutos

End Function

Esta outra função faz o contrário: pega um string no formato de horas e converte para número:

Public Function HrDbl(stHora As String) As Double

'Converte um string de hora (formato (h)hh:mm) para Double

'Ex: "135:30" = 135,5

'Ex: "23:59" = 23,9833333333333

Dim dblHoras As Double

Dim intMinutos As Integer

Dim blnDoisPontos As Boolean, blnNum As Boolean

Dim strNum As String

'Verifica se o sinal de dois pontos ':' está na terceira casa

'da direita para esquerda

If Asc(Left(Right(stHora, 3), 1)) = 58 Then

    blnDoisPontos = True

Else

    blnDoisPontos = False

End If

'Verifica se o resto dos dígitos são numéricos

strNum = Left(stHora, Len(stHora) - 3) & Right(stHora, 2)

If IsNumeric(strNum) = True Then

    blnNum = True

Else

    blnNum = False

End If

'Sai do procedimento se o formato estiver incorreto

If (blnDoisPontos = False) Or (blnNum = False) Then

    MsgBox "Informe a hora no formato hh:mm", vbCritical + vbOKOnly

    Exit Function

End If

'Pega os minutos

If CDbl(strNum) < 0 Then

    intMinutos = CInt(Right(strNum, 2)) * (-1)

Else

    intMinutos = CInt(Right(strNum, 2))

End If

'Pega as horas

dblHoras = Fix(CDbl(Left(strNum, Len(strNum) - 2)))

'Calcula a hora

HrDbl

= dblHoras + (intMinutos / 60)

End Function 



Tags
Microsoft Office, VBA, tips, convert, hour, hora, clock, time


André Luiz Bernardes

A&A® - Work smart, not hard.


VBA Tips: Extraindo parte do texto - Por delimitação

top_software.jpg

É muito comum quando estamos efetuando alguma higienização dos dados, querermos retirar parte de um texto contido em algum campo, por exemplo:

Suponha que deseja acertar a sua base de dados de endereço e para isso necessite corrigir os endereços de acordo com a base disponibilizada. alguns endereços contém a string "- - " que indica a numeração de alcance do CEP, informando onde começa e até onde vai a respectiva numeração. Isso não é nada útil no seu cadastro, pois deseja apenas o nome correto da Rua. Aqui surge a pergunta:

Como faço para que retornar apenas a parte do endereço que desejo, ignorando o restante que não necessito?

AVENIDA PRESIDENTE GETÚLIO VARGAS - - de 1182 a 1732 - lado par
AVENIDA PRESIDENTE GETÚLIO VARGAS 

RUA DA JUVENTUDE - - até 678/679
RUA DA JUVENTUDE 

RUA AMARALINA - - de 1391/1392 ao fim
RUA AMARALINA 

RUA MINISTRO ALFREDO BUZAIDE - - de 547/548 ao fim
RUA MINISTRO ALFREDO BUZAIDE 

Supondo que o nome seja ''ENDERECO", a sintaxe seria: 
BetterCompare ([ENDERECO];" -")

Function BetterCompare (nFrase As Variant, nExclude As Variant) As String
    Dim nSize As Variant
    Dim nInitXtract As Variant
    
    If InStr (1, nFrase, nExclude) <> 0 Then
        Let nSize = Len (nFrase)
        Let nInitXtract = InStr (1, nFrase, nExclude)
        Let BetterCompare = Mid (nFrase, 1, nInitXtract)
    Else
        Let BetterCompare = nFrase
    End If
End Function


Tags: VBA, Tip, deduplicação, higienização, correio, endereço


André Luiz Bernardes

A&A® - Work smart, not hard.


VBA Tips: Retira Acentos diacríticos

headerBottom.gif
Como retiramos os acentos de um texto, ou de uma base de dados a qual desejamos popular, comparar, deduplicar? A função abaixo resolve bem a nossa necessidade:

Function TiraAcento (Palavra)
    Dim cAcento As String
    Dim sAcente As String
    
    Let cAcento = "àáâãäèéêëìíîïòóôõöùúûüÀÁÂÃÄÈÉÊËÌÍÎÒÓÔÕÖÙÚÛÜçÇñÑ"
    Let sAcento = "aaaaaeeeeiiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcCnN"
    Let Texto = ""
    
    If Palavra <> "" Then
        For X = 1 To Len(Palavra)
            Let Letra = Mid(Palavra, X, 1)
            Let Pos_Acento = InStr(cAcento, Letra)

            If Pos_Acento > 0 Then
                Let Letra = Mid(sAcento, Pos_Acento, 1)
            End If

            Let Texto = Texto & Letra
        Next

        Let TiraAcento = Texto
    End If
End Function

Referências:
A.M. Kuchling (19 de julho de 2008). Regular Expression HOWTO (em inglês). Documentação do Python. Python Software Foundation. Página visitada em 24 de julho de 2008.
Aurélio Marinho Jargas. Expressões Regulares - Uma Abordagem Divertida. 3 ed. [S.l.]: Novatec, 2009. 208 p. ISBN 978-85-7522-212-6
Ben Forta. Sams Teach Yourself Regular Expressions in 10 Minutes. [S.l.]: Sams. ISBN 0-672-32566-7
DOT NET Framework Regular Expressions (em inglês). .NET Framework Developer's Guide. Microsoft. Página visitada em 25 de julho de 2008.
Francois Liger; Craig McQueen, Paul Wilton. Visual Basic .NET Text Manipulation Handbook. [S.l.]: Wrox Press. ISBN 1-86100-730-2
Jan Goyvaerts (14 de março de 2008). Example: Regular Expression Matching a Valid Date (em inglês). Página visitada em 25 de julho de 2008.
Jeffrey Friedl. Mastering Regular Expressions. [S.l.]: O'Reilly. ISBN 0-596-00289-0
Larry Wall (4 de junho de 2002). Apocalypse 5: Pattern Matching (em inglês).
Larry Wall e o time de desenvolvimento do Perl 5 (2006). perlre: Perl regular expressions (em inglês).
Lesson: Regular Expressions (em inglês). The Java Tutorials. Sun Microsystems. Página visitada em 25 de julho de 2008.
Mehran Habibi. Real World Regular Expressions with Java 1.4. [S.l.]: Springer. ISBN 1-59059-107-0
Michael Sipser. Introduction to the Theory of Computation. [S.l.]: PWS Publishing. 31–90 p. ISBN 0-534-94728-X
POSIX Regex: Introduction (em inglês) (18 de julho de 2008). Página visitada em 24 de julho de 2008.
Referências
Regular Expressions (em inglês). The Open Group (1997). Página visitada em 19 de julho de 2008.
Russ Cox (Janeiro de 2007). Regular Expression Matching Can Be Simple and Fast (em inglês). Página visitada em 20 de julho de 2008.
Tony Stubblebine. Regular Expression Pocket Reference. [S.l.]: O'Reilly. ISBN 0-596-00415-X
a b Perl 5.10.0 documentation (em inglês). Página visitada em 25 de julho de 2008.

Tags: VBA, Tip, deduplicação, higienização, acento, diacrítico, cedilha


André Luiz Bernardes

A&A® - Work smart, not hard.


28/01/2012

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.