[RESUELTO] pasar registros a columnas en grid

Hola, comunidad

una pregunta que me surge.

Existe algo o componente dentro de Yii que te permita en un grid pasar los registros a columnas de la base de datos, vamos! lo que viene a ser una función pivot.

un saludo.

No sé si un componente, o no se a que te refieres con componente. Pero eso se puede hacer con el widget de yii que se llama cgridview, solo es cuestión de configurarlo

Muchas gracias por contestar,

a lo que me refería con esto es que por ejemplo.tenemos una tabla en una bbdd con la siguiente configuración

id

compañia

tipo_compañia

telefono

si generas un gridview, genera una linea por cada registro id/compañia, la idea es variar esa composición y muestre por cada tipo de compañia una linea y que la compañia pase al header (columna) del gridview.

La pregunta es si existe algún componente ya definido (gridview, clistview,etc…) o extensión al que le indiques como componer el grid, que dato va a ser tomado como columna y que dato es línea.

no sé si se me entiende ahora o he liado más el asunto.

Buenos días, creo que está un poco más claro(supongo), y sigo pensando que con las opciones disponibles para el cgridview lo puedes hacer, por ejemplo puedes agrupar por tipo de compañía en la funcion search q definas así por ejemplo:


$criteria->group = 'tipocompañia';

Y con las opciones del widget como header o name podrías definir los headers que necesitas, deberias postear el intento de codigo para saber el alcance del problema realmente

Hola

Perdón por contestar tan tarde pero otras tareas me han tenido ocupado.

Tengo preparada el Sql para pasar los registros a columnas a través de funciones de mysql, ahora queda pasar a Yii esta consulta.




SELECT 

d.NOMBRE_CORTO as 'Nombre'

,d.COD_COMP as 'Codigo'

,b.ID_ENTI

          , GROUP_CONCAT(DISTINCT(IF(b.ID_SERVICIO = 1 ,b.TIP_PARTICIPA,NULL))) AS 'servicio 1'

	  , GROUP_CONCAT(DISTINCT(IF(b.ID_SERVICIO = 2 ,b.TIP_PARTICIPA,NULL))) AS 'servicio 2'	

	  , GROUP_CONCAT(DISTINCT(IF(b.ID_SERVICIO = 3 ,b.TIP_PARTICIPA,NULL))) AS 'servicio 3'	

	  , GROUP_CONCAT(DISTINCT(IF(b.ID_SERVICIO = 4 ,b.TIP_PARTICIPA,NULL))) AS 'Servicio 4'	

	  , GROUP_CONCAT(DISTINCT(IF(b.ID_SERVICIO = 5 ,b.TIP_PARTICIPA,NULL))) AS 'servicio 5'				

          

FROM tb_entidades_servicios b INNER JOIN tip_servicios c  ON  b.ID_SERVICIO=c.ID_SERVICIOS

	,tb_entidades d

where

	d.ID_ENTI = b.ID_ENTI




GROUP BY b.ID_ENTI;




Qué sería mejor construir una función para generar un dataprovider nuevo o modificar el search para luego poderlo usar en con un Griedview en una vista.

He creado una nueva función




 public function EntidadesServicios() 

                                

                {

                $sql="SELECT 

                        d.NOMBRE_CORTO as 'Nombre'

                        ,d.COD_COMP as 'Codigo'

                        ,b.ID_ENTI

                             , GROUP_CONCAT(DISTINCT(IF(b.ID_SERVICIO = 1 ,b.TIP_PARTICIPA,NULL))) AS 'servicio 1'

                                  , GROUP_CONCAT(DISTINCT(IF(b.ID_SERVICIO = 2 ,b.TIP_PARTICIPA,NULL))) AS 'servicio 2'	

                                  , GROUP_CONCAT(DISTINCT(IF(b.ID_SERVICIO = 3 ,b.TIP_PARTICIPA,NULL))) AS 'servicio 3'	

                                  , GROUP_CONCAT(DISTINCT(IF(b.ID_SERVICIO = 4 ,b.TIP_PARTICIPA,NULL))) AS 'Servicio 4'	

                                  , GROUP_CONCAT(DISTINCT(IF(b.ID_SERVICIO = 5 ,b.TIP_PARTICIPA,NULL))) AS 'servicio 5'				


                        FROM tb_entidades_servicios b INNER JOIN tip_servicios c  ON  b.ID_SERVICIO=c.ID_SERVICIOS

                                ,tb_entidades d

                        where

                                d.ID_ENTI = b.ID_ENTI




                        GROUP BY b.ID_ENTI;";

                $resultado_sql = Yii::app()->db->createCommand($sql)->queryAll();     

                                         

		return new CActiveDataProvider($resultado_sql, array(

			 'pagination'=>array('pageSize'=>3000),

                 

                        

		)); 

            

        }




y dentro de la vista admin he modificado el el dataprovider por este nuevo.




<?php $this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'tb-entidades-servicios-grid',

	'dataProvider'=>$model->EntidadesServicios(),

	'filter'=>$model,

	'columns'=>array(

		//'ID_ENTI_SERVICIO',

		'NOMBRE_CORTO',

                'COD_COMP',

               'ID_ENTI',

		array(

			'class'=>'CButtonColumn',

		),

	),

)); ?>




