Duvidas banco de dados

21 respostas
P

como fazer para os itens de uma coluna no banco aparecerem em varias colunas em uma jtable,tipo no banco eu tenho:
disciplina|modulo|atividade
port |1 |trabalho
port |1 |prova…

dai eu qria q na jtable ficasse

disciplina|modulo|atividade1|atividade2…
port |1 |trabalho |prova

tem como fazer isto?
obg

21 Respostas

Nicolas_Fernandes

paty_trind:
como fazer para os itens de uma coluna no banco aparecerem em varias colunas em uma jtable,tipo no banco eu tenho:
disciplina|modulo|atividade
port |1 |trabalho
port |1 |prova…

dai eu qria q na jtable ficasse

disciplina|modulo|atividade1|atividade2…
port |1 |trabalho |prova

tem como fazer isto?
obg

Oi, Paty.

Crie o seu próprio TableModel, definindo quais dados aparecerão em qual coluna, e tudo o mais. Siga o link na minha assinatura para melhores informações!

drsmachado

Quando você realiza a consulta no banco de dados, armazene os resultados em uma classe (normalmente a chamada bean, cuja função é “segurar” os dados em memória durante a execução de um programa ou trecho de programa).
Por ex:

public class TelefoneBean{
 private String contato;
 private int ddd;
 private long numero;

 public void setContato(String contato){
  this.contato = contato;
 }

 public getContato(){
  return contato;
 }
 public void setDdd(int ddd){
  this.ddd = ddd;
 }

 public getDdd(){
  return ddd;
 }
 public void set(long numero){
  this.numero = numero;
 }

 public getNumero(){
  return numero;
 }
}

e na classe de persistência

ResultSet res ...
TelefoneBean tel = new TelefoneBean();
while(res.next()){
  tel.setContato(res.getString("coluna_de_contato"));
  tel.setDdd(rs.getInt("coluna_ddd"));
}

E assim você pode utilizar os dados da bean em qualquer parte do código

P

drsmachado
tipo eu faço a consulta e crio uma casse chamada bean ou q extende algo bean é q bah não conheço isto :oops:
e Nicolas Fernandes to lendo os topicos mas na verdade o q eu qro é pegar os valores de uma coluna e criar varias outras colunas na jtable,eu vou ter q redimensionar tmbm mas a prioridade é o resultado não sei como fazer isto eu ate to usando o default table model é q tipo eu tava fazendo assim selecionava disciplina,modulo e atividade do banco e criava a tabela a partir disto mas ficava mto feia a jtable ficava mais ou menos assim
disciplina|modulo|atividade
port |1 |trabalho
port |1 |prova

qria q ficasse daquele outro formato q disse antes =(
obg pela ajuda

P

drsmachado
tah tipo não entendi mto bem o uso de bean isto seria para q eu pudesse alterar o resultado da pesq.do banco em tempo de execução?
obg

Nicolas_Fernandes

paty_trind:
drsmachado
tipo eu faço a consulta e crio uma casse chamada bean ou q extende algo bean é q bah não conheço isto :oops:
e Nicolas Fernandes to lendo os topicos mas na verdade o q eu qro é pegar os valores de uma coluna e criar varias outras colunas na jtable,eu vou ter q redimensionar tmbm mas a prioridade é o resultado não sei como fazer isto eu ate to usando o default table model é q tipo eu tava fazendo assim selecionava disciplina,modulo e atividade do banco e criava a tabela a partir disto mas ficava mto feia a jtable ficava mais ou menos assim
disciplina|modulo|atividade
port |1 |trabalho
port |1 |prova

qria q ficasse daquele outro formato q disse antes =(
obg pela ajuda

Paty,

Na verdade, o que o drsmachado quis dizer foi o seguinte:
Você tem uma tabela no banco de dados. Para trabalhar com ela em memória de maneira prática, existem as conhecidas classes Bean. Elas servem como uma representação das suas tabelas no Banco de Dados. Por exemplo, você tem no seu BD uma tabela chamada Alunos, com ID, Nome e Email. Isso ficaria representado como em memória? Com uma classe Bean!

public class Aluno { // ou AlunoBean, como preferir

   private Long ID;
   private String nome;
   private String email;

   // getters e setters
}

Assim, você pode criar coleções dos dados da tabela em memória e trabalhar com eles através das classes Bean! Legal, né?
É, com relação a um modelo dinâmico, onde você adiciona colunas dependendo dos dados que você tiver, não tenho ideia de como fazer. Vamos esperar alguém que tenha um conhecimento melhor sobre isso pra nos tirar essa dúvida!

P

Nicolas Fernandes
obrigada pelas explicações bah isto é muito legal!
mas eu tmbm não cmo implementar isto :oops:
vamos esperar
=)

P

pesquisando encontrei este topico do guj
http://www.guj.com.br/java/101508-classe-java-bean
vou ler o link q tm ali

drsmachado

Paty, é muito complicado e nada produtivo ir setando os valores dos campos de tela na consulta.
O ideal é utilizar uma classe de apoio (ou uma collection como ArrayList ou Map) que permita manter os dados em memória, durante a execução do aplicativo.
Uma classe bean “não faz nada” além de segurar os dados em memória até que eles sejam necessários ou o programa acabe.
Quanto ao formato que você precisa.
Bom, embora muito criticado, o DefaultTableModel permite que você insira ou remova linhas e colunas.

String colName = "Nome_da_nova_coluna";
String[] colData = { "Dado 1", "Dado 2", "Dado 3"};
DefaultTableModel dtm = (DefaultTableModel)myTable.getModel();
dtm.addColumn(colName, data);
P
hmmm bah não pensei q fosse tão complicado :shock: vamos continuar o usando o default table model então :D na verdade eu ja estou usando nesta aplicação então me corrijam se eu estiver errada mas acho q da pra fazer o seguinte selecionar a disciplina e o modulo usando o distinct e construir a jtable dai depois eu seleciono as atividades relacionadas ao mesmo e dai vou add colunas na jtable com este conteudoconforme o cod q tu disseste drsmachado! da para fazer isto? ficaria mais ou menos assim
private void geraTabela()
	{
		try
		{
			Vector<String> cabecalho = new Vector<String>();
			Vector<Vector> linhas = new Vector<Vector>();
			
			System.out.println("select distinct disciplina,modulo from nota where rc_aluno='"+ t0.getText() +"'");
			resultado = comando.executeQuery("select distinct disciplina,modulo from nota where rc_aluno='"+ t0.getText() +"'");
			resultado.next();
			final ResultSetMetaData rsmd = resultado.getMetaData();
			for( int i = 1; i <= rsmd.getColumnCount(); ++i )
				cabecalho.addElement( rsmd.getColumnName( i ) );
			do
			{
				Vector<Object> linhaAtual = new Vector<Object>();
				for ( int i = 1; i <= rsmd.getColumnCount(); i++ )
				{
					switch( rsmd.getColumnType(i))
					{
					case Types.VARCHAR:
						linhaAtual.addElement(resultado.getString(i));break;
					case Types.TIMESTAMP:
						linhaAtual.addElement(resultado.getDate(i));break;
					}

				}
				linhas.addElement(linhaAtual);

			}
			while (resultado.next() );
			modelo=new DefaultTableModel(linhas,cabecalho);
			table = new JTable(modelo);
dai depois ou antes eu acho neh eu pesquiso as atividades jogo num vetor e vou add colunas com este conteudo mas como eu faço isto?e tipo isto seria depois depois de inserir as linhas e colunas no default? mtoooo obrigada
P

drsmachado
eu fiz do jeito q tu disseste e funcionou direitinho mas qria saber se da para mim usar um for para preencher,criar colunas com os valores do banco?
é q no momento estou fazendo na mão mas o problema é q nem todas as disciplinas tm a mesma qntde d atividades isto varia de acordo cm a c.h delas por isto pensei num for,é possivel?
agora estou faznd assim cnforme tu disseste

String col="atv1";String cold[]={vet[0][2]}; modelo.addColumn(col,cold); String col1="atv2";String cold1[]={vet[1][2]}; modelo.addColumn(col1,cold1);
e ta dando certinho so pensei num for para otimizar isto

P
eu acho q eu deveria fazer algo mais ou menos assim
/**for(int i=0;i<vet.length;i++)
 * if(vet[i][2]!=null)//atividade
 * if(vet[i][0].equals(table.getModel().getValueAt(table.getSelectedRow(),0 ) && vet[i][1].equals(table.getModel().getValueAt(table.getSelectedRow(),1 )))
 * pesquisar no banco as atividades referentes a esta disciplina e criar uma nova coluna e linha cm este resultado**/
mas agora q a tab ta assim disc|mod|at1 |at2 port|1 |trab |prova bio |1 |prova |teste cmo q eu posso fazer para colocar a ativdade na linha da disciplina correta? cmo eu faço para se tenho trab e prova d port inserir na tabela onde a disciplina da linha for port? obg
Nicolas_Fernandes

Oi, Paty.

Estive pensando aqui…
Porque você não faz sua tabela da seguinte maneira:

  1. Você descobre qual o máximo de colunas que essa tabela terá e todos os nomes delas.
    Por exemplo:
    Para português, eu tenho Atividade em Sala 1, Atividade em Sala 2, Prova 1.
    Para biologia, eu tenho Atividade em Sala 1, Atividade em Sala 2, Prova 1, Teste Prático 1.
    Para matemática, eu tenho Atividade em Sala 1, Prova 1, Prova 2.

Beleza, eu crio minha JTable com todas essas colunas existentes, sem repetição.

Matéria   |   Atividade em Sala 1   |   Atividade em Sala 2   |   Prova 1   |   Prova 2   |   Teste Prático 1

Agora, como eu terei uma coleção de objetos das matérias, eu preencho a coluna se existir valor para a matéria!
Daí você me pergunta: “Mas como assim?”

Ficaria algo assim, preenchida:

Matéria       |   Atividade em Sala 1   |   Atividade em Sala 2   |   Prova 1   |   Prova 2 
Português                   X                        X                   X                      
Biologia                    X                        X                   X
Matemática                  X                                                          X

(Fiz com uma coluna a menos, “Teste Prático 1”, para caber e ficar bonitinho na tela.)
Onde, onde estão os “X”, seriam os respectivos dados que você quer.
O que acha dessa abordagem?

P

tah do jeito q tu disseste eu achei legal tipo ficou mais facil att d visualizar mas acho q o problema é o jeito q eu salvo estes dados no banco tipo desta maneira q tu mostraste tu ja salvou no banco akelas colunas neh?
eu tava tetando criar novas colunas na jtable e novas linhas aa partir do resul do banco mas ta dando um trabalhao e nao to cnseguindo fazer direito cm Vector ta mais ou menos assim

Vector<String> c = new Vector<String>(); Vector<Vector> l = new Vector<Vector>(); Vector<Object> la= new Vector<Object>(); String v[]={"at1","at2","at3","at4"}; for(int i=0;i<vet.length;i++) resultado = comando.executeQuery("select atividade from nota where rc_aluno='"+ t0.getText() +"' and disciplina='"+vet[i][0]+"'and modulo='"+vet[i][1] +"'"); while(resultado.next()) { la.add(resultado.getString(1)); } l.add(la); for(int i=0;i<v.length;i++) if(v[i]!=null) c.add(v[i].toString()); modelo.addColumn(c,l);
olha cmo ta errado meu cod pq olha o jeito q ficou meu print=[

tah tipo se eu for fazer desta maneira q tu falou eu teria q modificar a maneira q salvo os itens neh?


P

barbaridade mudei o cod. um pouco

Vector<String> c = new Vector<String>(); Vector<Vector> l = new Vector<Vector>(); Vector<Object> la= new Vector<Object>(); String v[]=new String[25]; for(int j=0;j<v.length;j++) { v[j]=new String("atv"+j); } for(int i=0;i<vet.length;i++) { System.out.println("select atividade from nota where rc_aluno='"+ t0.getText() +"' and disciplina='"+vet[i][0]+"'and modulo='"+vet[i][1] +"'"); resultado = comando.executeQuery("select atividade from nota where rc_aluno='"+ t0.getText() +"' and disciplina='"+vet[i][0]+"'and modulo='"+vet[i][1] +"'"); while(resultado.next()) { la.add(resultado.getString(1)); } l.add(la); System.out.println("elementos d l "+l.toString()); for(int k=0;k<v.length;k++) if(v[k]!=null) c.add(v[k].toString()); modelo.addColumn(c,l); }
para tentar arrumar mas acho q piorei as coisa olhem cmo ficou o print


P

tipo os vetores q eu to usando pra criar as linhas e colunas colocam todos os dados em cada linha e coluna q esta sendo criada cmo eu faço para parar isto e colocar apenas um item em cada linha e coluna?
obg

Nicolas_Fernandes

Não sei como seu Banco de Dados está mapeado, mas penso que está assim: o aluno pode pertencer a um módulo. Este módulo contém uma ou mais atividades. Certo?

Se for assim, do jeito que eu falei, ficaria algo assim:

  1. Eu tenho meu POJO Aluno, que contém um objeto Modulo que, por sua vez, possui uma coleção de Atividade.
public class Aluno {

   private Long ID;
   private String nome;
   private Modulo modulo;
}

public class Modulo {

   private Long ID;
   private String nome;
   private List<Disciplina> disciplinas;
}

public class Disciplina {

   private Long ID;
   private String nome;
   private List<Atividade> atividades;
}

public class Atividade {

   private Long ID;
   private String nome;
}

Você tem o DAO de cada classe, mas eu vou fazer o do aluno pra exemplificar:

public class AlunoDAO {

    public Aluno pesquisarPorID(Connection connection, Long ID)
        throws SQLException {
        
        ModuloDAO modulo = new ModuloDAO();

        String query = "Select A.ID, A.Nome, A.Modulo From Alunos A Where A.ID = ?";
        PreparedStatement statement = connection.prepareStatement(query);
        ResultSet result = statement.executeQuery();

        Aluno aluno = new Aluno();
        if (result.next()) {

            aluno.setID( result.getLong("ID") );
            aluno.setNome( result.getString("Nome") );
            aluno.setModulo( modulo.pesquisarPorID(result.getLong("Modulo")) );
        }

        statement.close();
        return aluno;
    }
}

Com isso, você tem seu aluno com seu respectivo módulo e suas disciplinas, juntamente com as atividades pertencentes a ela. Correto?
Assim, você cria seu TableModel para mapear isso tudo!
Esse seu modelo deve buscar o máximo de disciplinas que você possui e setar como número de colunas. Após isso, você busca os valores referentes a ela e preenche.

Que tal assim?

P

hmm agora entendi melhor mas tipo cada aluno esta relacionado a uma disciplina e cada disciplina esta relacionada com varios modulos e cada modulo tem um numero de atividades diferentes…
ah e o q seria POJO Aluno?
obg

P

?

P

bah ainda nao consegui resolver isto!
tipo vcs podem ver q eu att to criando novas colunas mas o problema é q todas elas pegam todos os textos do vetor e o texto de todas as linhas e jogam em kda novo item criado na jtable
cmo eu posso controlar isto?isto ta acontecend por causa do for?
obg

P

gente cnsegui arrumar tipo para so criar a qntde d colunas d acordo cm o num d atv no banco
so falta arrumar para cada linha so ficar cmas atividades referentes a cada disciplina

P

alguem pode me ajudar?
como eu faço para relaionar as colunas que estão sendo criadas com as colunas q ja faziam parte da tabela?
exemplo na tabela eu tnho disciplina,modulo e agora eu estou criando a coluna de notas so q os itens desta nova coluna não se relacionam cm elas tipo eles ficam abaixo dos itens preenchidos,fica mais ou menos assim
disciplina|modulo|nota
port |1 |
quim |1 |
| |5,3//essa é a nota de port do mod 1
como eu faço para q minha jtable fique assim
disciplina|modulo|nota
port |1 |5,3
quim |1 |
| |
obg

Criado 10 de fevereiro de 2011
Ultima resposta 25 de fev. de 2011
Respostas 21
Participantes 3