Autor
|
Tema: SQL SUM() AS .. FROM ... WHERE... que no funciona (Leído 3,884 veces)
|
Baldomero123
Desconectado
Mensajes: 18
|
ver si alguien me consigue sacar del atasco. En el código siguiente se m da como resultado de la suma NULL, cuanto todos los campos de la columna de la columna 'importe' en la tabla remesas están bien están debidamente llenos: Cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0.;Data source=C:\users\Alberto Moreno Gil\Documents\Lending.mdb" Cn.Open Rs.Open "SELECT COUNT(0)AS 'cuantosinv' FROM inversores", Cn, adOpenStatic, adLockPessimistic cuantosinvx = Rs(0) MsgBox cuantosinvx, 16, "Nº inversores" ' cuantosinvx es la variable que indica el nº de inversores. Ciclo exterior. Rs.Close Rs.Open "SELECT COUNT(0)AS 'cuantasplat' FROM plataforma", Cn, adOpenStatic, adLockPessimistic cuantasplatx = Rs(0) MsgBox cuantasplatx, 16, "Nº plataformas" ' cuantasplatx es la v. que indica el nº de plataformas. Ciclo interno Rs.Close '+++++++++++++++++++++ 'CICLO EXTERIOR (DE LOS INVERSORES)(principio) tfin = 0 Rs.Open "SELECT * FROM inversores ORDER BY inversor", Cn, adOpenStatic, adLockPessimistic Rs.MoveFirst Do While tfin < cuantosinvx inversorx = Rs.Fields.Item(1) 'CICLO INTERIOR (principio) Rs1.Open "SELECT SUM(importe) AS 'granremesa' FROM remesas WHERE INVERSOR = ' " & inversorx & " ' ", Cn, adOpenStatic, adLockOptimistic remesatot = Rs1(0) MsgBox remesatot, 16, "Importe remesas" En Rs1(0) me da como resultado de la suma NULL y a partir de ahí todo ya está mal. "inversorx" que es la condición está bien tanto en la línea de código como en una MsgBox que puse. En cuanto a las comillas y comas de inversorx en la expresión SQL creo que están bien. Me he dado varias vueltas por la red intentando aclararlo, pero nada. Gracias.
|
|
|
En línea
|
|
|
|
Baldomero123
Desconectado
Mensajes: 18
|
Recibo el mensaje: Error 94 Uso no válido de NULL"
|
|
|
En línea
|
|
|
|
Serapis
|
El código resulta un poco espagueti, por la vaguedad en los nombres, pero bueno... Según tú...: ...where inversor = 'inversorx' Pero ausmo que inversorX es una variable no una cadena de texto literal... es decir si fuera una cadena de texto literal, hubieras puesto: ...where inversor = "'inversorx'"
Pero si es una variable debe poner: ...where inversor = inversorx
Y si el contenido de inversorx, debe estrar entre comillas simples deberías poner: inversorX = "'" & inversorX & "'" ' en alguna parte pondrías esto ... ...where inversor = inversorX ' par al final hacer esto
...en fin apunta el ratón en la palabra inversorx, y con el otro botón del ratón da click, y cuando emerja el menú flotante, selecciona: 'definición' y te llevará a la declaración de la variale, si lo es... (aunque es algo que tu debieras saber (los demás no, porque no vemos declaraciones de variables por ningún lado en tu código escueto). Corrige las comillas según lo que sea (uno de los 3 casos antedichos).
p.d.: también si encerraras tu código entre etiquetas GeSHi, el coloreado del texto, lo haría más legible...
|
|
« Última modificación: 31 Diciembre 2017, 02:46 am por NEBIRE »
|
En línea
|
|
|
|
Baldomero123
Desconectado
Mensajes: 18
|
Muchísimas gracias por tu respuesta y consejos. Imprimo y estudiaré "most carefully" tu contestación. Tras que mis conocimientos son los que son, a base de darle vueltas y vueltas a esta cuestión ya estaba aprendiendo a decir "carchuto" . Feliz año nuevo.
|
|
|
En línea
|
|
|
|
Baldomero123
Desconectado
Mensajes: 18
|
Hola, de nuevo. Efectivamente inversorx es una variable. He hecho con el ratón como me has dicho y en Definición me dice "No se reconoce el identificador que está debajo del cursor". Esto en un Recordset, creo que Rs2, pero en la línea inmediatamente anterior de código, en Rs1(1), sí aparece inversorx como reconocido y con un valor. Por si fuera cosa de Public o Private he puesto al principio del módulo: Public inversorx As Var. Sigue con el mensaje de "no se reconoce...". Seguiremos con la lucha. Gracias y hasta luego.
|
|
|
En línea
|
|
|
|
Serapis
|
A ver... yo te puse eso de "te llevará a la declaración de la variale, si lo es... (aunque es algo que tu debieras saber (los demás no, porque no vemos declaraciones de variables por ningún lado en tu código escueto).", e smás una crítica que otra cosa. Por la mala costumbre de no poner las declraciones y que tengamos que jugar a adivinar que tipo es una variable. Está claro que es (o debiera ser) un Recordset, para recibir la asignación de la línea: inversorx = Rs.Fields.Item(1)
No lo declares como Variant si sabes el tipo que va a recibir. Ralentiza mucho las operaciones con Variant y debe usarse exclusivamente cuando un parámetro ha de recibir diferentes tipos... éste no parece ser el caso. Luego, como te fallan las comillas, venía decirte que si no estás seguro de si lo has hecho correctamente, una forma de saber si por error, lo tratas como un literal, en vez de como variable, es reclamar su "definición", si la variable está declarada, irá a la línea donde aparece declarada, si no lo está o está descrita como un literal, te indiará que 'no se reconoce como un identificador (nombre de variable, función, propiedad, clase, constante, etc...) ...pero ya te dije que corrigieras las comillas como corresponde... y si no tienes claro donde falla exactamente, ejecuta el programa paso a paso, en la función donde esté ese fragemnto de código (pon una línea de pausa (con F9), al comienzo de ese código, y luego ejecuta paso a paso (con F8), mirando tras la ejecución de cada paso, si las variables contienen el valor que cabe esperar... Y si precisas evaluar una expresión, en vez de una variable suelta, selecciona la expresión 'completa' y con el ratón selecciona "inspección rápida" ( ó SHIFT+F9)... así logras llegar fácilmente al punto donde no está como corresponde. ...en fin, tienes que aprender algo sobre depuración del código usando el propio entorno de programación. VB6 es muy completo al caso.
|
|
|
En línea
|
|
|
|
Baldomero123
Desconectado
Mensajes: 18
|
Muy buenos días. Lo intenté sin éxito. Buscando después, en una página de Microsoft especializada en comas, comillas y cometas encontré estas instrucciones que sí me han solucionado al fin:
Rs.Open "SELECT * FROM inversores ORDER BY inversor", Cn, adOpenStatic, adLockOptimistic Rs.MoveFirst inversorx = Rs(1) MsgBox inversorx, 16, "Inversor 1º" 'Me devuelve en inversorx = "AMG" Rs1.Open "SELECT SUM(importe) FROM remesas WHERE inversor = """ & inversorx & """", Cn, adOpenStatic, adLockOptimistic totalrem3 = Rs1(0) MsgBox totalrem3, 16, "Suma de las remesas de inversorx " 'FUNCIONA Rs1.Close Rs.Close
Tengo que decir que en esta página dice que esto de las """& ... & """" (tres " más la final " es equivalente al procedimiento que tú me indicaste, pero el procedimiento de las tres " me ha funcionado y el otro no. Misterios. Muchas gracias por aguantar la matraca que te he dado y feliz año.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
psx no me funciona
Juegos y Consolas
|
faju
|
4
|
2,741
|
23 Febrero 2005, 00:25 am
por ¤ Nerviozzo ¤
|
|
|
X-oom funciona pero no funciona (sungoku?)
Multimedia
|
Lordofchaos
|
4
|
4,351
|
12 Diciembre 2005, 20:44 pm
por Sourraund
|
|
|
Login con md5 , BD funciona pero no funciona
« 1 2 »
PHP
|
securedigital
|
16
|
10,247
|
25 Mayo 2007, 17:46 pm
por securedigital
|
|
|
Context-root en eclipse no funciona, pero si genero ear y despliego, si funciona
Desarrollo Web
|
JobFer
|
0
|
2,227
|
26 Septiembre 2014, 10:09 am
por JobFer
|
|
|
como es posible que este programa funciona y como funciona?
Ingeniería Inversa
|
insider dealing
|
7
|
9,815
|
1 Octubre 2017, 01:23 am
por BloodSharp
|
|