[SOLUCIONADO] Tabla CGridView a partir de SQL

Buenas a todos,

Quiero crear un tabla CGridview a partir de una consulta SQL la cual es la siguiente:


SELECT CA.rut AS MAIN_ID, 

	            CA.nombre AS nom, 

	            CA.apellido_paterno AS ap, 

	            CA.apellido_materno AS am, 

	            SUM(RA.cantidad_cartas) AS totalC, 

	            SUM(DA.cantidad_devoluciones) AS totalD

				FROM cartero AS CA

				INNER JOIN 

				carga_diaria AS CD

				ON (CD.rut_cartero = CA.rut)

				INNER JOIN registro_acuse AS RE

				ON (CD.codigo_acuse_recibo = RE.codigo_acuse_recibo)

				INNER JOIN devolucion_acuse AS DA

				ON (RA.codigo_acuse_recibo = DA.codigo_acuse_recibo)	

				GROUP BY id, nom, ap, am 

				ORDER BY ap DESC

En mi controlador tengo esto:


public function actionPagos() {

        

        $sql = "SELECT CA.rut AS MAIN_ID, 

	            CA.nombre AS nom, 

	            CA.apellido_paterno AS ap, 

	            CA.apellido_materno AS am, 

	            SUM(RA.cantidad_cartas) AS totalC, 

	            SUM(DA.cantidad_devoluciones) AS totalD

				FROM cartero AS CA

				INNER JOIN 

				carga_diaria AS CD

				ON (CD.rut_cartero = CA.rut)

				INNER JOIN registro_acuse AS RE

				ON (CD.codigo_acuse_recibo = RE.codigo_acuse_recibo)

				INNER JOIN devolucion_acuse AS DA

				ON (RA.codigo_acuse_recibo = DA.codigo_acuse_recibo)	

				GROUP BY id, nom, ap, am 

				ORDER BY ap DESC";

        

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


        $arrayDataProvider = new CArrayDataProvider($rawData, array(

								   'keyField' => 'MAIN_ID',                // PRIMARY KEY

								   'id' => 'Pagos'   // ID of the data provider itself

								));

								        

        $this->render('Pagos', array(

            'arrayDataProvider'=>$arrayDataProvider

        ));

    }

y en vista admin.php tengo lo siguiente:


<?php 

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

                'id'=>'data-grid',

                'dataProvider'=>$arrayDataProvider,                     

                'columns'=>array(

		                        array(

			                        'header'=>'R.U.T',

			                        'name'=>'MAIN_ID',

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

		                        	),

		                        array(

			                        'header'=>'Nombre',

			                        'name'=>'nom',

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

		                        	),

		                        array(

			                        'header'=>'Apellido',

			                        'name'=>'ap',

			                        'value'=>'$data["ap"]." ".$data["am"]'

			                        ),

		                        array(

			                        'header'=>'Cantidad',

			                        'name'=>'totalC',

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

			                        ),

		                        array(

			                        'header'=>'Devoluciones',

			                        'name'=>'totalD',

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

			                        ),

		                        ),

                ));?>       

El problema es que al cargar la página me muestra el error La propiedad "dataProvider" no puede estar vacia.

No sé como arreglar ese problema, o si hay una forma mejor de crear una tabla a partir de una sentencia SQL.

De antemano, gracias por su ayuda

Buenas.

Yo utilizaría un CSqlDataProvider

De todas formas diría q estás teniendo algún problema seteando el provider. Pq tu código parece correcto.

Has comprobado que la variable $arrayDataProvider de tu vista contenga un dataprovider? Haz esto en tu vista :




var_dump($arrayDataProvider);



Y a ver que te muestra.

Un saludo.

Gracias por la respuesta, al final terminé ocupando un CSqlDataProvider y se solucionó el problema.

Saludos.

Logré solucionarlo cambiando estás lineas en el controlador


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

		$count = Yii::app()->db->createCommand('SELECT COUNT(*) FROM (' . $sql . ') as count_alias')->queryScalar();

 

        $model = new CSqlDataProvider($rawData, array( 

                    'keyField' => 'MAIN_ID', 

                    'totalItemCount' => $count,

                    'sort' => array(

                        'attributes' => array(

                            'MAIN_ID','nom','ap','am'

                        ),

                        'defaultOrder' => array(

                            'ap' => CSort::SORT_ASC, //default sort value

                        ),

                    ),

                    'pagination' => array(

                        'pageSize' => 11,

                    ),

                ));

 

        $this->render('admin', array(

            'model' => $model,

        ));

Mi vista admin quedó así


<?php $this->widget('bootstrap.widgets.TbGridView', array(

    'id' => 'a-grid-id',

    'dataProvider' => $model,

    'ajaxUpdate' => true, //false if you want to reload aentire page (useful if sorting has an effect to other widgets)

    'filter' => null, //if not exist search filters

    'columns' => array(

        array(

            'header' => 'R.U.T',

            'name' => 'MAIN_ID',

            //'value'=>'$data["MAIN_ID"]', //in the case we want something custom

        ),

        array(

            'header' => 'Nombre',

            'name' => 'nom',

            'value' => '$data[nom]." ".$data[ap]." ".$data[am]',

            //'value'=>'$data["title"]', //in the case we want something custom

        ),

        array(

            'header' => 'Cartas',

            'name' => 'totalC',

            //'value'=>'$data["title"]', //in the case we want something custom

        ),

        array(

            'header' => 'Devoluciones',

            'name' => 'totalD',

            //'value'=>'$data["title"]', //in the case we want something custom

        ),//just use it in default way (but still we could use array(header,name)... )

 

        ),

    )

);?>           

Saludos.