consultar tablas dbf

08/03/2005 - 17:57 por fredy | Informe spam
hola grupo...
mi necesidad es la siguiente:

tengo una tabla dbf (FUENTE)que proviene de foxpro con mas de 900.000
registros
tengo una tabla de excel la cual tengo que completar con datos de la tabla
dbf (FUENTE) la llave entre estas tablas es un numero de identificacion de
usuario y un numero de factura, los datos que tengo que extraer de (FUENTE)
para cada usuario pueden ser de cero hasta 10 datos, como puedo hacer la
consulta de FUENTE desde excel para extraer los datos de cada usuario???( mi
duda se debe a que latabla FUENTE no me la abre excel por la cantidad de
registros)

muchas gracias por su colaboracion

Preguntas similare

Leer las respuestas

#6 Manuel Romero
09/03/2005 - 23:39 | Informe spam
Se me olvido (siempre me pasa, no se porque)

rs.movenext

antes del cnt=cnt+1

"fredy" escribió en el mensaje
news:
Hola Manuel

estoy utilizando el codigo que me recomendaste ( aunque el anterior me
funciono el de datos externos lo adapte en una macro y me genero los
resultados que esperaba solo que se demoro casi 12 hrs para extraer los


datos
de 9000 registros de la fuente de 900000 registros pero bueno...ahora


busco
tal vez un poco de rapidez en el proceso)

PRIMERA SUGERENCIA DE MANUEL

MATRICULA = Sheets("HOJA2").Cells(i, 2)
FACTURA = Sheets("HOJA2").Cells(i, 4)
Application.StatusBar = "CONSULTA " & i & " DE 8577 MATRICULA " &
MATRICULA & " FACTURA " & FACTURA

With Sheets("HOJA1").QueryTables.Add(Connection:= _
"ODBC;DSN=dBASE



Files;DefaultDir=C:\BORREME\2;DriverIdS3;MaxBufferSize 48;PageTimeout=5;
"
_
, Destination:=Sheets("HOJA1").Range("A1"))
.CommandText = Array( _
"SELECT adiciona.ADI_MATR, adiciona.ADI_NFAC, adiciona.ADI_CODI,
adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM adiciona adiciona" &
Chr(13) & "" & Chr(10) & "WHERE(adiciona.ADI_MATR='" & MATRICULA & "') AND
(adiciona.ADI_NFAC=" & FACTURA & ")" _
)

.Name = "Consulta desde dBASE Files_13"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True

.Refresh BackgroundQuery:=False
End With

RESULTADO
ADI_MATR ADI_NFAC ADI_CODI ADI_VALO
117095 4 56 3000
117095 4 27 10408
117095 4 39 291
117095 4 28 0
117095 4 40 0
117095 4 61 3086
117095 4 63 -3

en la nueva sugerencia me extrae datos lo que pasa es que se queda en el


loop

tengo:

MATRICULA = Sheets("HOJA2").Cells(i, 2)
FACTURA = Sheets("HOJA2").Cells(i, 4)

cn.Open "Driver={Microsoft dBASE Driver
(*.dbf)};DriverID'7;Dbq=C:\BORREME\2;"
rs.Open "select adiciona.ADI_MATR, adiciona.ADI_NFAC,
adiciona.ADI_CODI,adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM
adiciona adiciona" & Chr(13) & "" & Chr(10) & "WHERE(adiciona.ADI_MATR='"


&
MATRICULA & "') AND (adiciona.ADI_NFAC=" & FACTURA & ")", cn,
adlockoptimistic, adcmdtext
cnt = 1
Do Until rs.EOF
ActiveSheet.Range("a" & cnt) = rs("adi_matr")
ActiveSheet.Range("b" & cnt) = rs("adi_nfac")
ActiveSheet.Range("c" & cnt) = rs("adi_nfac")
ActiveSheet.Range("d" & cnt) = rs("adi_codi")
ActiveSheet.Range("e" & cnt) = rs("adi_valo")
cnt = cnt + 1
Loop

Next i

rs.Close
cn.Close

RESULTADO
pero me extrae solo un registro

117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
117095 4 4 56 3000
. .

PORQUE PUEDE ESTAR SUCEDIENDO?

Gracias!!

"Manuel Romero" escribió:

> Puedes usar ADO, activa una referencia a MS ActiveX Data Objects 2.X


primero
> y escribe unas sentencias asi
>
> dim cn as new adodb.connection
> dim rs as new adodb.recordset
>
> cn.open "cadena de conexion"
> rs.open "select * from tutabla where campo=valor", cn, adlockoptimistic,
> adcmdtext
> cnt=1
> do until rs.eof
> activesheet.range("a" & cnt)=rs("campo1")
> activesheet.range("b" & cnt)=rs("campo2")
> cnt=cnt+1
> loop
> rs.close
> cn.close
>
> la cadenas de conexion para tablas DBF la puedes encontrar en
> www.connectionstrings.com
>
> el ejemplo es muy (demasiado) sencillo, pero te puedes dar una idea de


como
> es
>
> "fredy" escribió en el mensaje
> news:
> > listo Manuel ya pude realizar la consulta muchas gracias; sinembargo


me
> > gustaria saber si es posible recorrer la tabla DBF ( mas de 900000¡
> > registros)desde excel con una macro sin tener que realizar este


proceso de
> > consulta
> >
> > gracias! : )
> >
> > "fredy" wrote:
> >
> > > gracias manuel, pero resulta "imposible leer este archivo" otra
> sugerencia
> > > por favor, me gustaria manejarlo por macros alguna idea?
> > >
> > > "Manuel Romero" wrote:
> > >
> > > > Menu Datos / Obtener datos externos / Nueva consulta de base de


