selectOneMenu - Após carregar os itens, selecionar um padrão

Bom dia,

trabalho com Delphi mas no momento estamos sem programador Java na empresa. Então, estou tentando cuidar do portal de vendas em Java.
Na faculdade aprendi um pouco de Java SE mas estou meio perdido nesse projeto Web.
Então, peço desculpas se acaso não for tão claro ou não fornecer todas as informações necessárias.
Peço um pouco de paciência :oops:

Bem, indo direto ao assunto…

  • Tenho um inputText no qual seleciono um cliente (clico em um botão e é aberto uma janelinha para selecionar o cliente). O inputText recebe o cliente selecionado.
  • Tenho um selectOneMenu que lista todas as tabelas de preço cadastradas.

O que necessito é que, o selectOneMenu, além de listar as tabelas cadastradas, selecione a tabela default do cliente selecionado.
Procurei pela internet e não encontrei nada que atribuisse um valor padrão.
Tentei na minha classe que busca as tabelas de preço, após adicionar todas, procurar a tabela default do cliente, remove-la e depois adicioná-la novamente no índice 0.
Não deu certo. Acho que a minha dinâmica estava errada (além de achar que isso é uma POG)

Esse é o meu selectOneMenu:

<h:selectOneMenu id="tabela" value="#{infoPedido.tabelaPreco}"
	styleClass="tamanho2" style="margin: 5px 0 0 0;">
	<a4j:support event="onchange" reRender="d1, d2, d3" />
	<s:selectItems value="#{listaCliente.tabelaOrdenada}" var="c"
	label="#{c.nome}" />
	<s:convertEntity />
</h:selectOneMenu>

Essa é minha classe:

        public List<TabelaPreco> getTodasTabelas() {
		String textoSql;
		textoSql = "select t.id.tabelaPreco from TabelaPreco_Filial t "
				+ "where t.id.filial.id = :cFilial and t.id.tabelaPreco.status = 'ATIVO'";
		return entityManager.createQuery(textoSql).setParameter("cFilial",
				webUsuarioFilial.getFilial().getId()).getResultList();
	}

	public List<TabelaPreco> getTodasTabelasdoVendedor() {
		String textoSql;

		textoSql = "select t.id.tabelaPreco from TabelaPreco_Vendedor t  "
				+ "where t.id.vendedor.id = :cVendedor and t.id.tabelaPreco.status = 'ATIVO'";

		return entityManager.createQuery(textoSql).setParameter("cVendedor",
				infoPedido.getVendedor().getId()).getResultList();
	}

	public List<TabelaPreco> getTabelaFiltrada() {
		try {

			System.out.println("chamou getTabelaFiltrada");

			Integer tabelaPadrao = paramVendas.getTabelaPadrao();

			List<TabelaPreco> todasTabelas = new ArrayList<TabelaPreco>();

			if (webUsuarioFilial.getFilial().getEmpresa()
					.getFiltraTabelaporVendedor().equals("NAO")) {
				todasTabelas = getTodasTabelas();
			} else {
				todasTabelas = getTodasTabelasdoVendedor();
			}

			List<TabelaPreco> tabelasOrdenadas = new ArrayList<TabelaPreco>();

			for (TabelaPreco t : todasTabelas) {
				if (t.getId() == tabelaPadrao) {
					tabelasOrdenadas.add(t);
				}
			}

			for (TabelaPreco t : todasTabelas) {
				if (!tabelasOrdenadas.contains(t)) {
					tabelasOrdenadas.add(t);
				}
			}
			

			return tabelasOrdenadas;
		} catch (Exception e) {
			e.printStackTrace();
			return new ArrayList();
		}

	}

	public List<TabelaPreco> getTabelaOrdenada() {
		System.out.println("chamou getTabelaOrdenada");
		List<TabelaPreco> todas = getTabelaFiltrada();
		List<TabelaPreco> ordenada = new ArrayList<TabelaPreco>();

		if (webUsuarioFilial.getFilial().getEmpresa()
				.getFiltraTabelaporVendedor().equals("NAO")) {
			if (infoPedido.getTabelaPreco() != null) {
				ordenada.add(infoPedido.getTabelaPreco());
			}
		}

		for (TabelaPreco t : todas) {
			if (!ordenada.contains(t)) {
				ordenada.add(t);
			}
		}

		return ordenada;
	}

