ADF: selectOneChoices carregando valor selecionado

Forum sobre a ferramenta Oracle JDeveloper, ADF, OAF, etc. (Não é destinado ao aprendeziado da Linguagem Java em geral)
Responder
rohling
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 26 Ago 2009 7:43 pm
Localização: PR

Tenho um simples exemplo de 2 selectOneChoice um de UF outro de cidade, que quando na insersão funcionan selecionando a UF no evento valueChangeListener lista as cidades daquela UF, o problema é quando fazer uma alteração do cadastro em que preciso que a UF e a cidades venham já selecionada conforme o banco; e no selectOneChoice da cidade apresente somente as cidades do respectiva UF. Aonde posso colocar a operação do meu AM para executar antes do formulário ser apresentado?

Atenciosamente
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

o atributo value do seu selectOneChoice de cidades tem q receber o valor igual ao do banco e então ele sera selecionado..


UF e cidade referente a algum cadastro certo?!.. você pode linkar com um VL o seu VO de UF e usar outro VL para linkar o seu VO de cidades e então quando abrir o seu cadastro ele(ADF BC) já vai trazer a UF e cidade referentes aquele cadastro
rohling
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 26 Ago 2009 7:43 pm
Localização: PR

Sim estaria tudo certo assim, porém gostaria que no combo das cidades apresentasse somente as cidades daquela uf. Pois creio que fazendo assim apresentará todas as cidades. Teriamos que fazer um procedimento para buscar o id da uf já cadastrada e executar a operação do meu VO cidade onde um paramatro iduf seja igual está uf. Meu maior problema é onde posso executar está operação antes de carregar o formulário?

Atenciosamente,
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

você pode fazer um metodo no AM com esta implementaçao que filtre as combos..

criar um methodAction no pageDef e criar um invokeAction para este methodAction que você criou e chamar dessa forma
RefreshCondition="#{adfFacesContext.postback == true}"
rohling
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 26 Ago 2009 7:43 pm
Localização: PR

Fiz isto agora, mas quando é carregado 1ª vez o formulário de cadastro, o médodo do AM não é executado é executado quando percorro o cadastro com o next, previous ou submit, aí ele executa 2 vezes: uma com o valor da iduf do cadastro anterior e outra com valor correspondente e quando executa não fica selecionado o combo e a seguinte mensagem do log:

Selecionar tudo

<FacesCtrlListBinding><getInputValue> ADFv: Não foi possível encontrar o item selecionado correspondente ao valor 1503201 do tipo: oracle.jbo.domain.Number na lista de valores.
meu invokeAction:

Selecionar tudo

<invokeAction id="invokeExecuteWithParams" Binds="procuraciade"
                  Refresh="ifNeeded"
                  RefreshCondition="#{adfFacesContext.postback == true}"/>
Atenciosamente,
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

estou ficando esquecido das coisas rsrsrs...

muda de true para false.. ou então nega a sua expressao atual
rohling
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 26 Ago 2009 7:43 pm
Localização: PR

Sim agora está executando mas porém quando executa o método no AM eu seto o parametro:

Selecionar tudo

 
getUfcidade1View1().setNamedWhereClauseParam("idufp",iduf);
as cidades são filtradas mas o combo não vem selecionado e a mensagem do log:

Selecionar tudo

<FacesCtrlListBinding><getInputValue> ADFv: Não foi possível encontrar o item selecionado correspondente ao valor 1503201 do tipo: oracle.jbo.domain.Number na lista de valores. 
Acho que é algum bug, pois se eu setar o valor do parametro lá mesmo no VO ele traz o valor selecionado, também se eu mandar listar todas as cidades sem usar condição where no VO ele seleciona o combo perfeitamente porém sem o filtro.
Será que temos solução para isso.....
Agradeço,

[/code]
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

então..

manda seus componentes de tela completo.
qual o tipo do atributo no VO?
rohling
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 26 Ago 2009 7:43 pm
Localização: PR