datos
> > > >
> > > > crea el origen de datos y sigue el asistente, ahi puedes usar
> criterios de
> > > > seleccion e inclusive definir el orden de los registros a traer
> > > >
> > > > "fredy" escribió en el mensaje
> > > > news:
> > > > > hola grupo...
> > > > > mi necesidad es la siguiente:
> > > > >
> > > > > tengo una tabla dbf (FUENTE)que proviene de foxpro con mas de
> 900.000
> > > > > registros
> > > > > tengo una tabla de excel la cual tengo que completar con datos


de la
> tabla
> > > > > dbf (FUENTE) la llave entre estas tablas es un numero de
> identificacion de
> > > > > usuario y un numero de factura, los datos que tengo que extraer


de
> > > > (FUENTE)
> > > > > para cada usuario pueden ser de cero hasta 10 datos, como puedo
> hacer la
> > > > > consulta de FUENTE desde excel para extraer los datos de cada
> > > > usuario???( mi
> > > > > duda se debe a que latabla FUENTE no me la abre excel por la
> cantidad de
> > > > > registros)
> > > > >
> > > > > muchas gracias por su colaboracion
> > > >
> > > >
> > > >
>
>
>
Respuesta Responder a este mensaje
#7 fredy
09/03/2005 - 23:49 | Informe spam
si eso era muchas gracias Manuel : )
es posible que este proceso sea mas rapido que el de la primera opcion que
me enviaste??

"Manuel Romero" wrote:

Se me olvido (siempre me pasa, no se porque)

rs.movenext

antes del cnt=cnt+1

