Consulta ao banco no rich:modalpanel [RESOLVIDO]

10 respostas
cleiton_herrmann

Olá pessoal…

Eu tenho em uma página, um modalpanel que exibe registros de determinada tabela do banco, mas eu percebi q a query que retorna esses registros esta sendo executada mesmo quando eu nao clico no botao pra exibir o modalpanel…

EDIT: na verdade quem exibe os registros é um picklist que esta neste modalpanel…

Tem algum jeito de fazer com que essa query seja executada somente quando eu exibir o modalpanel ??

Desde já grato !! Att.

10 Respostas

ralphsilver

Tem sim…

posta o seu código pra gente ver o que vc está fazendo

cleiton_herrmann
opa blz... esse é o codigo do botao que chama o modal, ele só aparece se tiver registros sendo exibidos no datatable, senao nao tem sentido gerar um relatorio em branco...
<s:div styleClass="actionButtons" rendered="#{not empty contaList.resultList}">
        <h:commandButton id="relatorio" value="Imprimir"
        	onclick="Richfaces.showModalPanel('selecionarCamposPanel')" />
    </s:div>
e esse é o codigo do modal
<rich:modalPanel id="selecionarCamposPanel" left="425" top="50" width="450" height="270" >
    	<f:facet name="header">
            <h:panelGroup>
                <h:outputText value="Selecione os campos do relatório"></h:outputText>
            </h:panelGroup>
        </f:facet>
        <f:facet name="controls">
            <h:panelGroup>
                <h:graphicImage value="/img/close.png" styleClass="hidelink" id="hidelink"/>
                <rich:componentControl for="selecionarCamposPanel" attachTo="hidelink" operation="hide" event="onclick"/>
            </h:panelGroup>
        </f:facet>
		
	    <a:form id="modalRelatorio">
			<h:panelGrid columns="1" columnClasses="top, top">
			   	<rich:pickList copyAllControlLabel="#{messages['msg.btnCopyAll']}"
			   	                  copyControlLabel="#{messages['msg.btnCopy']}"  
		                     removeAllControlLabel="#{messages['msg.btnRemoveAll']}"
		                        removeControlLabel="#{messages['msg.btnRemove']}" 
		                                     value="#{relatorioList.camposSelecionados}"
		                                        id="campos" >
		            <a:support event="onlistchanged" reRender="botaoGerar"/>
			        <f:selectItems value="#{relatorioList.camposSelectItens}"/>
			    </rich:pickList>
			    
			    <s:div id="botaoGerar" styleClass="actionButtons">
					<h:commandButton id="gerar" 
			        	rendered="#{not empty relatorioList.camposSelecionados}"
			              action="#{relatorioList.gerarRelatorio(contaList.resultList, contaList.conta)}"
			               value="Ok" />
				</s:div>
				
		   	</h:panelGrid>
		</a:form>
   	</rich:modalPanel>

intaum, os ítens do picklist, sao campos que o usuario quer que sejam impressos no relatorio ( #{relatorioList.camposSelectItens} ) e esse cara ( #{relatorioList.camposSelecionados} ) sao os campos selecionados pelo usuario... o que eu quero é que ( #{relatorioList.camposSelectItens} ) seja preenchido somente quando abrir o modal...

cleiton_herrmann
esqueci... esse é o codigo da action que me retorna os selectItens do picklist
@In(create=true)
private SubItemMenuList subItemMenuList;
	
@In(create=true)
EntityManager entityManager;
	
private SubItemMenu subItemMenu;

public void getSubItemMenu() {
    String viewId = FacesContext.getCurrentInstance().getViewRoot().getViewId();
    String entidade = viewId.replaceAll("/|List.xhtml|Edit.xhtml|.xhtml", "").toLowerCase();
    	
    subItemMenu = (SubItemMenu) entityManager.createQuery("from SubItemMenu as subItem where subItem.entidade=?1").setParameter(1, entidade).
}
os campos eu tiro do bean... subItemMenu.getCamposSubItem();
cleiton_herrmann

tem mesmo ?

ralphsilver

É o Seguinte:

Voce está populando o picklist no value dele… no value, sempre que se carrega a página… ele será executado… o que vc pode fazer é não carregar os dados de imediato no #{relatorioList.camposSelecionados} deixando ele vazio… e quando a pessoa ativar o modal panel que provavelmente deva ser um <a4j:commandLink /> , vc popula o #{relatorioList.camposSelecionados} e de um reRender em campos tipo assim:

<a4j:commandLink reRender="campos" action="<popule o relatorioList.camposSelecionados nessa action>" />

ele irá popular o relatorioList.camposSelecionados via ajax

ralphsilver

com certeza assim dá certo

ralphsilver

ralphsilver:
É o Seguinte:

Voce está populando o picklist no value dele… no value, sempre que se carrega a página… ele será executado… o que vc pode fazer é não carregar os dados de imediato no #{relatorioList.camposSelecionados} deixando ele vazio… e quando a pessoa ativar o modal panel que provavelmente deva ser um <a4j:commandLink /> , vc popula o #{relatorioList.camposSelecionados} e de um reRender em campos tipo assim:

<a4j:commandLink reRender="campos" action="<popule o relatorioList.camposSelecionados nessa action>" />

ele irá popular o relatorioList.camposSelecionados via ajax

para Completar:

<a4j:commandButton id="relatorio" reRender="campos" action="<popule o relatorioList.camposSelecionados nessa action>"> <rich:componentControl for="campos" attachTo="relatorio" operation="show" event="onclick"/> </a4j:commandButton>

troque seu <h:commandButton /> por este acima

ralphsilver

ralphsilver:
ralphsilver:
É o Seguinte:

Voce está populando o picklist no value dele… no value, sempre que se carrega a página… ele será executado… o que vc pode fazer é não carregar os dados de imediato no #{relatorioList.camposSelecionados} deixando ele vazio… e quando a pessoa ativar o modal panel que provavelmente deva ser um <a4j:commandLink /> , vc popula o #{relatorioList.camposSelecionados} e de um reRender em campos tipo assim:

<a4j:commandLink reRender="campos" action="<popule o relatorioList.camposSelecionados nessa action>" />

ele irá popular o relatorioList.camposSelecionados via ajax

para Completar:

<a4j:commandButton id="relatorio" reRender="campos" action="<popule o relatorioList.camposSelecionados nessa action>"> <rich:componentControl for="campos" attachTo="relatorio" operation="show" event="onclick"/> </a4j:commandButton>

troque seu <h:commandButton /> por este acima

e implemente uma action que popule seu picklist

cleiton_herrmann

opa, blz vlw ralphsilver, numa lida rápida me parece q vai funcionar sim, mas agora to em outra atividade, vai ter q ficar pra depois, qq coisa posto denovo ai…

Vlw t+

cleiton_herrmann

blz deu certinho ralphsilver, vlw a dica t+

Criado 18 de novembro de 2009
Ultima resposta 24 de nov. de 2009
Respostas 10
Participantes 2