Tengo que hacer un recordset de agrupación sobre un fichero dBase III, pero
seleccionado solo algunos registros que conincidan con datos de una tabla de
access
Mas o menos lo que hago es esto.
cNombre = "Fichero" <- es el nombre del fichero sin estensión
cOrigen = "[C:\DIR\BASE.MDB]."
Set dbDBF = OpenDatabase(cPath, False, True, "dBASE III")
cSql = "SELECT CLI, USER, Sum(HORAS) as HORAS " & _
"FROM " & cNombre & " " & _
"WHERE ((CLI In (select cod From " & _
cOrigen & "Previsto Where Emp_Any = '" & cAny & _
"' Order By Emp_cod))) " & _
"GROUP BY PRT_CLI, PRT_USER;"
Set rstTrab = dbDBF.OpenRecordset(cSql, dbOpenDynaset, dbReadOnly)
Pero no funciona
Yo supongo que le problema es que los sistemas Access y dBase chocan y me
falta algo, pero no se que puede ser
Alguien podria indicarme como se puede hacer
Gracias a tod@s
Desde Barcelona
José Luis Gazulla
¿No has vinculado la tabla dbase? Parece que lo más fácil
es vincularla (Menú Archivo -> Obtener datos externos ->
Vincular) y después puedes trabajar con ella (para
lectura) como cualquier otra tabla Access.
Saludos,
CarCar
>-----Mensaje original-----
>.
>
Saludos
José Luis
"CarCar" <ccar...@hotmail.com> escribió en el mensaje
news:05a001c30b1c$cb1d22e0$a501...@phx.gbl...
Pues "tendrás" que vincularla, estás en Access, no en
Dbase o Clipper, así que tendrás que "acatar" las
reglas. :-)
¿De qué opciones del Form depende? ¿A cuantas tablas de
dBase vas a vincular? lo que está claro es que tal y como
lo estás haciendo no hay nada que hacer. :-(
Saludos,
CarCar
>-----Mensaje original-----
>.
>
Hola, José Luis:
No indicas el motivo por el cual no funciona.
Prueba a ponerle la extensión *.DBF al nombre del archivo dBASE:
Dim dbDBF As Database
Dim rstTrab As DAO.Recordset
' Abrimos la base de datos
Set dbDBF = OpenDatabase("C:\Mi carpeta", False, True, "dBASE III;")
' Abrimos el recordset
Set rstTrab = dbDBF.OpenRecordset("SELECT * FROM Archivo.dbf",
dbOpenDynaset, dbReadOnly)
' Leemos el valor del primer campo
MsgBox rstTrab.Fields(0)
Un saludo.
--
Enrique Martínez
[MS MVP - VB]
Joé... pues menuda metedura de pata acabo de decir... lo
siento... mira que normalmente que cuando no tengo claro
el tema no contesto para no meter la pata... pero esta vez
la he metido hasta el corvejón. :-((
Saludos,
CarCar
PD: Intentaré ser aún más discreto.
CarCar dijo:
------------------------------------------------------
Pues "tendrás" que vincularla, estás en Access, no en
Dbase o Clipper, así que tendrás que "acatar" las
reglas. :-)
------------------------------------------------------
>-----Mensaje original-----
>.
>
>
> Joé... pues menuda metedura de pata acabo de decir... lo
> siento... mira que normalmente que cuando no tengo claro
> el tema no contesto para no meter la pata... pero esta
> vez la he metido hasta el corvejón. :-((
>
Hola, Carlos:
No te preocupes, que no eres el único que en alguna
ocasión ha metido la «gamba». :-)
Más de uno, y yo me incluyo entre ellos, en alguna que
otra ocasión también hemos metido la pata «hasta el
cuello», y cuando me he dado cuenta del error, he
gritado «¡¡trágame tierra!!» :-((
Pero lo importante de todo ésto, es que tú has intentado
ayudar de la mejor manera posible. ¿Que te has equivocado
ésta vez? Bueno, no pasa nada. ¿Cuántas veces has
acertado, y le has resuelto la "papeleta" a más de uno?
Eso es lo verdaderamente importante, por tanto, el no
haber acertado en ésta ocasión, no debe ser motivo para
desanimarte, porque repito, que tú has intentado dar la
respuesta que creías ser la mejor, o porque desconocías,
que no se podía abrir mediante código un archivo de dBASE.
Como le digo a más de uno, debes de tener en cuenta que
los MVPs ni somos «dioses», ni tenemos porqué saberlo todo.
¡Venga! Ánimo, y a seguir colaborando como hasta ahora en
el grupo de noticias, que para eso te has ganado a pulso
el que Microsoft te haya reconocido como nuevo MVP de
Access.
De todas formas ha sido una lástima no haber leído antes
tu contestación, muy interesante por cierto, no tenía ni
idea.
Supongo que entonces sí se puede, utilizando esta técnica
actualizar y borrar registros en las tablas de dBase.
(Había leído en las News que las nuevas versiones de
Access no permitían la actualizacìón de tablas .dbf
vinculadas).
Saludos,
CarCar
>-----Mensaje original-----
>
>"CarCar" escribió:
>
>>
>> Joé... pues menuda metedura de pata acabo de decir...
lo
>> siento... mira que normalmente que cuando no tengo
claro
>> el tema no contesto para no meter la pata... pero esta
>> vez la he metido hasta el corvejón. :-((
>>
>
>Hola, Carlos:
>
>No te preocupes, que no eres el único que en alguna
>ocasión ha metido la «gamba». :-)
>
...
...
>
>Un saludo.
>
>--
>Enrique Martínez
>[MS MVP - VB]
>
>.
>
> Supongo que entonces sí se puede, utilizando esta
técnica
> actualizar y borrar registros en las tablas de dBase.
> (Había leído en las News que las nuevas versiones de
> Access no permitían la actualizacìón de tablas .dbf
> vinculadas).
Pues ahora mismo no te lo puedo confirmar, aunque me
extraña que no se pueda actualizar archivos dBASE
vinculados. Más tarde lo probaré con Access XP y te lo
comentaré.
Si estas interesado en el tema, en la siguiente dirección
te aparecerá una lista de artículos de la Knowledge Base
(la mayoría están es español gracias al servicio de
traducción automática), que tratan sobre dBASE. Si el
enlace aparece roto, que será lo más probable, junta las
palabras:
http://support.microsoft.com/search/default.aspx?
Product=&KeywordType=any&Titles=false&numDays=&maxResults=2
5&withinResults=false&Queryl=abrir+archivo+dbase&Query=abri
r+archivo+dbase&Catalog=LCID%3D1034%26CDID%3DES-SUPPORT%
26PRODLISTSRC%3DON&QuerySource=gsfxSearch_Query
Salu2.
Softjaen ha escrito:
--
¡¡Se está preparando el III Encuentro de Sufridores de Access!!
http://www.mcpegasus.com/encuentros/iiiencuentro.htm
> Al comienzo de Access 2000, Microsoft dejo de dar soporte a la
> posibilidad de modificar ficheros de dBase a través de Access. Requería
> la instalación del Borland DataEngine. Pero luego, milagrosamente, la
> recuperó.
Hola, José Mª.
La verdad es que desconocía tal posibilidad.
Lo que sí es cierto es que (y desde aquí le contesto a «CarCar»), desde una
base de datos Access97 o XP (con Access 2000 no lo he probado, aunque me
imagino que también se podrá), se puede vincular un archivo dBASE como todos
sabemos, y se pueden añadir, eliminar y actualizar los registros, pero lo
que Access no permite es modificar la estructura del los campos del archivo:
si un campo es de tipo Texto, no intentes cambiarlo a Numérico porque no te
dejará.
Otra cosa distinta es utilizar el controlador IISAM Xbase de Microsoft, el
cual es compatible con las versiones de dBASE de Borland: dBASE III, dBASE
IV y dBASE 5.0. Por tanto, mediante dicho controlador podemos vincular o
abrir mediante código una base de datos dBASE, y utilizarla como
utilizaríamos una tabla cualquiera de Access. Eso sí, debemos de tener
instalado el ISAM de Xbase, el archivo «msxbde40.dll», que por defecto se
instala en el directorio System o System32 de Windows. Hay unas ciertas
particularidades que habría que tener en cuenta en lo referente al control
de los registros eliminados y de los índices de dBase, pero eso sería tema
para escribir un nuevo artículo, y estoy ya de tipos de ISAM hasta los
mismísimos «cataplines» :-))
Por último, indicar que, si escribimos código para abrir/vincular un archivo
dBASE, podemos utilizar tanto la biblioteca de DAO como la de ADO. Y aún hay
más: si utilizamos la biblioteca de ADOX, hasta podemos crear y definir la
estructura de nuestro propio archivo de dBASE. Os adjunto una respuesta que
en su día le respondí a un usuario del grupo de Visual Basic:
El siguiente ejemplo crea un archivo dBASE versión 5.0 utilizando
conjuntamente las bibliotecas de ADO y ADOX (para ésta última, en tu
proyecto tendrás que hacer referencia a la biblioteca «Microsoft ADO Ext.
2.x for DDL and Security»):
Dim cnn As ADODB.Connection
Dim cat As ADOX.Catalog
Dim tbl As ADOX.Table
' Establecemos una conexión, especificando sólo la ruta
' donde vamos a crear el nuevo archivo dBASE
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source = C:\Mis documentos\"
.Properties("Extended Properties") = "dBASE 5.0;"
.Open
End With
' Creo un nuevo objeto «Catalog»
Set cat = New ADOX.Catalog
cat.ActiveConnection = cnn
' Creamos un nuevo objeto "Table"
Set tbl = New ADOX.Table
' Genero la nueva base de datos dBASE
With tbl
.Name = "Clientes"
' Añadimos los campos a la tabla
.Columns.Append "IdCliente", adInteger
.Columns.Append "Nombre", adVarWChar, 50
.Columns.Append "CIF", adVarWChar, 9
End With
' Añadimos la tabla al catálogo
cat.Tables.Append tbl
> y poder llenar sus datos... La pregunta es ¿Como...?
El siguiente ejemplo va a rellenar la base de datos que acabamos de crear.
Pero antes, inserta en tu proyecto un control «DataGrid» y establece su
propiedad «AllowAddNew» a «True»:
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
' Conexión con la base
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source = C:\Mis documentos"
.Properties("Extended Properties") = "dBASE 5.0;"
.Open
End With
' Configuramos el conjunto de registros
Set rs = New ADODB.Recordset
With rs
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open "Clientes.dbf", cnn, , , adCmdTable
MsgBox .RecordCount
End With
Set DataGrid1.DataSource = rs
Ya estas en disposición de rellenar la base de datos. Por supuesto que en
lugar del control «DataGrid» puedes utilizar el método «AddNew» del objeto
«Recordset», para añadir nuevos registros a la base de datos, igual que si
de una tabla de Access se tratara.
Un saludo, José Mª.
¡Ah! ¡Y enhorabuena!, que aunque lo tienes muy calladito, me he enterado que
también te han nombrado MVP. ¡Mira que estáis MVPs en el grupo de Access!
8-)
Gracias a todos, creo que las cosas han quedado
suficientemente claras... espero que José Luis Gazulla, el
iniciador del hilo, no haya huido de aquí después de leer
mis desastrosos mensajes iniciales. Le pido disculpas por
llevarle a la confusión más confusa.
Saludos,
CarCa
>-----Mensaje original-----
>.
>
He de decir que para poder efectuar las pruebas, primero vincule una tabla
dBase
he hice una consulta que funciona perfectamente.
Pero al hacerlo por VB dejo de funcionar.
Sobre el tema de poner la estensión del fichero no es necesario, tengo otras
consultas y funciona perfectamente.
Yo creo que el problema es de otro tipo
Lo que deseo que esta consulta de agrupación que se hace sobre una tabla
dBase se añada en una tabla MDb, que esta Vinculada a la bd desde donde se
ejecuta, (nota esta bd vinculada tiene Pasword)
lo que pasa es que
1º se abre una base de datos Dbase
Set dbDb = OpenDatabase(cPath, False, True, "dBASE III")
2º Creo la consulta que tendria que insertar en mi tabla Importdo
los datos del fichero dBase agrupado por PRT_CLI Y PRT_USER Sumando las
HORAS
Cumpliendo las condiciones de fecha, y que ademas la clave PRT_CLI este
tambien en la tabla Previsto
tanto las tablas Importado como Previsto son tablas Access, pero Previsto es
una tabla vinculada
csql = "INSERT INTO Importado ( EMP_COD, USR_COD, HORAS ) " & _
"SELECT PART2002.PRT_CLI, PART2002.PRT_USER,
Sum(PART2002.PRT_HORAS) AS HORAS " & _
"FROM PART2002 " & _
"WHERE (((PART2002.PRT_CLI) In " & _
"(select emp_cod From Previsto Where Emp_Any = '2002' Order By
Emp_cod)) " & _
"AND ((PART2002.PRT_FECHA)<=#6/30/2002#)) " & _
"GROUP BY PART2002.PRT_CLI, PART2002.PRT_USER;"
dbDb.Execute (csql)
Al intentar ejecutar esto me dice que no encuentra la tabla previsto
Yo supongo que deberia incluir algun dato mas para inciar que es Access y
que ademas abria que inculir el password No se como Hacerlo,
Saludos de Nuevo desde Barcelona
José Luis Gazulla
"Softjaen" <soft...@NOSPAMyahoo.es> escribió en el mensaje
news:OqBiaVz...@TK2MSFTNGP11.phx.gbl...
José Luis
"CarCar" <ccar...@hotmail.com> escribió en el mensaje
news:01c601c30d68$1a335f00$a001...@phx.gbl...
> Sobre el tema de poner la estensión del fichero no
> es necesario, tengo otras consultas y funciona
> perfectamente.
>
En algunas ocasiones, no está de más especificar la
extensión *.dbf.
>
> Yo supongo que deberia incluir algun dato mas para
> inciar que es Access y que ademas abria que incluir
> el password.
> No se como Hacerlo,
Si la base de datos Access, donde quieres importar los
datos, tiene establecida una contraseña, indudablemente se
la tienes que indicar en la cadena de conexión.
No voy a entrar en detalle sobre tu consulta SQL, ya que
es un poco complicada. Te voy a exponer otro ejemplo, y tú
lo adaptas a tus necesidades. Decirte que acabo de
ejecutar una consulta SQL de datos anexados, con más de
800 registros procedentes de un archivo dBASE, para
insertarlos en una tabla de Access con contraseña. :-)
Dim sConnect As String, sChainSql As String
Dim db As Database
' Abrimos la base de datos dBASE
Set db = OpenDatabase("C:\Temp", False, True, "dBASE
III;")
' Identificamos la tabla de destino, por lo que debemos
' de especificar la ruta de la base y la contraseña
' Obsérvese el par de comillas entre paréntesis,
' que hay que quitar cuando se vaya a ejecutar
sConnect = " (')(')[;DATABASE=C:\Temp\Bd1.mdb;
pwd=1234]"
' Construimos la consulta SQL, la cual importará los
datos
' del archivo «Clientes.DBF» a la tabla «Clientes» de
Access
sChainSql = "INSERT INTO [Clientes] IN " & sConnect
& " SELECT * FROM [Clientes#dbf]"
' Ejecutamos la consulta
db.Execute sChainSql
Espero que el ejemplo te resuelva el problema.
Perdona por la tardanza.
Bueno ya lo he probado y no funciona me da error EN INSERT INTO.
Al final he cambiado la forma de hacer la consulta, en lugar de utilizar la
conexion de la base de datos.
Dim db As Database
' Abrimos la base de datos dBASE
Set db = OpenDatabase("C:\Temp", False, True, "dBASE III")
cConex = "''[;DATABASE=X:\CONTA\MiBase.Mdb;pwd=123456]"
y abrir el recordset a traves de esa bd tipo de base
He utilizado
set db = CurrentDb
cConex = "''[;DATABASE=C:\DATOS\MIBASE.MDB;]"
csql = "INSERT INTO [Importado] " & _
" ( EMP_COD, USR_COD, HORAS ) " & _
"SELECT PART2002.PRT_CLI, PART2002.PRT_USER,
Sum(PART2002.PRT_HORAS) AS HORAS " & _
"FROM [PART2002] IN " & cConex & _
" WHERE " & _
" (PART2002.PRT_CLI In " & _
" (select emp_cod From Previsto Where Emp_Any = '2002' Order By
Emp_cod) ) " & _
"AND " & _
"( PART2002.PRT_FECHA <= #06/30/2002# ) " & _
"GROUP BY PART2002.PRT_CLI, PART2002.PRT_USER;"
db.Execute (csql)
y ASI SI QUE HA FUNCIONADO
MUCHAS GRACIAS
Desde Barcelona
José Luis Gazulla
"Softjaen" <soft_jaen@QUITA_ESTOyahoo.es> escribió en el mensaje
news:06ca01c30da6$5d9c6a50$a501...@phx.gbl...
> Bueno ya lo he probado y no funciona me da error EN INSERT INTO.
>
Hola:
Pues la verdad es que no sé por qué no te funciona. Me da que pensar, que
sea por algún error de sintaxis de la consulta SQL. Desde luego, el código
que te adjunté funciona perfectamente, aparte de que no conozco otra forma
de llevar a cabo tal acción.
>
> y ASI SI QUE HA FUNCIONADO
>
> MUCHAS GRACIAS
>
De nada, José Luis. Lo importante es que, de una u otra manera, has resuelto
el problema. :-)
Un saludo desde Jaén
Gracias por la ayuda de todos
Saludos desde BCN
José Luis Gazulla
"Softjaen" <soft...@NOSPAMyahoo.es> escribió en el mensaje
news:%23D2QYJn...@TK2MSFTNGP11.phx.gbl...