[Lógica] Esse tá dificil

6 respostas
_fs

Olá, boa tarde.

Situação:

  • tenho uma consulta que me retorna uma quantidade X resultsets diferentes, com quantidade X de registros e colunas em cada um. Ex:
ResultSet 1:
coluna1	coluna2	coluna3
abc			abc2		abc3
abc4			abc5		abc6

ResultSet 2:
coluna1
abc
abc2
abc3

ResultSet 3:
coluna1	coluna2	coluna3	coluna4
abc			abc2		abc3		abc4
  • preciso mostrar estes dados usando VTL numa página com o seguinte layout:
ResultSet1:
coluna1: abc, acb4
coluna2: abc2, abc5
coluna3: abc3, abc6

ResultSet2:
coluna1: abc, acb2, abc3

ResultSet3:
coluna1: abc
coluna2: abc2
coluna3: abc3
coluna4: abc4

Até onde fui:
Consigo pegar todo os resultsets e todas as colunas, adicionando-os num ArrayList. Consigo mostrar as colunas na ordem certa do jeito que eu preciso. Estes códigos abaixo funcionam muito bem com Consultas que retornam apenas um resultset:

sp = conn.prepareCall( storedproc );
			sp.execute();

			do
			{
				rs = sp.getResultSet();
				rsmd = rs.getMetaData();
				while( rs.next() )
					for( int i = 1; i <= rsmd.getColumnCount(); ++i )
						sRs.add( rs.getString ( i ) );
				
				for( int i = 1; i <= rsmd.getColumnCount(); i++ )
					sColumNames.add( rsmd.getColumnLabel( i ) );
			} while ( ( sp.getMoreResults() ) || ( sp.getUpdateCount() != -1) );

E na página VM:

<table>
		#set( $size = $colsize - 1 )
		#foreach( $i in [1..$size] )
			<tr>
				<td>$!action.getCols( $i ):</td>
				<td>$!action.getResultset( $i )</td>
			</tr>
		#end
	</table>

Problema:
Não consigo fazer com que os registros (linhas nas colunas) fiquem respectivos às suas colunas.

O que já tentei:
Arrays bidimensionais, arraylists dentro de arraylists, galinhas pretas.

Pergunta:
Há como fazer isso que eu preciso de maneira elegante?

Infinitos obrigados a todos que chegaram até aqui :smiley:

6 Respostas

Rafael_Steil

tenta isso:

class ColumnData {
	private HashMap values = new HashMap();

	public void add(String name, String value) {
		if (!this.values.containsKey(name)) {
			this.values.put(name, new ArrayList());
		}

		((ArrayList)this.values.get(name)).add(value);
	}

	public Iterator getNames() {
		return this.values.keySet().iterator();
	}

	public ArrayList getValuesByName(String name) {
		return (ArrayList)this.values.get(name);
	}
}

class RSRecord {
	private ArrayList recordsList = new ArrayList();

	public void addColumn(ColumnData cd) {
		this.recordsList.add(cd);
	}

	public ArratyList getRecords() {
		return this.recordsList;
	}
}

...
ArrayList rsRecords = new ArrayList();

do {
	rs = sp.getResultSet(); 
	rsmd = rs.getMetaData();
	RSRecord record = new RSRecord();
	ColumnData cd = new ColumData();

	while (rs.next()) {
		for (int i = 1; i <= rsmd.getColumnCount(); i++) {
			cd.add(rsmd.getColumnLabel(i), rs.getString(i));
		}	
	}

	record.addColumn(cd);
	rsRecords.add(record);

} while (( sp.getMoreResults() ) || ( sp.getUpdateCount() != -1) );
...

...
#foreach ($rs in $rsRecords)
<table>
	#foreach ($cd in $rs.records) 
	<tr>
		#foreach ($cName in $cd.names)
			<td>
			$cName: 
				#foreach ($cValue in $cd.valuesByName($cName))
				$cValue, 
				#end
			</td>
		#end
	</tr>
	#end
</table>
#end
...

Nao testei, mas deve servir como ideia…

Rafael

cv1

Eba, mais uma brejinha pro cv :D

#macro(mostraResultSet1 $n1 $col1 $n2 $col2 $n3 $col3)
  #mostraColuna($n1 $col1)
  #mostraColuna($n2 $col2)
  #mostraColuna($n3 $col3)
#end
#macro(mostraResultSet2 $n1 $col1)
  #mostraColuna($n1 $col1)
#end
#macro(mostraResultSet3 $col1 $col2 $col3 $col4)
  #mostraColuna($n1 $col1)
  #mostraColuna($n2 $col2)
  #mostraColuna($n3 $col3)
  #mostraColuna($n4 $col4)
#end

O segredo, claro, tah no mostraColuna:

#macro(mostraColuna $nome $col)
  <tr>
    <td>$nome</td>
    #foreach($col in $cols)
    <td>$col</td>
    #end
  </tr>
#end

$col é uma List, Set ou Array com os dados, e representa uma coluna no ResultSet. Separar um ResultSet em n Lists diferentes, um por coluna, fica como licao de casa :D

_fs

Nossa … pqp vocês

marcando um porsche na lista de débito do forum

Obrigado Rafael e CV, já vou testar :smiley:

cv1

Eu agradeco a gentileza, mas fica pro Paulo, q dirige q nem uma tiazona de 60 anos… eu tenho um Ka e ja quase me mato :lol:

_fs

hehehe

vai demorar só para eu entender a resposta de ambos, depois eu posto o feedback aqui tá bem?

Muitíssimo obrigado novamente =*

_fs

Funcionou redondo Rafael :smiley:
Só precisei fazer uma gabiarrinha para passar os valores da classe de conexão para a classe de ação :smiley:

Agora pra view vou usar a solução do cv :smiley:

Criado 5 de fevereiro de 2004
Ultima resposta 5 de fev. de 2004
Respostas 6
Participantes 3