Query-ADO-SQL-EXCEL

27/07/2006 - 18:54 por JC. | Informe spam
Tengo una tabla en un banco SQL Server y una consulta a dicha tabla con
Microsoft Query.
Necesito sumar el campo “Valor” de la tabla dependiendo si el campo “TIPO”
es 1(uno) o 0(cero) pero si es 0(cero) necesito convertir el valor del campo
a negativo antes de sumarlo.
Para esto utilizo la instrucción UNION ALL. Primero traigo los valores
positivos y después con el UNION ALL los negativos para posteriormente
sumarlos en Excel.
El punto es: 1- No existe en Microsoft Query (es decir en la instrucción
SQL) la opción para cambiar el valor del campo a negativo antes de sumarlo
(algo así como incluir un CASE) y así no tener que utilizar la instrucción
UNION ALL la cual me trae algunos problemas de forma (perdida de nombre de
campos).
2- Existe la posibilidad de ejecutar una instrucción TRANSACT-SQL desde MS
QUERY????
3- Puedo ejecutar un Procedimiento almacenado en el SQL Server desde MS
QUERY???
4- Si las tres anteriores son negativas la única Opción es ADO???

Preguntas similare

Leer las respuestas

#6 incanato
31/07/2006 - 16:46 | Informe spam
HOla gustav holst, hice lo que me sugeriste, pero lamentablemente sale
igual error, te mando aqui el codigo completo:
(en un archivo excel " Jalador.xls")
Dim cnnExcel As New ADODB.Connection
Dim SQL As New ADODB.Command
Dim rs As New ADODB.Recordset
Dim A As String
Dim B As Integer
B = ActiveCell.Row
Dim C As String
cnnExcel.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=D:\Mis
documentos\CONTROL.xls;" & _
"FirstRowHasNames=0;"

Set SQL.ActiveConnection = cnnExcel


A = "'" & Range("B3").Value & Range("C3").Value & "'"
C = "Select cliente from tabla WHERE Codigo="
C = C & A

SQL.CommandText = C
rs.Open SQL
On Error Resume Next
Workbooks("Libro4.XLS").Sheets("Hoja1").Range("d4").Value rs.Fields(0).Value
'Workbooks("Libro4.XLS").Sheets("Hoja1").Range("e4").Value rs.Fields(1).Value


If Err.Number = 3021 Then
Workbooks("Libro4.XLS").Sheets("Hoja1").Range("d4").Value rs.Fields(0).Value
' Workbooks("Libro4.XLS").Sheets("Hoja1").Range("e4").Value rs.Fields(1).Value


End If


rs.Close



cnnExcel.Close

End Sub

Mi archivo control tiene 64 columnas, en la parte del codigo de: Select
cliente, supuestamente "cliente" es el nombre del campo que
supuestamente el excel escoge como los datos en la primera fila, el
error esta en que Select "campo", supuestamente el codigo me debe jalar
cuando escribo cualquiera de los 64 campos de mi tabla excel, pero el
codigo me jala datos solamente de las primeras 15 columnas, y de ahi,
me jala, por saltos (42,44,48,50,51,52,53,54,56,57,59,60 y 62,),
pareceria que el excel, tiene limitaciones para jalar datos de una base
de datos en excel, sera asi??, a proposito ese codigo para desbloquear
celdas es fantastico!!
Saludos
Gustav Holst wrote:
Hola!

A ver si te soy de ayuda. A mi me da que te toma la primera fila como
cabecera, aunque hayas puesto el parámetro "FirstRowHasNames=0", y estoy
adivinando puede que tengas esas columnas conflictivas sin ningún dato
en la primera fila.
¿Has probado a poner una primera fila con nombres para las columnas?



