Accesar Excel con ADO

10/05/2010 - 17:30 por JC. | Informe spam
Estoy utilizando Excel como un banco de datos para lo cual realizo la
coneccion que les muestro adelante, pero cuando llego a la "asignacion" del
recordset al cache de la tabla dinamica (ya existente) me da el siguiente
error "Method Recordset of object Pivotcache failed". Me pueden decir como
corregirlo y si estoy haciendo bien la asignacion a la tabla dinamica ya
existente. Esto ultimo lo hice con una ayuda que Hector me dio hace unos años
pero no se si funciona en la actualidad. Uso Excel 2007. Nota: el
CopyFromRecordset lo utilice transitoriamente para saber si la consulta se
estaba ejecutando momentaneamente, aqui es un comentario.

Sub Prueba()
Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim PC As PivotCache
Dim PT As PivotTable

Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data
Source=C:\Users\Owner\Documents\Rendimientos\Cartago.xls;" & _
"Extended Properties=Excel 8.0"
.Open
End With

Set rst = New ADODB.Recordset

With rst
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockOptimistic
End With

rst.Open "SELECT FECHA, HH, Media, SUM(SUM), Dia FROM
[VentasHora$A1:F15000]" & _
"GROUP BY FECHA, HH, Media, Dia", cn, , , adCmdText

' ThisWorkbook.Worksheets("Sheet4").Range("A2").CopyFromRecordset rst

Set PC = ActiveWorkbook.PivotCaches(4)
Set PC.Recordset = rst
Set PT = ActiveSheet.PivotTables("PivotTable2")
PT.PivotCache.Refresh

rst.Close
Set rst = Nothing
cn.Close
Set cn = Nothing
End Sub

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
11/05/2010 - 05:03 | Informe spam
hola, JC !

Estoy utilizando Excel como un banco de datos para lo cual realizo la coneccion que les muestro adelante
pero cuando llego a la "asignacion" del recordset al cache de la tabla dinamica (ya existente)
me da el siguiente error "Method Recordset of object Pivotcache failed".
Me pueden decir como corregirlo y si estoy haciendo bien la asignacion a la tabla dinamica ya existente.
Esto ultimo lo hice con una ayuda... hace unos a#os pero no se si funciona en la actualidad.
Uso Excel 2007. Nota: el CopyFromRecordset lo utilice transitoriamente
para saber si la consulta se estaba ejecutando momentaneamente, aqui es un comentario.



no comentaste que sucedio con el "copyfromrecordset" (???)
aqui encuentras notas relacionadas con los cambios en la version 2007:
Administrador de conexion OLE DB
http://msdn.microsoft.com/es-es/library/ms141013(SQL.90).aspx

nota que hay una incompatibilidad en la version 2007 con el proveedor jet.oledb.4

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

__ el codigo expueso __
Sub Prueba()
Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim PC As PivotCache
Dim PT As PivotTable
Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=C:\Users\Owner\Documents\Rendimientos\Cartago.xls;" & _
"Extended Properties=Excel 8.0"
.Open
End With
Set rst = New ADODB.Recordset
With rst
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockOptimistic
End With
rst.Open "SELECT FECHA, HH, Media, SUM(SUM), Dia FROM [VentasHora$A1:F15000]" & _
"GROUP BY FECHA, HH, Media, Dia", cn, , , adCmdText
' ThisWorkbook.Worksheets("Sheet4").Range("A2").CopyFromRecordset rst
Set PC = ActiveWorkbook.PivotCaches(4)
Set PC.Recordset = rst
Set PT = ActiveSheet.PivotTables("PivotTable2")
PT.PivotCache.Refresh
rst.Close
Set rst = Nothing
cn.Close
Set cn = Nothing
End Sub
Respuesta Responder a este mensaje
#2 JC.
11/05/2010 - 20:26 | Informe spam
Hola Hector

Con respecto al "copyfromrecordset" funciono sin problemas. Solo que lo
utilice transitoriamente para copiarla en una hoja para ver si la Consulta
estaba correcta y me estaba devolviendo los datos de la manera que los
necesito. Una vez que vi que estaba ok quise dar el siguiente paso que es
asignar la consulta a una tabla dinamica ya existente (aqui es donde hace
algunos años me habias ayudado pero en su oportunidad era una consulta a un
banco de Datos Oracle:
http://es.narkive.com/2006/3/20/109...z0nd5s9ED0
) y todo habia salido OK pues el cache de la tabla dinamica aceptaba el
recordset sin problema.

Estoy leyendo el link que me diste pero estoy algo confundido. Dice que " no
puedo utilizar el proveedor OLE DB de Microsoft Jet 4.0 para conectarme a un
origen de datos de Excel 2007". Si bien utilizo Excel 2007 el archivo que
estoy manipulando es 2003 y creo que por eso no ha existido problema hasta
ahora con la coneccion [ o ] debo de asumir que cuando habla del origen de
datos en mi caso es Excel 2007 independientemente de que el archivo este en
una version anterior? Yo asumo que el origen de datos es el del archivo
(Excel 2003) y no la version de Excel que estoy utilizando, me corriges.
Como te digo, a mi me acepta la coneccion sin problema lo que no se es
porque el cache de la tabla dinamica no me acepta el recordset de la consulta
para despues solo "refrescarla"

Talvez te preguntes porque usar ADO para manipular datos del mismo Excel
enviandolos a una Tabla dinamica? porque no hacerlo de forma directa? pues
por una sencilla razon: son datos que tengo que agrupar por cada hora y
dentro de cada hora por cada media hora y cuando intento sacar el promedio la
tabla dinamica me da el promedio del banco de datos [sin agrupar] y no de los
datos ya agrupados que es lo que necesito. Por este motivo crei la la unica
forma de hacerlo es manejar los datos de Excel agrupandolos primero con la
consulta sql y de esta forma con los datos ya agrupados Excel me daria el
promedio que necesito.
Cualquier ayuda...

JC

"Héctor Miguel" wrote:

hola, JC !

> Estoy utilizando Excel como un banco de datos para lo cual realizo la coneccion que les muestro adelante
> pero cuando llego a la "asignacion" del recordset al cache de la tabla dinamica (ya existente)
> me da el siguiente error "Method Recordset of object Pivotcache failed".
> Me pueden decir como corregirlo y si estoy haciendo bien la asignacion a la tabla dinamica ya existente.
> Esto ultimo lo hice con una ayuda... hace unos a#os pero no se si funciona en la actualidad.
> Uso Excel 2007. Nota: el CopyFromRecordset lo utilice transitoriamente
> para saber si la consulta se estaba ejecutando momentaneamente, aqui es un comentario.

no comentaste que sucedio con el "copyfromrecordset" (???)
aqui encuentras notas relacionadas con los cambios en la version 2007:
Administrador de conexion OLE DB
http://msdn.microsoft.com/es-es/library/ms141013(SQL.90).aspx

nota que hay una incompatibilidad en la version 2007 con el proveedor jet.oledb.4

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

__ el codigo expueso __
> Sub Prueba()
> Dim cn As ADODB.Connection
> Dim rst As ADODB.Recordset
> Dim PC As PivotCache
> Dim PT As PivotTable
> Set cn = New ADODB.Connection
> With cn
> .Provider = "Microsoft.Jet.OLEDB.4.0"
> .ConnectionString = "Data Source=C:\Users\Owner\Documents\Rendimientos\Cartago.xls;" & _
> "Extended Properties=Excel 8.0"
> .Open
> End With
> Set rst = New ADODB.Recordset
> With rst
> .CursorLocation = adUseClient
> .CursorType = adOpenStatic
> .LockType = adLockOptimistic
> End With
> rst.Open "SELECT FECHA, HH, Media, SUM(SUM), Dia FROM [VentasHora$A1:F15000]" & _
> "GROUP BY FECHA, HH, Media, Dia", cn, , , adCmdText
> ' ThisWorkbook.Worksheets("Sheet4").Range("A2").CopyFromRecordset rst
> Set PC = ActiveWorkbook.PivotCaches(4)
> Set PC.Recordset = rst
> Set PT = ActiveSheet.PivotTables("PivotTable2")
> PT.PivotCache.Refresh
> rst.Close
> Set rst = Nothing
> cn.Close
> Set cn = Nothing
> End Sub


.

Respuesta Responder a este mensaje
#3 Héctor Miguel
11/05/2010 - 23:35 | Informe spam
hola, JC !

