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
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
¿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
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?
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
- Compartir respuesta