incanato escribió:
> Hola amigos, como estan , hablando de excel ,les envio una consulta,
> actualmente yo acceso a informacion de un archivo de excel, que esta
> cerrado, desde otro que esta abierto en red mediante:
> cnnExcel.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
> "DBQ=D:\Mis
> documentos\archivo.xls;" & _
> "FirstRowHasNames=0;"
>
> Set SQL.ActiveConnection = cnnExcel
>
> este archivo esta cerrado
> desde otro archivo en red(jalador.xls), yo jalo la informacion que hay
> en D:\Mis documentos\archivo.xls de otra maquina
> el problema es que en archivo.xls, tengo una tabla de excel de 64
> columnas, y lo curioso es que he probado jalar datos, y solo me jala
> hasta la columna 15!!, la 16,17,18, me sale error en odbc, o bien no me
> sale nada, pero lo mas curioso es que he ido probando, y me jala las
> columnas 42,44,48,50,51,52,53,54,56,57,59,60 y 62, nada mas, las demas
> columnas me sale error
> No entiendo!!!
>
>
>> Tengo una tabla en un banco SQL Server y una consulta a dicha tabla con
>> Microsoft Query.
>> Necesito sumar el campo "Valor" de la tabla dependiendo si el campo "TIPO"
>> es 1(uno) o 0(cero) pero si es 0(cero) necesito convertir el valor del campo
>> a negativo antes de sumarlo.
>> Para esto utilizo la instrucción UNION ALL. Primero traigo los valores
>> positivos y después con el UNION ALL los negativos para posteriormente
>> sumarlos en Excel.
>> El punto es: 1- No existe en Microsoft Query (es decir en la instrucción
>> SQL) la opción para cambiar el valor del campo a negativo antes de sumarlo
>> (algo así como incluir un CASE) y así no tener que utilizar la instrucción
>> UNION ALL la cual me trae algunos problemas de forma (perdida de nombre de
>> campos).
>> 2- Existe la posibilidad de ejecutar una instrucción TRANSACT-SQL desde MS
>> QUERY????
>> 3- Puedo ejecutar un Procedimiento almacenado en el SQL Server desde MS
>> QUERY???
>> 4- Si las tres anteriores son negativas la única Opción es ADO???
>
Respuesta Responder a este mensaje
#7 JC.
01/08/2006 - 16:33 | Informe spam
Hola Hector!

Te envio mi Query(la cual es muy sencilla) porque me da error cuando realizo
lo que me dices.

SELECT Substring(cuenta,1,4), Tabla3.cuenta, Tabla3.tit_cta,
(Tabla1.Valor*Tabla2.tasa) * Iif (Tabla1.Tipo=0,1,-1)
FROM Tabla1, Tabla2, Tabla3
WHERE …

Me da el error de que existe una sintaxis incorrecta cerca del '=' y que la
sentencia no pudo ser preparada.

JC

"Héctor Miguel" wrote:

hola, JC !

> Tendria como hacer esta funcion de exponencial en MS query???. Lo intente pero no pude, me da error.
> Ese es el problema, porque no se cambiar el valor del campo "Valor" antes de sumarlo.
> Por esta razon tengo que utilizar el UNION ALL -- Primer select los positivos cuando campo "Tipo" es 1
> y el segundo Select los convierto a negativo cuando Tipo es 0. Asi me "llevo" los valores a Excel
> y los sumo en una tabla dinamica.
> Pero quiero realizar la suma de los valores en el QUERY antes de traerme los datos a Excel
> pues me ahorro muchos inconvenientes posteriores.

1) puedes utilizar -al menos- dos formas para 'convertir' [como si utilizars filtros] algunos valores a negativos segun 'condiciones'

a) podrias 'editar' la cadena con la sentencia SQL que genera la consulta a tu base de datos [p.e.]
agregando la condicion dentro de la clausula SELECT +/- como sigue:
-> suponiendo que en la cadena sql [que no te has animado a exponer] contiene algo +/- como lo siguiente:
SELECT <.etc.> Nombre_de_tu_tabla.Valores <.etc.>
-> podrias 'complementarla' con algo +/- como lo siguiente:
SELECT <.etc.> Nombre_de_tu_tabla.Valores * Iif(Nombre_de_tu_tabla.Tipo=0,-1,1) <.etc.>

