Foros del Web » Programando para Internet » PHP »

Duda para generar reportes

Estas en el tema de Duda para generar reportes en el foro de PHP en Foros del Web. Buen día foro Tengo una duda al momento de hacer reportes. Espero me puedan aconsejar cual es la mejor opcion: Tengo dos metodos uno que ...
  #1 (permalink)  
Antiguo 08/03/2013, 12:24
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Pregunta Duda para generar reportes

Buen día foro

Tengo una duda al momento de hacer reportes. Espero me puedan aconsejar cual es la mejor opcion:

Tengo dos metodos uno que hace la condicion y otro que hace las consultas:

Código PHP:
Ver original
  1. public function condicion($k){
  2.         $where = '';
  3.         $inicio = true;
  4.         if(isset($k['desde']) && $k['desde'] != "" && isset($k['hasta']) && $k['hasta'] != ""):
  5.             $where.=($inicio)?" WHERE f.fecha BETWEEN'".$k['desde']."' AND '".$k['hasta']."'" : "AND f.fecha BETWEEN'".$k['desde']."' AND '".$k['hasta']."'";
  6.             $inicio = false;  
  7.         endif;
  8.         if(isset($k['cliente']) && $k['cliente'] != ""):
  9.             $where.=($inicio)?" WHERE c.cliente='".$k['cliente']."'":" AND c.cliente='".$k['cliente']."'";
  10.             $inicio = false;
  11.         endif;
  12.         if(isset($k['asociado']) && $k['asociado'] != ""):
  13.             if($k['asociado'] != 4):
  14.                 $where.=($inicio)?" WHERE a.asociadoID='".$k['asociado']."'":" AND a.asociadoID='".$k['asociado']."'";
  15.                 $inicio = false;
  16.             endif;    
  17.         endif;
  18.         if(isset($k['estado']) && $k['estado'] != ""):
  19.             if($k['estado'] == "Todos"):
  20.                 $where.=($inicio)? " WHERE f.status='Pagada' OR f.status='Pendiente' OR f.status='Cancelada' ":" AND f.status='Pagada' OR f.status='Pendiente' OR f.status='Cancelada'";
  21.                 $inicio = false;
  22.             else:
  23.                 $where.=($inicio)? " WHERE f.status='".$k['estado']."'":" AND f.status='".$k['estado']."'";
  24.                 $inicio = false;
  25.             endif;
  26.         endif;
  27.         if(isset($k['agrupar']) && $k['agrupar'] != ""):
  28.             if($k['asociado'] != 4):
  29.                 $where.=($k['agrupar'] == 1) ? " GROUP BY c.cliente WITH ROLLUP":"";
  30.             endif;
  31.         endif;
  32.         return $where;
  33.     }
  34.    
  35.     public function datosFiltro($k){
  36.         $condicion = $this->condicion($k);
  37.         $meses = array(1=>"ene",2=>"feb",3=>"mar",4=>"abr",5=>"may",6=>"jun",7=>"jul",8=>"ago",9=>"sep",10=>"oct",11=>"nov",12=>"dic");
  38.         // CONSULTA...
  39.         if($k['asociado'] != 4):
  40.             $query = "SELECT  c.cliente, f.status, ";
  41.             for($j = 1; $j <= 12; $j++):
  42.                 $query.= "SUM(CASE WHEN MONTH(f.fecha) = ".$j." THEN f.totalFactura ELSE 0 END) ".$meses[$j].", ";  
  43.             endfor;
  44.             $query.=" SUM(f.totalFactura) totalgral ";
  45.             $query.= $k['asociado'] == 1 ? "FROM facturaX f ": "FROM facturaY f ";
  46.             $query.=" JOIN cliente c ON f.clienteID = c.clienteID JOIN asociado a ON c.asociadoID=a.asociadoID";
  47.             $query.= $condicion;
  48.             return $query;
  49.         else:
  50.             $query = "SELECT  c.cliente, f.status, ";
  51.             for($j = 1; $j <= 12; $j++):
  52.                 $query.= "SUM(CASE WHEN MONTH(f.fecha) = ".$j." THEN f.totalFactura ELSE 0 END) ".$meses[$j].", ";  
  53.             endfor;
  54.             $query.=" SUM(f.totalFactura) totalgral ";
  55.             $query.=" FROM facturaX f ";
  56.             $query.=" JOIN cliente c ON f.clienteID = c.clienteID JOIN asociado a ON c.asociadoID=a.asociadoID";
  57.             $query.= $condicion." AND (a.asociadoID='1') GROUP BY c.cliente WITH ROLLUP";
  58.             $query.=" UNION ";
  59.             $query.= "SELECT  c.cliente, f.status, ";
  60.             for($j = 1; $j <= 12; $j++):
  61.                 $query.= "SUM(CASE WHEN MONTH(f.fecha) = ".$j." THEN f.totalFactura ELSE 0 END) ".$meses[$j].", ";  
  62.             endfor;
  63.             $query.=" SUM(f.totalFactura) totalgral ";
  64.             $query.=" FROM facturaY f ";
  65.             $query.=" JOIN cliente c ON f.clienteID = c.clienteID JOIN asociado a ON c.asociadoID=a.asociadoID";
  66.             $query.= $condicion." AND (a.asociadoID='2' OR a.asociadoID='3') GROUP BY c.cliente WITH ROLLUP ";
  67.             return $query;
  68.         endif;
  69.     }

Mi duda cual es la mejor opcion para manejar las consultas:
Hacer las consultas por separado o generar todo como lo tengo en ese ejemplo?

Espero me puedan apoyar.
De antemano muchas gracias.
__________________
Lo imposible solo cuesta un poco mas
  #2 (permalink)  
Antiguo 08/03/2013, 12:53
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: Duda para generar reportes

Pues no veo mal crear la condición por separado de la ejecución de la consulta, lo que creo que trabajas de más es a la hora d e formar la condición, al tratar de concatenarla y al evaluar si existen los parámetros:

Código PHP:
Ver original
  1. if(isset($k['desde']) && $k['desde'] != "" && isset($k['hasta']) && $k['hasta'] != ""):
  2.             $where.=($inicio)?" WHERE f.fecha BETWEEN'".$k['desde']."' AND '".$k['hasta']."'" : "AND f.fecha BETWEEN'".$k['desde']."' AND '".$k['hasta']."'";
  3.             $inicio = false;  
  4.         endif;


Código PHP:
Ver original
  1. if(!empty($k['desde'])  && !empty ($k['hasta'])):
  2.               $where[]="f.fecha BETWEEN'".$k['desde']."' AND '".$k['hasta'];
al final, la variable $where la juntas con implode

Código PHP:
Ver original
  1. $where='WHERE '.implode(' AND ',$where);

Y sólo habría que tratar el group by de forma independiente para que no lleve el and.

Las diferencias: empty verifica si la variable existe y está o no vacía, con lo que no necesitas comparar dos veces

Y finalmente, en vez de preguntar si la variable $where ya contiene algo, vas almacenando en un arreglo los segmentos de la consulta para al final unirlo con AND entre cada segmento.

Etiquetas: reportes, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:36.