Macro para consultar cierto valor que esta dentro de un .DBF

Necesito una macro para consultar un "IBM" y que en la parte de abajo muestre un historial de las fechas y horas que tiene registradas, tengo el siguiente diseño:

y la .DBF contiene esta informacion:

1 respuesta

Respuesta
1

Hol.a

No me queda claro que quieres decir con "consultar un IBM" pero en todo caso entendí que parte (¿o todo?) De tu dilema es conectarte a una tabla *.dbf ¿cierto? Lo que hay que tomar en cuenta primero es si es parte de una base de datos de Fox (o similar) o si es una tabla *.dbf "libre" ya que el modo de conectarse es distinto. Segundo, verifica que tienes algún "driver" de conexión y que si solo tienes Excel 2013 dicha versión perdió compatibilidad con ese tipo de archivos (cosa que ya restablecieron en Excel 2016), claro, si en tu PC tienes un programa que se maneja con tablas *.dbf, lo más probable es que sí tengas algún "driver".

Comentas

Abraham Valencia

Abraham Valencia! que tal

Consultar IBM me refiero a consultar el valor que esta en la segunda imagen con el campo EMP,  a eso me refiero con IMB (me falto especificar), y al parecer si son tablas de datos Fox, toda esa informacion se captura mediante command prompt y se guarda en PRCLOCK.DBF... me estoy dando a entender?

Te entendí mejor entonces la información que quieres "consultar" ya está en Excel y no directamente en el *.dbf como pensé ¿cierto?

Abraham Valencia

No, ese DBF lo estoy abriendo con Excel, es la manera que me deja visualizarlo, pero toda esa información esta dentro del .DBF... y si quiero consultar por el numero de EMP, al momento de consultar que me de un histórico de 10 días.

Ejemplo si el empleado 8255 tiene

1.50 horas el dia 1/3/2017

2.50 horas el dia 1/4/2017

1.00 horas el dia 1/7/2017

Al momento de consultar me de esos resultados en una lista del día mayor al menor.

Espero haberme explicado mejor.

Lo primero que hay que averiguar es como conectarse, prueba con esto:

Sub ConectarDBF()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
cnn.Open "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=D:\Nombredelacarpeta;Exclusive=No;Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;"
rst.Open "Select * From PRCLOCK.DBF", cnn, adOpenStatic, adLockReadOnly, adCmdText
MsgBox "Conexión exitosa"
rst.Close
cnn.Close
Set rst = Nothing
Set cnn = Nothing
End Sub

Reemplaza la ruta por la tuya (SourceDB=) y prueba la conexión. Por si acaso tienes que activar, en el editor de VBA, la referencia a "Microsoft ActiveX Data 2.8 Objects Library" (en donde el 2.8 puede ser otro número en tu caso)

Comentas

Abraham Valencia

Okey, deja lo hago y te aviso... Gracias.

¿Abraham dónde puedo ver si la conexión se realizo con éxito? Ya lo escribí en el código pero no se si la conexión sea buena y valla a leer las celdas, muchas gracias

Coloca lo que te envié en un módulo "standard" (Insertar - Módulo) y luego coloca el cursor en cualquier parte de la macro y activa la macro con el botón "Ejecutar sub" (el triangulo de lado). Si logra la conexión saldrá un "MsgBox" que dirá "Conexión exitosa", si da un error es que no pudo.

Abraham Valencia

Me aparece este error, active referencias pero fue lo mismo

Me aparece este error, ya trate de agregar el DLL pero no me deja ejecutar-

En lo de las referencias, parece que marcaste una erradas. Mira y guíate (la última):

Sobre lo segundo, hay muchos "drivers", tú ¿qué programas usas en esa PC para poder trabajar con los archivos *.dbf?

Abraham Valencia

Abraham ya realizo conexión exitosa, tuve que agregar VFPODBC.DLL, ahora que esta hecha la conexión, ¿qué sigue?

Excelente. ¿Conoce/manejas el lenguaje SQL?

Abraham Valencia

tengo un poco de conocimiento pero casi no lo he manejado... que es lo que quieres hacer en SQL?

Vamos a usar "Between" y "Where", solo dime en la tabla *.dbf cual es el nombre del campo de ela fecha

Abraham Valencia

.

La tabla es prclock.dbf y el campo es date, como te lo explique anteriormente solo lo que necesito es Date, Emp y Hours todas las demás no me importan, solo necesito información de esos campos.

También hay otro detalle, tengo un maestro en donde viene el nombre del empleado, en este caso iré a buscar el numero de emp y que en el campo nombre del formulario de excel me extraiga el nombre de la persona, solo que este maestro lo tengo en otra DBF y en diferente ubicación, pero eso lo podemos dejar para después...

Hol.a

Como para empezar, declara estas variables:

Dim FechaInicio As Date, FechaFinal As Date

Agrega esto inmediatamente después de las líneas que dicen "Set":

FechaInicio = Format("03/01/2017", "mm/dd/yyyy")
FechaFinal = Format("05/01/2017", "mm/dd/yyyy")

Reemplaza esta línea:

rst.Open "Select * From PRCLOCK.DBF Where date Between #" & FechaInicio & "# And #" & FechaFinal & "#", cnn, adOpenStatic, adLockReadOnly, adCmdText

Y luego esto después del "MsgBox" (que en realidad ya puedes borrar):

Range("A1"). CopyFromRecordset rst

Comentas los resultados.

Abraham Valencia

Sub ConectarDBF()
Dim FechaInicio As Date, FechaFinal As Date
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
FechaInicio = Format("03/01/2017", "mm/dd/yyyy")
FechaFinal = Format("05/01/2017", "mm/dd/yyyy")
cnn.Open "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=C:\;Exclusive=No;Collate=Machine;NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;"
rst.Open "Select * From PRCLOCK.DBF Where date Between #" & FechaInicio & "# And #" & FechaFinal & "#", cnn, adOpenStatic, adLockReadOnly, adCmdText
Range("A1").CopyFromRecordset rst
rst.Close
cnn.Close
Set rst = Nothing
Set cnn = Nothing
End Sub

quedaría así???

Sí, úsala a ver que resultados te arroja en una hoja.

El lenguaje SQL no es igual para todos los tipos de tablas y hace años no uso *.dbf, por eso prueba a ver que tal.

Abraham Valencia

me arrojo esto...

¿Oye pero se podrá mostrar lo que contiene el DBF en el listbox que tengo en el formulario?

Lo que quiero hacer se hace todo desde el formulario, ya que los datos estén correctos en el listbox ahora si poderlos exportar a excel, haber si pude explicarme mejor, creo en lo primero me revolví un poco

Se puede todo desde el formulario ("Userform"), claro, pero primero hay que conectar y poder tener la certeza de las sentencias SQL para extraer los datos, por eso lo que te mandaba.

Ahora ando en mi portátil, aquí tengo Office de 64 bits así que no tengo forma de probar conexiones a *.dbf, más tarde desde mi PC probaré a ver como era lo de las fechas, igual quizá es cosa de poner la fecha con la hora porque quizá el campo es tipo "Date Time" y no "fecha", intenta/comenta eso.

Abraham Valencia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas