Error al volcar informacion a PDF de un Grid generado por un Csqldataprovider

hola comunidad,

Sigo aprendiendo cada vez mas… gracias a los post y a las respuestas de la comunidad.

Tengo el siguiente problema, al generar un gridview cuyo dataprovider lo he realizado con un csqldataprovider, tengo una función que mediante request me genera un pdf. el problema lo tengo a la hora de generar el fichero pdf.

mi gridview lo tengo así generado y se ve perfecto.




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

                                //'filter'=>$model,

                                'columns'=>array(


                                        array ( 

                                               'header'=>'CODIGO CLIENTE',

                                               'name'=>'ID_ENTI',

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


                                               ),

                                        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["1"]',

                                                'type'=>'raw',

                                               ),

                                        array (

                                                'header'=>'servicio 2',

                                                'name'=>'ID_SERVICIO',

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

                                               ),	

                                        array (

                                                'header'=>'servicio 3',

                                                'name'=>'ID_SERVICIO',

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

                                                ),      

                                        array (

                                                'header'=>'servicio 4',

                                                'name'=>'ID_SERVICIO',

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

                                                ), 

                                        array (

                                                'header'=>'servicio 5',

                                                'name'=>'ID_SERVICIO',

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

                                                ),




mediante un $_session guardo la información para luego generar el informe. la vista con la genero el pdf tengo





....

     <thead>

   <tr>

            <td width="60%"><b>Código</b></td>

            <td width="70%"><b>Nombre</b></td>

            <td width="10%"><b>servicio 1</b></td>

            <td width="15%"><b>servicio 2</b></td>

            <td width="25%"><b>servicio 3</b></td>

            <td width="25%"><b>servicio 4</b></td>

            <td width="25%"><b>servicio 5</b></td>

    </tr>


 </thead>

 <!-- ITEMS -->

 <?php foreach($model as $row): ?>

<tr>

     <td class=formato align="left">  <?php echo ($row->$data["codigo"]); ?> </td>

     <td align="left">  <?php echo ($row->$data["nombre"]); ?>  </td>

     <td align="left">  <?php echo ($row->$data["1"]); ?>  </td>

     <td align="left">  <?php echo ($row->$data["2"]); ?>  </td>

     <td align="left">  <?php echo ($row->$data["3"]); ?>  </td>

     <td align="left">  <?php echo ($row->$data["4"]); ?>  </td>

     <td align="left">  <?php echo ($row->$data["5"]); ?>  </td>

     

</tr>


 <?php endforeach; ?>



y el error que obtengo es este…

error 500

Object of class CDbCommand could not be converted to string

¿como puedo pasar la variable dentro de la vista que genera el pdf? de que forma paso el valor al campo $row->¿?

he visto que tengo la asignación de variables de forma errónea y las asigno de forma correcta al menos eso creo…

parte de la vista que genera el pdf.




 <?php foreach($model as $row): ?>

<tr>

     <td class=formato align="left">  <?php echo ($row["codigo"]); ?> </td>

     <td align="left">  <?php echo ($row["nombre"]); ?>  </td>

     <td align="left">  <?php echo ($row["1"]); ?>  </td>

     <td align="left">  <?php echo ($row["2"]); ?>  </td>

     <td align="left">  <?php echo ($row["3"]); ?>  </td>

     <td align="left">  <?php echo ($row["4"]); ?>  </td>

     <td align="left">  <?php echo ($row["5"]); ?>  </td>

     

</tr>


 <?php endforeach; ?>



Esta función que genera un CsqlDataprovider que luego utilizo para generar la vista en el Gridview, este permite pasar registros a columnas.




 public function EntidadesServicios() 

                                

                {

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

            

                $sql="SELECT 

                        d.NOMBRE_CORTO as 'Nombre'

                        ,d.COD_COMPANIA as 'codigo'

                        ,b.ID_ENTI_SERVICIO 

                        ,b.ID_ENTI

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

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

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

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

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

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

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

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

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

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

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

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


                        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

                        and 	/* indicamos que solo muestre los códigos activos 1 = alta*/

                        	d.ESTADO_COMP = 1        


                        GROUP BY d.COD_COMPANIA";

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

                

                $session=new CHttpSession;

                $session->open();

                $session['TbEntidadesServicios_records']=$resultado_sql; 

                 

                

		return new CSqlDataProvider($resultado_sql, array(

                        'totalItemCount'=>$count, 

                        'keyField'=>'ID_ENTI_SERVICIO',   

                        'pagination'=>array('pageSize'=>$count),

                 

                        

		)); 

        die();

        }



Posteriormente tengo una función para generar el PDF y es aquí donde tengo los problemas para decirle que tome como referencia el csqldataprovider, ya que si le añado el parametro ‘DataProvider’=>$model->EntidadesServicios() dentro del renderpartial, se muestra error y si lo pongo sin los parentesis o sin ellos. muestra error 500

dejo aqui la función de generar pdf.




 public function actionGenerarPdf()

        {

        $session= yii::app()->session;

        

        if(isset($session['TbEntidadesServicios_records']))

           

        {

        $model=TbEntidadesServicios::model()->findAll($session['TbEntidadesServicios_records']);

        }

        else

           

        {

             $model=TbEntidadesServicios::model()->findAll();

        }// 'A4-L'-> fuerza a landscape

       

        $mPDF1 = Yii::app()->ePdf->mpdf('utf-8', // mode 

                                           'A4', // formato 

                                             '', // font size 

                                             '', // default font size 

                                              5, // margin left

                                              5, // margin right

                                              30, // margin top 

                                              18, // margin botton

                                              2, // margin header

                                              9, // margin footer

                                            'P'); // P - portrait L - Landscape.

        $mPDF1->useOnlyCoreFonts = true;

        $mPDF1->SetTitle("departamento");

        $mPDF1->SetAuthor("departamento");

	$mPDF1->SetWatermarkText("");

	$mPDF1->showWatermarkText = true;

	$mPDF1->watermark_font = 'Colibri';

	$mPDF1->watermarkTextAlpha = 0.1;

	$mPDF1->SetDisplayMode('fullpage');

	$mPDF1->WriteHTML($this->renderPartial('pdfReport', array('model'=>$model), true)); 

	$mPDF1->Output('Servicios'.date('YmdHis'),'I'); 

	exit;

        }

        

  

Saludos bocatadepanceta.

Podrias hacer esto en tu función EntidadesServicios().




 $sort = new  CSort;

 

 $_SESSION['TbEntidadesServicios_records'] = new CActiveDataProvider($this, array(

	'criteria'=>$resultado_sql,

	'sort'=>$sort,

	'pagination'=>false,

 ));



Luego en tu función GenerarPdf(), puedes hacer esto




 $session = new CHttpSession;

 $session->open();

 $model = $_SESSION['TbEntidadesServicios_records']->getData();

 

 $mPDF1 = Yii::app()->ePdf->mpdf('utf-8', // mode 

                                           'A4', // formato 

                                             '', // font size 

                                             '', // default font size 

                                              5, // margin left

                                              5, // margin right

                                              30, // margin top 

                                              18, // margin botton

                                              2, // margin header

                                              9, // margin footer

                                            'P'); // P - portrait L - Landscape.

        $mPDF1->useOnlyCoreFonts = true;

        $mPDF1->SetTitle("departamento");

        $mPDF1->SetAuthor("departamento");

        $mPDF1->SetWatermarkText("");

        $mPDF1->showWatermarkText = true;

        $mPDF1->watermark_font = 'Colibri';

        $mPDF1->watermarkTextAlpha = 0.1;

        $mPDF1->SetDisplayMode('fullpage');

        $mPDF1->WriteHTML($this->renderPartial('pdfReport', array('model'=>$model), true)); 

        $mPDF1->Output('Servicios'.date('YmdHis'),'I'); 



De esta forma en la variable $_SESSION[‘TbEntidadesServicios_records’], traes los datos que hayan en el CGridView ya sean todos o los que hayan filtrado.

Espero que te sirva y sea lo que necesitas.

Saludos.

Saludos gifrancohe!!

Mucha gracias por tu tiempo y respuesta.

Tu sugerencia funciona de correctamente, pero me encuentro con el siguiente problema, el Csqldataprovider dentro de la función genera una consulta crosstables parte de los campos encontrados son pasados a columnas a la hora de generar el Cgridview.

Yo creía (erróneamente) que la información generada pasaría de igual forma a la vista que genera el pdfReport, pero no es así por lo que tocará hacer de nuevo un tratamiento de la información recibida para colocar de nuevo los servicios a columnas y las compañías en las filas.