Desde já obrigado

Bom, pra falar a verdade eu não entendi direito…

Vc quer que no seu combo (selectOneMenu) apareçam valores default além dos que são pesquisados no banco?
Ou vc quer criar uma tabela que tenha uma coluna de Cliente e outra de Preços?

Olá Natália!

Eu gostaria que exibisse no meu combobox todas as tabelas de preço que estão no banco e, após selecionar o cliente, automaticamente selecionar a tabela padrão do mesmo.

Exemplo:
O cliente ALAN tem a tabela de preço CLIENTES-PR como padrão.
No banco de dados existe as tabelas: CLIENTES-MG, CLIENTES-SP, CLIENTES-PR e CLIENTES-RJ

Atualmente, o combobox exibe todas as tabelas citadas acima e posiciona no primeiro registro (CLIENTES-MG)
Mas, o que eu queria era que, após selecionar o cliente ALAN, no combobox fosse posicionado no item CLIENTES-PR já que é a tabela padrão deste.

No próprio método que lista as tabelas de preço já é chamado um método que retorna o ID da tabela parametrizada no cliente.

Bom, então o esquema é na pesquisa no Banco de Dados…
Se vc não selecionou o cliente, vc executa a query que pesquisa todas as tabelas de preços…
Se tiver um cliente já selecionado, vc pesquisa apenas a tabela de preços correspondente.

Daí vc retorna para o sel selectOneMenu a lista populada com todas ou só uma tabela…

Acho que ainda não ajudei muito… rs
Vou tentar um exemplo aqui…

Obrigado Natália mas, se entendi sua solução, não é exatamente o que precisava.

Mesmo quando um cliente for selecionado, ainda sim deve exibir todas as tabelas de preço.
A diferença é que agora será selecionado a tabela de preço padrão do Cliente.
No combobox o item selecionado é sempre o primeiro.

Imagine um combobox (em negrito é o item posicionado):
Por padrão meu combobox vem assim:

CLIENTE-SP
CLIENTE-RJ
CLIENTE-PR
CLIENTE-MG

Eu quero que o resultado seja assim:
CLIENTE-SP
CLIENTE-RJ
CLIENTE-PR
CLIENTE-MG

Espero não ter complicado mais o entendimento da dúvida
rsrs

Ahhh blzz… Agora entendi (acho)… rs
Na hora de montar sua lista, vc tem que pegar o item que vc quer que fique em primeiro e daí usa o método

lista.add(index, objeto); 
//index é a posição onde vc deseja adicionar, no caso o primeiro, então vc deve passar 0 (zero).. 
//objeto é o que vc quer adicionar a lista na primeira posição

E aí, para não ficar duplicado o valor, vc pode usar o método

lista.remove(index);
//index é á posição que vc deseja remover o valor que adicionou a primeira posição

Bom, era isso mesmo que queria?
Ou me embananei de novo?

Fiz um exemplo aqui, se vc executar esses códigos, vai ver funcionando.
São duas classes, uma que define o modelo do combo e a outra que executa.

import java.util.ArrayList;
import java.util.List;


public class TesteLista {

	public static void main(String[] args) {
		
		ItemCombo combo = new ItemCombo();
		List<ItemCombo> lista = new ArrayList<ItemCombo>();
		
		//gerando uma lista exemplo
		for(int i=0; i<4; i++){
			ItemCombo item = new ItemCombo();
			item.setCodigo(i);
			item.setDescricao("CLIENTE-"+i);
			lista.add(item);
		}
		//imprime o combo da forma que vai aparecer na sua tela
		combo.imprimeLista(lista);
		
		
		//agora troca as posições
		lista.add(0, lista.get(2));//coloca o CLIENTE-2 para a primeira posição
		lista.remove(3);
		
		//imprime a lista reordenada
		combo.imprimeLista(lista);
		
	}

}
import java.util.List;


public class ItemCombo {

	private int codigo;
	private String descricao;
	
	public void imprimeLista(List<ItemCombo> lista){
		for(int i=0; i<lista.size(); i++){
			System.out.println(lista.get(i).getDescricao());
		}
		System.out.println("\n\n\n\n");
	}
	
	/**
	 * @return the codigo
	 */
	public int getCodigo() {
		return codigo;
	}
	/**
	 * @param codigo the codigo to set
	 */
	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}
	/**
	 * @return the descricao
	 */
	public String getDescricao() {
		return descricao;
	}
	/**
	 * @param descricao the descricao to set
	 */
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	
	
}

A saída é

//lista normal
CLIENTE-0
CLIENTE-1
CLIENTE-2
CLIENTE-3

//lista reordenada
CLIENTE-2
CLIENTE-0
CLIENTE-1
CLIENTE-3

Olá Natália, obrigado pela ajuda =]
Então, eu já havia tentado isso e não deu certo.
Mas resolvi tentar novamente e deu o seguinte erro:

HTTP ERROR 500

Problem accessing /pSeven/pedido/novoPedido.seam. Reason:

/pedido/novoPedido.xhtml @316,29 value="#{listaCliente.tabelaOrdenada}": java.util.ConcurrentModificationException

Veja como ficou meu método:
Adicionei aquele último laço antes do return.

        public List<TabelaPreco> getTabelaOrdenada() {
		System.out.println("chamou getTabelaOrdenada");
		List<TabelaPreco> todas = getTabelaFiltrada();
		List<TabelaPreco> ordenada = new ArrayList<TabelaPreco>();

		Integer tabelaPadrao = paramVendas.getTabelaPadrao(); //Aqui eu pego o ID da tabela parametrizada no cliente
		
		if (webUsuarioFilial.getFilial().getEmpresa()
				.getFiltraTabelaporVendedor().equals("NAO")) {
			if (infoPedido.getTabelaPreco() != null) {
				ordenada.add(infoPedido.getTabelaPreco());
			}
		}

		for (TabelaPreco t : todas) {
			if (!ordenada.contains(t)) {
				ordenada.add(t);
			}
		}
		
		//A partir daqui eu modifiquei

		int indice = -1;
		for (TabelaPreco t : ordenada ){
			indice++;
			if (t.getId() == tabelaPadrao){ //Aqui comparo se a tabela atual é a mesma parametrizada no cliente
				TabelaPreco itemPadrao = new TabelaPreco();
				itemPadrao = t;	//crio uma tabela que é a mesma parametrizada no cliente. 			
				ordenada.remove(indice); //Removo o item atual
				ordenada.add(0,itemPadrao); //Adiciono a tabela que criei no indice 0
			}
		}
		
		
		return ordenada;
	}

Acredito que o erro seja porque já existe um item no índice zero não é?

Alterei algumas coisas e consegui trazer corretamente.
Meu problema agora é o seguinte:

Imagine que na busca padrão o combobox venha preenchido com os seguintes itens (negrito é o item selecionado):
TABELA-SP
TABELA-RJ
TABELA-PR
TABELA-MG

Ao selecionar um cliente com a TABELA-PR padrão, a nova consulta me traz assim:
TABELA-PR
TABELA-SP
TABELA-RJ
TABELA-MG

Notem que, a ordem veio como eu queria mas, o item que antes estava selecionado, apesar de ter caído para a segunda posição, continua selecionado.
O que fazer?
Tentei dar um reRender mas não deu certo