Prezados, boa tarde.
Estou realizando a importação de um arquivo TXT para uma tabela do Access, na primeira versão do código, atribui cada campo a ser importado em variáveis e importei linha a linha de uma única vez, como abaixo:
UPD = ("INSERT INTO Tb_Importado (Cartao, Nome, Status,DD ,B1 ,B2 ,Saldo, Cr_Date, Last_Txn, Last_Pmt, ORG, Logo, Faixa_Valor) VALUES ('" & Cartao & "', '" & Nome & "', '" & Status & "','" & DD & "','" & B1 & "','" & B2 & "','" & Saldo & "', '" & Cr_Date & "', '" & Last_Txn & "', '" & Last_Pmt & "', '" & Org & "', '" & Logo & "', '" & Faixa_Valor & "')")
CurrentDb.Execute (UPD)
Mas ficou muito demorada a importação.
Então estou tentando fazer o INSERT INTO, campo a campo na tabela, sem utilizar variáveis. O comando lê o código, mas não carrega a informação para o Access.
UPD = ("INSERT INTO Tb_Importado (DD) VALUES ('" & (Trim(Mid(Linha, 43, 2))) & "')")
CurrentDb.Execute (UPD)
UPD = ("INSERT INTO Tb_Importado (B1) VALUES ('" & (Trim(Mid(Linha, 48, 1))) & "')")
CurrentDb.Execute (UPD)
Minhas dúvidas: é se podem ajudar a corrigir o código de importar campo a campo sem o uso de variáveis, ou se á outra forma melhor de importação?
************************************************************
Código completo (incluindo as linhas em comentário do primeiro código
************************************************************
Option Compare Database
Public Function Importar()
Dim appDialog As Object
Dim stFile As String
Dim Arq As Integer 'Variável que irá receber o nome do Arquivo.
Dim Linha As String 'Variável que irá receber o conteúdo de Cada Linha
Dim Cartao As String
' Dim Plano As String
Dim Saldo As Double
Dim CrDate As String
Dim LastTxn As String
Dim LastPmt As String
Dim Org As String
Dim Logo As String
Dim Achou As Boolean
Dim Quant As Long
Arq = FreeFile 'O Termo FreeFile definine que á variável é um arquivo.
SQL = "SELECT * FROM Tb_Importado" 'WHERE Nome Is Null"
Set BD = CurrentDb
Set rst = BD.OpenRecordset(SQL)
'Bloco para selecionar o arquivo que será Importado.
Set appDialog = Application.FileDialog(3)
With appDialog
.AllowMultiSelect = False 'Impede a abertura de Multiplos arquivos.
.Title = "Selecione o Arquivo" 'Título da Caixa de Diálogo
.InitialView = 3 'Tipo de Visão dos arquivos, Ícones pequenos, grandes, detalhes, etc.
' .InitialFileName = "" 'Caminho inicial de abertura da Pasta para localizar os arquivos.
.Filters.Clear 'Limpa os filtros existentes.
.Filters.Add "Arquivo de Texto", "*.txt" 'Especifica os tipos de filtros a serem exibidos.
.Show 'Exibe a caixa de exibir arquivos.
End With
If appDialog.SelectedItems.Count < 1 Or appDialog.SelectedItems.Count > 1 Then 'Se nenhum arquivo, ou mais do um tiver sido selecionado, irá finalizar a execução.
MsgBox "Selecione apenas 1 arquivo para a Importação!!!"
Exit Function
Else
stFile = appDialog.SelectedItems(1)
End If
'Bloco para a abertura e Leitura do arquivo .txt
Open stFile For Input As #Arq ' Abre o arquivo que será lido.
Line Input #Arq, Linha
If Mid(Linha, 1, 14) <> "AR000000 - O19" Then
MsgBox "O arquivo não está no padrão esperado! Verifique.", vbExclamation, "Validação!"
Exit Function
End If
Line Input #Arq, Linha
If Mid(Linha, 56, 21) <> "CREDIT BALANCE REPORT" Then
MsgBox "O arquivo não está no padrão esperado! Verifique.", vbExclamation, "Validação!"
Exit Function
End If
UPD = ("INSERT INTO Tb_Importado (ORG) VALUES ('" & Trim(Mid(Linha, 1, 50)) & "')")
CurrentDb.Execute (UPD)
Line Input #Arq, Linha
UPD = ("INSERT INTO Tb_Importado (Logo) VALUES ('" & Trim(Mid(Linha, 1, 55)) & "')")
CurrentDb.Execute (UPD)
Line Input #Arq, Linha
Line Input #Arq, Linha
Line Input #Arq, Linha
Line Input #Arq, Linha
Quant = 1
Do While Not EOF(Arq) 'EOF significa End Of File, vai executar até que chegue o final do arquivo.
Achou = False
Line Input #Arq, Linha
Linha = Trim(Linha)
If Linha = "" Then
GoTo ProximaLinha
' ElseIf Mid(Linha, 4, 3) = " - " And Mid(Linha, 56, 21) = "CREDIT BALANCE REPORT" Then
' Org = Trim(Mid(Linha, 1, 55))
' Line Input #Arq, Linha
' Logo = Trim(Mid(Linha, 1, 55))
' GoTo ProximaLinha
End If
If Mid(Linha, 1, 3) = "000" And Mid(Linha, 91, 1) = "/" And Mid(Linha, 94, 1) = "/" And Mid(Linha, 100, 1) = "/" Then
Achou = True
If Mid(Linha, 1, 19) = Cartao Then ' Se o nº do cartão da linha atual foi o mesmo da Linha anterior, irá somar o saldo.
' Saldo = Saldo + Replace(Replace(Trim(Mid(Linha, 71, 18)), "-", ""), " ", "") * 1
UPD = ("INSERT INTO Tb_Importado (Saldo) VALUES ('" & (Saldo + (Trim(Mid(Linha, 71, 14))) * 1) & "')")
CurrentDb.Execute (UPD)
Else
' Cartao = Mid(Linha, 1, 19)
UPD = ("INSERT INTO Tb_Importado (Cartao) VALUES ('" & (Mid(Linha, 1, 19)) & "')")
CurrentDb.Execute (UPD)
' Saldo = Replace(Replace(Trim(Mid(Linha, 71, 18)), "-", ""), " ", "") * 1
'UPD = ("INSERT INTO Tb_Importado (Saldo) VALUES ('" & (Replace(Replace(Trim(Mid(Linha, 71, 18)), "-", ""), " ", "") * 1) & "')")
UPD = ("INSERT INTO Tb_Importado (Saldo) VALUES ('" & (Trim(Mid(Linha, 71, 14))) & "')")
CurrentDb.Execute (UPD)
End If
' Nome = Trim(Mid(Linha, 22, 18))
UPD = ("INSERT INTO Tb_Importado (Nome) VALUES ('" & Trim(Mid(Linha, 22, 18)) & "')")
CurrentDb.Execute (UPD)
' Status = Trim(Mid(Linha, 40, 1))
UPD = ("INSERT INTO Tb_Importado (Status) VALUES ('" & (Trim(Mid(Linha, 40, 1))) & "')")
CurrentDb.Execute (UPD)
' DD = Trim(Mid(Linha, 43, 2))
UPD = ("INSERT INTO Tb_Importado (DD) VALUES ('" & (Trim(Mid(Linha, 43, 2))) & "')")
CurrentDb.Execute (UPD)
' B1 = Trim(Mid(Linha, 48, 1))
UPD = ("INSERT INTO Tb_Importado (B1) VALUES ('" & (Trim(Mid(Linha, 48, 1))) & "')")
CurrentDb.Execute (UPD)
' B2 = Trim(Mid(Linha, 52, 1))
UPD = ("INSERT INTO Tb_Importado (B2) VALUES ('" & (Trim(Mid(Linha, 52, 1))) & "')")
CurrentDb.Execute (UPD)
' Cr_Date = Trim(Mid(Linha, 89, 8 )) '***** VERIFICAR NESSES CASOS SE QUANDO TEM MAIS DE UM PLANO ABERTO SE A DATA ALTERA.
UPD = ("INSERT INTO Tb_Importado (Cr_Date) VALUES ('" & (Trim(Mid(Linha, 89, 8 ))) & "')")
CurrentDb.Execute (UPD)
' Last_Txn = Trim(Mid(Linha, 98, 8 )) '***** VERIFICAR NESSES CASOS SE QUANDO TEM MAIS DE UM PLANO ABERTO SE A DATA ALTERA.
UPD = ("INSERT INTO Tb_Importado (Last_Txn) VALUES ('" & (Trim(Mid(Linha, 98, 8 ))) & "')")
CurrentDb.Execute (UPD)
' Last_Pmt = Trim(Mid(Linha, 107, 8 )) '***** VERIFICAR NESSES CASOS SE QUANDO TEM MAIS DE UM PLANO ABERTO SE A DATA ALTERA.
UPD = ("INSERT INTO Tb_Importado (Last_Pmt) VALUES ('" & (Trim(Mid(Linha, 107, 8 ))) & "')")
CurrentDb.Execute (UPD)
If Saldo <= "500,00" Then
' Faixa_Valor = "Até R$ 500,00"
UPD = ("INSERT INTO Tb_Importado (Faixa_Valor) VALUES ('" & ("Até R$ 500,00") & "')")
CurrentDb.Execute (UPD)
ElseIf Saldo > "500,00" Then
' Faixa_Valor = "Acima de R$ 500,00"
UPD = ("INSERT INTO Tb_Importado (Faixa_Valor) VALUES ('" & ("Acima de R$ 500,00") & "')")
CurrentDb.Execute (UPD)
End If
'Bloco para realizar o Update na Tabela de Importação.
' UPD = ("INSERT INTO Tb_Importado (Cartao, Nome, Status,DD ,B1 ,B2 ,Saldo, Cr_Date, Last_Txn, Last_Pmt, ORG, Logo, Faixa_Valor) VALUES ('" & Cartao & "', '" & Nome & "', '" & Status & "','" & DD & "','" & B1 & "','" & B2 & "','" & Saldo & "', '" & Cr_Date & "', '" & Last_Txn & "', '" & Last_Pmt & "', '" & Org & "', '" & Logo & "', '" & Faixa_Valor & "')")
' CurrentDb.Execute (UPD)
Quant = Quant + 1 'Variável para a COntagem de Registros Importados.
GoTo ProximaLinha
ElseIf Mid(Linha, 4, 3) = " - " And Mid(Linha, 56, 21) = "CREDIT BALANCE REPORT" Then
Org = Trim(Mid(Linha, 1, 55))
Line Input #Arq, Linha
Logo = Trim(Mid(Linha, 1, 55))
GoTo ProximaLinha
Else
GoTo ProximaLinha
End If
'Bloco para realizar a importação
If Achou = True Then
GoTo ProximaLinha
ElseIf Mid(Linha, 2, 2) = "AR" Then
GoTo ProximaLinha
ElseIf Mid(Linha, 1, 7) = "ACCOUNT" Then
GoTo ProximaLinha
ElseIf Mid(Linha, 1, 6) = "NUMBER" Then
GoTo ProximaLinha
ElseIf Mid(Linha, 1, 10) = " " Then
GoTo ProximaLinha
ElseIf Mid(Linha, 1, 6) = "REFUND" Then
GoTo ProximaLinha
ElseIf Mid(Linha, 1, 5) = "TOTAL" Then
GoTo ProximaLinha
ElseIf Mid(Linha, 1, 19) = "**--LOGO TOTALS--**" Then
GoTo ProximaLinha
ElseIf Trim(Mid(Linha, 26, 20)) = "DAYS" Then
GoTo ProximaLinha
End If
ProximaLinha:
'Limpando as variáveis
Org = ""
Logo = ""
Cartao = ""
Nome = ""
Status = ""
DD = ""
B1 = ""
B2 = ""
Cr_Date = ""
Last_Txn = ""
Last_Pmt = ""
Faixa_Valor = ""
Faixa_Valor = ""
' Saldo = 0
If Quant Mod 1000 = 0 Then
MsgBox "Total de Registros Importados até o momento " & Quant
End If
Loop
Close Arq ' Fecha o arquivo que está sendo lido
MsgBox "Processo Finalizado - Total de Registros Importados: " & Quant
Quant = 0
End Function
Estou realizando a importação de um arquivo TXT para uma tabela do Access, na primeira versão do código, atribui cada campo a ser importado em variáveis e importei linha a linha de uma única vez, como abaixo:
UPD = ("INSERT INTO Tb_Importado (Cartao, Nome, Status,DD ,B1 ,B2 ,Saldo, Cr_Date, Last_Txn, Last_Pmt, ORG, Logo, Faixa_Valor) VALUES ('" & Cartao & "', '" & Nome & "', '" & Status & "','" & DD & "','" & B1 & "','" & B2 & "','" & Saldo & "', '" & Cr_Date & "', '" & Last_Txn & "', '" & Last_Pmt & "', '" & Org & "', '" & Logo & "', '" & Faixa_Valor & "')")
CurrentDb.Execute (UPD)
Mas ficou muito demorada a importação.
Então estou tentando fazer o INSERT INTO, campo a campo na tabela, sem utilizar variáveis. O comando lê o código, mas não carrega a informação para o Access.
UPD = ("INSERT INTO Tb_Importado (DD) VALUES ('" & (Trim(Mid(Linha, 43, 2))) & "')")
CurrentDb.Execute (UPD)
UPD = ("INSERT INTO Tb_Importado (B1) VALUES ('" & (Trim(Mid(Linha, 48, 1))) & "')")
CurrentDb.Execute (UPD)
Minhas dúvidas: é se podem ajudar a corrigir o código de importar campo a campo sem o uso de variáveis, ou se á outra forma melhor de importação?
************************************************************
Código completo (incluindo as linhas em comentário do primeiro código
************************************************************
Option Compare Database
Public Function Importar()
Dim appDialog As Object
Dim stFile As String
Dim Arq As Integer 'Variável que irá receber o nome do Arquivo.
Dim Linha As String 'Variável que irá receber o conteúdo de Cada Linha
Dim Cartao As String
' Dim Plano As String
Dim Saldo As Double
Dim CrDate As String
Dim LastTxn As String
Dim LastPmt As String
Dim Org As String
Dim Logo As String
Dim Achou As Boolean
Dim Quant As Long
Arq = FreeFile 'O Termo FreeFile definine que á variável é um arquivo.
SQL = "SELECT * FROM Tb_Importado" 'WHERE Nome Is Null"
Set BD = CurrentDb
Set rst = BD.OpenRecordset(SQL)
'Bloco para selecionar o arquivo que será Importado.
Set appDialog = Application.FileDialog(3)
With appDialog
.AllowMultiSelect = False 'Impede a abertura de Multiplos arquivos.
.Title = "Selecione o Arquivo" 'Título da Caixa de Diálogo
.InitialView = 3 'Tipo de Visão dos arquivos, Ícones pequenos, grandes, detalhes, etc.
' .InitialFileName = "" 'Caminho inicial de abertura da Pasta para localizar os arquivos.
.Filters.Clear 'Limpa os filtros existentes.
.Filters.Add "Arquivo de Texto", "*.txt" 'Especifica os tipos de filtros a serem exibidos.
.Show 'Exibe a caixa de exibir arquivos.
End With
If appDialog.SelectedItems.Count < 1 Or appDialog.SelectedItems.Count > 1 Then 'Se nenhum arquivo, ou mais do um tiver sido selecionado, irá finalizar a execução.
MsgBox "Selecione apenas 1 arquivo para a Importação!!!"
Exit Function
Else
stFile = appDialog.SelectedItems(1)
End If
'Bloco para a abertura e Leitura do arquivo .txt
Open stFile For Input As #Arq ' Abre o arquivo que será lido.
Line Input #Arq, Linha
If Mid(Linha, 1, 14) <> "AR000000 - O19" Then
MsgBox "O arquivo não está no padrão esperado! Verifique.", vbExclamation, "Validação!"
Exit Function
End If
Line Input #Arq, Linha
If Mid(Linha, 56, 21) <> "CREDIT BALANCE REPORT" Then
MsgBox "O arquivo não está no padrão esperado! Verifique.", vbExclamation, "Validação!"
Exit Function
End If
UPD = ("INSERT INTO Tb_Importado (ORG) VALUES ('" & Trim(Mid(Linha, 1, 50)) & "')")
CurrentDb.Execute (UPD)
Line Input #Arq, Linha
UPD = ("INSERT INTO Tb_Importado (Logo) VALUES ('" & Trim(Mid(Linha, 1, 55)) & "')")
CurrentDb.Execute (UPD)
Line Input #Arq, Linha
Line Input #Arq, Linha
Line Input #Arq, Linha
Line Input #Arq, Linha
Quant = 1
Do While Not EOF(Arq) 'EOF significa End Of File, vai executar até que chegue o final do arquivo.
Achou = False
Line Input #Arq, Linha
Linha = Trim(Linha)
If Linha = "" Then
GoTo ProximaLinha
' ElseIf Mid(Linha, 4, 3) = " - " And Mid(Linha, 56, 21) = "CREDIT BALANCE REPORT" Then
' Org = Trim(Mid(Linha, 1, 55))
' Line Input #Arq, Linha
' Logo = Trim(Mid(Linha, 1, 55))
' GoTo ProximaLinha
End If
If Mid(Linha, 1, 3) = "000" And Mid(Linha, 91, 1) = "/" And Mid(Linha, 94, 1) = "/" And Mid(Linha, 100, 1) = "/" Then
Achou = True
If Mid(Linha, 1, 19) = Cartao Then ' Se o nº do cartão da linha atual foi o mesmo da Linha anterior, irá somar o saldo.
' Saldo = Saldo + Replace(Replace(Trim(Mid(Linha, 71, 18)), "-", ""), " ", "") * 1
UPD = ("INSERT INTO Tb_Importado (Saldo) VALUES ('" & (Saldo + (Trim(Mid(Linha, 71, 14))) * 1) & "')")
CurrentDb.Execute (UPD)
Else
' Cartao = Mid(Linha, 1, 19)
UPD = ("INSERT INTO Tb_Importado (Cartao) VALUES ('" & (Mid(Linha, 1, 19)) & "')")
CurrentDb.Execute (UPD)
' Saldo = Replace(Replace(Trim(Mid(Linha, 71, 18)), "-", ""), " ", "") * 1
'UPD = ("INSERT INTO Tb_Importado (Saldo) VALUES ('" & (Replace(Replace(Trim(Mid(Linha, 71, 18)), "-", ""), " ", "") * 1) & "')")
UPD = ("INSERT INTO Tb_Importado (Saldo) VALUES ('" & (Trim(Mid(Linha, 71, 14))) & "')")
CurrentDb.Execute (UPD)
End If
' Nome = Trim(Mid(Linha, 22, 18))
UPD = ("INSERT INTO Tb_Importado (Nome) VALUES ('" & Trim(Mid(Linha, 22, 18)) & "')")
CurrentDb.Execute (UPD)
' Status = Trim(Mid(Linha, 40, 1))
UPD = ("INSERT INTO Tb_Importado (Status) VALUES ('" & (Trim(Mid(Linha, 40, 1))) & "')")
CurrentDb.Execute (UPD)
' DD = Trim(Mid(Linha, 43, 2))
UPD = ("INSERT INTO Tb_Importado (DD) VALUES ('" & (Trim(Mid(Linha, 43, 2))) & "')")
CurrentDb.Execute (UPD)
' B1 = Trim(Mid(Linha, 48, 1))
UPD = ("INSERT INTO Tb_Importado (B1) VALUES ('" & (Trim(Mid(Linha, 48, 1))) & "')")
CurrentDb.Execute (UPD)
' B2 = Trim(Mid(Linha, 52, 1))
UPD = ("INSERT INTO Tb_Importado (B2) VALUES ('" & (Trim(Mid(Linha, 52, 1))) & "')")
CurrentDb.Execute (UPD)
' Cr_Date = Trim(Mid(Linha, 89, 8 )) '***** VERIFICAR NESSES CASOS SE QUANDO TEM MAIS DE UM PLANO ABERTO SE A DATA ALTERA.
UPD = ("INSERT INTO Tb_Importado (Cr_Date) VALUES ('" & (Trim(Mid(Linha, 89, 8 ))) & "')")
CurrentDb.Execute (UPD)
' Last_Txn = Trim(Mid(Linha, 98, 8 )) '***** VERIFICAR NESSES CASOS SE QUANDO TEM MAIS DE UM PLANO ABERTO SE A DATA ALTERA.
UPD = ("INSERT INTO Tb_Importado (Last_Txn) VALUES ('" & (Trim(Mid(Linha, 98, 8 ))) & "')")
CurrentDb.Execute (UPD)
' Last_Pmt = Trim(Mid(Linha, 107, 8 )) '***** VERIFICAR NESSES CASOS SE QUANDO TEM MAIS DE UM PLANO ABERTO SE A DATA ALTERA.
UPD = ("INSERT INTO Tb_Importado (Last_Pmt) VALUES ('" & (Trim(Mid(Linha, 107, 8 ))) & "')")
CurrentDb.Execute (UPD)
If Saldo <= "500,00" Then
' Faixa_Valor = "Até R$ 500,00"
UPD = ("INSERT INTO Tb_Importado (Faixa_Valor) VALUES ('" & ("Até R$ 500,00") & "')")
CurrentDb.Execute (UPD)
ElseIf Saldo > "500,00" Then
' Faixa_Valor = "Acima de R$ 500,00"
UPD = ("INSERT INTO Tb_Importado (Faixa_Valor) VALUES ('" & ("Acima de R$ 500,00") & "')")
CurrentDb.Execute (UPD)
End If
'Bloco para realizar o Update na Tabela de Importação.
' UPD = ("INSERT INTO Tb_Importado (Cartao, Nome, Status,DD ,B1 ,B2 ,Saldo, Cr_Date, Last_Txn, Last_Pmt, ORG, Logo, Faixa_Valor) VALUES ('" & Cartao & "', '" & Nome & "', '" & Status & "','" & DD & "','" & B1 & "','" & B2 & "','" & Saldo & "', '" & Cr_Date & "', '" & Last_Txn & "', '" & Last_Pmt & "', '" & Org & "', '" & Logo & "', '" & Faixa_Valor & "')")
' CurrentDb.Execute (UPD)
Quant = Quant + 1 'Variável para a COntagem de Registros Importados.
GoTo ProximaLinha
ElseIf Mid(Linha, 4, 3) = " - " And Mid(Linha, 56, 21) = "CREDIT BALANCE REPORT" Then
Org = Trim(Mid(Linha, 1, 55))
Line Input #Arq, Linha
Logo = Trim(Mid(Linha, 1, 55))
GoTo ProximaLinha
Else
GoTo ProximaLinha
End If
'Bloco para realizar a importação
If Achou = True Then
GoTo ProximaLinha
ElseIf Mid(Linha, 2, 2) = "AR" Then
GoTo ProximaLinha
ElseIf Mid(Linha, 1, 7) = "ACCOUNT" Then
GoTo ProximaLinha
ElseIf Mid(Linha, 1, 6) = "NUMBER" Then
GoTo ProximaLinha
ElseIf Mid(Linha, 1, 10) = " " Then
GoTo ProximaLinha
ElseIf Mid(Linha, 1, 6) = "REFUND" Then
GoTo ProximaLinha
ElseIf Mid(Linha, 1, 5) = "TOTAL" Then
GoTo ProximaLinha
ElseIf Mid(Linha, 1, 19) = "**--LOGO TOTALS--**" Then
GoTo ProximaLinha
ElseIf Trim(Mid(Linha, 26, 20)) = "DAYS" Then
GoTo ProximaLinha
End If
ProximaLinha:
'Limpando as variáveis
Org = ""
Logo = ""
Cartao = ""
Nome = ""
Status = ""
DD = ""
B1 = ""
B2 = ""
Cr_Date = ""
Last_Txn = ""
Last_Pmt = ""
Faixa_Valor = ""
Faixa_Valor = ""
' Saldo = 0
If Quant Mod 1000 = 0 Then
MsgBox "Total de Registros Importados até o momento " & Quant
End If
Loop
Close Arq ' Fecha o arquivo que está sendo lido
MsgBox "Processo Finalizado - Total de Registros Importados: " & Quant
Quant = 0
End Function