La Web del Programador: Comunidad de Programadores
 
    Pregunta:  25863 - INSERTAR EN LA BASE DE DATOS ARCHIVOS PLANOS
Autor:  María Isabel Mora Penagos
Hola, necesito que por favor me comenten si existe una o varias instrucciones en Visual Basic 4.0 para subir archivos planos a una base de datos en Access si necesidad de leer linea por linea e insertar en una tabla.

Tengo el siguiente código, el cual crea una tabla con la información del archivo plano, pero no se como insertar esta información a una tabla existente.

Set MyTableDef = gBD(0).CreateTableDef("PERSONAS_INICIAL")

MyTableDef.Connect = "Text;Database=C:DATOS\"
MyTableDef.SourceTableName = "Plano.txt"

gBD(0).TableDefs.Append MyTableDef

Por otra parte, cuando se utiliza este código los datos de tipo double no suben correctamente y el encabezado de la tabla es el primer registro o la primera linea del archivo plano.

Agradezco la colaboración.

  Respuesta:  Christian Tomas Benitez Morel
Hola, hay una forma, comun, vieja y sencilla de hacer eso que vos queres,
que es con la instruccion OPEN que se utilizaba con basic para abrir archivos de acceso directo y secuencial, ej. Open txtNombreArchivo For Random As #1 Len = Len(MiRegistro)
Cant = Int(LOF(1) / Len(MiRegistro)) + 1

If Cant > 0 Then
posicion = 1
sInSQL = "delete from tmpMarcas"
Ejecuta_Instruccion_ABM sInSQL
lblAccion = "Importando datos del Reloj"
pBarOperacion.Value = 0
pBarOperacion.Max = Cant

Else
MsgBox "Error, el archivo no contiene datos"
End If

For posicion = 1 To Cant

pBarOperacion.Value = posicion

Get #1, posicion, MiRegistro

If InStr(1, UCase(MiRegistro.Ced), "F") > 0 Then
sCedula = Trim(Left(MiRegistro.Ced, InStr(1, UCase(MiRegistro.Ced), "F") - 1))
Else
If IsNumeric(MiRegistro.Ced) Then sCedula = MiRegistro.Ced
End If

If IsNumeric(sCedula) And IsDate(MiRegistro.fecha) _
And Len(Trim(MiRegistro.Hora)) = 5 _
And Len(Trim(MiRegistro.tipo)) = 1 Then
If Format(sFechaMin, "yyyymmdd") > Format(MiRegistro.fecha, "yyyymmdd") Then
sFechaMin = MiRegistro.fecha
End If
If Format(sFechaMax, "yyyymmdd") < Format(MiRegistro.fecha, "yyyymmdd") Then
sFechaMax = MiRegistro.fecha
End If

sInSQL = "insert into Marcas "
sInSQL = sInSQL + "(ced, fecha, hora, tipo, nodo, obs)"
sInSQL = sInSQL + " values ("
sInSQL = sInSQL + Trim(sCedula)
sInSQL = sInSQL + ", '" + Trim(MiRegistro.fecha)
sInSQL = sInSQL + "', '" + Trim(Left(Trim(MiRegistro.Hora), 2) + Right(Trim(MiRegistro.Hora), 2))
Select Case Trim(MiRegistro.tipo)
Case "1", "E"
sTipo = "E"
Case "2", "S"
sTipo = "S"
End Select

sInSQL = sInSQL + "', '" + Trim(sTipo)
sInSQL = sInSQL + "', '" + Trim(MiRegistro.Filler)
sInSQL = sInSQL + "', '" + sSucursal + "')"
Ejecuta_Instruccion_ABM sInSQL

sInSQL = "insert into tmpMarcas "
sInSQL = sInSQL + "(ced, fecha, hora, tipo, nodo, obs)"
sInSQL = sInSQL + " values ("
sInSQL = sInSQL + Trim(sCedula)
sInSQL = sInSQL + ", '" + Trim(MiRegistro.fecha)
sInSQL = sInSQL + "', '" + Trim(Left(Trim(MiRegistro.Hora), 2) + right(Trim(MiRegistro.Hora), 2))
Select Case Trim(MiRegistro.tipo)
Case "1", "E"
sTipo = "E"
Case "2", "S"
sTipo = "S"
End Select

sInSQL = sInSQL + "', '" + Trim(sTipo)
sInSQL = sInSQL + "', '" + Trim(MiRegistro.Filler)
sInSQL = sInSQL + "', '" + sSucursal + "')"
Ejecuta_Instruccion_ABM sInSQL

End If
sCedula = ""
Next posicion
Close #1


  Respuesta:  Christian Tomas Benitez Morel
Hola, hay una forma, comun, vieja y sencilla de hacer eso que vos queres,
que es con la instruccion OPEN que se utilizaba con basic para abrir archivos de acceso directo y secuencial, ej.

'Definicion del registro en el modulo
Type Record
Ced As String * 9
fecha As String * 9
Hora As String * 6
tipo As String * 1
Filler As String * 6
kk As String * 2
End Type

'Definicion del registro en el procedimiento
dim MiRegistro as record
dim Cant as integer, posicion as integer

'en el nombre del archivo no importa la extension
Open "c:\Archivo.txt" For Random As #1 Len = Len(MiRegistro)
Cant = Int(LOF(1) / Len(MiRegistro)) + 1

If Cant > 0 Then
posicion = 1
Else
MsgBox "Error, el archivo no contiene datos"
End If

For posicion = 1 To Cant

Get #1, posicion, MiRegistro

Next posicion
Close #1

a la par que lees una linea de tu archivo de texto, lo insertas en una tabla temporal en tu BD, con una instruccion sql en ADO o en DAO.

ojala te sirva, a mi me fue muy util y solucione un gran problema.
SUERTE.