Melhor forma de mostrar somatorio e paginação
26/03/2014 21:01
0
Boa tarde!
Estou fazendo minha primeira aplicação em GRAILS. Preciso logar no sistema e mostrar o saldo e os ultimos lançamentos paginados do user logado.
Depois de muita luta o que consegui está abaixo, mas pra mim não está certa esta forma.
Gostaria de saber de vocês a forma correta de fazer isso.
Obrigada!

	def index(Integer max) {
params.max = Math.min(max ?: 10, 100)
//respond MovimentoUnidade.list(params), model:[movimentoUnidadeInstanceCount: MovimentoUnidade.count()]
BigDecimal saldo= MovimentoUnidade.executeQuery(
"SELECT sum(MU.valorMovimento*MU.tipoMovimentoUnidade.entradaSaida) "+
"FROM MovimentoUnidade AS MU, "+
"UnidadeAbastecimento AS UA, "+
"UnidadeCondutor UC, "+
"Condutor AS C"+
" WHERE UA.id = MU.idUnidadeAbastecimento "+
" AND UC.idUnidadeOrganizacional = UA.idUnidadeOrganizacional "+
" AND C.id = UC.idCondutor "+
" AND C.cpf = :condutor ",[condutor: session.condutor.cpf])[0]


java.util.List<MovimentoUnidade> resultCount = MovimentoUnidade.executeQuery(
"SELECT MU "+
"FROM MovimentoUnidade AS MU, "+
"UnidadeAbastecimento AS UA, "+
"UnidadeCondutor UC, "+
"Condutor AS C "+
" WHERE UA.id = MU.idUnidadeAbastecimento "+
" AND UC.idUnidadeOrganizacional = UA.idUnidadeOrganizacional "+
" AND C.id = UC.idCondutor "+
" AND C.cpf = :condutor "+
" order by MU.dataMovimento desc",[condutor: session.condutor.cpf])


java.util.List<MovimentoUnidade> result = MovimentoUnidade.executeQuery(
"SELECT MU "+
"FROM MovimentoUnidade AS MU, "+
"UnidadeAbastecimento AS UA, "+
"UnidadeCondutor UC, "+
"Condutor AS C "+
" WHERE UA.id = MU.idUnidadeAbastecimento "+
" AND UC.idUnidadeOrganizacional = UA.idUnidadeOrganizacional "+
" AND C.id = UC.idCondutor "+
" AND C.cpf = :condutor "+
" order by MU.dataMovimento desc",[condutor: session.condutor.cpf], params)

result[0].saldo = saldo

respond result, model:[movimentoUnidadeInstanceCount: resultCount.size()]
}
Tags: paginar sum HQL


0
Olá Adriana,

Realmente fazer 3 consultas iguais para pegar dados não é a melhor idéia, a consulta a banco é mais demorada do que fazer o sumatório do total em um loop por exeplo.

No caso da paginação, o grails traz coisas um pouco mais prontas para fazer. Eu utilizo Critéria para fazer isso:

def c = MovimentoUnidade.createCriteria()
def results = c.list (max: params.max, offset: params.offset){
// sua consulta usando criteria aqui
}


e depois você consegue passar para a view a lista de objetos retornados (results) e o número de objetos retornados (results.totalCount) sem precisar fazer duas consultas para isso.

Para saber um pouco mais sobre o critéria vc pode ir no link:
http://grails.org/doc/2.3.7/ref/Domain%20Classes/createCriteria.html

Mas se você não quer continuar utilizando HQL, no seguinte link tem exemplo de como fazer a paginação (se atente para o exemplo que passa os atributos 'max' e 'offset' para o HQL):
http://grails.org/doc/2.1.0/ref/Domain%20Classes/executeQuery.html
27/03/2014 14:00


0
Olá Thiago!
Obrigada por me responder.
Minha grande dificuldade em trabalhar com critéria são os mapeamentos desse tanto de tabelas.
Não sei como retornar todos os "MovimentoUnidade" do Condutor cujo CPF é passado.

Li o artigo http://www.itexto.net/devkico/?p=885 mas não consegui reproduzir no meu cenário. Esse foi o motivo de usar HQL. Só que usando o HQL, precisei fazer isso aí acima pra conseguir todos os dados que precisava.
Seria algo do tipo?
		def criterio = MovimentoUnidade.createCriteria()
def results = criterio.list(max: params.max, offset: params.offset) {
unidadeAbastecimento{
unidadeOrganizacional{
.
.
.
}
}
eq("cpf", session.condutor.cpf)


27/03/2014 18:17


0
Pelo seu código acho que ficaria assim:

def results = criterio.list(max: params.max, offset: params.offset) {
unidadeAbastecimento{
unidadeOrganizacional{
condutor{
eq("cpf",session.condutor.cpf)
}
}
}
}
27/03/2014 22:19


0
Boa tarde Thiago.
Fiz os testes aqui e não consegui, mesmo usando Criteria, resolver com uma consulta só. Não consegui acessar o total de registros como vc falou: results.totalCount. Esse totalCount não existe, entende? Existe um count, que não retorna nada.
Eu implementei conforme seu exemplo e o link que me passou.
Ou seja, para continuar sabendo o total de registros retornados eu preciso fazer outra consulta...

Desde já agradeço a ajuda.
04/04/2014 18:41


1
Olá Adriana,

o totalCount() existe sim, eu uso ele e funciona perfeitamente. Veja este parágrafo que copiei da página do grails que te passei:

"Because that query includes pagination parameters (max and offset), this will return a PagedResultList which has a getTotalCount() method to return the total number of matching records for pagination. Two queries are still run, but they are run for you and the results and total count are combined in the PagedResultList."

Me manda o método que você criou para eu dar uma olhada.
04/04/2014 20:44


0
def index(Integer max) {
params.max = Math.min(max ?: 10, 100)
def criterio = UnidadeCondutor.createCriteria()
def results = criterio.list(max: params.max, offset: params.offset) {

condutor{
eq("cpf",session.condutor.cpf)
}
}
respond results, model:[unidadeCondutorInstanceCount: results.totalCount]
}
04/04/2014 21:00


0
Desculpe-me... enviei sem formato.

def index(Integer max) {
params.max = Math.min(max ?: 10, 100)
def criterio = UnidadeCondutor.createCriteria()
def results = criterio.list(max: params.max, offset: params.offset) {

condutor{
eq("cpf",session.condutor.cpf)
}
}
respond results, model:[unidadeCondutorInstanceCount: results.totalCount]
}
04/04/2014 21:01


0
Olá Adriana,

Parece correto, está aparecendo algum erro? Ou apenas não funciona? Na view vc usa "unidadeCondutorInstanceCount"?
08/04/2014 12:58


0
Oi Thiago!
Então, não dá erro nenhum, só não funciona.
To usando "unidadeCondutorInstanceCount" no paginate. O interessante é que quando eu dou um ctrl+espace não aparece a opção totalCount, aparece outras coisas e ela não.

A mesma coisa na outra pergunta que fiz sobre o flash.message, quando coloco o "." e ctrl+espace não aparece a opção encode... e, embora eu escreva, não dá erro.. mas não faz nada...

Obrigada pela sua disposição em ajudar!
08/04/2014 18:41


0
Oi Adriana,

tenta adicionar 'max:params.max' na model do seu respond


respond results, model:[unidadeCondutorInstanceCount: results.totalCount, max:params.max]
09/04/2014 12:54



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