Questionário Dinâmico - JSF

Comunidade!

Estou com um bloqueio mental na elaboração de um “questionário dinâmico”, onde quero acrescentar/remover perguntas de acordo com as marcações feitas pelo usuário.

Vi alguns tópicos aqui no Guj, mas sem solução prática.

Esbocei no paint a ideia no paint… vejam:

No desenvolvimento, estou usando JSF c/ Hibernate.

Alguem pode me dar um help inicial?

Estou começando a escrever as classes Perguntas, Respostas, Questionário, Entrevista, Entrevistado, Entrevistador, Rotas(para o caminho das perguntas).

Logo mais eu atualizo com as classes… mas um brainstorm seria bem vindo!!

Será que é melhor organizar a tabela com a estrutura de pai/filho? ou tudo com tabelas independentes relacionadas?

Abs!

Em algum lugar você vai ter que ter esse fluxo.

Eu pensei em algo do tipo, uma tabela de PERGUNTA_TEM_PERGUNTAS
Nela seria apenas chaves:
Pergunta 1 poderia ter sequencia de pergunta 2.
Pergunta 4 poderia ter sequencia a 3 ou 7.
Ou seja, duas colunas acho que resolveria.

Certamente vou precisar do mapeamento sim…

será que não seria uma tabela RESPOSTA TEM PERGUNTAS?

Afinal, a pergunta será (ou não) feita de acordo com uma resposta (de uma pergunta)

… ou estou pensando besteira?

COF COF COF… Quem foi o louco que falou PERGUNTA TEM PERGUNTA? pffffff

É isso mesmo mano. Acho que assim vai ficar xuxu!

valeu, jakefrog!

Vou fazer nessa linha!

Abs!

Eu estava pensando na linha:

“Uma pergunta pode ter mais de uma resposta” e “uma resposta pode estar relacionada com mais de uma pergunta”

Se “uma resposta pode desencadear uma nova pergunta” (restposta_tem_perguntas), pode gerar um conflito.

Exemplo:
As respostas “SIM” e “NÃO” vão ter ids que estarão relacionados, certamente, com mais de uma questão.

Como faço para dizer que “A RESPOSTA_DE_UMA_PERGUNTA TEM PERGUNTA”?

Ou devo cadastrar vários “SIM’s” e “NÃO’s” para cada pergunta? meio errado fazer isso, não é?

Obrigado!

Estou usando annotations do hibernate…

Minhas classes estão ficando assim… estou com dúvida quanto o mapeamento da classe que vai tornar o questionário dinâmico, como mostrado no primeiro post.

jakefrog, sua ideia de RESPOSTA_TEM_PERGUNTA está na linha que preciso, mas a resposta tem que relacionar com determinada pergunta (na minha visão).

Por isso acho que tenho que ter uma tabela com PerguntaGatilho;RespostaGatilho; PerguntaQueSeráRendezizada.

Gostaria que me ajudasse nessa missão… tá bem difícil pensar em um jeito de realizar essa tarefa (e ainda estou certo que vou ter dificuldade em coletar a resposta do usuário… mas vamos deixar isso mais para frente)

======================
Classe Perguntas

[code]@Entity
@SequenceGenerator(name=“SEQ_PERGUNTA”)
public class Perguntas implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator=“SEQ_PERGUNTA”)
private Long id;
private String pergunta;
private String observacao;
private Boolean padrao;

@ManyToMany(fetch= FetchType.EAGER) // mais de uma pergunta pode estar relacionada com mais de uma resposta
@JoinTable(name="PERGUNTA_TEM_RESPOSTAS", 
    joinColumns={@JoinColumn(name="ID_PERGUNTA")}, 
    inverseJoinColumns={@JoinColumn(name="ID_RESPOSTA")})
private List<Respostas> listRespostas;

}[/code]

Classe Respostas

[code]@Entity
@SequenceGenerator(name=“SEQ_RESPOSTA”)
public class Respostas implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO,generator="SEQ_RESPOSTA")
private Long id;
private String resposta;
private String copmlemento;
private TipoResposta tipoResposta; //enum UNICA,MULTIPLA,DESCRITIVA
@ManyToMany(fetch= FetchType.LAZY)
@JoinTable(name="PERGUNTA_TEM_RESPOSTAS", 
    joinColumns={@JoinColumn(name="ID_RESPOSTA")}, 
    inverseJoinColumns={@JoinColumn(name="ID_PERGUNTA")})
private List<Perguntas> listPerguntas;

}[/code]

Classe TipoResposta (ENUM)

public enum TipoResposta { MULTIPLA,UNICA,DESCRITIVA //Para renderizar as respostas na view com option, check ou text }

Classe Questionário - tem as perguntas (com as respectivas opções respostas)

@Entity @SequenceGenerator(name="SEQ_QUESTIONARIO") public class Questionario implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO,generator="SEQ_QUESTIONARIO") private Long id; private String nomeQuestionario; @ManyToMany @JoinTable(name="QUESTIONARIO_PERGUNTAS", joinColumns={@JoinColumn(name="ID_QUESTIONARIO")}, inverseJoinColumns={@JoinColumn(name="ID_PERGUNTA")}) private List<Perguntas> listPerguntas; }

Classe Entrevista - um questionário respondido entre um entrevistador e um entrevistado em determinada data. Substuirei as Strings por classes

@Entity @SequenceGenerator(name="SEQ_ENTREVISTA") public class Entrevista implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO, generator="SEQ_ENTREVISTA") private Long id; @OneToOne(mappedBy="nomeQuestionario") private Questionario questionario; private String usuario; // Vou substituir pela classe que representa o entrevistador private String cliente; // '' representa o entrevistado private String acao; // '' levará o nome/prazo/etc da ação de entrevistas @Temporal(javax.persistence.TemporalType.DATE) private Date dataEntrevista; //Armazena a data da entrevista }

Classe Regras - Essa tá sendo a parte mais foda de pensar… é o que vai deixar o questionário dinâmico… nem sei se está na linha certa e por isso estou postando… heeeelp please :wink:

@Entity @SequenceGenerator(name="SEQ_REGRAS") public class Regras implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO, generator="SEQ_REGRAS") private Long id; private Perguntas perguntaGatilho;//Duvida!! private Respostas respostaGatilho; private Perguntas perguntaDisparada; }

A dúvida é com relação a lógica, considerando que terei que:

  • Exibir/Ocultar perguntas (e respectivas opções de resposta) de acordo com as respostas no questionário
  • Terei que salvar as respostas do questionário em meu banco

Como relaciono essas classe regra com as outras classes? terei que mapear nas outras também?

Desde já agradeço e adianto que toda ajuda será muito bem vinda!!

Abs

Hoje eu já amanheci pensando que talvez seja realmente melhor ter várias respostas duplicadas na entidade Respostas e trabalhar com RESPOSTA_TEM_PERGUNTAS…

… de qualquer forma, poderiam me ajudar no mapeamento das classes? tem alguma oportunidade imediata de melhoria??

Obrigado

Estou com um problema semelhante no mapeamento de classe…

Desculpe a demora. ontem deixei a janela aberta para te responder e esqueci e desliguei o notebook.

Cara, até onde eu vi ta tudo tranquilo. Vc ta tendo algum problema?

jakefrog! obrigado!

Estou sim na verdade é um dilema:

Vc disse “RESPOSTA_TEM_PERGUNTA”, certo?

Eu pensei nas respostas que estarão relacionadas com mais de uma pergunta, ex. SIM/NÃO.

Devo, para cada pergunta optativa inserir uma resposta SIM e outra NÃO (e aí usar a regra RESPOSTA_TEM_PERGUNTA)
ou
Devo utilizar uma mesma resposta SIM para mais de uma pergunta e relacionar que RESPOSTA_DA_PERGUNTA_TEM_PERGUNTA?

Ontem me veio na cabeça que isso me economizaria registros na tabela e que eu teria que ter uma classe (chamei de rota) que teria PerguntaGatilho, RespostaGatilho, PerguntaDisparada para definição dos fluxos…

… já na hora de dormir eu repensei na sua solução de RESPOSTA_TEM_PERGUNTAS e acho que seria melhor cadastrar várias respostas, mesmo que repetidas, gerando ids diferentes e rumos diferentes.

Veja as perguntas “Quanto tempo levou para desenvolver” e “há quanto tempo está tentando”… elas possuem as mesmas respostas, mas levam a caminhos diferentes

É meio confuso expressar… espero que tenha me entendido.

Obrigado!!!

jakefrog
Estou tentando acompanhar o raciocínio da dúvida do rCalastro, será que essa classe está certa?

@Entity @SequenceGenerator(name="SEQ_REGRAS") public class Regras implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO, generator="SEQ_REGRAS") private Long id; private Perguntas perguntaGatilho;//Duvida!! private Respostas respostaGatilho; private Perguntas perguntaDisparada; }

CaioNascimento,

“Certa” ela não está ainda… mas acho que está caminhando…

se o melhor conceito for “RespostaDaPergunta_Tem_Pergunta”… falta fazer as anotações relacionais… tem alguma sugestão?

Valeu

Pelo que vejo a tabela de relacionamento funcionaria numa boa.

Quem sabe desse modo aqui ficaria melhor.

Você teria uma tabela para Mapear PERGUNTA_TEM_RESPOSTA e nela ficaria
Pergunta 1 tem
Resposta 3, 4

E em uma outra tabela vocÊ teria RESPOSTA_TEM_PERGUNTA
Resposta 3
Pergunta 6,33

Que tal?

É… acho que o esquema é esse mesmo.

Vou redesenhar minhas classes e volto a postar.

Obrigado!