Estoy leyendo el link que me diste pero estoy algo confundido.
Dice que "no puedo utilizar el proveedor OLE DB de Microsoft Jet 4.0 para conectarme a un origen de datos de Excel 2007".
Si bien utilizo Excel 2007 el archivo que estoy manipulando es 2003
y creo que por eso no ha existido problema hasta ahora con la coneccion
[ o ] debo de asumir que cuando habla del origen de datos en mi caso es Excel 2007
independientemente de que el archivo este en una version anterior?
Yo asumo que el origen de datos es el del archivo (Excel 2003) y no la version de Excel que estoy utilizando, me corriges...



(creo que) si consultas el primer enlace externo de la pagina sugerida anteriormente (donde dice):
"... vea Administrador de conexion con Excel."
http://msdn.microsoft.com/es-es/library/ms139836(v=SQL.90).aspx
(la segunda nota -ultima parte- parece ser mas "clara" que en el enlace anterior)

comentas si continuan esos detalles ?
saludos,
hector.
Respuesta Responder a este mensaje
#4 Héctor Miguel
12/05/2010 - 05:42 | Informe spam
hola (de nuevo), JC !

Estoy leyendo el link que me diste pero estoy algo confundido.
Dice que "no puedo utilizar el proveedor OLE DB de Microsoft Jet 4.0 para conectarme a un origen de datos de Excel 2007".
Si bien utilizo Excel 2007 el archivo que estoy manipulando es 2003
y creo que por eso no ha existido problema hasta ahora con la coneccion
[ o ] debo de asumir que cuando habla del origen de datos en mi caso es Excel 2007
independientemente de que el archivo este en una version anterior?
Yo asumo que el origen de datos es el del archivo (Excel 2003) y no la version de Excel que estoy utilizando, me corriges...



solo comentar que hice la prueba con los procedimientos sugeridos (exactamente iguales a) como en "aquella propuesta"
y me han funcionado en la version 2007 sin ningun apuro (tanto la creacion de la TD como la actualizacion de su cache)

de todas formas, haciendo las adaptaciones "del caso" (por si las dudas), modifique ligeramente la designacion del "Proveedor"
y el funcionamiento ha sido exactamente igual (ambos procedimientos corren muy bien en la version 2007)

(claro, en mis ejemplos consulta hacia la base de datos de access "neptuno.mdb")

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

' en un modulo de codigo estandar {+} referencias a ActiveX Data Objects {+} Excel 2000 o superior ==' mas informacion acerca de las cadenas de conexion en: => http://www.connectionstrings.com/
Sub CrearTablaADO_RS()
Dim Con As New ADODB.Connection, RS As New ADODB.Recordset, _
Sql As String, PC As PivotCache, PT As PivotTable, ConVersion As String
ConVersion = IIf(Val(Application.Version) < 12 , "microsoft.jet.oledb.4.0", "microsoft.ace.oledb.12.0")
Con.Open "provider=" & ConVersion & ";data source=c:eptuno.mdb;"
Sql = "select * from clientes"
Set RS = New ADODB.Recordset
Set RS.ActiveConnection = Con
RS.Open Sql
Set PC = ActiveWorkbook.PivotCaches.Add(SourceType:=xlExternal)
Set PC.Recordset = RS
Set PT = ActiveSheet.PivotTables.Add(PivotCache:=PC, TableDestination:=Range("a3"))
With PT
.NullString = "0": .SmallGrid = False
.AddFields RowFields:="Ciudad", ColumnFields:="País"
.PivotFields("Región").Orientation = xlDataField
End With
End Sub

Sub ModificarADO_RS_de_Tabla()
Dim Con As New ADODB.Connection, RS As New ADODB.Recordset, _
Sql As String, PC As PivotCache, PT As PivotTable, ConVersion As String
ConVersion = IIf(Val(Application.Version) < 12 , "microsoft.jet.oledb.4.0", "microsoft.ace.oledb.12.0")
Con.Open "provider=" & ConVersion & ";data source=c:eptuno.mdb;"
' Sql = "select * from clientes"
Sql = "select * from proveedores"
Set RS = New ADODB.Recordset
Set RS.ActiveConnection = Con
RS.Open Sql
Set PC = ActiveWorkbook.PivotCaches(1)
Set PC.Recordset = RS
Set PT = ActiveSheet.PivotTables(1)
PT.PivotCache.Refresh
End Sub
Respuesta Responder a este mensaje
#5 JC.
12/05/2010 - 20:54 | Informe spam
Hola Hector

Redireccione el recordset a otra cache de otra tabla dinamica pero sucede
algo extraño (y no se porque): Ejecuto el procedimiento paso a paso la
primera vez y se ejecuta correctamente, es decir, asigna al cache de la tabla
dinamica existente el recordset PERO la segunda vez que quiero ejecutar paso
a paso me da el mismo error cuando llega a la asignacion del recordset: "El
metodo recordset del objeto PivotCache fallo".

Porque sirve para la primera vez y no para la segunda? Quiere decir que el
procedimiento esta correcto solo que debe de existir una consideracion a
nivel de recordset que me impide ejecutarlo por segunda vez sin que me de el
error?

Tienes alguna idea de a que pueda deberse?

Hay alguna forma de hacerte llegar el archivo para que veas a que se puede
deber?

Comentas
Saludos
JC

"Héctor Miguel" wrote:

hola (de nuevo), JC !

> Estoy leyendo el link que me diste pero estoy algo confundido.
> Dice que "no puedo utilizar el proveedor OLE DB de Microsoft Jet 4.0 para conectarme a un origen de datos de Excel 2007".
> Si bien utilizo Excel 2007 el archivo que estoy manipulando es 2003
> y creo que por eso no ha existido problema hasta ahora con la coneccion
> [ o ] debo de asumir que cuando habla del origen de datos en mi caso es Excel 2007
> independientemente de que el archivo este en una version anterior?
> Yo asumo que el origen de datos es el del archivo (Excel 2003) y no la version de Excel que estoy utilizando, me corriges...

solo comentar que hice la prueba con los procedimientos sugeridos (exactamente iguales a) como en "aquella propuesta"
y me han funcionado en la version 2007 sin ningun apuro (tanto la creacion de la TD como la actualizacion de su cache)

de todas formas, haciendo las adaptaciones "del caso" (por si las dudas), modifique ligeramente la designacion del "Proveedor"
y el funcionamiento ha sido exactamente igual (ambos procedimientos corren muy bien en la version 2007)

(claro, en mis ejemplos consulta hacia la base de datos de access "neptuno.mdb")

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

' en un modulo de codigo estandar {+} referencias a ActiveX Data Objects {+} Excel 2000 o superior ==> ' mas informacion acerca de las cadenas de conexion en: => http://www.connectionstrings.com/
Sub CrearTablaADO_RS()
Dim Con As New ADODB.Connection, RS As New ADODB.Recordset, _
Sql As String, PC As PivotCache, PT As PivotTable, ConVersion As String
ConVersion = IIf(Val(Application.Version) < 12 , "microsoft.jet.oledb.4.0", "microsoft.ace.oledb.12.0")
Con.Open "provider=" & ConVersion & ";data source=c:eptuno.mdb;"
Sql = "select * from clientes"
Set RS = New ADODB.Recordset
Set RS.ActiveConnection = Con
RS.Open Sql
Set PC = ActiveWorkbook.PivotCaches.Add(SourceType:=xlExternal)
Set PC.Recordset = RS
Set PT = ActiveSheet.PivotTables.Add(PivotCache:=PC, TableDestination:=Range("a3"))
With PT
.NullString = "0": .SmallGrid = False
.AddFields RowFields:="Ciudad", ColumnFields:="País"
.PivotFields("Región").Orientation = xlDataField
End With
End Sub

Sub ModificarADO_RS_de_Tabla()
Dim Con As New ADODB.Connection, RS As New ADODB.Recordset, _
Sql As String, PC As PivotCache, PT As PivotTable, ConVersion As String
ConVersion = IIf(Val(Application.Version) < 12 , "microsoft.jet.oledb.4.0", "microsoft.ace.oledb.12.0")
Con.Open "provider=" & ConVersion & ";data source=c:eptuno.mdb;"
' Sql = "select * from clientes"
Sql = "select * from proveedores"
Set RS = New ADODB.Recordset
Set RS.ActiveConnection = Con
RS.Open Sql
Set PC = ActiveWorkbook.PivotCaches(1)
Set PC.Recordset = RS
Set PT = ActiveSheet.PivotTables(1)
PT.PivotCache.Refresh
End Sub


.

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida