Problemas con un reporte

Muy buenos días

Agradecería que pudieran ayudarme,ya que llevo tiempo y no logro avanzar

mi problema consiste en dos partes

primero tengo esta consulta.

7435

Captura.PNG

[sql]SELECT historiaFisica,count(evolucion.id)

AS contadorEvoluciones,historiaclinicafisica.pacienteId,evolucion.id,tercero.eps

FROM evolucion 


INNER JOIN historiaclinicafisica 


ON evolucion.historiaFisica=historiaclinicafisica.id 


WHERE evolucion.fecha >= '2017-07-01' 


AND evolucion.fecha <= '2017-07-31'


    GROUP BY evolucion.historiaFisica


ORDER BY evolucion.fecha DESC[/sql]

Se supone que tiene que arrojarme la historia y la ultima evolucion realizada entre fecha y fecha, junto con la

cantidad de evoluciones realizadas, el problema es que me devuelve la fecha de una evolucion pero no de la ultima evolución.

7436

Captura1.PNG

Segunda parte del problema.

parte de la vista del reporte:


foreach ($modelApProcedimientos as $key => $value) {


			$modelTercero = Tercero::model()->findByPk($value->pacienteId);

			$modelAgenda = Agenda::model()->find('numeroAutorizacion =:autorizacion',array(':autorizacion'=>$value->numeroautorizacion));

			$modelHistoria=Historiaclinicafisica::model()->findByPk($value->historiaFisica);

			$modeloCie10=Diagnostico::model()->find('historiaFisicaId=:historiaFisicaId',array(':historiaFisicaId'=>$value->historiaFisica));

			$modelEntidad = Entidadsalud::model()->find('numeroDocumento=:eps',array(':eps'=>$modelTercero->eps));


			$numeroAuto ='';


			

			//**********************INFO AGENDA******************************

				echo '<tr>

				 <td>'.$modelAgenda->numeroRecibo.'</td>

				 <td>'.$modelAgenda->cantidad.'</td>

				';


				if(!empty($modelAgenda->numeroAutorizacion))

				{

				   echo '<td>'.$modelAgenda->numeroAutorizacion.'</td>';

				}

				else{

					echo '<td bgcolor="#f9c5b8">'.$value->numeroautorizacion.'</td>';

				}


				echo'

				 <td>'.$modelAgenda->MedicoOrden.'</td>

				 <td>'.$modelAgenda->TipoRecaudo.'</td>

				 <td>'.$modelAgenda->ValorRecaudo.'</td>

				 <td>'.$codOptimus.'</td>

				 ';



Tengo que generar un reporte supremamente engorroso, me explico tengo que llamar diferentes modelos,mientras se escribe el archivo en excel, por tanto se termina cayendo el script, como se puede hacer para que las consultas o la llamada a modelos sea mas optima.

Si alguien tiene experiencia en reportes que me pueda ayudar !!

De antemano Muchas Gracias.

Hola, Para la 1ª mira este enlace.

Para la 2ª esta no es nada fácil.

  • Si el script cae por tiempo (quizas las sql puedan optimizarse, o el codigo), sino aumentar el tiempo permitido de ejecucion del script.

  • Si el script cae por falta de memoria recuerda que un objeto consume más que un array, minimiza todo lo que puedas el nº de objetos.

En Yii2 esto es más facil que en Yii1 (por lo menos este caso), pero aún así si el bucle es grande …

Utiliza explain para ver las sql, de select * … --> haz explain select * …

y mira si necesitas crear alguna clave para acelerar la búsquedas.

saludos

Muchas gracias por tu respuesta en efecto el primer problema era una cuestion de ordenar,el sql

lo que estaba haciendo era agruparme las evoluciones pero en el select se mostraba cualquiera

debido a que el order solo se aplica a la salida general no a la salida de cada select

Solucione esto empleando la funcion MAX(evolucion.fecha) de sql de esta manera me mostraria

la evolucion con mayor fecha de una historia clinica y cumpliendo los WHERE.

[sql]SELECT historiaFisica,count(evolucion.id)

AS contadorEvoluciones,historiaclinicafisica.pacienteId,MAX(evolucion.id) AS idEvo,

MAX(evolucion.fecha) AS fechaEvo, <— La funcion MAX me arroja la fecha mayor que cumpla las condiciones

evolucion.hora

FROM evolucion

INNER JOIN historiaclinicafisica

ON evolucion.historiaFisica=historiaclinicafisica.id

WHERE evolucion.fecha >= ‘".$model->fechaInicioReport."’

AND evolucion.fecha <= ‘".$model->fechaFinReport."’

GROUP BY evolucion.historiaFisica

ORDER BY evolucion.fecha DESC,evolucion.hora DESC[/sql] <-- Esto organiza es la salida general

Con respecto a lo segundo sigo investigando,debido a que uso yii 1

me toca optimizarlo lo mas posible es por eso que para el reporte creare un store procedure para asi

hacer la busqueda en el servidor y no depender del tiempo de carga de los navegadores,ni de la maquina del usuario , me permito hacer esto debido a que el reporte es algo mensual, entonces la carga en le servidor seria minima.

Pero si tienen algun otro consejo les agradeceria

Hola,

Muy bien salvado el punto 1 :) , en este caso has podido hacerlo en un select, pero no siempre se puede.

Para el punto 2 lo que comentas esta bien, porque no veo que puedas cachear nada ya que trabajas con varios modelos y parece una locura, pero si puedes utilizar cache las cosas se acelerarian y mucho.

Suerte

Y exportar a csv en luagr de directamente a Excel?

Ten en cuenta que un csv lo puedes abrir en Excel y formatearlo como quieras.

Un saludo.