Paninação no Grails (searchResults) Resultados de uma busca
13/05/2008 00:00
0
Ajuda por favor...

Andei estudando o Grails-Getting-Starter recomendado por alguns freqüentadores deste forum (MUITO BOM!!!)... mas ainda tenho uma dúvida... gostaria muito de criar uma paginação para os resultados daquela busca que vai para a tela ...

No exemplo do pdf o resultado não retorna para a tela com paginação... e quando tentei paginá-lo copiando a forma do list... não funcionou... porque me manda para o list, que acaba listando tudo, perdendo o criterio da busca...

tipo, a primeira página fica com os resultados da busca... mas quando clica em next vai para a listagem completa.

Obrigado pela atenção
Tags: Grails


0
esta passando os parametros certos na tag paginate?
como esta calculando o total?
nao sei qual é o exemplo, mas voce usa hibernatecriteria na busca dos dados?
13/05/2008 00:00


0
Seguinte cara...
To usando sim o criteria no meu metodo de busca... dá uma olhada aí...
O exemplo é bem parecido com o que esta no Grails-Getting-Started...

raceController

def search = {
if (request.method == 'POST') {
RaceQuery query = new RaceQuery()
bindData(query, params)
def criteria = Race.createCriteria()
def results = criteria {
and{
...
}

render view:'searchresults', template:'listsearchresults',
model:[raceList: results]


}//if

}



searchresults.gsp


<html>
...
<body>
...
<div class=&quot;list&quot;>
$&#123;render(template&#58;'listsearchresults')&#125;

<div class=&quot;paginateButtons&quot;>
<g&#58;paginate total=&quot;$&#123;Race.count()&#125;&quot;/>
</div>
</div>
</body>
</html>



Sei que o total configurado com Race.count() está errado... mas não achei outra forma de fazer. (não sei como calcular o total)

listsearchresults.gsp




<table>
<tr>
<g&#58;sortableColumn property=&quot;name&quot; title=&quot;Name&quot; />
...
</tr>
<g&#58;each in=&quot;$&#123;raceList&#125;&quot; status=&quot;i&quot; var=&quot;race&quot;>
<tr class=&quot;$&#123;(i % 2) == 0 ? 'odd' &#58; 'even'&#125;&quot;>
<td>$&#123;race.name?.encodeAsHTML()&#125;</td>
...
</tr>
</g&#58;each>
</table>



A página traz o resultado da consulta corretamente... Porém traz tudo na primeira página independente do numero de resultados. Mesmo listando tudo na primeira página, vem com botões como se existisse duas páginas como se eu estivesse listando tudo (provavelmente por causa do Race.count()) e quando clico para navegar por esses botões volta para a página de busca.

Valeu!
13/05/2008 00:00


0
Poderia me mostrar como é esse RaceQuery?

na query voce utiliza max ou offset?
se sim retire da query e coloque isso na hora que criar a query por exemplo:

def results
def query = {
.... sua query.....
}
results = Race.createCriteria().list(max: params.max, offset: params.offset, query)

isso irá lhe retornar um PagedResultList, agora para pegar o count dessa query basta usar &quot;results.totalCount&quot; (faca isso na tag paginate no gsp)

por exemplo:

<g:paginate action=&quot;list&quot;
total=&quot;${raceList.totalCount}&quot;
params='[(COLOQUE AQUI OS MESMOS PARAMS DA BUSCA)]'
next=&quot;Proximo&quot; prev=&quot;Anterior&quot;
/>
13/05/2008 00:00


0
RaceQuery é só um objeto java com alguns parametros que não tem na classe de dominio Race, mas tem na minha tela de busca.
Não uso nem 'max' nem 'offset' nele.

RaceQuery

public class RaceQuery &#123;

public enum DistanceOperator &#123;AT_LEAST, EXACTLY, AT_MOST&#125;;


Date minDate;
Date maxDate;
String city;
String state;
Float distance;
DistanceOperator distanceOperator;

public Date getMinDate() &#123;
return minDate;
&#125;
public void setMinDate(Date minDate) &#123;
this.minDate = minDate;
&#125;
public Date getMaxDate() &#123;
return maxDate;
&#125;
public void setMaxDate(Date maxDate) &#123;
this.maxDate = maxDate;
...



o que devo colocar dentro de '...sua query...' ?
13/05/2008 00:00


0
ali dentro voce deve colocar toda sua criteria,

exemplo:
def query = {
or{
like(&quot;nome&quot;, params.nome+ '%')
eq(&quot;numero&quot;, params.numero)
}
}

.....


por ai vai e somente depois de montar a query criar a criteria passando o max, offset ,ordenação(caso necessite) e a query(logicamente)
13/05/2008 00:00


0
Cara, valeu mesmo pela ajuda... minha paginação está bem melhor...

veja como ficou o codigo...
RaceController

...
def searchresults = &#123;
if(!params.max) params.max = 10

return [ raceList&#58; Race.list( params ) ]
&#125;

def search = &#123;
if(!params.max) params.max = 10

if (request.method == 'POST') &#123;

RaceQuery query = new RaceQuery()

bindData(query, params)

def myquery = &#123;
and&#123;
like(&quot;city&quot;, &quot;%&quot; + query.getCity() + &quot;%&quot;)
like(&quot;state&quot;, &quot;%&quot; + query.getState() + &quot;%&quot;)

if (query.distance) &#123;
switch(query.distanceOperator) &#123;
case RaceQuery.DistanceOperator.AT_LEAST&#58;
ge(&quot;distance&quot;, query.distance)
break
case RaceQuery.DistanceOperator.EXACTLY &#58;
eq(&quot;distance&quot;, query.distance)
break
case RaceQuery.DistanceOperator.AT_MOST &#58;
le(&quot;distance&quot;, query.distance)
break
default &#58;
log.error &quot;Found unexpected value for distance &quot;
+ &quot; operator - $&#123;query.distanceOperator&#125;&quot;

&#125;
&#125;

between (&quot;startDateTime&quot;,
query.minDate,
query.maxDate + 1)

&#125;//and
&#125;
def results = Race.createCriteria().list(max&#58; params.max, offset&#58; params.offset, myquery)

render view&#58;'searchresults', template&#58;'listsearchresults', model&#58;[raceList&#58; results]

&#125;//if

&#125;
...




Paginação no search results...
<div class=&quot;paginateButtons&quot;>
<g&#58;paginate controller=&quot;race&quot; action=&quot;searchresults&quot; total=&quot;$&#123;raceList.totalCount&#125;&quot; />

</div>


o código do RaceQuery é identico ao anterior já postado...

Entretanto o total=&quot;${raceList.totalCount}&quot; está lançando uma exception, tipo... quando coloco um valor estatico tipo total=&quot;20&quot;, funciona legal.
13/05/2008 00:00


0
coloca a exception ai pra gente dar uma olhada, mas acredito que seja por nao estar passando os parametros da busca no g:paginate mas pode ser outra coisa é melhor postar
14/05/2008 00:00


0
A página de entrada que possui os resultados listados vem corretamente... o problema é quando vou navegar na paginação...

Pelo que eu entendi no meu controller eu fiz uma busca utilizando Criteria().list(...) que me retornava um PagedResultList (results) então mandei ele pra a minha view com o nome raceList (postei isso na mensagem anterior)... la na view eu tento usar o total=&quot;${raceList.totalCount}&quot; mas não rola... olha a exceção...


Grails Runtime Exception
Error Details
Message&#58; No such property&#58; totalCount for class&#58; Race
Caused by&#58; No such property&#58; totalCount for class&#58; Race
Class&#58; Unknown
At Line&#58; [-1]
Code Snippet&#58;

Stack Trace
groovy.lang.MissingPropertyException&#58; No such property&#58; totalCount for class&#58; Race
at Race.getProperty(Race.groovy)
at C__java_workspace_racetrack_grails_app_views_race_searchresults_gsp.run(C__java_workspace_racetrack_grails_app_views_race_searchresults_gsp&#58;26)
14/05/2008 00:00


0
só pude responder hoje.
Nunca tive este erro, qual versao do grails esta usando?
em quanto isso vou dar uma olhada por aqui o que pode ser
15/05/2008 00:00


0
Cara... foi mal a demora... ontem tive complicações e não acessei o meu micro.

Bom, eu estou usando a versão 1.0.2 do grails e a 1.5.5 do groovy.

Olha só, eu esqueci de reforçar essa parte... meu problema não está em paginar todos os elementos que possuo (o list está funcionando muito bem) e sim em paginar uma parte deles, ou seja o resultado de um search.

Não encontrei caminhos ainda para resolver isso.

Se você quiser posso te passar o meu codigo... que nada mais é que o sisteminha que é desenvolvido no Grails-Getting-Starter da InfoQ. Basta me passar o seu email.

abraço.
16/05/2008 00:00


0
Fala amigo,
vc tem q retornar a quantidade total dessa busca, mas precisa fazer uma outra consulta q retorne apenas o total de registro dessa consulta sem offset e max. Ex.: select count(*) from......


abs
30/05/2008 00:00


0
Estou com um problema ao fazer uma pesquisa e retornar o resultado com paginação, utilizando a list.gsp para exibir os resultados.

A quantidade correta de páginas é mostrada e os primeiros registros mostrados pertencem ao usuário logado, mas ao clicar na página 2 ou em Próximo não são exibidos os próximos resultados.

Exemplo:
Consigo listar 18 registros do usuário, que estão distribuídos em 4 páginas contendo no máximo 5 registros por página, mas ao clicar na página 2 ou em próximo o conteúdo é perdido (mostra a listagem em branco).

Na minha aplicação o Usuário tem vários Contatos e quero retornar na busca somente os contatos que pertencem a ele e correspondam ao termo buscado.

No meu ContatoController possuo as actions search e showSearchResults. A search chama a página search.gsp com o campo para busca.

    
def search = {
}

def showSearchResults = {
params.max = Math.min(params.max ? params.int('max') &#58; 5, 100)
render(view&#58;'list', model&#58;[contatoInstanceList&#58; Contato.findAllByNomeIlikeAndUsuario(&quot;%&quot; + params.nome + &quot;%&quot;, session?.usuario, params), contatoInstanceTotal&#58; Contato.countByNomeIlikeAndUsuario(&quot;%&quot;+params.nome+&quot;%&quot;, session?.usuario, params)])
}


A action List está da seguinte forma:

def list = {
params.max = Math.min(params.max ? params.int('max') &#58; 10, 100)
// exibe somente os contatos do usuário logado
[contatoInstanceList&#58; Contato.findAllByUsuario(session?.usuario, params), contatoInstanceTotal&#58; Contato.countByUsuario(session?.usuario,params)]
}


No list.gsp do Contato está o seguinte:

<div class=&quot;paginateButtons&quot;>
<g&#58;paginate total=&quot;${contatoInstanceTotal}&quot; />
</div>


Alguma dica de como fazer para que a paginação funcione corretamente, percorrendo o resultado da busca?

Agradeço a quem puder ajudar.
01/11/2010 00:00



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto