Bom dia pessoal,
Tô com uma pequena duvida :roll:. Tenho duas tabelas, projetos e funcionarios, preciso listar os funcionarios e os projetos que eles participam numa tabela em jsp. Na pagina, os nomes dos funcionarios até aparecem, mas os projetos que eles participam não. Creio eu que é algo na jsp, pois testei o sql.
<body>
<jsp:useBean id="func" class="br.com.DAO.FuncionarioDAO" />
<jsp:useBean id="proj" class="br.com.DAO.ProjetoDAO" />
<jsp:useBean id="set" class="br.com.Setor" />
<table align="center" border="1">
<tr>
<td>Nome:</td>
<td>Projetos:</td>
</tr>
<c:forEach var="funcionarios" items="${func.lista}">
<tr>
<td><c:out value="${funcionarios.nome}"></c:out></td>
</tr>
<tr>
<td><sql:setDataSource var="conexao"
dataSource="jdbc:postgresql://127.0.0.1/postgres?user=postgres&password=12345" />
<c:set var="sql"
value="select projetos.nome from projetos inner join funcionarios on funcionarios.codigo = ${funcionarios.codigo} and projetos.codigo = funcionarios.cod_projeto"></c:set>
<sql:query var="consulta" dataSource="${conexao}">
<c:out value="${sql}"></c:out>
</sql:query></td>
</tr>
</c:forEach>
</table>
</body>
Tambem gostaria de saber se há uma maneira menos poluida de codificar para listar essas informações.
Obrigado. 
Então se o funcionario participa apenas de um projeto, ele recebe a chave extrangerira (A nivel de banco de dados).
enão seria:
select p.nome, f.nome from funcionario f inner join projeto p on p.pkprojeto=f.fkprojeto
Neste caso vc teria o nome do funcionarios e os projetos.
Dai para frente acho que vc aplica sua ideia.
Abs
Na questão do SQL tá beleza, yoshikichi, ele roda tranquilo, pois testei no console do BD. Minha duvida é na hora de popular as linhas da tabela na pagina jsp, isso não é feito. No codigo, passado no começo da thread, ele gera para jsp a coluna funcionarios, mas não lista da coluna projetos. Qual material vc me indica para solucionar essa pendenga?
Obrigado.
Alex,
você acha uma boa ideia colocar sua lógica dentro de um jsp?
Não seria melhor você fazer a busca de sua lista no seu controller (ou seja lá o que você tiver usando) ? Assim você popula uma lista e manda para seu jsp, igual você fez com os funcionários. Dai é só colocar num for each (como você fez) e fechou.
Não seria melhor ?
Além disso, por questões de performace, não é recomendado colocar instruções sql dentro de loops.
Agora de acordo com que você fez… eu percebi que você colocou aquela instrução SQL dentro de uma variável chamada sql, e executou colocando o resultado dentro da variável consulta, mas você não mostra essa variável (consulta) em tela, não seria esse o problema?
rodrigocolasso, só coloquei a logica dentro da jsp porque não estou conseguindo chamar a mesma logica da DAO, por exemplo:
Dentro da ProjetoDAO fiz duas lista, getLista() e BuscarProjetos(), mas os sql’s são diferentes, o ultimo metodo é propriamente para buscar o nome do projeto que esta relacionado com o funcionario, a mesma que esta na jsp. Mas na jsp não consigo chama-lo.
<c:forEach var="funcionarios" items="${func.lista}">
<tr>
<td><c:out value="${funcionarios.nome}"></c:out></td>
</tr>
</c:forEach>
Esse forEach tá beleza, mas no outro que faço, justamente para lista o nome dos projetos com o BuscarProjeto, não funciona.
<c:forEach var="projetos" items="${proj.BuscarProjeto}">
<tr>
<td><c:out value="${projetos.nome}"></c:out>
</td>
</tr>
</c:forEach>
Tô fazendo uma confusão nessa hora, esse laço esta correto?
Obrigado.
Alex,
apesar de serem duas tabelas diferentes que você quer buscar, não tem problema colocar, por exemplo, no FuncionarioDAO um método que busque os funcionários e também busque os projetos que ele estão alocados (ou algum coisa do gênero), você faz sua query como precisar, coloca o resultado dessa busca em um array e pode enviar para sua jsp. Assim tendo somente um array para fazer o loop.
Se você não conseguir coloque seu código completo, o dao, o servlet e sua jsp para eu ver como você está fazendo.
Entendi rodrigo, dentro dessa busca eu teria que criar um objeto de cada classe, um da classe funcionario e outro projeto. Dentro dessa busca setaria os nome dos atributos em seus objetos especificos, até aí beleza, como faria para demostrar na tela atributos do mesmo nome de objetos diferentes? Essa é minha duvida.
Ou seria melhor criar outra tabela, juntando as duas entidades, que ficaria mais facil de exibir em um relatorio na jsp? :shock:
Estava olhando umas coisas de DataTable, isso resolveria o meu problema mais facilmente? Há algum material que voce indicaria, se a resposta for sim?
Alex,
primeiro eu gostaria de saber como você faz a persistência dos dados no banco, utiliza algum framework (ex: Hibernate)?
Acho mais fácil você postar o trecho do código que você fazer a recuperação dos dados do banco e o trecho que envia a lista para o jsp.
Assim fica mais fácil ajudar.
Não utilizo nenhum framework, faço a persistencia na unha mesmo, até entender todo o processo. Tenho esse metodo que faz a busca na tabela projetos.
public List<Projeto> getBuscarProjetos() {
try {
List<Projeto> projetos = new ArrayList<Projeto>();
PreparedStatement stmt = this.connection
.prepareStatement("select p.nome, p.meta from funcionarios f "
+ "inner join projetos p on p.codigo=f.cod_projeto");
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
Projeto projeto = new Projeto();
projeto.setNome(rs.getString("nome"));
projeto.setMeta(rs.getInt("meta"));
projetos.add(projeto);
}
rs.close();
stmt.close();
System.out.println("Fechando a conexão com o banco");
return projetos;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
E essa é a jsp que mostra o relatorio
<body>
<jsp:useBean id="func" class="br.com.DAO.FuncionarioDAO" />
<jsp:useBean id="proj" class="br.com.DAO.ProjetoDAO" />
<jsp:useBean id="set" class="br.com.Setor" />
<table align="center" border="1">
<caption>
<b>Relação de Projetos</b>
</caption>
<tr>
<td>Nome:</td>
<td>Projetos:</td>
<td>Produção:</td>
</tr>
<c:forEach var="funcionarios" items="${func.lista}">
<tr>
<td><c:out value="${funcionarios.nome}" /></td>
<td><c:out value="${funcionarios.producao}"></c:out>
</td>
<td><c:forEach var="projetos" items="${proj.buscarProjetos}">
<td><c:out value="${projetos.nome}"></c:out></td>
</c:forEach>
</td>
</tr>
</c:forEach>
</table>
<c:if test="${!empty param.producao }">
<a href="cadastroproducao.jsp"><b>Incluir Produção</b> </a>
</c:if>
<center>
<a href="index.jsp">Pagina Principal</a>
</center>
Esse buscarProjetos() é que não funfa, ele tá gerando um relatorio com todos os projetos relacionados no BD. Não esta fazendo a relacão com a tabela funcionarios. Posso fazer essas duas listagens em um mesmo metodo? Com duas tabelas diferentes?
Alex,
então vou te explicar, seguindo a sua lógica, como você deve proceder:
Na sua classe de buscar os funcionários: Você tem um método chamado buscarFuncionarios (ou algo do gênero), nesse método (que acredito ser um select no banco) acrescente o join com a tabela de projetos, ou se você preferir criei um novo método.
Quando você fizer os rs.next(): Você pode colocar no objeto projeto os dados recuperados na busca e acrescentar no funcionário (Você provavelmente criou as classes Funcionário e Projeto, e na classe projeto colocou o funcionário como chave estrangeira). Acrecente esses objetos em uma lista (do jeito que você já faz agora) e mande para sua jsp. Pronto agora é só fazer como já faz antes, mas agora você pode fazer o loop nos projetos assim: projetos.funcionario.getNome, projetos.getNome (isso depende dos métodos públicos que você criou).
Entendeu agora ?
Sim Rodrigo, já tinha entendido o que estava explicando, até implementei, mas ainda não é do jeito que tinha imaginado.
Faço uma busca na tabela funcionarios, utilizando o ‘inner join’ juntamente com a tabela projetos, como mostra o codigo que mandei anteriormente. Na tabela funcionarios tenho um campo ‘cod_projetos’ que referencia uma fk da tabela projetos. Quando salvo essas infomações no resultset só recupero esse ‘cod_projetos’, um ‘int’, mas não o nome da tabela que a coluna indica, como tinha pensado por causa do inner join.
Solução: Criei um atributo na classe Funcionarios com o nome de ‘nomeProjeto’, e seto ele com o nome do projeto na ResultSet, quando faço a busca utilizando o inner join com a tabela ‘Projetos’.
Não sei se é a melhor maneira, mas foi a que encontrei.
Valeu e Obrigado. 
Alex,
se a seleção só está buscando o id do projeto e não o nome é porque você não incluiu o nome no select.
Bom a forma que você fez pode ter funcionado, mas não está correta. Lembre-se que o java é uma linguagem orientada a objetos, e você não está usando essa funcionalidade.
Tente fazer da maneira correta para ir se acostumando com as melhores práticas.
Se você realmente quiser fazer algo legal me avisa que eu te ajudo.
Desculpe a demora por responder, tá meio corrido por aqui.
Na questão de não retornar o nome do projeto que o funcionário está envolvido, estava utilizando a mesma nomeação para campos das duas tabelas, f.nome e p.nome, vi que tava duplicando esse “atributo”. Só foi solucionado quando renomeei o nome da tabela projeto para “nomeprojeto”, e setei esse atributo na classe funcionários.
Tinha a impressão que eu poderia setar tudo, os atributos das duas tabelas, em uma mesma lista, mas não consegui visualizar essa opção. Isso seria o certo? Criaria outra lista para isso e como setaria os valores para um relatório na jsp?
Tudo bem?
Agora desculpe a minha demora.
Vou colocar um exemplo de como eu iria fazer essa seleção e como iria enviar para o jsp. Bom vamos lá.
[code]/* Model */
String query = “select f.idFuncinario,
p.idProjeto,
f.nome as nomeFuncionario,
p.nome as nomeProjeto
from Funcionario f
inner join Projeto p on (p.idProjeto = f.idProjeto)”;
ResultSet rs = stm.executeQuery(query);
Funcionario func = new Funcionario();
Projeto proj = new Projeto();
ArrayList<Funcionario> funcionarios = new ArrayList<Funcionario>();
while(rs.next()) {
func.setIdFuncionario(rs.getInt("idFuncinario"));
func.setNome(rs.getInt("nomeFuncionario"));
proj.setIdProjeto(rs.getInt("idProjeto"));
proj.setNome(rs.getInt("nomeProjeto"));
func.setProjeto(proj);
funcionarios.add(func);
}
/* JSP */
<c:forEach var=“func” items="${funcionarios}">
<tr>
<td><c:out value="${func.nome}" /></td>
<td><c:out value="${func.producao}"></c:out></td>
<td><c:out value="${func.projeto.nome}"></c:out></td>
</tr>
</c:forEach> [/code]
Acho que seria, isso. Agora é só alterar para resolver o seu problema.