"fredy" escribió en el mensaje
news:
> Hola Manuel
>
> estoy utilizando el codigo que me recomendaste ( aunque el anterior me
> funciono el de datos externos lo adapte en una macro y me genero los
> resultados que esperaba solo que se demoro casi 12 hrs para extraer los
datos
> de 9000 registros de la fuente de 900000 registros pero bueno...ahora
busco
> tal vez un poco de rapidez en el proceso)
>
> PRIMERA SUGERENCIA DE MANUEL
>
> MATRICULA = Sheets("HOJA2").Cells(i, 2)
> FACTURA = Sheets("HOJA2").Cells(i, 4)
> Application.StatusBar = "CONSULTA " & i & " DE 8577 MATRICULA " &
> MATRICULA & " FACTURA " & FACTURA
>
> With Sheets("HOJA1").QueryTables.Add(Connection:= _
> "ODBC;DSN=dBASE
>
Files;DefaultDir=C:\BORREME\2;DriverIdS3;MaxBufferSize 48;PageTimeout=5;
"
> _
> , Destination:=Sheets("HOJA1").Range("A1"))
> .CommandText = Array( _
> "SELECT adiciona.ADI_MATR, adiciona.ADI_NFAC, adiciona.ADI_CODI,
> adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM adiciona adiciona" &
> Chr(13) & "" & Chr(10) & "WHERE(adiciona.ADI_MATR='" & MATRICULA & "') AND
> (adiciona.ADI_NFAC=" & FACTURA & ")" _
> )
>
> .Name = "Consulta desde dBASE Files_13"
> .FieldNames = True
> .RowNumbers = False
> .FillAdjacentFormulas = False
> .PreserveFormatting = True
> .RefreshOnFileOpen = False
> .BackgroundQuery = True
> .RefreshStyle = xlInsertDeleteCells
> .SavePassword = True
> .SaveData = True
> .AdjustColumnWidth = True
> .RefreshPeriod = 0
> .PreserveColumnInfo = True
>
> .Refresh BackgroundQuery:=False
> End With
>
> RESULTADO
> ADI_MATR ADI_NFAC ADI_CODI ADI_VALO
> 117095 4 56 3000
> 117095 4 27 10408
> 117095 4 39 291
> 117095 4 28 0
> 117095 4 40 0
> 117095 4 61 3086
> 117095 4 63 -3
>
> en la nueva sugerencia me extrae datos lo que pasa es que se queda en el
loop
>
> tengo:
>
> MATRICULA = Sheets("HOJA2").Cells(i, 2)
> FACTURA = Sheets("HOJA2").Cells(i, 4)
>
> cn.Open "Driver={Microsoft dBASE Driver
> (*.dbf)};DriverID'7;Dbq=C:\BORREME\2;"
> rs.Open "select adiciona.ADI_MATR, adiciona.ADI_NFAC,
> adiciona.ADI_CODI,adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM
> adiciona adiciona" & Chr(13) & "" & Chr(10) & "WHERE(adiciona.ADI_MATR='"
&
> MATRICULA & "') AND (adiciona.ADI_NFAC=" & FACTURA & ")", cn,
> adlockoptimistic, adcmdtext
> cnt = 1
> Do Until rs.EOF
> ActiveSheet.Range("a" & cnt) = rs("adi_matr")
> ActiveSheet.Range("b" & cnt) = rs("adi_nfac")
> ActiveSheet.Range("c" & cnt) = rs("adi_nfac")
> ActiveSheet.Range("d" & cnt) = rs("adi_codi")
> ActiveSheet.Range("e" & cnt) = rs("adi_valo")
> cnt = cnt + 1
> Loop
>
> Next i
>
> rs.Close
> cn.Close
>
> RESULTADO
> pero me extrae solo un registro
>
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> 117095 4 4 56 3000
> . .
>
> PORQUE PUEDE ESTAR SUCEDIENDO?
>
> Gracias!!
>
> "Manuel Romero" escribió:
>
> > Puedes usar ADO, activa una referencia a MS ActiveX Data Objects 2.X
primero
> > y escribe unas sentencias asi
> >
> > dim cn as new adodb.connection
> > dim rs as new adodb.recordset
> >
> > cn.open "cadena de conexion"
> > rs.open "select * from tutabla where campo=valor", cn, adlockoptimistic,
> > adcmdtext
> > cnt=1
> > do until rs.eof
> > activesheet.range("a" & cnt)=rs("campo1")
> > activesheet.range("b" & cnt)=rs("campo2")
> > cnt=cnt+1
> > loop
> > rs.close
> > cn.close
> >
> > la cadenas de conexion para tablas DBF la puedes encontrar en
> > www.connectionstrings.com
> >
> > el ejemplo es muy (demasiado) sencillo, pero te puedes dar una idea de
como
> > es
> >
> > "fredy" escribió en el mensaje
> > news:
> > > listo Manuel ya pude realizar la consulta muchas gracias; sinembargo
me
> > > gustaria saber si es posible recorrer la tabla DBF ( mas de 900000¡
> > > registros)desde excel con una macro sin tener que realizar este
proceso de
> > > consulta
> > >
> > > gracias! : )
> > >
> > > "fredy" wrote:
> > >
> > > > gracias manuel, pero resulta "imposible leer este archivo" otra
> > sugerencia
> > > > por favor, me gustaria manejarlo por macros alguna idea?
> > > >
> > > > "Manuel Romero" wrote:
> > > >
> > > > > Menu Datos / Obtener datos externos / Nueva consulta de base de
datos
> > > > >
> > > > > crea el origen de datos y sigue el asistente, ahi puedes usar
> > criterios de
> > > > > seleccion e inclusive definir el orden de los registros a traer
> > > > >
> > > > > "fredy" escribió en el mensaje
> > > > > news:
> > > > > > hola grupo...
> > > > > > mi necesidad es la siguiente:
> > > > > >
> > > > > > tengo una tabla dbf (FUENTE)que proviene de foxpro con mas de
> > 900.000
> > > > > > registros
> > > > > > tengo una tabla de excel la cual tengo que completar con datos
de la
> > tabla
> > > > > > dbf (FUENTE) la llave entre estas tablas es un numero de
> > identificacion de
> > > > > > usuario y un numero de factura, los datos que tengo que extraer
de
> > > > > (FUENTE)
> > > > > > para cada usuario pueden ser de cero hasta 10 datos, como puedo
> > hacer la
> > > > > > consulta de FUENTE desde excel para extraer los datos de cada
> > > > > usuario???( mi
> > > > > > duda se debe a que latabla FUENTE no me la abre excel por la
> > cantidad de
> > > > > > registros)
> > > > > >
> > > > > > muchas gracias por su colaboracion
> > > > >
> > > > >
> > > > >
> >
> >
> >



Respuesta Responder a este mensaje
#8 Manuel Romero
10/03/2005 - 20:42 | Informe spam
1) coloca el application.screenupdating=false y regresalo a true cuando el
proceso termine

2) prueba el metodo copyfromrecordset del objeto range. este metodo elimina
el bucle do

las dos opciones no son excluyentes, intenta con ambas

"fredy" escribió en el mensaje
news:
si eso era muchas gracias Manuel : )
es posible que este proceso sea mas rapido que el de la primera opcion que
me enviaste??

"Manuel Romero" wrote:

> Se me olvido (siempre me pasa, no se porque)
>
> rs.movenext
>
> antes del cnt=cnt+1
>
> "fredy" escribió en el mensaje
> news:
> > Hola Manuel
> >
> > estoy utilizando el codigo que me recomendaste ( aunque el anterior me
> > funciono el de datos externos lo adapte en una macro y me genero los
> > resultados que esperaba solo que se demoro casi 12 hrs para extraer


los
> datos
> > de 9000 registros de la fuente de 900000 registros pero bueno...ahora
> busco
> > tal vez un poco de rapidez en el proceso)
> >
> > PRIMERA SUGERENCIA DE MANUEL
> >
> > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > Application.StatusBar = "CONSULTA " & i & " DE 8577 MATRICULA


