Ordernar um Group By CDbCriteria

Boas,

Tenho uma gridview que vai ser preenchida pelos dados retornados pela função search, até aqui tudo bem, o problema começa quando preciso fazer um Group By pelo idNumTicket, mas esse Group by deveria vir ordenado pela DtSubmetido DESC de forma a apanhar o ultimo registo introduzido, mas isso não acontece ele retorna sempre pelo primeiro, ou seja faz o order ASC.

Gostaria se saber se existe forma de ordenar o group no CdbCriteria.

O que quero é basicamente isto que tenho em SQL mas no formato do CdbCriteria.


SELECT * FROM (select * from TroubleTicket order by DtSubmetido DESC) as ToubleTicket_tmp group by idNumTicket order by DtSubmetido DESC

Obrigado.

Bem amigo, criei um nova nova função que utiliza o CDbCriteria e ficou assim:




	public function report() {

    	$inicio = isset($_POST['datainclusao']);

    	$fim = isset($_POST['data']);

    	$criteria = new CDbCriteria;

    	$criteria->alias = 'a';

    	$criteria->select = array('data as Data, CONCAT(v.ve_placa, " - ", v.ve_descricao) as Veiculo, tipocombustivel, SUM(totallitros)as totallitros, FORMAT(SUM(valortotal),2) as ValorTotal, FORMAT(AVG(consumokml),2) as consumokml, FORMAT(AVG(custokm),2) as custokm');

    	$criteria->condition = 'v.ve_tipo <> "ALUGADO" AND Data BETWEEN "2011-10-11" AND "2011-10-16"';

    	$Criteria->params = array(

        	':inicio' => $inicio,

        	':fim' => $fim

    	);

    	$criteria->join = 'JOIN veiculo v ON v.ve_id = a.veiculo';

    	$criteria->group = 'data, veiculo, tipocombustivel';

    	$criteria->limit = 30;

    	return new CActiveDataProvider('abastecimento', array(

        	'criteria' => $criteria,

        	'pagination' => array(

            	'pageSize' => 30,

        	),

    	));

	}



É só manipular com seus dados…Espero ter ajudado

Obrigado, mas penso que não faz nada do que eu pedi.

O meu problema é o group retornar os dados ordenados de forma asc e eu quero arranjar uma forma de ordenar esse grupo de forma desc para o registo a aparecer na gridview ser o ultimo que foi introduzido com o idNumTicket x, e não o primeiro.

Depois do group voce pode usar o order assim:




                	

$criteria->group => 'idNumTicket ',               	

$criteria->order => 'DtSubmetido DESC',

 

Vê se dá certo!!!!!!!!!1

Obrigado, mas dessa forma não funciona.

Assim é como tentei.

Desse modo não faz a ordenação dentro do grupo mas sim dos resultados já retornados da consulta.

Amigo,

Se possível colocar em uma planilha no excel, por exemplo, como seria o resultado final dessa consulta. E posta aqui a imagem…

Passo a explicar.

Eu tenho um Ticket com um determinado idNumTicket.

Esse ticket pode ter várias entradas sobre o mesmo, ou seja terei várias linhas com detalhes diferentes, mas com o mesmo idNumTicket.

O que quero é agrupar todos os tickets com o mesmo idNumTicket.

Até aqui tudo bem.

O problema é que o group do cdbcriteria retorna uma linha por idNumTicket, mas os detalhes que vem nessa linha são relativos à primeira entrada com um determinado idNumTicket, e eu queria que ele retornasse a ultima entrada.

Ou seja que fizesse uma ordenação decrescente dentro do grupo de forma a mostrar a ultima alteração ao ticket.

Por exemplo tenho o ticket idNumTicket = 213 que tem várias entradas:

id idNumTicket Estado Data_Alteração

1 231 Aberto 2011-11-20

2 231 Em Curso 2011-11-21

3 231 Concluido 2011-11-22

4 231 Fechado 2011-11-23

O que queria era que o group retornasse isto:

id idNumTicket Estado Data_Alteração

4 231 Fechado 2011-11-23

Mas retorna é isto:

id idNumTicket Estado Data_Alteração

1 231 Aberto 2011-11-20

Deste modo sabia o estado actual do ticket directamente na tabela do gridview.

A query sql que coloquei em cima faz isto, mas precisava de a traduzir para o formato CdbCriteria

Problema resolvido com o seguinte código.


$criteria->alias= 'i';

                $criteria->select= '*';

                $criteria->compare('id', $this->id);

                $criteria->condition='i.id IN (select id FROM (select * from TroubleTicket WHERE idEstado IN (2,3,4,5,6,<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' /> order by id DESC) as ToubleTicket_tmp group by idNumTicket ORDER BY id DESC)';

                $criteria->order='idEstado ASC, DtSubmetido DESC';

Parabéns por ter conseguido

:D