Então se faço o combo como abaixo filtra as cidades e seleciona a cidade mas seleciona a cidade errada, pois seleciona conforme a sequencia do combo, exemplo cadastrado cidade 3 seleciona o 4 campo do combo pois começa com 0.

Selecionar tudo

<af:selectOneChoice value="#{bindings.Cidadeid1.inputValue}"
                                  label="#{bindings.Ufcidade1View1.label}"
                                  shortDesc="#{bindings.Ufcidade1View1.hints.tooltip}"
                                  binding="#{backingBeanScope.backing_teste.soc3}"
                                  id="soc3" partialTriggers="cb3">
                <f:selectItems value="#{bindings.Ufcidade1View1.items}"
                               binding="#{backingBeanScope.backing_teste.si4}"
                               id="si4"/>
              </af:selectOneChoice>

No Def

	      <list IterBinding="Ufcidade1View1Iterator" ListOperMode="navigation"
          ListIter="Ufcidade1View1Iterator" id="Ufcidade1View1"
          DTSupportsMRU="true">
      <AttrNames>
        <Item Value="Nomecidade"/>
      </AttrNames>
    </list>

Se faço através de um forEach como abaixo o combo filtra e não fica selecionado e vejo pelo codigo html gerado fica com valor de sequencia começando do 0 o idcidade.

Erro:

Selecionar tudo

<FacesCtrlListBinding><getInputValue> ADFv: Não foi possível encontrar o item selecionado correspondente ao valor 5 do tipo: oracle.jbo.domain.Number na lista de valores.
<SimpleSelectOneRenderer><_getSelectedIndex> Could not find selected item matching value "5" in RichSelectOneChoice[UIXEditableFacesBeanImpl, id=soc4]
Código:

Selecionar tudo


<af:selectOneChoice value="#{bindings.Cidadeid1.inputValue}"
                                label="#{bindings.Ufcidade1View1.label}"
                                shortDesc="#{bindings.Ufcidade1View1.hints.tooltip}"
                                binding="#{backingBeanScope.backing_teste.soc4}"
                                id="soc4" partialTriggers="cb3">
              <af:forEach items="#{bindings.Ufcidade1View11.rangeSet}"
                          var="row">
                <af:selectItem label="#{row.Nomecidade}" id="si14"
                               value="#{rowa.Idibge}"/>
              </af:forEach>
            </af:selectOneChoice>
No Def:

<table IterBinding="Ufcidade1View1Iterator" id="Ufcidade1View11">
      <AttrNames>
        <Item Value="Idibge"/>
        <Item Value="Nomecidade"/>
      </AttrNames>
    </table>
Agradeço,
[/code]
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

não to entendendo... explica melhor a sua estrutura


teria duas formas:

você tem uma tela de cadastro com n informacoes para serem salvas
2 delas são UF e cidade.. nesse caso ao abrir o registro você não precisaria filtrar a segunda combo pois o registro uma vez salvo seria exibido na tela

você disse...
o problema é quando fazer uma alteração do cadastro em que preciso que a UF e a cidades venham já selecionada conforme o banco
qual a entidade principal da tela desse cadastro?

tipo assim..
AlunoVO -> Nome, matricula, UF e Cidade

Um aluno tem uma cidade.. logo você precisa ter um campo na tabela aluno para guardar a cidade.. então o que você deve fazer.. criar uma tabela para cidades e dai construir um VO para essa tabela...

no seu componente de tela você vai usar o value do campo cidade do VO de aluno.. e no seu foreach você vai usar a listagem do CidadesVO

acho q você não tera problemas assim..

se você continuar na duvida.. me comunique que eu faço um projeto de exemplo para você..
rohling
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 26 Ago 2009 7:43 pm
Localização: PR

está então:
Você diz:
você tem uma tela de cadastro com n informacoes para serem salvas
2 delas são UF e cidade.. nesse caso ao abrir o registro você não precisaria filtrar a segunda combo pois o registro uma vez salvo seria exibido na tela
Sim concordo vai listar Todas as cidades no combo pois realmente tenho uma tabela cidade que faz referencia ao meu cadastro de pessoa e se por exemplo abrir o cadastro de pessoa poderei selecionar uma cidade do estado não correspondente. e se executo o método do AM para filtrar ele não traz os valores no combo.
Você diz:
AlunoVO -> Nome, matricula, UF e Cidade