¿Alguna otra sugerencia?¿como lo transformo? porque ahora mismo estoy pegado… :(

adjunto imagen para intentar explicar lo que quiero hacer.

6691

ejemplo.jpg

Buenas bocatadepanceta.

En realidad no entiendo bien que es lo que quieres hacer, pero si ya tienes la información en la vista pdfReport, puedes disponer de ella como tu quieres. No entiendo bien cual es el problema que tienes, por que al hacer esto:




  $mPDF1->WriteHTML($this->renderPartial('pdfReport', array('model'=>$model), true)); 



En la variable $model, ya tienes toda la informacion contenida en el CGridView y puedes trabajar con ella de la forma que necesites.

Ejemplo con una tabla:




 ...

 <table>

   <thead>

      <tr>

         <td>Codigo</td>

         <td>Nombre</td>

         <td>Serv 1 </td>

      </tr>

   </thead>

   <tbody>

     <?php foreach($model as $value): ?>

        <tr>

           <td><?php echo $value->atributo1; ?></td>

           <td><?php echo $value->atributo2; ?></td>

           <td><?php echo $value->atributo3; ?></td>

        </tr>

     <?php endforeach;?>

   </tbody>

 </table>



No se si te pueda servir el ejemplo, espero que si.

Saludos.

Hola gifrancohe,

muchas gracias por responder te paso a explicar lo que pretendo, la vista pdfreport, contiene la forma en la que quiero generar el pdf con su pequeño css y datos, he interno generarlo como se muestra en el CGridView.




Compañia  | servicio 1|servicio 2| servicio 3| servicio 4|

---------------------------------------------------------

compañia 1|  SI       |          |           |     SI    |   

---------------------------------------------------------

compañia 2|           |  SI      | SI        |           |

---------------------------------------------------------

compañia 3|  SI       |  SI      | SI        |           |



la variable $model contiene los datos como dices, pero que ocurre, la información que muestro en el CGridView en la vista admin proviene de hacer una transposición de los datos con Csqldataprovider (ver función EntidadesServicios), el valor de id_servicio es un dato que lo he pasado a columna agrupándolo (group_concat), según tengo hecha la vista pdfreport todos los valores con independencia del valor del campo id_servicio se muestran en la misma columna cuando debería de acomodarse bajo el valor del campo id_servicio correspondiente, tal y como sucede en el CGridView gracias al csqldataprovider.

no sé si esto te aclara más. gracias por tu ejemplo.

Hola.

Estoy empezando a entender como necesitas visualizar los datos, pero me gutaria ver una imagen de tu CGridView y si es posible que hagas en var_dump de la variable $model en la vista pdfreport, para saber como llegan los datos y como podemos organizarlos para que se ven como necesitamos.

Saludos.

Hola gifrancohe

Entiendo que lo que hay que hacer es generar dos foreach dentro del pdfreport uno encargado de la parte de los titulos de las columnas para que tomen el valor de ID_SERVICIO y otro foreach anidado para que vaya pintando los valores de cada compañia (TIP_PARTICIPA) dentro de cada columna indicada. tras buscar y probar lo consigo que funcione, te paso parte del resultado del var_dump a la variable $modelo, los dos primeros registros del array y la imagen del gridview.

Algo he avanzado pero el valor (TIP_SERVICIO) de la columna me lo repite… adjunto imagen y no me deja una unica línea por compañia




array

(size=161)

  0 =>

	object(TbEntidadesServicios)[31]

	public  'ListaEntidades' =>string'20'(length=2)

	public  'resultado_sql'=>null

	public  'valor' => null

	public  'enti' => null

	private '_new' (CActiveRecord) => boolean false

	private '_attributes'(CActiveRecord) => 

	array (size=7)

         'ID_ENTI_SERVICIO' => string '2' (length=1)

         'ID_ENTI' => string '20' (length=2)

         'ID_SERVICIO' => string '1'(length=1) 

         'TIP_PARTICIPA' => string 'SI' (length=2) 

         'COMENTARIOS' => string '' (length=0)

         'FECHA_ALTA' => string '2010-08-17' (length=10)

         'FECHA_BAJA' => string '0000-00-00' (length=10)

    private '_related'(CActiveRecord) =>

    array (size=1)

         'iDENTI' => object (TbEntidades)[32]

              ...

	private '_c' (CActiveRecord) => null

	private '_pk' (CActiveRecord) => string '2'(length=1)

	private '_alias' (CActiveRecord) => string 't' (length=1)

	private '_errors' (CModel) => array (size=0) empty

	private '_validators' (CModel) => null

	private '_scenario' (CModel) => string 'update' (length=6)

	private '_e' (CComponent) => null 

	private '_m' (CComponent) => null

  1 =>

	object ( TbEntidadesServicios)[33]

	public 'ListaEntidades' => string '37' (length=2)

    public  'resultado_sql' => null

	public  'valor' => null

	public  'enti'  => null

	private '_new' (CActiveRecord) => boolean false

	private '_attributes' (CActiveRecord)=> 

	array (size=7)

          'ID_ENTI_SERVICIO' =>string'3'(length=1)

          'ID_ENTI' =>string'37'(length=2)

          'ID_SERVICIO'=>string'1'(length=1)

          'TIP_PARTICIPA' =>string'REP'(length=3)

          'COMENTARIOS' =>string''(length=0)

          'FECHA_ALTA' =>string'0000-00-00'(length=10)

          'FECHA_BAJA' =>string'0000-00-00'(length=10)

	private '_related' (CActiveRecord)=> 

	array(size=1)

          'iDENTI' => object(TbEntidades)[34]

              ...

	private '_c' (CActiveRecord) => null




Esto sería la parte dentro del pdfreport que generaría las líneas y que no funciona de momento…





<?php $columnas = array ("Serv 1 ","Serv 2 ","Serv 3 ","Serv 4 ","Serv 5 ");?> 


</div>

 <table class="items" width="100%" style="font-size: 14pt; border-collapse: collapse;" cellpadding="0">

   <thead>

         <tr>

            <td width="12%"><b>Codigo</b></td>

            <td width="70%"><b>Nombre</b></td>

            <td width="50%"><b><?php foreach($columnas as $valor): //con este definimos las columnas en la cabecera.

                                              echo $valor." "; 

                                     endforeach;?></b></td>

         </tr>

  </thead>

  <!-- Lineas -->

  <?php foreach($model as $row): ?> 

    <tr>

        <td class=formato align="left">  <?php echo ($row->iDENTI->Codigo); ?> </td>    

        <td class=formato align="left">  <?php echo ($row->iDENTI->NOMBRE_CORTO); ?> </td>

        <td align="left">     <?php foreach ($row as $columna=>$columnas) //intentamos colocar el valor en su columna

                                                    echo ($row->TIP_PARTICIPA." "); ?></td>

    </tr>


 <?php endforeach; ?>



Muchas gracias.

Hola bocatadepanceta.

Considero que necesitas que el pdf salga similar a como estas viendo la información en el CGridVie, si es verdad esto, y viendo como estas construyendo el pdfreport, podrias hacer lo siguiente:




 <?php $columnas = array ("Serv 1 ","Serv 2 ","Serv 3 ","Serv 4 ","Serv 5 ");?> 

</div>

 <table class="items" width="100%" style="font-size: 14pt; border-collapse: collapse;" cellpadding="0">

   <thead>

         <tr>

            <td width="12%"><b>Codigo</b></td>

            <td width="70%"><b>Nombre</b></td>

            <?php foreach($columnas as $valor):?> 

                //con este definimos las columnas en la cabecera.

                <td width="50%"><b>  <?php echo $valor." ";?></b></td>

            <?php endforeach;?>

         </tr>

  </thead>

  <!-- Lineas -->

  <?php foreach($model as $row): ?> 

    <tr>

        <td class=formato align="left">  <?php echo ($row->iDENTI->Codigo); ?> </td>    

        <td class=formato align="left">  <?php echo ($row->iDENTI->NOMBRE_CORTO); ?> </td>

        <?php foreach ($row as $columna=>$columnas):?> //Debes tener en cuenta que el obj $row debe tener la misma cantidad de serv que tengas en $columna.

          //intentamos colocar el valor en su columna

           <td class=formato align="left"> <?php echo ($row->TIP_PARTICIPA." ");?></td>

        <?php endforeach;?>

    </tr>


 <?php endforeach; ?>



no se si funcione por que lo hize solo mirandolo, pero eso seria la idea, revisa y cuentame como sale todo.

Saludos.

hola

Parece que el asunto va tomando forma pero no está del todo fino, estoy duplicando líneas y estoy colocando el valor id_participa en cada una de las columnas. Como puedo agrupar la información por codigo y nombre de compañia para evitar que se duplique la información. Creo que la información que estoy tomando como dataprovider (variable $_session) es toda la información de la tabla en lugar de que se muestra en el Csqldataprovider que utilizo para armar el gridview.

adjunto imagen del pdf

paso el código de como han quedado los bucles en la generación del pdf.





<div style="text-align: right">

    Fecha: <?php echo date("d/m/Y"); ?>

</div>    

<div style="text-align: left">

Total Resultados: <?php echo $contador; ?>


/*con esta llamada me traigo todas los servicios que están marcados como visibles a la hora de armar las columnas*/


<?php $columnas = CHtml::ListData(TipServicios::model()->findAll('VISIBLE=1'),'ID_SERVICIOS','ABR_SERVICIO');?> 

</div>

    <table class="items" width="100%" style="font-size: 15pt; border-collapse: collapse;" cellpadding="0">

      <thead>

            <tr>

               <td width="12%"><b>Codigo</b></td>

               <td width="70%"><b>Nombre</b></td>

               <?php foreach($columnas as $valor): ?>

               <td width="20%"><b><?php echo $valor." "; ?></b></td> 

                                     <?php endforeach; ?>

            </tr>

     </thead>

     <!-- Lineas -->

     <?php foreach($model as $row): ?>

       <tr>

           <td class=formato align="left">  <?php echo ($row->iDENTI->COD_NRBE); ?> </td> 

           <td class=formato align="left">  <?php echo ($row->iDENTI->NOMBRE_CORTO); ?> </td>

           <?php foreach ($row as $columna=>$columnas): ?>

                      <td class=formato align="left"> <?php echo ($row->TIP_PARTICIPA." ");?></td>

           <?php endforeach;?>

        </tr>

    <?php endforeach; ?>

    <!-- FIN lineas -->

    </table>

 </body>



Hola bocatadepanceta.

En efecto la variable de session toma todo lo que retorne la funcion search(), la cual esta encargada de cargar los datos en el CGridView, por ende si quieres agrupar por codigo de compañia debes hacer esto en la función search() de tu modelo:




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



Con esto ya no deberia redundar la información de las compañias.

Saludos.

hola

Comentar que tras colocar el agrupamiento dentro del $criteria, la información se muestra igual, solo decir que la información del codigo de compañia esta relacionada en otro modelo y defino un with dentro del criteria para poder usar el campo de codigo de compañia (cod_nrbe).

Al generar el pdf no agrupa mostrando una línea compañia por cada servicio asignado.




public function search()

	{

		// @todo Please modify the following code to remove attributes that should not be searched.


		$criteria=new CDbCriteria;

                

                $criteria->with = array('iDENTI');

                                

                $criteria->addSearchCondition('iDENTI.COD_NRBE', $this->ID_ENTI);

                $criteria->distinct=true; //incluyo distinct

                $criteria->group = 'iDENTI.COD_NRBE'; //agrupamos por codigo compañia

                $criteria->compare('ID_ENTI_SERVICIO',$this->ID_ENTI_SERVICIO,true);

		$criteria->compare('ID_SERVICIO',$this->ID_SERVICIO,true);

		$criteria->compare('TIP_PARTICIPA',$this->TIP_PARTICIPA,true);

		$criteria->compare('COMENTARIOS',$this->COMENTARIOS, true);

		$criteria->compare('FECHA_ALTA',$this->FECHA_ALTA, true );

		$criteria->compare('FECHA_BAJA',$this->FECHA_BAJA, true);

                                             

                $sort_1 = new CSort();  

                $sort_1->defaultOrder = array('iDENTI.COD_NRBE, ID_SERVICIO  asc');

                

                $sort = new CSort();

                $sort->defaultOrder = array('iDENTI.COD_NRBE, ID_SERVICIO  asc');

                $_SESSION['TbEntidadesServicios_records']= new CActiveDataProvider($this, array(

                            'criteria'=>$criteria,

                            'sort'=>$sort,

                            'pagination'=>false,

                    

                        ));  //Esto para guardar la criteria en la sesión actual para usarlo posteriormente.

                          

                

		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

                        'sort'=> $sort_1,

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

                 

                        

		));

	}