Consulta com alias help!

Preciso fazer um consulta na tabela de lancamento que por sua vez possui varios campos, so que eu preciso fazer um select tratando alguns valores nulos usando o coalesce e retornar os outros campos. Mas esta dado um erro.




  $criteria = new CDbCriteria();

  $criteria->select = "COALESCE(datapagamento, datavencimento) as datap, COALESCE(valorpago, valor) as valorp";

  $criteria->condition = "datap >= 2011/10/01 AND datap <= 2011/10/31";

  $criteria->order = "datap ASC";                

  $lancamento = Lancamento::model()->findAll($criteria);



Qual é a forma correta de se fazer esta consulta alguem poderia me ajuda.

Amigo,

Tenta assim:


  $criteria = new CDbCriteria();

  $criteria->select = "COALESCE(datapagamento, datavencimento) as datap, COALESCE(valorpago, valor) as valorp";

  $criteria->condition = "COALESCE(datapagamento, datavencimento) BETWEEN '2011/10/01' AND '2011/10/31'";   

  $criteria->order = "COALESCE(datapagamento, datavencimento) ASC";         	

  $lancamento = Lancamento::model()->findAll($criteria);



Acho que tem alguma coisa errada, porque no grid ele retorna a quantidade de resgitro so que vazio sem nada.

meu codigo:




$criteria = new CDbCriteria();

                $criteria->select = "COALESCE(datapagamento, datavencimento) as datap, COALESCE(valorpago, valor) as valorp";

                $criteria->condition = "COALESCE(datapagamento, datavencimento) BETWEEN '2011/10/01' AND '2011/10/31'";   

                $criteria->order = "COALESCE(datapagamento, datavencimento) ASC";   

               

                $model = new CActiveDataProvider('Lancamento',array(

                    'criteria'=>$criteria,

                ));           

                

                

            



Sera que existe outra forma de fazer isso?

Tenta trocar o [color="#000080"]COALESCE [/color]por [color="#000080"]IFNULL [/color]pra sem se tem resultado. Testei essa sua query no SQL-Front e rodou beleza, será que a gridview não aceita esse tipo de comando?

Bom eu nao sei, no sqlfront o COALESCE ou IFNULL funciona de boa eu teste tb, o problema é que a consulta funciona, retornado o array so que vazio.

no grid:




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

	'id'=>'lancamento-grid',

	'dataProvider'=>$model,

        'cssFile'=>'../css/cssgrid.css',



Acho que deve ter outra forma de fazer esta consulta. so que eu nao acho a resposta.

Explica um pouco mais detalhado o que você quer amigo.

O que eu quero é basicamente isso que esta acima, quero realizar uma consulta que retorne os registros da tabela lançamento de um determinado periodo, so que no grid vai ter apenas uma coluna de data(se nao tiver data de pagamento monstra a data de vencimento) a mesma coisa para coluna valor(se nao tiver o valor pago, mostra o valor) e todos estes registro sao organizados pela data.

Espero que tenha entendido.

Agradeço desde já.

Tenta criar no _model




public $datap;



e depois tenta chamar na gridview




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

        'id'=>'lancamento-grid',

        'dataProvider'=>$model,

        'cssFile'=>'../css/cssgrid.css',

        'columns' => array(

                        'datap',                                 

                ));



Vê se dá certo agora…

Entao brodi o erro deve ser na consulta. porque olha o grid como ele retorna na imagem anexada.


public function actionIndex()

	{

		  $criteria = new CDbCriteria();

                  $criteria->select = "COALESCE(datapagamento, datavencimento) as datap, COALESCE(valorpago, valor) as valorp";

                  $criteria->condition = "COALESCE(datapagamento, datavencimento) BETWEEN '2011/10/01' AND '2011/10/31'";   

                  $criteria->order = "COALESCE(datapagamento, datavencimento) ASC";             

                  $model = new CActiveDataProvider('Lancamento',array(

                    'criteria'=>$criteria,

                   ));           

                

                

            

            

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

			'model'=>$model,

		));

	}

Entao brodi o erro deve ser na consulta. porque olha o grid como ele retorna na imagem anexada.


public function actionIndex()

	{

		  $criteria = new CDbCriteria();

                  $criteria->select = "COALESCE(datapagamento, datavencimento) as datap, COALESCE(valorpago, valor) as valorp";

                  $criteria->condition = "COALESCE(datapagamento, datavencimento) BETWEEN '2011/10/01' AND '2011/10/31'";   

                  $criteria->order = "COALESCE(datapagamento, datavencimento) ASC";             

                  $model = new CActiveDataProvider('Lancamento',array(

                    'criteria'=>$criteria,

                   ));           

                

                

            

            

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

			'model'=>$model,

		));

	}

Posta aí os códigos da tua GridView, por favor.