" &
> > MATRICULA & " FACTURA " & FACTURA
> >
> > With Sheets("HOJA1").QueryTables.Add(Connection:= _
> > "ODBC;DSN=dBASE
> >
>


Files;DefaultDir=C:\BORREME\2;DriverIdS3;MaxBufferSize 48;PageTimeout=5;
> "
> > _
> > , Destination:=Sheets("HOJA1").Range("A1"))
> > .CommandText = Array( _
> > "SELECT adiciona.ADI_MATR, adiciona.ADI_NFAC,


adiciona.ADI_CODI,
> > adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM adiciona adiciona"


&
> > Chr(13) & "" & Chr(10) & "WHERE(adiciona.ADI_MATR='" & MATRICULA & "')


AND
> > (adiciona.ADI_NFAC=" & FACTURA & ")" _
> > )
> >
> > .Name = "Consulta desde dBASE Files_13"
> > .FieldNames = True
> > .RowNumbers = False
> > .FillAdjacentFormulas = False
> > .PreserveFormatting = True
> > .RefreshOnFileOpen = False
> > .BackgroundQuery = True
> > .RefreshStyle = xlInsertDeleteCells
> > .SavePassword = True
> > .SaveData = True
> > .AdjustColumnWidth = True
> > .RefreshPeriod = 0
> > .PreserveColumnInfo = True
> >
> > .Refresh BackgroundQuery:=False
> > End With
> >
> > RESULTADO
> > ADI_MATR ADI_NFAC ADI_CODI ADI_VALO
> > 117095 4 56 3000
> > 117095 4 27 10408
> > 117095 4 39 291
> > 117095 4 28 0
> > 117095 4 40 0
> > 117095 4 61 3086
> > 117095 4 63 -3
> >
> > en la nueva sugerencia me extrae datos lo que pasa es que se queda en


el
> loop
> >
> > tengo:
> >
> > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > FACTURA = Sheets("HOJA2").Cells(i, 4)
> >
> > cn.Open "Driver={Microsoft dBASE Driver
> > (*.dbf)};DriverID'7;Dbq=C:\BORREME\2;"
> > rs.Open "select adiciona.ADI_MATR, adiciona.ADI_NFAC,
> > adiciona.ADI_CODI,adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM
> > adiciona adiciona" & Chr(13) & "" & Chr(10) &


"WHERE(adiciona.ADI_MATR='"
> &
> > MATRICULA & "') AND (adiciona.ADI_NFAC=" & FACTURA & ")", cn,
> > adlockoptimistic, adcmdtext
> > cnt = 1
> > Do Until rs.EOF
> > ActiveSheet.Range("a" & cnt) = rs("adi_matr")
> > ActiveSheet.Range("b" & cnt) = rs("adi_nfac")
> > ActiveSheet.Range("c" & cnt) = rs("adi_nfac")
> > ActiveSheet.Range("d" & cnt) = rs("adi_codi")
> > ActiveSheet.Range("e" & cnt) = rs("adi_valo")
> > cnt = cnt + 1
> > Loop
> >
> > Next i
> >
> > rs.Close
> > cn.Close
> >
> > RESULTADO
> > pero me extrae solo un registro
> >
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > 117095 4 4 56 3000
> > .


.
> >
> > PORQUE PUEDE ESTAR SUCEDIENDO?
> >
> > Gracias!!
> >
> > "Manuel Romero" escribió:
> >
> > > Puedes usar ADO, activa una referencia a MS ActiveX Data Objects 2.X
> primero
> > > y escribe unas sentencias asi
> > >
> > > dim cn as new adodb.connection
> > > dim rs as new adodb.recordset
> > >
> > > cn.open "cadena de conexion"
> > > rs.open "select * from tutabla where campo=valor", cn,


adlockoptimistic,
> > > adcmdtext
> > > cnt=1
> > > do until rs.eof
> > > activesheet.range("a" & cnt)=rs("campo1")
> > > activesheet.range("b" & cnt)=rs("campo2")
> > > cnt=cnt+1
> > > loop
> > > rs.close
> > > cn.close
> > >
> > > la cadenas de conexion para tablas DBF la puedes encontrar en
> > > www.connectionstrings.com
> > >
> > > el ejemplo es muy (demasiado) sencillo, pero te puedes dar una idea


de
> como
> > > es
> > >
> > > "fredy" escribió en el mensaje
> > > news:
> > > > listo Manuel ya pude realizar la consulta muchas gracias;


sinembargo
> me
> > > > gustaria saber si es posible recorrer la tabla DBF ( mas de


900000¡
> > > > registros)desde excel con una macro sin tener que realizar este
> proceso de
> > > > consulta
> > > >
> > > > gracias! : )
> > > >
> > > > "fredy" wrote:
> > > >
> > > > > gracias manuel, pero resulta "imposible leer este archivo" otra
> > > sugerencia
> > > > > por favor, me gustaria manejarlo por macros alguna idea?
> > > > >
> > > > > "Manuel Romero" wrote:
> > > > >
> > > > > > Menu Datos / Obtener datos externos / Nueva consulta de base