b) podrias utilizar una columna adyacente al rango 'devuelto' por ms-query con una formula que 'convierta' a negativos los 'convertibles'
[+/- como la sugerencia del mensaje anterior]
{+} -> copias/arrastras/... dicha formula al resto de las filas en el rango de la extraccion
{+} -> haces un click-secundario sobre alguna celda 'dentro' del rango de extraccion
{+} -> seleccionad [del menu contextual] la opcion de: -> 'propiedades del rango de datos'
{+} -> marcas/habilitas/... la ultima opcion en el dialogo: -> autorellenar formulas en columnas adyacentes'
-> la siguiente vez que actualices la consulta, dicha columna [y su formula] se ajustara el rango devuelto por la consulta ;)

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

__ las consultas anteriores __
>> 1) [creo que] seria mas... 'ilustrativo', si expones como ha quedado la cadena de texto con la instruccion sql en ms-query -?-
>>
>> 2) de la exposicion que haces [se entiende que], en la BD tienes...
>> a) un campo [valores] con numeros 'repersentados' -todos- como positivos
>> b) un campo [tipo] que, cuando es 0 [cero] el numero [del campo 'valor'] debe ser convertido a negativo
>>
>> 3) [en excel] es sumamente sencillo realizar este tipo de conversiones [p.e.]
>> a) 'tomas' el valor positivo 'convertido' a negativo y...
>> b) lo multiplicas por la unidad-negativa 'elevada' a la potencia 'tipo' [0 /1] ejemplo:
>> = -Valor * -1 ^ Tipo o...
>> = -Valor * ( -1 ^ Tipo )
>> c) la diferencia entre una 'forma' y otra, pudiera 'radicar' en que [para excel] el orden/precedente de los operadores es +/- logico
>> potencia/raiz se resuelven antes que multiplicacion/division... y estas a su vez, antes que suma/resta
>> [es probable que las operaciones en otras aplicaciones requieran parentesis para didentificar operaciones de 'nivel superior'] -?-
>>
>> 4) si puedes modificar/agregar/icluir/... este tipo de instrucciones en la sentencia sql que estas utilizando... ;)
>>
>> si cualquier duda [o informacion adicional]... comentas ?
>> saludos,
>> hector.
>>
>> __ la consulta original __
>> > ... una tabla en... SQL Server y una consulta... con Microsoft Query.
>> > ... sumar el campo "Valor"... dependiendo si el campo "TIPO" es 1 (uno) o 0 (cero)
>> > ... si es 0 (cero)... convertir el valor del campo a negativo antes de sumarlo
>> > ... traigo los... positivos y... con el UNION ALL los negativos para posteriormente sumarlos en Excel.
>> > El punto es:
>> > 1- No existe en Microsoft Query (...en la instruccion SQL) la opcion para cambiar el valor del campo a negativo antes de sumarlo
>> > (algo asi como incluir un CASE) y asi no tener que utilizar la instruccion UNION ALL
>> > la cual me trae algunos problemas de forma (perdida de nombre de campos).
>> > 2- Existe la posibilidad de ejecutar una instruccion TRANSACT-SQL desde MS QUERY????
>> > 3- Puedo ejecutar un Procedimiento almacenado en el SQL Server desde MS QUERY???
>> > 4- Si las tres anteriores son negativas la unica Opcion es ADO???



Respuesta Responder a este mensaje
#8 Gustav Holst
03/08/2006 - 18:42 | Informe spam
Pues no sé, aunque no domino mucho el VB no veo problemas en tu código,
excepto el "FirstRowHasNames" que lo podría a 1 para indicarle que la
primera fila es 1 cabecera.


incanato escribió:
HOla gustav holst, hice lo que me sugeriste, pero lamentablemente sale
igual error, te mando aqui el codigo completo:
(en un archivo excel " Jalador.xls")
Dim cnnExcel As New ADODB.Connection
Dim SQL As New ADODB.Command
Dim rs As New ADODB.Recordset
Dim A As String
Dim B As Integer
B = ActiveCell.Row
Dim C As String
cnnExcel.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=D:\Mis
documentos\CONTROL.xls;" & _
"FirstRowHasNames=0;"