Segue




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

	'id'=>'lancamento-grid',

	'dataProvider'=>$model,

        'cssFile'=>'../css/cssgrid.css',

        'enableSorting'=>false,

        'afterAjaxUpdate'=>'function() {$(".loadingv").html("");}',

        'summaryText'=>false,  

       	'columns'=>array(

                

		'tipo',

		'descricao',

		'datavencimento',

		'datapagamento',

		'status',

		

		array(

			'class'=>'CButtonColumn',

                                    'template' => '{delete}{editar}{baixa}',

                                    'afterDelete'=>'function(link,success,data){ if(success){ $("#statusMsg").show(); $("#statusMsg").html(data); $("#statusMsg").delay(9000).slideUp("slow");}}',

                                    'buttons' => array(

                                       'baixa' => array(

                                        'label'=>'Pagar este agendamento',

                                        'imageUrl'=>Yii::app()->request->baseUrl.'/images/baixa.png',

                                         'url'=>'Yii::app()->createUrl("Lancamento/delete", array("id"=>$data->id))',

                                         'visible'=> 'false',




                                       ),

                                        'editar' => array(

                                        'label'=>'Editar',

                                        'imageUrl'=>Yii::app()->request->baseUrl.'/images/editar.png',

                                         'url'=>'Yii::app()->createUrl("Lancamento/update", array("id"=>$data->id))',


                                        ),

                                        'delete' => array(

                                        'label'=>'Excluir',

                                        'imageUrl'=>Yii::app()->request->baseUrl.'/images/excluir.png',

                                        'url'=>'Yii::app()->createUrl("Lancamento/delete", array("id"=>$data->id))',

                                     ),





                                ),

		),

	),

)); ?>

Tenta assim:




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

        'id'=>'lancamento-grid',

        'dataProvider'=>$model,

        'cssFile'=>'../css/cssgrid.css',

        'enableSorting'=>false,

        'afterAjaxUpdate'=>'function() {$(".loadingv").html("");}',

        'summaryText'=>false,  

        'columns'=>array(

                

                'tipo',

                'descricao',

                'datap',

                'valorp',

                'status',

                

                array(

                        'class'=>'CButtonColumn',

                                    'template' => '{delete}{editar}{baixa}',

                                    'afterDelete'=>'function(link,success,data){ if(success){ $("#statusMsg").show(); $("#statusMsg").html(data); $("#statusMsg").delay(9000).slideUp("slow");}}',

                                    'buttons' => array(

                                   	'baixa' => array(

                                        'label'=>'Pagar este agendamento',

                                        'imageUrl'=>Yii::app()->request->baseUrl.'/images/baixa.png',

                                     	'url'=>'Yii::app()->createUrl("Lancamento/delete", array("id"=>$data->id))',

                                     	'visible'=> 'false',




                                   	),

                                        'editar' => array(

                                        'label'=>'Editar',

                                        'imageUrl'=>Yii::app()->request->baseUrl.'/images/editar.png',

                                     	'url'=>'Yii::app()->createUrl("Lancamento/update", array("id"=>$data->id))',


                                        ),

                                        'delete' => array(

                                        'label'=>'Excluir',

                                        'imageUrl'=>Yii::app()->request->baseUrl.'/images/excluir.png',

                                        'url'=>'Yii::app()->createUrl("Lancamento/delete", array("id"=>$data->id))',

                                 	),





                                ),

                ),

        ),

)); ?>



E no _model coloca assim:




class nomeClasse extends CActiveRecord {

	public $datap;

	public $valorp;

........

}



Acontece que você ta chamando em sua grid dos campos que não existe na sua consulta a datavencimento e datapagamento, onde você renomeou por datap e valorp.

Vê se dá agora…

Meu grande amigo, vc nao vai acreditar…depois de quebrarmosa cabeça eu achei o problema veja o codigo abaixo




$criteria = new CDbCriteria();

                  $criteria->select = "COALESCE(datapagamento, datavencimento) as datap, COALESCE(valorpago, valor) as valorp, L.*";

                  $criteria->condition = "COALESCE(datapagamento, datavencimento) BETWEEN '2011-10-01 00:00:00' AND '2011-10-26 23:59:59'";   

                  $criteria->alias = "L";

                  $criteria->order = "datap ASC";             

                  $model = new CActiveDataProvider('Lancamento',array(

                    'criteria'=>$criteria,

                   ));           

                

Falou determinar o alias L e buscar os outro campos com L.*, e como eu trabalho com datetime eu tive que colocar as horas. Ahi deu certo!

Adrian Valew mesmo pela ajuda nesta batalha hahaha.

Brigadão…

Pensei que você estivesse trabalhando com campo date, e até eu também passei dispercebido do alias…rsrsrsr

Mas o que importa é que deu certo. Parabéns