Exportar Tabla Cgridview Creada Con Sql Compleja A Excel Y Pdf

Estimados:

Junto con saludarles quería hacerles la siguiente consulta, lo que pasa que genere una tabla en CgridView de la siguiente forma:

Controlador




    public function actionPrestacionesIngresadasMes() {

        $sql = "SELECT A.asiento_id as id,

                    MC.medico_rut as rut,

                    MC.medico_nombres as nombre,

                    MC.medico_apellidos as apellido,

                    A.asiento_fecha_oficial as fecha, 

                    P.prestacion_codigo as codigo_prestacion, 

                    P.prestacion_nombre as nombre_prestacion, 

                    AP.asiento_prestacion_precio as precio,

                    YEAR(A.asiento_fecha_oficial) AS ano

                    FROM ASIENTO AS A 

                    INNER JOIN ASIENTO_PRESTACION AS AP ON (AP.asiento_prestacion_asiento_id = A.asiento_id)

                    INNER JOIN PRESTACION AS P ON (P.prestacion_id = AP.asiento_prestacion_prestacion_id)

                    INNER JOIN ASIENTO_COBRANZA AS AC ON (AC.as_cob_asiento_id = A.asiento_as_cob_asiento_id)

                    INNER JOIN MEDICO_COBRANZA AS MC ON (MC.medico_id = AC.as_cob_medico_id)

                    WHERE YEAR(A.asiento_fecha_oficial) = YEAR ( NOW() )"; 

        

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

        $arrayDataProvider = new CArrayDataProvider($rawData, array(

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

           'id' => 'PrestacionesIngresadas',  // ID of the data provider itself

            'sort'=> false,

            'pagination' => false,

        ));


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

        'arrayDataProvider'=>$arrayDataProvider

        ));

    }



y la vista




<?php 

$this->widget('ext.groupgridview.GroupGridView', array(

'id'=>'data-grid',

'dataProvider'=>$arrayDataProvider,

'extraRowColumns' => array('ano'),

'extraRowPos' => 'below',

'extraRowTotals' => function($data, $row, &$totals) {


            if(!isset($totals['suma_precio'])) $totals['suma_precio'] = 0;

                    $totals['suma_precio'] += $data['precio'];

                    $totals['sumaPrecioFormat'] = number_format($totals['suma_precio'] ,0,',', '.'); 

        },


        'extraRowExpression' => '"<table class=\"tabla-extrarow\">

                                    <tr>

                                        <td><span class=\"blod total\">TOTAL </span></td>

                                        <td class=\"montos\">".$totals["sumaPrecioFormat"]."</td>

                                    </tr></table>"', 

 			'columns'=>array(

       			array(

            		'header'=>'RUT MÉDICOS',

            		'name'=>'rut',

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

        		),

        		array(

            		'header'=>'NOMBRES MÉDICOS',

            		'name'=>'nombre',

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

        		),

        		array(

            		'header'=>'APELLIDOS MÉDICOS',

            		'name'=>'apellido',

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

        		),

              	array(

            		'header'=>'FECHA',

            		'name'=>'fecha',

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

        		),

        		array(

            		'header'=>'CODIGO PRESTACION',

            		'name'=>'codigo_prestacion',

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

        		),

        		array(

            		'header'=>'NOMBRE PRESTACION',

            		'name'=>'nombre_prestacion',

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

        		),

        		array(

                    'id'=>'precio_id',

            		'header'=>'PRECIO',

            		'name'=>'precio',

                    'value'=>'number_format($data["precio"],0,\',\', \'.\')'

        		),

			),

		));?>		



