SQL SUM() AS .. FROM ... WHERE... que no funciona

Iniciado por Baldomero123, 30 Diciembre 2017, 16:38 PM

0 Miembros y 1 Visitante están viendo este tema.

Baldomero123

 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.

Baldomero123

Recibo el mensaje: Error 94 Uso no válido de NULL"

Serapis

#2
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:
Código (vb) [Seleccionar]

 ...where inversor = "'inversorx'"
 
Pero si es una variable debe poner:
Código (vb) [Seleccionar]

...where inversor = inversorx

Y si el contenido de  inversorx, debe estrar entre comillas simples deberías poner:
Código (vb) [Seleccionar]

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...

Baldomero123

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.

Baldomero123

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.

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:
Código (vb) [Seleccionar]
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.

Baldomero123

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.