Ver Mensaje Individual
  #5 (permalink)  
Antiguo 26/11/2013, 04:28
FIEBRE
 
Fecha de Ingreso: octubre-2007
Mensajes: 25
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: Hacer que un ODBC_EXEC() ignore valores NULL al ejecutar un "select sum(ca

Hola, gracias de nuevo, te pongo el código y los datos que necesitas, he comprobado que el problema sólo aparece cuando hay valores NULL en la columna que se lee para hacer el SUM(), no obstante, puede que se me escape algo...

El SQL funciona perfectamente, si ejecuto las consultas directamente sobre la BBDD efectivamente el sum() no coge los null, como debe ser y por supuesto, no afectan al resultado como comentas.
Código PHP:
       //Conecto a postgresql para sacar los datos del gráfico, incluida la consulta
        
$con=pg_connect("host=servidor dbname=intranet user=xxx password=xxxx");
    if (!
$con
         exit;

        
//Leemos la consulta para generar el gráfico  en una BBDD postgresql
         
gracias a un  parámetro recibido que indica el número de la consulta a leer
    
        $sacarquery
="select * from bbdd.graficos where codigo=".$_GET['qu'];
    
$resquery=pg_query($con,$sacarquery);
    
$row=pg_fetch_array($resquery);
    if(
trim($row['dsn'])!="" && trim($row['usuario'])!="" && trim($row['password'])!="")
    {
        
$conaux=odbc_connect(trim($row['dsn']),trim($row['usuario']),trim($row['password']));
        if (!
$conaux
            echo 
"ERROR AL CONECTAR A LA BASE DE DATOS POR ODBC";
        
//La conexión es correcta, se usa siempre el mismo dsn, usuario y password, para todas las consultas
        
        
$resultado=odbc_exec($conaux,trim($row['consulta']));
        
         echo 
"NUM ROWS:".odbc_num_rows($resultado)."<br><br>\n"
                
// devuelve -1 tanto si falla como si funciona, he leido que dependiendo de la versión    puede ocurrir eso
         
         
echo "RESULTADO:".$resultado."<br><br>\n"
                
//devuelve Resource id #14 tanto si falla como si funciona
         
         
echo "NUM CAMPOS:".odbc_num_fields($resultado)."\n<br><br>";
                
//Devuelve 0 cuando la consulta falla, si no, devuelve el número de campos         
//Por ejemplo, para:
//select year(fecha) as "año", month(fecha) as "mes", sum(enviados) as emails from MITabla group by year(fecha), month(fecha) order by 1,2 -> DEVUELVE CERO
//Para:
select year(fecha) as "año"month(fecha) as "mes"sum(enviados) as emails from MITabla [B]where enviados>0[/Bgroup by year(fecha), month(fechaorder by 1,-> DEVUELVE 3
 
//Cuando he probado estas dos consultas lo hago directamente leyéndolas de base de datos, hago el update para añadir la condición, el proceso es exactamente igual, sólo cambia la query y sólo falla cuando el SUM coge valores NULL, eso es seguro porque he hecho varias pruebas, como quitar los NULL y ponerlos a cero y funciona, ok??

         
echo "MSG ERROR:".odbc_errormsg($conaux)."\n";
                
//No devuelve mensaje ni cuando falla
            
}
           if (
$resultado) --> entra siempreaunque la query falle
           
{
                                        
$tupla=Array(); 
                                        
$err=odbc_fetch_into($resultado,$tupla);
//Esta línea ya da error: odbc_fetch_into(): No tuples available at this result index y ya no sigue
                    
$i=0;
                    while(
$err==true)
                    {
                        
//Se leen datos para pintar el gráfico
                    
}           
           } 
La prueba que tengo por la que te digo que no funciona por los campos NULL es porque éstos gráficos han estado funcionado durante años y ahora ya no funcionan, no se han cambiado ni consultas, ni base de datos, ni estructura de la tabla, ni conexión, ni código, lo único que entiendo que haya podido pasar es una actualización del driver ODBC o del PHP.

No te pongo estrucutura de tabla porque son muchas queys a muchas tablas y en todos los casos que aparece un SUM() y que hay valores a NULL en ese campo a sumar no obtengo datos. Da siempre el mismo error:
odbc_fetch_into(): No tuples available at this result index

Si ejecuto las consultas directamente en el SQL Server funcionan OK.

Te pongo un link de un Bug de PHP que, creo, que está relacionado con este problema...
https://bugs.php.net/bug.php?id=61387

Si te fijas, le da el mismo problema que a mi al ejecutar un SUM().

Gracias de nuevo!!