y me muestra error

Fatal error: Call to a member function getDbCriteria() on a non-object in C:\wamp\www\yii\framework\web\CActiveDataProvider.php on line 225

intentalo con un csqldataprovider

Muchas gracias Rahif por tu respuesta.

buscada la información sobre csqldataprovider he modificado la función y los resultados obtenidos no son del todo buenos.




 public function EntidadesServicios() 

                                

                {

                $count=Yii::app()->db->createCommand('SELECT COUNT(*) FROM tb_entidades_servicios')->queryScalar();

            

                $sql="SELECT 

                        d.NOMBRE_CORTO as 'Nombre'

                        ,d.COD_NRBE as 'Codigo'

                        ,b.ID_ENTI

                             , GROUP_CONCAT(DISTINCT (IF(b.ID_SERVICIO = c.ID_SERVICIOS,b.TIP_PARTICIPA,NULL))) AS servicio 1'

                             , GROUP_CONCAT(IF(b.ID_SERVICIO = 2,b.TIP_PARTICIPA,NULL)) AS 'servicio 2'	

                             , GROUP_CONCAT(IF(b.ID_SERVICIO = 3,b.TIP_PARTICIPA,NULL)) AS 'servicio 3'	

                             , GROUP_CONCAT(IF(b.ID_SERVICIO = 4,b.TIP_PARTICIPA,NULL)) AS 'servicio 4'	

                             , GROUP_CONCAT(IF(b.ID_SERVICIO = 5,b.TIP_PARTICIPA,NULL)) AS 'servicio 5'				


                        FROM tb_entidades_servicios b

                                ,tip_servicios c

                                ,tb_entidades d

                        where 

                                c.ID_SERVICIOS =b.ID_SERVICIO

                        and

                                d.ID_ENTI = b.ID_ENTI


                        GROUP BY b.ID_ENTI";

                $resultado_sql = Yii::app()->db->createCommand($sql)->queryAll();     

                                         

		return new CSqlDataProvider($resultado_sql, array(

                        'totalItemCount'=>$count, 

                        'keyField'=>'ID_ENTI',   

                        'pagination'=>array('pageSize'=>3000),

                 

                        

		)); 

            

        }






en la vista he modificado el grid





<?php $this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'tb-entidades-servicios-grid',

	'dataProvider'=>$model->EntidadesServicios(),

	'filter'=>$model,

	'columns'=>array(

		array (

                    'name' =>'NOMBRE_CORTO',

                    'value'=>'$data["Nombre"]'

                      ),

		array ( 

                       'name'=>'COD_NRBE',

                       'value'=>'$data["Codigo"]' 

                       ),

                array (

                        'name'=>'ID_ENTI',

                        'value'=>'$data["servicio 1"]',

                       ),

                 array (

                        'name'=>'ID_ENTI',

                        'value'=>'$data["servicio 2"]',

                       ),	

                  array (

                        'name'=>'ID_ENTI',

                        'value'=>'$data["servicio 3"]',

                        ),      

                  array (

                        'name'=>'ID_ENTI',

                        'value'=>'$data["servicio 4"]',

                        ),      

                  array (

                        'header'=>'SPF',

                        'name'=>'ID_ENTI',

                        'value'=>'$data["servicio 5"]',

                        ),

                array(

                        'class'=>'CButtonColumn',

		),

	),

)); ?>






La respuesta que me muestra es:




La propiedad "CDbCommand"."0" no se encuentra definida.



Que me he dejado por hacer en el camino.

muchas gracias por vuestro tiempo.

Asegurate de que la query devuelve algún valor, ejecutalá directamente en phpmyadmin o algún otro gestor de BD.

Pon el valor del count directamente si conoces el número de resultados, pero no coloques un count distinto al de la query principal, ejemplo

y mientras haces pruebas cambia lo de 3000 registros a unos pocos valores.

Puedes ver los datos del dataprovider si haces:




$dataprovider = new CSqlDataProvider($resultado_sql, array(

      'totalItemCount'=>$count, 

      'keyField'=>'ID_ENTI',   

      'pagination'=>array('pageSize'=>3),

));


var_dump($dataProvider->getData());

die();



Aqui deberías poder ver los datos de la query.

gracias por contestar rahif.

he realizado los cambios que me has comentado y sigo igual, no sé si me he dejado algo pendiente por hacer. La query la he probado en un gestor de BD, estoy utilizando HEIDISQL. añado la imagen con el resultado 6619

heidisql.png
, la query que cuenta los registro funciona también sin problema, indicando el total de registros.

Luego he modificado la función y el resultado sigue siendo el mismo,

"La propiedad "CDbCommand"."0" no se encuentra definida". 6621

excepcion_yii.png




 public function EntidadesServicios() 

                                

                {

                $count=Yii::app()->db->createCommand('SELECT COUNT(*) FROM tb_entidades_servicios')->queryScalar();

            

                $sql="SELECT 

                        d.NOMBRE_CORTO as 'Nombre'

                        ,d.COD_NRBE as 'Codigo'

                        ,b.ID_ENTI

                             , GROUP_CONCAT(IF(b.ID_SERVICIO = 1,b.TIP_PARTICIPA,NULL)) AS 'serv 1'

                             , GROUP_CONCAT(IF(b.ID_SERVICIO = 2,b.TIP_PARTICIPA,NULL)) AS 'serv 2'	

                             , GROUP_CONCAT(IF(b.ID_SERVICIO = 3,b.TIP_PARTICIPA,NULL)) AS 'serv 3'	

                             , GROUP_CONCAT(IF(b.ID_SERVICIO = 4,b.TIP_PARTICIPA,NULL)) AS 'serv 4'	

                             , GROUP_CONCAT(IF(b.ID_SERVICIO = 5,b.TIP_PARTICIPA,NULL)) AS 'serv 5'				


                        FROM tb_entidades_servicios b

                                ,tip_servicios c

                                ,tb_entidades d

                        where 

                                c.ID_SERVICIOS =b.ID_SERVICIO

                        and

                                d.ID_ENTI = b.ID_ENTI


                        GROUP BY b.ID_ENTI";

                $resultado_sql = Yii::app()->db->createCommand($sql)->queryAll();     

                                         

		return new CSqlDataProvider($resultado_sql, array(

                        'totalItemCount'=>$count, 

                        'keyField'=>'ID_ENTI',   

                        'pagination'=>array('pageSize'=>3),

                 

                        

		)); 

         var_dump($dataProvider->getData());

         die();

        }




En la vista, según ejemplos que he visto creo que está bien

gracias de nuevo.

Fallo mio,




$resultado_sql = Yii::app()->db->createCommand($sql); // ponlo así sin el queryAll 



saludos

Muchas gracias rahif por tu respuesta,

hemos avanzado un poco mas, de nuevo gracias, parece que tengo problemas con algun dato del dataprovider, ire viendo a ver que campo es el que está fallando ya dentro de la vista


Fatal error: Call to a member function getDbCriteria() on a non-object in 

Saludos

Hola

Ya esta en marcha!! gracias rahif. ;)

Ahora me toca seguir configurando algunas cosas de forma manual.He comprobado que dentro del Gridview la opción de los botones por defecto del grid no le gusta y da error por lo que he tenido que quitarlo. >:(

tengo el siguiente problema, quiero sustituir el valor de id por otro campo, en uno de ellos me lo permite (nombre) pero en otro (cod_nrbe) dice que no encuentra el campo dentro del modelo, pese a que la sql está definido ya que lo he tomado de otra tabla relacionada y que en el modelo están relacionadas.




,d.COD_NRBE as 'Codigo'



hay alguna forma según esto de poder sustituir los valores (ejemplo $data->iamigo->nombre…) como ocurre con un gridview digamos estandar.




<?php $this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'tb-entidades-servicios-grid',

	'dataProvider'=>$model->EntidadesServicios(),

	'filter'=>$model,

	'columns'=>array(

		

                /*array ( 

                       'header'=>'CODIGO',

                       'name'=>'ID_ENTI',

                       'value'=>'$data["codigo"]'//este campo quiero cambiarlo por otro valor COD_.

                        

                       ),*/

                array ( 

                       'header'=>'Codigo',

                       'name'=>'ID_ENTI',

                       'value'=>'$data["ID_ENTI"]' 

                       ),

                array (

                    'header'=>'NOMBRE',

                    'name' =>'ID_ENTI',

                    'value'=>'$data["Nombre"]',

                    'htmlOptions'=>array('style'=>'word-wrap:break-word; width:450px;')

                      ),

		

                array (

                        'header'=>'servicio 1',

                        'name'=>'ID_SERVICIO',

                        'value'=>'$data["servicio 1"]',

                       ),

                 array (

                        'header'=>'servicio 2',

                        'name'=>'ID_SERVICIO',

                        'value'=>'$data["servicio 2"]',

                       ),	

                  array (

                        'header'=>'servicio 3',

                        'name'=>'ID_SERVICIO',

                        'value'=>'$data["servicio 3"]',

                        ),      

                  array (

                        'header'=>'servicio 4',

                        'name'=>'ID_SERVICIO',

                        'value'=>'$data["servicio 4"]',

                        ),      

        	

	),

)); ?>



Lo que no puedo por el momento es colocar los botones si intento colocar

CButtonColumn o me muestra




Error 500


Trying to get property of non-object




gracias por el tiempo dedicado.

Me contesto ya he logrado que los botones aparezcan en el gridview.




array(

                        

     'class'=>'zii.widgets.grid.CButtonColumn',

     'viewButtonUrl'=>'Yii::app()->createUrl("/TbEntidadesServicios/view", array("id"=>$data["ID_ENTI"]))',

     'updateButtonUrl'=>'Yii::app()->createUrl("/TbEntidadesServicios/update", array("id"=>$data["ID_ENTI_SERVICIO"]))',

     'deleteButtonUrl'=>'Yii::app()->createUrl("/TbEntidadesServicios/delete", array("id"=>$data["ID_ENTI_SERVICIO"]))',

     ),