id not unique
29/09/2009 00:00
0
pessoal..

estou 'empacado' em um problema aqui,
tenho a tabela ACADEMICO_ATIV_COMP

CREATE TABLE dbo.ACADEMICO_ATIV_COMP
(
cd_acad INT NOT NULL,
cd_ativ_comp TINYINT NOT NULL,
evento VARCHAR (120) NOT NULL,
dt_inicio VARCHAR (10) NOT NULL,
tot_hor SMALLINT NOT NULL,
tot_min TINYINT NOT NULL,
PRIMARY KEY NONCLUSTERED (cd_acad,cd_ativ_comp)
)


cd_acad é de outra tabela (tabela ACADEMICOS), mas eu não preciso informar na hora do cadastro, estou controlando pela session.
Eu só consigo ver as atividades complementares de um determinado academico depois que eu vou na tela de busca e seleciono ele, gravando o cd_acad da tabela Academicos na session.

No caso do create, deve dar um insert com o cd_acad da session e os demais campos digitados.
Tanto o cd_acad quanto o cd_ativ_comp repetem, por exemplo:
um cd_acad pode ter varios cd_ativ_comp onde o mesmo não pode ter cd_ativ_comp repetidos,

cd_acad | cd_ativ_comp
1 | 1
1 | 2
1 | 3
2 | 1
3 | 1
3 | 2


problemas:
1) Qual devo definir como id? cd_acad ou cd_ativ_comp?

2) No caso do cd_acad como id, o list não me tras todas as linhas referentes ao cd_acad em questão.

3) O cd_ativ_comp como id, tive que mudar todas as funções, trocar list por findAllBy, get por FindWhere, até aí tudo bem mas não há o que faça o save, update e delete funcionar. No insert retorna erro dizendo que estou tentando inserir um registro duplicado, ou seja, ta violando o unique onde cd_acad não pode ter cd_ativ_comp repetidos.
Por Exemplo, o cd_acad = 5000 tem cd_ativ_comp 1,2,3...18
Há outros cd_acad que tem cd_ativ_comp que vão do 1 até o 63 +/-
Agora se eu tento inserir no cd_acad = 5000 o cd_ativ_comp = 19 da erro de violação de unique, mas se eu insiro um cd_ativ_comp = 64 ou mais, insere sem erros.
Então, o problema é que não ta relacionando o cd_acad com o cd_ativ_comp, e eu não faço ideia de como fazer essa relação.. <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->

meu domain:
class Ativcomp {
Short acad
String evento
String data
Short hora
Short minuto

static mapping = {
table 'marcelo..ACADEMICO_ATIV_COMP'
id column&#58;'cd_ativ_comp', generator&#58;'assigned', sqlType&#58;'int'
acad column&#58;'cd_acad'
data column&#58;'dt_inicio'
hora column&#58;'tot_hor'
minuto column&#58;'tot_min'
version false
}
}



me desculpem o texto que eu escrevi aqui xD, provavelmente a maioria vai se assustar e ficar sem empenho de ler tudo...
Tags: Grails


0
opaa!

Ae galera, tava moskando...
Dei uma pesquisada no id composite, é exatamente o que eu preciso.
Eu tinha outra ideia do composite por isso não tentei antes, imaginava que o composite gravava em um field id o valor de outros dois campos...

mas enfim, deu certo em partes..
não testei com a tabela do 1º post ainda, mandei o grails gerar as tabelas na mesma ideia das duas anteriores.

Funcionou bem, na ativ_comp gerou o cd_acad e o cd_ativ_comp e consegui inserir nesse esquema:


cd_acad | cd_ativ_comp
1 | 1
1 | 2
1 | 3
2 | 1
3 | 1
3 | 2


só tem um detalhe, não sei se estou deixando algo passar mas é o seguinte, no list do ativ_comp a coluna id não mostra nada, o id não ta referenciando o cd_ativ_comp ou algo assim..
tanto que quando vou no create e dou um save, na hora de redirecionar para o show volta para o list com a seguinte mensagem no flash: 'Ativcomp not found with id null'

meu domain Ativcomp:
class Ativcomp implements Serializable {
String evento
Date data
Short hora
Short minuto
Integer cd_ativ_comp

Academicos acad

static mapping = {
id composite&#58;['acad','cd_ativ_comp'], generator&#58;'assigned'
id column&#58;'cd_ativ_comp', sqlType&#58;'int'
acad column&#58;'cd_acad'
evento column&#58;'evento'
data column&#58;'dt_inicio'
hora column&#58;'tot_hor'
minuto column&#58;'tot_min'
version false
}
}


devo alterar nas view mesmo ou esqueci algo no domain?
30/09/2009 00:00


0
Consegui chegar à uma solução.
Se alguém precisar...

Pelo que eu pesquisei por aí, tem que alterar os metodos mesmo, o scaffold não gera certinho com composite..

tive que alterar os &quot;.get()&quot; dos metodos show, delete, edit e update para:

def ativcompInstance = Ativcomp.get( new Ativcomp(acad&#58;params.acad,ativ&#58;params.ativ) )

simples assim. Na view list:

<g&#58;link action=&quot;show&quot; params=&quot;[acad&#58;ativcompInstance.acad, ativ&#58;ativcompInstance.ativ]&quot;>SHOW</g&#58;link>


E no create para retornar certo muda o redirect da action save:

redirect(action&#58;show,params&#58;[acad&#58;ativcompInstance.acad, ativ&#58;ativcompInstance.ativ])
01/10/2009 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