Dúvida de inserção do objeto na coleção
21/10/2010 00:00
0
Olá pessoal, blz?

Estou tendo problemas no groovy. Como faço inserir 1 item numa coleção? Por exemplo tenho 2 classes. Periodo e Registro. Periodo possui vários registros e registro pertence a um Periodo.

Eu quero pegar 1 registro qualquer e adicionar na coleção "periodo.registros". No java é só fazer: periodo.registros.add(registro); e pronto. Como se faz no groovy?
Tags: Groovy


0
Yarhs, que eu saiba, do jeito que você está fazendo está certo, inclusive está quase igual ao exemplo da documentação collections do groovy.
21/10/2010 00:00


0
Teve um detalhe que eu esqueci de citar. A coleção usada é do tipo "org.hibernate.collection.PersistentSet".

Eu nem defini nada. Isto foi definido pelo grails. Eu defini no modelo "static hasMany = [registros : Registro]" e na hora de dar Periodo.list() ele recebe os valores e o tipo fica sendo o citado.

Aí eu não sei como trabalhar. Nunca tive que mexer diretamente com este tipo de objeto. Estou perdido.
21/10/2010 00:00


0
Yarkhs, de uma boa lida na documentação do GORM, la tem certinho o que acontece e o que pode ser feito quando utilizado estas associações, acontece que, quando iniciado a aplicação o grails "injeta" alguma métodos para suas classes que possuem este tipo de associação.

Então assim, se voce possui uma classe Periodo com muitos registros, ele "injeta" um método chamado addTO para cada atributo do hasMany, então você poderia adicionar um novo registro assim:
def periodo= Periodo.get(1) //TEU PERIODO
periodo.addToRegistros(name:"nome").save() //ADICIONA O REGISTRO PRO PERIODO E SALVA ELE ADICIONANDO O REGISTRO AO BANCO DE DADOS.
21/10/2010 00:00


0
Gostei da idéia. Vou fazer uns testes aqui e fazer as modificações caso dê certo. Quando puder darei um feedback <!-- s:P --><img src="{SMILIES_PATH}/icon_razz.gif" alt=":P" title="Razz" /><!-- s:P -->
22/10/2010 00:00


0
Funcionou hehe. Mas estou perdido na lógica. Acabei criando um sistema complexo de finanças Oo.

Estou fazendo uma aplicação de controle financeiro igual faço no Excel. Tenho uma tabela que corresponde a um período (Outubro-2010, Novembro-2010...) e cada tabela destas possui vários registros que correspondem aos gastos e ganhos daquele mês correspondente.

Exemplo:

Setembro-2010
------------------------------------------------------------------------
DATA | HISTORICO | RECEITA | DESPESA | TOTAL
- | saldo anterior | | | 0
10/09/2010 | salario | 500 | | 500
14/09/2010 | viagem | | 200 | 300
20/09/2010 | livro | | 50 | 250
-------------------------------------------------------------------------
total | - | 500 | 250 | 250





Com base nesta tabela criei 2 modelos.