Hasta ahi todo bien, pero necesito Exportarla a Excel y a PDF pero no me resulta :(

Para exportarla a ecxel lo tengo echo de la siguiente forma pero no me funciona




    public function actionExportExcelPrestacionesIngresadasMes() {

        header('Content-type: text/csv');

        header('Content-Disposition: attachment; filename="Reporte-Estado-Cuenta-Cliente' . date('YmdHi') . '.csv"');


        $model = new Asiento('search');

        $model->unsetAttributes();  // clear any default values


        if (Yii::app()->user->getState('exportModel2'))

            $model = Yii::app()->user->getState('exportModel2');


        $dataProvider = $arrayDataProvider;  

        $dataProvider->setPagination(false); 


        // csv header

        echo Asiento::model()->getAttributeLabel("rut") . ";" .

        Asiento::model()->getAttributeLabel("nombre") . ";" .

        Asiento::model()->getAttributeLabel("apellido") . ";" .

        Asiento::model()->getAttributeLabel("fecha") . ";" .

        Asiento::model()->getAttributeLabel("codigo_prestacion") . ";" .

        Asiento::model()->getAttributeLabel("nombre_prestacion") . ";" .

        Asiento::model()->getAttributeLabel("precio") .

        " \r\n";


        // csv data

        $data = $dataProvider->getData();

        foreach($data as $row) {  

            echo $row["rut"] . ";";

            echo $row["nombre"] . ";";

            echo $row["apellido"] . ";";

            echo $row["fecha"] . ";";

            echo $row["codigo_prestacion"] . ";";

            echo $row["nombre_prestacion"] . ";";

            echo $row["precio"];

            echo "\r\n";

        }

        exit;

    }



SI alguien sabe cual seria la mejor forma de hacerlo ojalá me pueda ayudar se lo agradeceria demaciado

saludos de ante mano…

Creo que no estas llenando tu dataProvider, solo lo declaras y asignas la propiedad de paginacion, pero no lo llenas, y por consecuencia cuando tratas de obtener los datos (getData) esta vacio.

Si el $dataProvider viene vacío, me di cuenta con el Debug que hize , pero no entiendo porque ?¿?, como tendria que hacerlo ¿?¿

me podrias echar una mano porfavor

Saludos

Buenos días.

Como te dice Daniel, tienes que llenar tu dataProvider.

Tienes 2 posibilidades:

1- Pasarle a tu acción actionExportExcelPrestacionesIngresadasMes los datos del dataprovider que creaste para tu acción actionPrestacionesIngresadasMes. Supongo que en la vista en donde muestras tendras un botón o enlace "exportar a Excel" que te redigirá a la acción actionExportExcelPrestacionesIngresadasMes. Entonces lo que tienes que hacer es modificar tu acción para que te quede así:




public function actionExportExcelPrestacionesIngresadasMes($misDatos) {

...

...




Y cuando haces la llamada a esta acción, pasarle los datos del dataprovider, por ejemplo:




echo CHtml::link("Exportar Excel", 

          array( 

               'tuControlador/exportExcelPrestacionesIngresadasMes',

               'misDatos'=>$arrayDataProvider->getData(),

               )

);



2- Llenar tu data provider en tu acción actionExportExcelPrestacionesIngresadasMes igual que haces en tu acción actionPrestacionesIngresadasMes. En lugar de hacer :




$dataProvider = $arrayDataProvider;  



Debes hacer:




$sql = "SELECT A.asiento_id as id,

                    MC.medico_rut as rut,

                    MC.medico_nombres as nombre,

                    MC.medico_apellidos as apellido,

                    A.asiento_fecha_oficial as fecha, 

                    P.prestacion_codigo as codigo_prestacion, 

                    P.prestacion_nombre as nombre_prestacion, 

                    AP.asiento_prestacion_precio as precio,

                    YEAR(A.asiento_fecha_oficial) AS ano

                    FROM ASIENTO AS A 

                    INNER JOIN ASIENTO_PRESTACION AS AP ON (AP.asiento_prestacion_asiento_id = A.asiento_id)

                    INNER JOIN PRESTACION AS P ON (P.prestacion_id = AP.asiento_prestacion_prestacion_id)

                    INNER JOIN ASIENTO_COBRANZA AS AC ON (AC.as_cob_asiento_id = A.asiento_as_cob_asiento_id)

                    INNER JOIN MEDICO_COBRANZA AS MC ON (MC.medico_id = AC.as_cob_medico_id)

                    WHERE YEAR(A.asiento_fecha_oficial) = YEAR ( NOW() )"; 

        

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


$dataProvider = new CArrayDataProvider($rawData, array(

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

           'id' => 'PrestacionesIngresadas',  // ID of the data provider itself

            'sort'=> false,

            'pagination' => false,

        ));




$misDatos = $dataProvider->getData();



Y listo.

Un saludo.

En mi particular punto de vista la segunda opcion que te da lagogz es la mejor. Ambas son validas pero al utilizar CHTML::LINK implicitamente utilizas GET para recibir tus datos del lado del CONTROLLER, GET tienen sus limitantes en cuanto a la longitud de los datos que recibe, por lo que podrias tener algun problema al manejar una gran cantidad de informacion en tu GRID.

;)

Yo tambien pienso que la segunda es la mejor, pero por otro motivo para mi más importante.

Tendrías en tu controlador todas las operaciones necesarias para crear el Excel y no dependerías de la vista. Creo q es uno de los objetivos del modelo MVC.

Un saludo.

Muchas gracias a los dos, logre solucionar el problema,

Controlers




 public function actionExportarExcelPrestaIngre() {

    $fileName = "PrestacionesIngresadas.xls";


        $sql = "SELECT A.asiento_id as id,

                    MC.medico_rut as rut,

                    MC.medico_nombres as nombre,

                    MC.medico_apellidos as apellido,

                    A.asiento_fecha_oficial as fecha, 

                    P.prestacion_codigo as codigo_prestacion, 

                    P.prestacion_nombre as nombre_prestacion, 

                    AP.asiento_prestacion_precio as precio,

                    YEAR(A.asiento_fecha_oficial) AS ano

                    FROM ASIENTO AS A 

                    INNER JOIN ASIENTO_PRESTACION AS AP ON (AP.asiento_prestacion_asiento_id = A.asiento_id)

                    INNER JOIN PRESTACION AS P ON (P.prestacion_id = AP.asiento_prestacion_prestacion_id)

                    INNER JOIN ASIENTO_COBRANZA AS AC ON (AC.as_cob_asiento_id = A.asiento_as_cob_asiento_id)

                    INNER JOIN MEDICO_COBRANZA AS MC ON (MC.medico_id = AC.as_cob_medico_id)

                    WHERE YEAR(A.asiento_fecha_oficial) = YEAR ( NOW() )";          

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

 

        $model = $rawData;


        yii::app()->request->sendFile($fileName, $this->renderPartial('exportarExcelPrestaIngre', 

            array('model' => $model,),true));

    }




En la vista donde esta el botón




<?php echo CHtml::link(CHtml::image(Yii::app()->request->baseUrl . '/images/excel.png'), Yii::app()->request->baseUrl .'/index.php?r=asiento/exportarExcelPrestaIngre')?></br>



y la vista donde dibujo el Excel en este caso seria exportarExcelPrestaIngr




<?php

        $total = 0;

            if ($model != NULL) {  ?>


        <table style='border-collapse: collapse; border: 1px solid #000; padding:5px' border=1 width="95%" align="center">

            <tr><td colspan="7" style="text-align: center; font-weight: bold; background-color: #008B8B; font-size: 1.5em ;" >PRESTACIONES INGRESADAS </td></tr>


            <tr>

                <td style="width: 15%; text-align: center; font-weight: bold; background-color: #5F9EA0">RUT M&Eacute;DICOS</td>

                <td style="width: 15%; text-align: center; font-weight: bold; background-color: #5F9EA0">NOMBRE M&Eacute;DICOS</td>

                <td style="width: 15%; text-align: center; font-weight: bold; background-color: #5F9EA0">APELLIDOS M&Eacute;DICOS</td>

                <td style="width: 15%; text-align: center; font-weight: bold; background-color: #5F9EA0">C&Oacute;DIGO PRESTACI&Oacute;N</td>

                <td style="width: 15%; text-align: center; font-weight: bold; background-color: #5F9EA0">NOMBRE PRESTACI&Oacute;N </td>

                <td style="width: 14%; text-align: center; font-weight: bold; background-color: #5F9EA0">FECHA </td>

                <td style="width: 14%; text-align: center; font-weight: bold; background-color: #5F9EA0">PRECIO </td>

            </tr>

            <?php

            foreach ($model as $datos) { 

                $total += $datos["precio"]; ?>

            <tr>    

                <td style="text-align: center;"><?php echo $datos["rut"] ?></td>

                <td style="text-align: center;"><?php echo $datos["nombre"] ?></td>

                <td style="text-align: center;"><?php echo $datos["apellido"] ?></td>

                <td style="text-align: center;"><?php echo $datos["codigo_prestacion"] ?></td>

                <td style="text-align: center;"><?php echo $datos["nombre_prestacion"] ?></td>

                <td style="text-align: center;"><?php echo $datos["fecha"] ?></td>

                <td style="text-align: center;"><?php echo number_format($datos["precio"] ,0,',', '.') ?></td>

            </tr>

            <?php  

            } 

            ?> 

            <tr>

                <td style="width: 80%; text-align: center; font-weight: bold; background-color: #5F9EA0" colspan="6">TOTAL </td>

                <td style="width: 80%; text-align: center; font-weight: bold; background-color: #5F9EA0"><?php echo number_format($total ,0,',', '.') ?>  </td> 

            </tr> 

        </table>

<?php  

} 

?>



SALUDOS Y GRACIAS POR SU TIEMPO !!!

Pues me alegro, pero…

Sólo tenías que rellenar el dataProvider!!!!!!!!!!!!!! ;D

Si te funciona…

Un saludo.