Um aluno tem uma cidade.. logo você precisa ter um campo na tabela aluno para guardar a cidade.. então o que você deve fazer.. criar uma tabela para cidades e dai construir um VO para essa tabela...
Realmente tenho tudo isso e também uma tabela UF com seu VO que também salva o iduf no meu cadastro de aluno no caso.

Você diz:
no seu componente de tela você vai usar o value do campo cidade do VO de aluno.. e no seu foreach você vai usar a listagem do CidadesVO
Sim no meus exemplos uso isso, agora no meu foreach o que eu criou no meu def para ser seus valor de items do meu componente de tala foreach? um table ou list ou iterator, etc?
Agradeço,
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

eu não to entendendo pelo seguinte

se isso.. no seu forEach

Selecionar tudo

value="#{rowa.Idibge}"
é igual a isso.. no seu selectOneChoice

Selecionar tudo

value="#{bindings.Cidadeid1.inputValue}"
ele deveria abrir setado com o valor do banco

tendeu??

===========

escrevendo o post acima vi o seguinte erro:

Selecionar tudo

rowa.Idibge
a variavel para cada linha que você definiu e row e não rowa

veja se vai funcionar
rohling
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 26 Ago 2009 7:43 pm
Localização: PR

Victor:
Realmente no meu forEach estava com o valor errado agora só alterei e graças funcionou, outro erro que estava fazendo em alguns testes também era que em value="#{bindings.Cidadeid1.inputValue}" onde Cidade1.inputValue era um list que foi gerado quando arrastei os componentes e não o valor propriamente da referencia do banco cidadeid.

Muito agradeçido mesmo, te devo mais esta... fique em paz.

Rohling
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

o interessante deste recurso de arrastar o componente direto da aba de modelo e a criação dos componentes la no pageDef porem na tela você não pode abrir mao de programar..

Eu e que agradeco a sua participação.

fica na paz irmao
rohling
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qua, 26 Ago 2009 7:43 pm
Localização: PR

Minha saga de componente selecionado continua.... agora é com um selectManyCheckbox que pode ter vários objetos selecionados. Listo todas as opções de seleção de uma tabela Tipodeficiencia, Realizo o filtros em uma tabela associativa onde possui o id da pessoa e o id do tipodeficiencia. Porém não sei qual valor usar para o atributo value= do af:selectManyCheckbox da minha apresentação para ficar os itens selecioados.... alguém tem alguma luz?

Selecionar tudo

<af:selectManyCheckbox value=???? Aqui list, table, etc. do meu def..
                                   label="#{bindings.TipodeficienciaView1_1.label}"
                                   binding="#{backingBeanScope.backing_cadastro_beneficiario.smc1}"
                                   id="smc1">
              <af:forEach items="#{bindings.TipodeficienciaView1_11.rangeSet}"
                          var="row">
                <af:selectItem label="#{row.Tipodeficiencia}" id="si13"
                               value="#{row.Idtipodeficiencia}"/>
              </af:forEach>
            </af:selectManyCheckbox>
Atenciosamente,
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

eu nunca trabalhei com esse componente..

Selecionar tudo

<af:selectManyCheckbox value="#{bean.aValue}" required="yes">
  <f:selectItem itemLabel="Option1" itemValue="1"/>
  <f:selectItem itemLabel="Option2" itemValue="2"/>
  <f:selectItem itemLabel="Option3" itemValue="3"/>
  <f:selectItem itemLabel="Option4" itemValue="4"/>
</af:selectManyCheckbox>
faça aValue la no seu bean assim..

Selecionar tudo

//Coloca dentro do seu getAValue()
List aValue = new ArrayList();
aValue.add("1");
aValue.add("3");
isso e para descobrir como o componente funciona ne.. tem q saber o que ele espera.. dai e so você popular do seu jeito dinamicamente
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes