[SOLUCIONADO] Filtrar por fechas CSqlDataProvider

Buenas,

Mi problema es que quiero filtrar un consulta sql entre fechas que entrega el usuario

Mi controlador lo tengo así


public function actionAdmin()

	{


		$desde = date('Y-m-d',strtotime($_POST['fechainicio']));

        $hasta = date('Y-m-d',strtotime($_POST['fechafin']));

        

		$model=new PagosCarterosGeneral('search');

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

		if(isset($_GET['PagosCarterosGeneral']))

			$model->attributes=$_GET['PagosCarterosGeneral'];


		  $sql = "SELECT CA.rut AS MAIN_ID, 

	            CA.nombre AS nom, 

	            CA.apellido_paterno AS ap, 

	            CA.apellido_materno AS am, 

	            DA.fecha_devolucion AS fecha,

	            SUM(RE.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 (RE.codigo_acuse_recibo = DA.codigo_acuse_recibo)

				WHERE DA.fecha_devolucion Between '".$desde."' AND '".$hasta."' 

				GROUP BY MAIN_ID, nom, ap, am


				";

        

        $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,

                        ),

                    ),

                    'pagination' => array(

                        'pageSize' => 11,

                    ),

                ));

 

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

            'model' => $model,

        ));

	}

y mi vista admin así




  

                <b>Desde:</b>

                <?php $this->widget('zii.widgets.jui.CJuiDatePicker', array(

                                        'name'=>'fechainicio',                                                                  

                                        'language' => 'es',                                     

                                        'htmlOptions'=>array(                                           

                                        'readonly'=>"readonly",

                                        ),

                                        'options'=>array(                                               

                                                'dateFormat'=>'dd-mm-yy',                                                       

                                        ),

                )); ?>

              

                <b>Hasta:</b>

                <?php $this->widget('zii.widgets.jui.CJuiDatePicker', array(

                                        'name'=>'fechafin',                                                                     

                                        'language' => 'es',                                     

                                        'htmlOptions'=>array(                                           

                                        'readonly'=>"readonly",

                                        ),

                                        'options'=>array(                                               

                                                'dateFormat'=>'dd-mm-yy',                                                       

                                        ),

                )); ?>


                 <?php echo CHtml::submitButton('Filtrar'); ?>


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

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

    'dataProvider' => $model,

    'ajaxUpdate' => true, 

    'filter' => null, 

    'columns' => array(

        array(

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

            'name' => 'MAIN_ID',

           

        ),

        array(

            'header' => 'Nombre',

            'name' => 'nom',

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

           

        ),

        array(

            'header' => 'Cartas',

            'name' => 'totalC',

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

        ),

        array(

            'header' => 'Devoluciones',

            'name' => 'totalD',

           

        ),

 

        ),

    )

);?>           

Se que me falta enviar desde la vista admin los parametros $desde y $hasta pero no se como.

De antemano muchas gracias.

hola sebastian, no se si me podria ayudar, yo quiero mostrar en la vista un resultado de un query que realiza inner join a dos tablas, debo usar el

http://www.yiiframework.com/doc/api/1.1/CSqlDataProvider?

porque tu problema es parecido al mio

hola Sebastian te postee la respuesta en inglés, búscalo y por favor dime si te funcionó. Saludos y suerte

primero que todo, gracias por responder

segundo hice todo lo que me indicaste y me da el siguiente error

No hermano obvia csqldataprovider, debes tratar de no enmarañar el código inutilmente, preserva la sencillez… Simplemente invocas tu modelo el cual has manejado de forma conveniente en la funcion search del modelo…

Para que me comprendas genera con el Gii nuevamente tu estructura (o en una app rápida que generes aparte) y podrás ver con claridad el funcionamiento del código que te envié. Te aseguro que no falla sino no te lo hubiera enviado. Pero debes manejar el código de esa manera que te aconsejo…

Una vez que pruebes el funcionamiento verás con total claridad el desenvolvimiento interno de las operaciones que te permiten filtrar por el rango de fechas con el uso de los pickers como acertadamente te dijo Fabrizio…

Por favor no dejes de decirme si te funcionó o no… y continuamos la ayuda, nunca es molestia… Suerte

Buenas.

En tu vista admin tienes un submitbutton pero no tienes un formulario, por lo que nada se te enviará.

Tienes que meter los CJuiDatePicker y el submitbutton dentro de un formulario que apunte a la acción admin de tu controlador.

Tu acción admin volverá a cargar la vista admin, pero como en tu search tienes que compruebe $_POST[‘fechainicio’] y $_POST[‘fechafin’] te devolverá el dataprovider filtrado.

Un saludo.

Un saludo.