class Periodo {

Date data
Integer totalReceita
Integer totalDespesa
Integer liquido

static hasMany = [registros &#58; Registro]
}




class Registro {

Date data
String tipo //Será ou despesa ou receita. 'D' ou 'R'
String descricao
Integer valor

static belongsTo = [periodo &#58; Periodo]
}


Aí eu tive a seguinte idéia. Toda vez que for criar um registro, se não tiver um periodo, a aplicação vai pegar a data do registro e vai usar para criar um periodo. E após criar o período, vai pegar o valor do registro e usar para alterar os campos &quot;totalReceita&quot;, &quot;totalDespesa&quot; e &quot;liquido&quot; do periodo. Só que não consigo resolver todos os problemas. Se eu quiser excluir, por exemplo, vai gerar erro. Já queimei muito a mufa tentando resolver esta lógica.



class RegistroController {

def save = {
def registroInstance = new Registro(params)

** registroInstance = PeriodoService.inserePeriodo(registroInstance)

if (registroInstance.save(flush&#58; true)) {

** PeriodoService.atualizaPeriodo(registroInstance)

redirect(action&#58; &quot;show&quot;, id&#58; registroInstance.id)
} else {
render(view&#58; &quot;create&quot;, model&#58; [registroInstance&#58; registroInstance])
}
}

def update = {
def registroInstance = Registro.get(params.id)

if (registroInstance) {
if (params.version) {
def version = params.version.toLong()
if (registroInstance.version > version) {

registroInstance.errors.rejectValue(&quot;version&quot;, &quot;default.optimistic.locking.failure&quot;, [message(code&#58; 'registro.label', default&#58; 'Registro')] as Object[], &quot;Another user has updated this Registro while you were editing&quot;)
render(view&#58; &quot;edit&quot;, model&#58; [registroInstance&#58; registroInstance])
return
}
}
registroInstance.properties = params
** registroInstance = PeriodoService.inserePeriodo(registroInstance)

if (!registroInstance.hasErrors() &amp;&amp; registroInstance.save(flush&#58; true)) {

** PeriodoService.atualizaPeriodo(registroInstance)

flash.message = &quot;${message(code&#58; 'default.updated.message', args&#58; [message(code&#58; 'registro.label', default&#58; 'Registro'), registroInstance.id])}&quot;
redirect(action&#58; &quot;show&quot;, id&#58; registroInstance.id)
}
else {
render(view&#58; &quot;edit&quot;, model&#58; [registroInstance&#58; registroInstance])
}
}
else {
flash.message = &quot;${message(code&#58; 'default.not.found.message', args&#58; [message(code&#58; 'registro.label', default&#58; 'Registro'), params.id])}&quot;
redirect(action&#58; &quot;list&quot;)
}
}

def delete = {
def registroInstance = Registro.get(params.id)
if (registroInstance) {
try {
registroInstance.delete(flush&#58; true)
** PeriodoService.atualizaPeriodo(registroInstance)

flash.message = &quot;${message(code&#58; 'default.deleted.message', args&#58; [message(code&#58; 'registro.label', default&#58; 'Registro'), params.id])}&quot;
redirect(action&#58; &quot;list&quot;)
}
catch (org.springframework.dao.DataIntegrityViolationException e) {
flash.message = &quot;${message(code&#58; 'default.not.deleted.message', args&#58; [message(code&#58; 'registro.label', default&#58; 'Registro'), params.id])}&quot;
redirect(action&#58; &quot;show&quot;, id&#58; params.id)
}
}
else {
flash.message = &quot;${message(code&#58; 'default.not.found.message', args&#58; [message(code&#58; 'registro.label', default&#58; 'Registro'), params.id])}&quot;
redirect(action&#58; &quot;list&quot;)
}
}
}


Obs: O registroController está praticamente todo padrão. Pus ** para facilitar a visão das linhas que acrescentei.


class PeriodoService {

def static inserePeriodo(Registro registro) {

def periodo = existePeriodo(registro)

if(!periodo) {
periodo = new Periodo()
periodo.data = new Date(registro.data.year, registro.data.month, 1)
periodo.save(flush&#58; true)

registro.periodo = Periodo.findByData(periodo.data)
}
else
registro.periodo = periodo

return registro
}


def static existePeriodo(Registro registro) {
def periodos = Periodo.list()

for(periodo in periodos)
if(registro.data.month == periodo.data.month)
return periodo

return null
}


def static atualizaPeriodo(Registro reg) {

def periodo = reg.periodo
periodo.totalReceita = 0
periodo.totalDespesa = 0

periodo = Periodo.get(periodo.id)

//periodo.addToRegistros(registro)

for(registro in periodo.registros) {

if(registro.tipo == 'D')
periodo.totalDespesa += registro.valor
else
periodo.totalReceita += registro.valor

}

periodo.liquido = periodo.totalReceita - periodo.totalDespesa

periodo.save(flush&#58; true)
}

}
22/10/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