Problema com Map

2 respostas
xandevieira

Boa tarde, estou fazendo um relatório onde tenho que separar por centro de custo, dentro de centro de custo por conta, dentro de conta mostrar os lançamentos.

fiz o seguinte na action (estou utilizando struts).

Map<Integer, ReportRazaoCentroCustoItem> mapPai = new LinkedHashMap<Integer, ReportRazaoCentroCustoItem>();
    		for (Iterator iter = list.iterator(); iter.hasNext();) {
				AssociaCCusto associaCCusto = (AssociaCCusto) iter.next();
				ReportRazaoCentroCustoItem reportRazaoCentroCustoItem = mapPai.get(associaCCusto.getAssociaCCustoPK().getCdCentroCusto());
				if(reportRazaoCentroCustoItem==null){
					reportRazaoCentroCustoItem = new ReportRazaoCentroCustoItem();
					reportRazaoCentroCustoItem.setFilterLivroRazaoCCustoForm(filterForm);
					reportRazaoCentroCustoItem.setAssociaCCusto(associaCCusto);
					mapPai.put(associaCCusto.getAssociaCCustoPK().getCdCentroCusto(), reportRazaoCentroCustoItem);
				}
				ReportRazaoCentroCustoItem2 reportRazaoCentroCustoItem2 = reportRazaoCentroCustoItem.getItens().get(associaCCusto.getLancamento().getContaCreditada().getCdReduzido());
				if(reportRazaoCentroCustoItem2==null){
					reportRazaoCentroCustoItem2 = new ReportRazaoCentroCustoItem2();
					reportRazaoCentroCustoItem2.setConta(associaCCusto.getLancamento().getContaCreditada());
					reportRazaoCentroCustoItem.getItens().put(associaCCusto.getLancamento().getContaCreditada().getCdReduzido(), reportRazaoCentroCustoItem2);
				}
				reportRazaoCentroCustoItem2 = reportRazaoCentroCustoItem.getItens().get(associaCCusto.getLancamento().getContaDebitada().getCdReduzido());
				if(reportRazaoCentroCustoItem2==null){
					reportRazaoCentroCustoItem2 = new ReportRazaoCentroCustoItem2();
					reportRazaoCentroCustoItem2.setConta(associaCCusto.getLancamento().getContaDebitada());
					reportRazaoCentroCustoItem.getItens().put(associaCCusto.getLancamento().getContaDebitada().getCdReduzido(), reportRazaoCentroCustoItem2);
				}
				ReportRazaoCentroCustoSubItem razaoCentroCustoSubItem = reportRazaoCentroCustoItem2.getSubItens().get(associaCCusto.getLancamento().getLancamentoPK().getCdLancamento());
				if(razaoCentroCustoSubItem==null){
					razaoCentroCustoSubItem = new ReportRazaoCentroCustoSubItem();
					razaoCentroCustoSubItem.setLancamento(associaCCusto.getLancamento());
					reportRazaoCentroCustoItem2.getSubItens().put(associaCCusto.getLancamento().getLancamentoPK().getCdLancamento(),razaoCentroCustoSubItem);
				}
			}

no relatório

for (Iterator iterItem = map.values().iterator(); iterItem.hasNext();) {
				ReportRazaoCentroCustoItem reportRazaoCentroCustoItem = (ReportRazaoCentroCustoItem) iterItem.next();
....
for (Iterator iterItem2 = reportRazaoCentroCustoItem.getItens().values().iterator(); iterItem2.hasNext();) {
					
					ReportRazaoCentroCustoItem2 reportRazaoCentroCustoItem2 = (ReportRazaoCentroCustoItem2) iterItem2.next();

ReportRazaoCentroCustoSubItem subItemAnt = reportRazaoCentroCustoItem2.getSubItens().values().iterator().next();

for (Iterator iterSubItem = reportRazaoCentroCustoItem2.getSubItens().values().iterator(); iterSubItem.hasNext();) {
						ReportRazaoCentroCustoSubItem subItem = (ReportRazaoCentroCustoSubItem) iterSubItem.next();

no primeiro “for” ok, mas no segundo da o seguinte erro:

java.util.NoSuchElementException
at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:367)
at java.util.LinkedHashMap$ValueIterator.next(LinkedHashMap.java:380)
at br.com.ctb.reports.ReportLivroRazaoGerencial.generateDetail(ReportLivroRazaoGerencial.java:128)

que eh a linha do
ReportRazaoCentroCustoSubItem subItemAnt = reportRazaoCentroCustoItem2.getSubItens().values().iterator().next();

sei la o que estou fazendo de errado.
se alguem puder me dar uma luz.

2 Respostas

fiaux

public class NoSuchElementException
extends RuntimeException

Thrown by the nextElement method of an Enumeration to indicate that there are no more elements in the enumeration.

Entenda a exception, e tente descobrir o erro no seu código, é em runtime, use o debug.

xandevieira

Alterei o nome das classes, mas debugando ele entra em todos os IFs

CentroCustoGerencial centroCusto = mapPai.get(keyCCusto);
				if(centroCusto==null){
					centroCusto = new CentroCustoGerencial();
					centroCusto.setCdCentroCusto(associaCCusto.getCentroCusto().getEmpreend().getCdEmpreendView());
					centroCusto.setNmCentroCusto(associaCCusto.getCentroCusto().getEmpreend().getNmEmpreend());
					mapPai.put(keyCCusto, centroCusto);
				}
				Integer keyCC = associaCCusto.getLancamento().getContaCreditada().getCdReduzido();
				ContaGerencial conta = centroCusto.getMapContas().get(keyCC);
				if(conta==null){
					conta = new ContaGerencial();
					conta.setConta(associaCCusto.getLancamento().getContaCreditada());
					centroCusto.getMapContas().put(keyCC, conta);
				}
				Integer keyCD = associaCCusto.getLancamento().getContaDebitada().getCdReduzido();
				conta = centroCusto.getMapContas().get(keyCD);
				if(conta==null){
					conta = new ContaGerencial();
					conta.setConta(associaCCusto.getLancamento().getContaDebitada());
					centroCusto.getMapContas().put(keyCD, conta);
				}
				Integer keyLanc = associaCCusto.getLancamento().getLancamentoPK().getCdLancamento();
				LancamentoGerencial lancamento = conta.getMapLancamentos().get(keyLanc);
				if(lancamento==null){
					lancamento = new LancamentoGerencial();
					conta.getMapLancamentos().put(keyLanc, lancamento);
				}

ao final quando especiono o centroCusto.getMapContas(),
o “values” esta null, mas o “table” contem os dados.

Criado 20 de fevereiro de 2008
Ultima resposta 25 de fev. de 2008
Respostas 2
Participantes 2