muchas gracias a todos por su ayuda, pude solucionarlo guiándome de una respuesta que me dieron en el foro en Inglés (digo guiándome pero en realidad él lo hizo casi todo :P )

Primero que todo quité el SQL del controlador y lo coloqué en la función search() de mi modelo de la siguiente forma




class PagosCarterosGeneral extends CActiveRecord

{

/*primero definí las variables*/

public $date_first;

public $date_last;


 /*Luego en rules las agregué */

public function rules()

	{

        .

        .

        array('date_first, date_last', 'safe', 'on'=>'search'),

        .

        .

        }


/*Acá el coloqué el SQL*/

public function search()

	{


/*

Quité:


$desde = date('Y-m-d',strtotime($_POST['fechainicio']));

$hasta = date('Y-m-d',strtotime($_POST['fechafin']));


y agregué:


$this->date_first y $this->date_last

*/


                        if(empty($this->date_first))

			    $this->date_first=null;

			if(empty($this->date_last))

			    $this->date_last=null;


			$sql = "SELECT CA.rut AS MAIN_ID, 

			                    CA.nombre AS nom, 

			                    CA.apellido_paterno AS ap, 

			                    CA.apellido_materno AS am, 

			                    DA.fecha_devolucion AS fecha,

			                    SUM(RE.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 (RE.codigo_acuse_recibo = DA.codigo_acuse_recibo)

			                                WHERE DA.fecha_devolucion BETWEEN '".$this->date_first."' AND '".$this->date_last."'

			                                GROUP BY MAIN_ID, nom, ap, am


			                                ";

			                                   $count = Yii::app()->db->createCommand(

                                         'SELECT COUNT(*) FROM (' . $sql . ') as count_alias')->queryScalar();

 

	        $dataProvider = new CSqlDataProvider($sql, array( 

	                    'keyField' => 'MAIN_ID', 

	                    'totalItemCount' => $count,

	                    'sort' => array(

	                        'attributes' => array(

	                            'MAIN_ID','nom','ap','am','totalD','totalC',

	                        ),

	                        'defaultOrder' => array(

	                            'ap' => CSort::SORT_ASC,

	                        ),

	                    ),

	                    'pagination' => array(

	                        'pageSize' => 11,

	                    ),

	                ));


		return $dataProvider;

	

	}

luego en mi vista puse lo siguiente


             <b>Desde:</b>

                <?php $this->widget('zii.widgets.jui.CJuiDatePicker', array(

                                        'name'=>'PagosCarterosGeneral[date_first]', // agregué y modifiqué los campos 'name' y 'value'

                                        'value' => $model->date_first,                                                                                                     

                                        'htmlOptions'=>array(

                                                       'style'=>'height:20px;width:150px;',

                                                       ), 

                                       'language'=>'es',

                                       'options'=>array(

                                                       'showAnim'=>'fold',

                                                       'dateFormat'=>'yy-mm-dd',

                                                       'changeMonth' => 'true',

                                                       'changeYear'=>'true',

                                                       'constrainInput' => 'false',                                                      

                                                                          ),

                                                  )); ?>

              

                <b>Hasta:</b>

                <?php $this->widget('zii.widgets.jui.CJuiDatePicker', array(

                                        'name'=> 'PagosCarterosGeneral[date_last]',  // agregué y modifiqué los campos 'name' y 'value'

                                        'value' => $model->date_last,                                                                                                    

                                         'htmlOptions'=>array(

                                                       'style'=>'height:20px;width:150px;',

                                                       ), 

                                       'language'=>'es',

                                       'options'=>array(

                                                       'showAnim'=>'fold',

                                                       'dateFormat'=>'yy-mm-dd',

                                                       'changeMonth' => 'true',

                                                       'changeYear'=>'true',

                                                       'constrainInput' => 'false',                                                       

                                                                          ),

                                                  )); ?>


/*Función javascript*/

<?php Yii::app()->clientScript->registerScript("searchdate","

                      function searchdate()

                      {

                         $('#a-grid-id').yiiGridView('update', {data: {'PagosCarterosGeneral[date_first]': $('#".CHtml::activeId($model,'date_first')."').val(),'PagosCarterosGeneral[date_last]': $('#".CHtml::activeId($model,'date_last')."').val()}});

                      }",CClientScript::POS_END);

                      

/*Se reemplaza el  <?php echo CHtml::submitButton('Filtrar'); ?> que tenía antes por lo siguiente*/

                      echo CHtml::button('Buscar',array('class' => 'btn btn-primary', 'onclick'=>'searchdate()')); 

?>

y con eso puedo filtrar y también ordenar las columnas.

Saludos a Todos.