Set SQL.ActiveConnection = cnnExcel


A = "'" & Range("B3").Value & Range("C3").Value & "'"
C = "Select cliente from tabla WHERE Codigo="
C = C & A

SQL.CommandText = C
rs.Open SQL
On Error Resume Next
Workbooks("Libro4.XLS").Sheets("Hoja1").Range("d4").Value > rs.Fields(0).Value
'Workbooks("Libro4.XLS").Sheets("Hoja1").Range("e4").Value > rs.Fields(1).Value


If Err.Number = 3021 Then
Workbooks("Libro4.XLS").Sheets("Hoja1").Range("d4").Value > rs.Fields(0).Value
' Workbooks("Libro4.XLS").Sheets("Hoja1").Range("e4").Value > rs.Fields(1).Value


End If


rs.Close



cnnExcel.Close

End Sub

Mi archivo control tiene 64 columnas, en la parte del codigo de: Select
cliente, supuestamente "cliente" es el nombre del campo que
supuestamente el excel escoge como los datos en la primera fila, el
error esta en que Select "campo", supuestamente el codigo me debe jalar
cuando escribo cualquiera de los 64 campos de mi tabla excel, pero el
codigo me jala datos solamente de las primeras 15 columnas, y de ahi,
me jala, por saltos (42,44,48,50,51,52,53,54,56,57,59,60 y 62,),
pareceria que el excel, tiene limitaciones para jalar datos de una base
de datos en excel, sera asi??, a proposito ese codigo para desbloquear
celdas es fantastico!!
Saludos
Gustav Holst wrote:
Hola!

A ver si te soy de ayuda. A mi me da que te toma la primera fila como
cabecera, aunque hayas puesto el parámetro "FirstRowHasNames=0", y estoy
adivinando puede que tengas esas columnas conflictivas sin ningún dato
en la primera fila.
¿Has probado a poner una primera fila con nombres para las columnas?



incanato escribió:
Hola amigos, como estan , hablando de excel ,les envio una consulta,
actualmente yo acceso a informacion de un archivo de excel, que esta
cerrado, desde otro que esta abierto en red mediante:
cnnExcel.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=D:\Mis
documentos\archivo.xls;" & _
"FirstRowHasNames=0;"

Set SQL.ActiveConnection = cnnExcel

este archivo esta cerrado
desde otro archivo en red(jalador.xls), yo jalo la informacion que hay
en D:\Mis documentos\archivo.xls de otra maquina
el problema es que en archivo.xls, tengo una tabla de excel de 64
columnas, y lo curioso es que he probado jalar datos, y solo me jala
hasta la columna 15!!, la 16,17,18, me sale error en odbc, o bien no me
sale nada, pero lo mas curioso es que he ido probando, y me jala las
columnas 42,44,48,50,51,52,53,54,56,57,59,60 y 62, nada mas, las demas
columnas me sale error
No entiendo!!!


Tengo una tabla en un banco SQL Server y una consulta a dicha tabla con
Microsoft Query.
Necesito sumar el campo "Valor" de la tabla dependiendo si el campo "TIPO"
es 1(uno) o 0(cero) pero si es 0(cero) necesito convertir el valor del campo
a negativo antes de sumarlo.
Para esto utilizo la instrucción UNION ALL. Primero traigo los valores
positivos y después con el UNION ALL los negativos para posteriormente
sumarlos en Excel.
El punto es: 1- No existe en Microsoft Query (es decir en la instrucción
SQL) la opción para cambiar el valor del campo a negativo antes de sumarlo
(algo así como incluir un CASE) y así no tener que utilizar la instrucción
UNION ALL la cual me trae algunos problemas de forma (perdida de nombre de
campos).
2- Existe la posibilidad de ejecutar una instrucción TRANSACT-SQL desde MS
QUERY????
3- Puedo ejecutar un Procedimiento almacenado en el SQL Server desde MS
QUERY???
4- Si las tres anteriores son negativas la única Opción es ADO???







email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida