Hola Tengo un problema al manejar una tabla temporal para SQL desde una macro en excel.
El codigo deveria hacer lo siguiente:
1.- Abre una conexion a SQL
2.-Con la variable sql toma un script de un textbox para crear la tabla temporal
3.-Con la variable sql1 ejecuta una consulta a la tabla temporal y la descarga en excel
4.-Con la variable sql2 ejecuta otra consulta a la tabla temporal y la descarga en excel
5.-Cierra mi conexion a SQL y por lo tanto se elimina la tabla temporal
Pero al parecer no realiza nada desde el punto 3, es como si mi tabla temporal no existiera; y esto mismo lo hago desde SQL y funciona perfectamente, incluso en el enterprise selecciono la creacion de la tabla y los selects y me manda los resultados sin problemas; pero en la macro si incluyo todo en una misma variable "sql" me manda error.
Este es mi codigo:
Sub Gen_Tabla_Temp(sql As String, consulta As String)
'
' Macro1 Macro
' Macro recorded 01/08/2011 by eblugo
'
'
'Eliminamos los registros de la consulta anterior para no confundir datos
Sheets("GT GCIA").Select
Range("G3:Q3").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Range("G3").Select
Sheets("GT EDO").Select
Range("G3:R3").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Range("G3").Select
Sheets("Data").Select
Range("A1").Select
Dim Connection1 As Object
Dim rst As Object
Dim rst1 As Object
Dim rst2 As Object
Dim sql1 As String
Dim sql2 As String
HoraInicio = Time()
'On Error Resume Next
Set Connection1 = CreateObject("ADODB.Connection")
Connection1.CommandTimeout = 0
Connection1.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=DB;Data Source=SERVER"
If sql <> vbNullString And consulta <> vbNullString Then
Connection1.Open
Set rst = CreateObject("ADODB.Recordset")
rst.Open sql, Connection1, , 1, 0
sql1 = "SELECT Estado, Canal, SubCanal, TipoNegocio, SubTipoNegocio, HET, Tipo, CPW, COUNT(CustomerCode) NumCtes, SUM(CustomerIndustryVolume) CPWINDTOT, SUM(CustomerInternalVolume) CPWPMMTOT, SUBSTRING(GeoTreeAreaCode, 1,2) Gerencia FROM #CtesTmp WHERE SUBSTRING(GeoTreeAreaCode, 1,2) between '31' and '84' GROUP BY SUBSTRING(GeoTreeAreaCode, 1,2), Estado, Canal, SubCanal, TipoNegocio, SubTipoNegocio, HET, Tipo, CPW ORDER BY SUBSTRING(GeoTreeAreaCode, 1,2), Estado, Canal, SubCanal, TipoNegocio, SubTipoNegocio, HET, Tipo, CPW"
Set rst1 = CreateObject("ADODB.Recordset")
rst1.Open sql1, Connection1, , 1, 0
C = 0
F = 0
'recorre las columnas, añade el nombre del campo al encabezado
For i = 0 To rst1.Fields.Count - 1
Sheets(Data).Range(Chr(i + 65) & F + 1).Value = rst1.Fields(i).Name
Next
F = F + 1
' recorre todo el recordset hasta el final
Do While Not rst1.EOF
' recorre los campos en el registro actual del recordset para recuperar el dato
For i = 0 To rst1.Fields.Count - 1
' añade el valor a la celda
Sheets(Data).Range(Chr(C + 65) & _
F + 1).Value = rst1.Fields(C)
C = C + 1
Next
' resetea el indice de las columnas
C = 0
' Referencia al registro actual (incrementa )
F = F + 1
' Siguiente registro
rst1.MoveNext
Loop
On Error Resume Next
sql2 = "SELECT Canal, SubCanal, TipoNegocio, SubTipoNegocio, HET, Tipo, CPW, COUNT(CustomerCode) NumCtes, SUM(CustomerIndustryVolume) CPWINDTOT, SUM(CustomerInternalVolume) CPWPMMTOT, SUBSTRING(GeoTreeAreaCode, 1,2) Gerencia FROM #CtesTmp WHERE SUBSTRING(GeoTreeAreaCode, 1,2) between '31' and '84' GROUP BY SUBSTRING(GeoTreeAreaCode, 1,2), Canal, SubCanal, TipoNegocio, SubTipoNegocio, HET, Tipo, CPW ORDER BY SUBSTRING(GeoTreeAreaCode, 1,2), Canal, SubCanal, TipoNegocio, SubTipoNegocio, HET, Tipo, CPW"
Set rst2 = CreateObject("ADODB.Recordset")
rst2.Open sql2, Connection1, , 1, 0
C = 0
'recorre las columnas, añade el nombre del campo al encabezado
For i = 0 To rst2.Fields.Count - 1
Sheets(Data).Range(Chr(i + 65) & F + 1).Value = rst2.Fields(i).Name
Next
F = F + 1
' recorre todo el recordset hasta el final
Do While Not rst2.EOF
' recorre los campos en el registro actual del recordset para recuperar el dato
For i = 0 To rst2.Fields.Count - 1
' añade el valor a la celda
Sheets(Data).Range(Chr(C + 65) & _
F + 1).Value = rst2.Fields(C)
C = C + 1
Next
' resetea el indice de las columnas
C = 0
' Referencia al registro actual (incrementa )
F = F + 1
' Siguiente registro
rst2.MoveNext
Loop
' cierra y descarga las referencias
On Error Resume Next
Set rst1 = Nothing
Set rst2 = Nothing
Connection1.Close
rst.Close
Set Connection1 = Nothing
Set rst = Nothing
rst1.Close
rst2.Close
End If
MsgBox ("Se completo la consulta exitosamente")
MsgBox "El proceso ha concluido" & vbCrLf & vbTab & _
DateDiff("s", HoraInicio, Time()) & " Segundos", vbInformation, "PROCESO CONCLUIDO"
End Sub
La verdad ya intente muchas formas para manejarlo, incluso quise anidar conexciones y que los selects a la tabla temporal entraran a tempdb, pero parece que no se pueden anidar, como le podria hacer para crear la tabla temporal y consultarla desde la macro?
De antemano gracias por su tiempo.