de
> datos
> > > > > >
> > > > > > crea el origen de datos y sigue el asistente, ahi puedes usar
> > > criterios de
> > > > > > seleccion e inclusive definir el orden de los registros a


traer
> > > > > >
> > > > > > "fredy" escribió en el


mensaje
> > > > > > news:
> > > > > > > hola grupo...
> > > > > > > mi necesidad es la siguiente:
> > > > > > >
> > > > > > > tengo una tabla dbf (FUENTE)que proviene de foxpro con mas


de
> > > 900.000
> > > > > > > registros
> > > > > > > tengo una tabla de excel la cual tengo que completar con


datos
> de la
> > > tabla
> > > > > > > dbf (FUENTE) la llave entre estas tablas es un numero de
> > > identificacion de
> > > > > > > usuario y un numero de factura, los datos que tengo que


extraer
> de
> > > > > > (FUENTE)
> > > > > > > para cada usuario pueden ser de cero hasta 10 datos, como


puedo
> > > hacer la
> > > > > > > consulta de FUENTE desde excel para extraer los datos de


cada
> > > > > > usuario???( mi
> > > > > > > duda se debe a que latabla FUENTE no me la abre excel por la
> > > cantidad de
> > > > > > > registros)
> > > > > > >
> > > > > > > muchas gracias por su colaboracion
> > > > > >
> > > > > >
> > > > > >
> > >
> > >
> > >
>
>
>
Respuesta Responder a este mensaje
#9 fredy
11/03/2005 - 17:01 | Informe spam
Manuel y como hago esto
"prueba el metodo copyfromrecordset del objeto range. este metodo elimina
el bucle do"

Function CopyFromRecordset()

no se como implementarlo para reeemplazar

Do Until rs.EOF
Sheets("HOJA1").Range("a" & cnt) = rs("adi_matr")
Sheets("HOJA1").Range("b" & cnt) = rs("adi_nfac")
Sheets("HOJA1").Range("c" & cnt) = rs("adi_codi")
Sheets("HOJA1").Range("d" & cnt) = rs("adi_valo")
rs.MoveNext

cnt = cnt + 1
Loop

muchas gracias
"Manuel Romero" wrote:

1) coloca el application.screenupdating=false y regresalo a true cuando el
proceso termine

2) prueba el metodo copyfromrecordset del objeto range. este metodo elimina
el bucle do

las dos opciones no son excluyentes, intenta con ambas

"fredy" escribió en el mensaje
news:
> si eso era muchas gracias Manuel : )
> es posible que este proceso sea mas rapido que el de la primera opcion que
> me enviaste??
>
> "Manuel Romero" wrote:
>
> > Se me olvido (siempre me pasa, no se porque)
> >
> > rs.movenext
> >
> > antes del cnt=cnt+1
> >
> > "fredy" escribió en el mensaje
> > news:
> > > Hola Manuel
> > >
> > > estoy utilizando el codigo que me recomendaste ( aunque el anterior me
> > > funciono el de datos externos lo adapte en una macro y me genero los
> > > resultados que esperaba solo que se demoro casi 12 hrs para extraer
los
> > datos
> > > de 9000 registros de la fuente de 900000 registros pero bueno...ahora
> > busco
> > > tal vez un poco de rapidez en el proceso)
> > >
> > > PRIMERA SUGERENCIA DE MANUEL
> > >
> > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > > Application.StatusBar = "CONSULTA " & i & " DE 8577 MATRICULA
" &
> > > MATRICULA & " FACTURA " & FACTURA
> > >
> > > With Sheets("HOJA1").QueryTables.Add(Connection:= _
> > > "ODBC;DSN=dBASE
> > >
> >
Files;DefaultDir=C:\BORREME\2;DriverIdS3;MaxBufferSize 48;PageTimeout=5;
> > "
> > > _
> > > , Destination:=Sheets("HOJA1").Range("A1"))
> > > .CommandText = Array( _
> > > "SELECT adiciona.ADI_MATR, adiciona.ADI_NFAC,
adiciona.ADI_CODI,
> > > adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM adiciona adiciona"
&
> > > Chr(13) & "" & Chr(10) & "WHERE(adiciona.ADI_MATR='" & MATRICULA & "')
AND
> > > (adiciona.ADI_NFAC=" & FACTURA & ")" _
> > > )
> > >
> > > .Name = "Consulta desde dBASE Files_13"
> > > .FieldNames = True
> > > .RowNumbers = False
> > > .FillAdjacentFormulas = False
> > > .PreserveFormatting = True
> > > .RefreshOnFileOpen = False
> > > .BackgroundQuery = True
> > > .RefreshStyle = xlInsertDeleteCells
> > > .SavePassword = True
> > > .SaveData = True
> > > .AdjustColumnWidth = True
> > > .RefreshPeriod = 0
> > > .PreserveColumnInfo = True
> > >
> > > .Refresh BackgroundQuery:=False
> > > End With
> > >
> > > RESULTADO
> > > ADI_MATR ADI_NFAC ADI_CODI ADI_VALO
> > > 117095 4 56 3000
> > > 117095 4 27 10408
> > > 117095 4 39 291
> > > 117095 4 28 0
> > > 117095 4 40 0
> > > 117095 4 61 3086
> > > 117095 4 63 -3
> > >
> > > en la nueva sugerencia me extrae datos lo que pasa es que se queda en
el
> > loop
> > >
> > > tengo:
> > >
> > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > >
> > > cn.Open "Driver={Microsoft dBASE Driver
> > > (*.dbf)};DriverID'7;Dbq=C:\BORREME\2;"
> > > rs.Open "select adiciona.ADI_MATR, adiciona.ADI_NFAC,
> > > adiciona.ADI_CODI,adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM
> > > adiciona adiciona" & Chr(13) & "" & Chr(10) &
"WHERE(adiciona.ADI_MATR='"
> > &
> > > MATRICULA & "') AND (adiciona.ADI_NFAC=" & FACTURA & ")", cn,
> > > adlockoptimistic, adcmdtext
> > > cnt = 1
> > > Do Until rs.EOF
> > > ActiveSheet.Range("a" & cnt) = rs("adi_matr")
> > > ActiveSheet.Range("b" & cnt) = rs("adi_nfac")
> > > ActiveSheet.Range("c" & cnt) = rs("adi_nfac")
> > > ActiveSheet.Range("d" & cnt) = rs("adi_codi")
> > > ActiveSheet.Range("e" & cnt) = rs("adi_valo")
> > > cnt = cnt + 1
> > > Loop
> > >
> > > Next i
> > >
> > > rs.Close
> > > cn.Close
> > >
> > > RESULTADO
> > > pero me extrae solo un registro
> > >
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > 117095 4 4 56 3000
> > > .
..
> > >
> > > PORQUE PUEDE ESTAR SUCEDIENDO?
> > >
> > > Gracias!!
> > >
> > > "Manuel Romero" escribió:
> > >
> > > > Puedes usar ADO, activa una referencia a MS ActiveX Data Objects 2.X
> > primero
> > > > y escribe unas sentencias asi
> > > >
> > > > dim cn as new adodb.connection
> > > > dim rs as new adodb.recordset
> > > >
> > > > cn.open "cadena de conexion"
> > > > rs.open "select * from tutabla where campo=valor", cn,
adlockoptimistic,
> > > > adcmdtext
> > > > cnt=1
> > > > do until rs.eof
> > > > activesheet.range("a" & cnt)=rs("campo1")
> > > > activesheet.range("b" & cnt)=rs("campo2")
> > > > cnt=cnt+1
> > > > loop
> > > > rs.close
> > > > cn.close
> > > >
> > > > la cadenas de conexion para tablas DBF la puedes encontrar en
> > > > www.connectionstrings.com
> > > >
> > > > el ejemplo es muy (demasiado) sencillo, pero te puedes dar una idea
de
> > como
> > > > es
> > > >
> > > > "fredy" escribió en el mensaje
> > > > news:
> > > > > listo Manuel ya pude realizar la consulta muchas gracias;
sinembargo
> > me
> > > > > gustaria saber si es posible recorrer la tabla DBF ( mas de
900000¡
> > > > > registros)desde excel con una macro sin tener que realizar este
> > proceso de
> > > > > consulta
> > > > >
> > > > > gracias! : )
> > > > >
> > > > > "fredy" wrote:
> > > > >
> > > > > > gracias manuel, pero resulta "imposible leer este archivo" otra
> > > > sugerencia
> > > > > > por favor, me gustaria manejarlo por macros alguna idea?
> > > > > >
> > > > > > "Manuel Romero" wrote:
> > > > > >
> > > > > > > Menu Datos / Obtener datos externos / Nueva consulta de base
de
> > datos
> > > > > > >
> > > > > > > crea el origen de datos y sigue el asistente, ahi puedes usar
> > > > criterios de
> > > > > > > seleccion e inclusive definir el orden de los registros a
traer
> > > > > > >
> > > > > > > "fredy" escribió en el
mensaje
> > > > > > > news:
> > > > > > > > hola grupo...
> > > > > > > > mi necesidad es la siguiente:
> > > > > > > >
> > > > > > > > tengo una tabla dbf (FUENTE)que proviene de foxpro con mas
de
> > > > 900.000
> > > > > > > > registros
> > > > > > > > tengo una tabla de excel la cual tengo que completar con
datos
> > de la
> > > > tabla
> > > > > > > > dbf (FUENTE) la llave entre estas tablas es un numero de
> > > > identificacion de
> > > > > > > > usuario y un numero de factura, los datos que tengo que
extraer
> > de
> > > > > > > (FUENTE)
> > > > > > > > para cada usuario pueden ser de cero hasta 10 datos, como
puedo
> > > > hacer la
> > > > > > > > consulta de FUENTE desde excel para extraer los datos de
cada
> > > > > > > usuario???( mi
> > > > > > > > duda se debe a que latabla FUENTE no me la abre excel por la
> > > > cantidad de
> > > > > > > > registros)
> > > > > > > >
> > > > > > > > muchas gracias por su colaboracion
> > > > > > >
> > > > > > >
> > > > > > >
> > > >
> > > >
> > > >
> >
> >
> >



