Dúvida de lógica para preencher campo [RESOLVIDO]

Pessoal, tenho uma parte do meu método onde consulto no BD um resultado… só que este resultado pode vir com mais de uma linha.

O caso é que as linhas que retornam, vem identicas só mudando um campo, pois é o campo fonte (origem do dado inserido) e não sei uma solução para caso ele tenha mais de um resultado para a mesma consulta, ele juntar no campo do excel gerado com as duas informações no mesmo campo.

[code]try {

		conn = ConnectionManager.obterConexao();
		ps = conn.prepareStatement(SQL_PESQUISA_CARD);
		ps.setString(1, Card);

		ResultSet rs = ps.executeQuery();

		while (rs.next()) {

			dispositivo = rs.getString("Dispositivo");
			codTecnologia = rs.getString("CodTecnologia");

fonte = rs.getString(“Fonte”);

			criarExcel.CriarPlanilhaColetiva(dispositivo, codTecnologia, fonte); // AQUI ENVIA PARA A CLASSE QUE GERA O EXCEL
		}

	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		ConnectionManager.fecharConexao(conn, null, ps);
	}[/code]

Ahn?
E o que isso tem a ver com o DAO?

É que envolve essa consulta no BD… e o envio para a classe que cria o excel… acho que vou arrumar o título

Você obtém os dados, através do DAO, só não sabe o que fazer com eles. Isso não tem relação com o DAO, mas com a lógica a ser aplicada na construção do relatório.

isso… é que não ficou tão claro minha dúvida… pois disso dúvida de lógica COM o Dao e não NO DAO, rsrs… mas alterei o título…

É assim, geralmente a consulta gera duas linhas, só com esse campo fonte diferente, ai queria saber como faço para caso aconteça isso, eu coloco os dois resultados do campo fonte no mesmo campo do excel.

Ninguém???

Não consigo imaginar uma lógica para isso…

Só sei que teria que ver um registro e verificar o próximo antes de chamar o método para criar o arquivo excel…

Mas o como fazer… não sei

Qual é o motor de BD?

O Oracle tem o comando LISTAGG que me parece que é o que tu precisas.

É postgresql…

Desde o 9.0 existe o STRING_AGG.

valeu amigo vou dar uma estudada nisso pq nunca usei…

se puder me dar um exemplo simples tbm agradeço…

obrigado

não to conseguindo resolver… alguém ai pode me dar uma outra luz… no BD ou na Aplicação?

Como tentaste?

Não tenho postgres para testar mas deverá ser algo assim…

SELECT dispositivo, codtecnologia, string_agg(fonte, ',' ORDER BY fonte) as fonte FROM <TABELA>;

É que é assim pmlm

Tenho dois resultados… com fontes diferentes… e um destes resultados possui data mais recente… então queria pegar o que tem maior data…

tabela A (SIMCard que possui um número X e uma Data)

tabela B (Dispositivo que possui um número Y e uma Data)

tabela C (SIMCardDispositivo que possui o X e o Y para vincular as tabelas)

Quero ver qual das tabelas A ou B, está com a data maior, e desconsiderar o menor… e não sei como deixar uma das datas no select…

O que tu queres é algo assim então

SELECT c.*, CASE WHEN a.data > b.data THEN a.data ELSE b.data END AS data 
FROM SIMCardDispositivo c, Dispositivo b, SIMCard a
WHERE c.x = a.x AND c.y = b.y

pmlm cara é quase isso… rsrsrs…

Nunca usei esse tipo de lógica em BD (com condição else) mas é quase isso… só não sei como fazer esse bendito SELECT

================================

Eu fiz assim:

[code]
SELECT SIMCardDispositivo.*, CASE WHEN SIMCard.dataAlteracao > Dispositivo.dataAlteracao THEN SIMCard.dataAlteracao ELSE Dispositivo.dataAlteracao END AS dataAlt,

(SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Processamento.CodigoFonteDados) AS Fonte,

FROM SIMCard LEFT JOIN SIMCardDispositivo ON SIMCardDispositivo.SIMCard_Numero = SIMCard.Numero
LEFT JOIN Dispositivo ON Dispositivo.Numero = SIMCardDispositivo.Dispositivo_Numero
INNER JOIN Linha ON Linha.Numero = SIMCard.NumeroLinha
LEFT JOIN Processamento ON (Processamento.Codigo = SIMCard.CodigoProcessamento OR Processamento.Codigo = Dispositivo.CodigoProcessamento)
WHERE SIMCard.Numero = 89550232280000892281 [/code]

Só que eu tenho esse campo chamado “Fonte” Que faço um select… E este campo possui dois valores distintos… e mesmo usando essa validação das datas ele traz dois valores…

Era melhor colocar essa condição da data no WHERE… e não no SELECT…

É por causa desse campo que to tomando na cabeça… tenho que pegar o último registro inserido, e trazer a fonte dele e consequentemente a data que foi inserido…

valeu pela força que está me dando

Consegui juntando a fonte na mesma linha com o que vc tinha me passado…

string_agg((SELECT Dominio.Nome FROM Dominio WHERE Dominio.Codigo = Processamento.CodigoFonteDados), '/' ORDER BY CodigoFonteDados) AS Fonte, ... CASE WHEN SIMCard.dataAlteracao > Dispositivo.dataAlteracao THEN SIMCard.dataAlteracao ELSE Dispositivo.dataAlteracao END AS dataAlt

Valeu…