Respuesta Responder a este mensaje
#10 Manuel Romero
11/03/2005 - 19:45 | Informe spam
Tomado de la ayuda de ExcelFor iCols = 0 to rs.Fields.Count - 1
ws.Cells(1, iCols + 1).Value = rs.Fields(iCols).Name
Next
ws.Range(ws.Cells(1, 1), ws.Cells(1, rs.Fields.Count)).Font.Bold = True
ws.Range("A2").CopyFromRecordset rsTe coloca en A1 los nombres de los campos
y los pone en negrita. A partir de A2 van los resultados

"fredy" escribió en el mensaje
news:
Manuel y como hago esto
"prueba el metodo copyfromrecordset del objeto range. este metodo elimina
el bucle do"

Function CopyFromRecordset()

no se como implementarlo para reeemplazar

Do Until rs.EOF
Sheets("HOJA1").Range("a" & cnt) = rs("adi_matr")
Sheets("HOJA1").Range("b" & cnt) = rs("adi_nfac")
Sheets("HOJA1").Range("c" & cnt) = rs("adi_codi")
Sheets("HOJA1").Range("d" & cnt) = rs("adi_valo")
rs.MoveNext

cnt = cnt + 1
Loop

muchas gracias
"Manuel Romero" wrote:

> 1) coloca el application.screenupdating=false y regresalo a true cuando


el
> proceso termine
>
> 2) prueba el metodo copyfromrecordset del objeto range. este metodo


elimina
> el bucle do
>
> las dos opciones no son excluyentes, intenta con ambas
>
> "fredy" escribió en el mensaje
> news:
> > si eso era muchas gracias Manuel : )
> > es posible que este proceso sea mas rapido que el de la primera opcion


que
> > me enviaste??
> >
> > "Manuel Romero" wrote:
> >
> > > Se me olvido (siempre me pasa, no se porque)
> > >
> > > rs.movenext
> > >
> > > antes del cnt=cnt+1
> > >
> > > "fredy" escribió en el mensaje
> > > news:
> > > > Hola Manuel
> > > >
> > > > estoy utilizando el codigo que me recomendaste ( aunque el


anterior me
> > > > funciono el de datos externos lo adapte en una macro y me genero


los
> > > > resultados que esperaba solo que se demoro casi 12 hrs para


extraer
> los
> > > datos
> > > > de 9000 registros de la fuente de 900000 registros pero


bueno...ahora
> > > busco
> > > > tal vez un poco de rapidez en el proceso)
> > > >
> > > > PRIMERA SUGERENCIA DE MANUEL
> > > >
> > > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > > > Application.StatusBar = "CONSULTA " & i & " DE 8577


MATRICULA
> " &
> > > > MATRICULA & " FACTURA " & FACTURA
> > > >
> > > > With Sheets("HOJA1").QueryTables.Add(Connection:= _
> > > > "ODBC;DSN=dBASE
> > > >
> > >
>


Files;DefaultDir=C:\BORREME\2;DriverIdS3;MaxBufferSize 48;PageTimeout=5;
> > > "
> > > > _
> > > > , Destination:=Sheets("HOJA1").Range("A1"))
> > > > .CommandText = Array( _
> > > > "SELECT adiciona.ADI_MATR, adiciona.ADI_NFAC,
> adiciona.ADI_CODI,
> > > > adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) & "FROM adiciona


adiciona"
> &
> > > > Chr(13) & "" & Chr(10) & "WHERE(adiciona.ADI_MATR='" & MATRICULA &


"')
> AND
> > > > (adiciona.ADI_NFAC=" & FACTURA & ")" _
> > > > )
> > > >
> > > > .Name = "Consulta desde dBASE Files_13"
> > > > .FieldNames = True
> > > > .RowNumbers = False
> > > > .FillAdjacentFormulas = False
> > > > .PreserveFormatting = True
> > > > .RefreshOnFileOpen = False
> > > > .BackgroundQuery = True
> > > > .RefreshStyle = xlInsertDeleteCells
> > > > .SavePassword = True
> > > > .SaveData = True
> > > > .AdjustColumnWidth = True
> > > > .RefreshPeriod = 0
> > > > .PreserveColumnInfo = True
> > > >
> > > > .Refresh BackgroundQuery:=False
> > > > End With
> > > >
> > > > RESULTADO
> > > > ADI_MATR ADI_NFAC ADI_CODI ADI_VALO
> > > > 117095 4 56 3000
> > > > 117095 4 27 10408
> > > > 117095 4 39 291
> > > > 117095 4 28 0
> > > > 117095 4 40 0
> > > > 117095 4 61 3086
> > > > 117095 4 63 -3
> > > >
> > > > en la nueva sugerencia me extrae datos lo que pasa es que se queda


en
> el
> > > loop
> > > >
> > > > tengo:
> > > >
> > > > MATRICULA = Sheets("HOJA2").Cells(i, 2)
> > > > FACTURA = Sheets("HOJA2").Cells(i, 4)
> > > >
> > > > cn.Open "Driver={Microsoft dBASE Driver
> > > > (*.dbf)};DriverID'7;Dbq=C:\BORREME\2;"
> > > > rs.Open "select adiciona.ADI_MATR, adiciona.ADI_NFAC,
> > > > adiciona.ADI_CODI,adiciona.ADI_VALO" & Chr(13) & "" & Chr(10) &


"FROM
> > > > adiciona adiciona" & Chr(13) & "" & Chr(10) &
> "WHERE(adiciona.ADI_MATR='"
> > > &
> > > > MATRICULA & "') AND (adiciona.ADI_NFAC=" & FACTURA & ")", cn,
> > > > adlockoptimistic, adcmdtext
> > > > cnt = 1
> > > > Do Until rs.EOF
> > > > ActiveSheet.Range("a" & cnt) = rs("adi_matr")
> > > > ActiveSheet.Range("b" & cnt) = rs("adi_nfac")
> > > > ActiveSheet.Range("c" & cnt) = rs("adi_nfac")
> > > > ActiveSheet.Range("d" & cnt) = rs("adi_codi")
> > > > ActiveSheet.Range("e" & cnt) = rs("adi_valo")
> > > > cnt = cnt + 1
> > > > Loop
> > > >
> > > > Next i
> > > >
> > > > rs.Close
> > > > cn.Close
> > > >
> > > > RESULTADO
> > > > pero me extrae solo un registro
> > > >
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > 117095 4 4 56 3000
> > > > .
> ..
> > > >
> > > > PORQUE PUEDE ESTAR SUCEDIENDO?
> > > >
> > > > Gracias!!
> > > >
> > > > "Manuel Romero" escribió:
> > > >
> > > > > Puedes usar ADO, activa una referencia a MS ActiveX Data Objects


2.X
> > > primero
> > > > > y escribe unas sentencias asi
> > > > >
> > > > > dim cn as new adodb.connection
> > > > > dim rs as new adodb.recordset
> > > > >
> > > > > cn.open "cadena de conexion"
> > > > > rs.open "select * from tutabla where campo=valor", cn,
> adlockoptimistic,
> > > > > adcmdtext
> > > > > cnt=1
> > > > > do until rs.eof
> > > > > activesheet.range("a" & cnt)=rs("campo1")
> > > > > activesheet.range("b" & cnt)=rs("campo2")
> > > > > cnt=cnt+1
> > > > > loop
> > > > > rs.close
> > > > > cn.close
> > > > >
> > > > > la cadenas de conexion para tablas DBF la puedes encontrar en
> > > > > www.connectionstrings.com
> > > > >
> > > > > el ejemplo es muy (demasiado) sencillo, pero te puedes dar una


idea
> de
> > > como
> > > > > es
> > > > >
> > > > > "fredy" escribió en el mensaje
> > > > > news:
> > > > > > listo Manuel ya pude realizar la consulta muchas gracias;
> sinembargo
> > > me
> > > > > > gustaria saber si es posible recorrer la tabla DBF ( mas de
> 900000¡
> > > > > > registros)desde excel con una macro sin tener que realizar


este
> > > proceso de
> > > > > > consulta
> > > > > >
> > > > > > gracias! : )
> > > > > >
> > > > > > "fredy" wrote:
> > > > > >
> > > > > > > gracias manuel, pero resulta "imposible leer este archivo"


otra
> > > > > sugerencia
> > > > > > > por favor, me gustaria manejarlo por macros alguna idea?
> > > > > > >
> > > > > > > "Manuel Romero" wrote:
> > > > > > >
> > > > > > > > Menu Datos / Obtener datos externos / Nueva consulta de


base
> de
> > > datos
> > > > > > > >
> > > > > > > > crea el origen de datos y sigue el asistente, ahi puedes


usar
> > > > > criterios de
> > > > > > > > seleccion e inclusive definir el orden de los registros a
> traer
> > > > > > > >
> > > > > > > > "fredy" escribió en el
> mensaje
> > > > > > > > news:
> > > > > > > > > hola grupo...
> > > > > > > > > mi necesidad es la siguiente:
> > > > > > > > >
> > > > > > > > > tengo una tabla dbf (FUENTE)que proviene de foxpro con


mas
> de
> > > > > 900.000
> > > > > > > > > registros
> > > > > > > > > tengo una tabla de excel la cual tengo que completar con
> datos
> > > de la
> > > > > tabla
> > > > > > > > > dbf (FUENTE) la llave entre estas tablas es un numero de
> > > > > identificacion de
> > > > > > > > > usuario y un numero de factura, los datos que tengo que
> extraer
> > > de
> > > > > > > > (FUENTE)
> > > > > > > > > para cada usuario pueden ser de cero hasta 10 datos,


como
> puedo
> > > > > hacer la
> > > > > > > > > consulta de FUENTE desde excel para extraer los datos de
> cada
> > > > > > > > usuario???( mi
> > > > > > > > > duda se debe a que latabla FUENTE no me la abre excel


por la
> > > > > cantidad de
> > > > > > > > > registros)
> > > > > > > > >
> > > > > > > > > muchas gracias por su colaboracion
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > >
> > > > >
> > > > >
> > >
> > >
> > >
>
>
>
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida