Ao Manter Foco em um inputText preciso executar um relatório ao sair deste Campo. JSF RichFaces
28/10/2009
0
Boa Tarde.
Estou desenvolvendo uma Tela onde o usuario entra com um numero em um inputText e logo pressiona TAB, essa entrada de dados tambem é através de uma Leitora de Codigos de Barra.
Ao sair do Campo o relatório deveria ser executado, mas não sei como proceder para que isso acontece.
Conseguir usando jQuery mater o focu no campo, sempre que sair retornar para o mesmo.
Segue exemplo:
Codigo jQuery usado funcionando ok:
function mantemFocus(){
jQuery( ".meuInput" ).blur( function(){
setTimeout( function(){
jQuery( ".meuInput" ).focus()
},0);
});
}
Tela onde o usuario entra com o dados :
Codigo desta Pagina :
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
<body>
<ui:composition template="../layouts/template.xhtml">
<ui:define name="content">
<rich:panel style="width:800px;height:300px">
<f:facet name="header">
<h:outputText value="Impressão de Etiquetas"/>
</f:facet>
<h:form id="etiqueta">
<h:panelGrid columns="3">
<h:outputText styleClass="rich-label" value="Tipo de Etiqueta" />
<rich:comboBox size="2" label="Tipo de Etiqueta" defaultLabel="Selecione a Etiqueta" id="etiqueta" required="true" value="">
<f:selectItem itemValue="Endereçamento"/>
<f:selectItem itemValue="Simples"/>
<f:validateLength minimum="4" maximum="30" />
</rich:comboBox>
<h:selectOneRadio styleClass="rich-label">
<f:selectItem itemLabel="Numero de Nota Fiscal" itemValue="nota"/>
<f:selectItem itemLabel="Numero do Pedido" itemValue="pedido"/>
<a4j:support event="onclick" reRender="tipo"/>
</h:selectOneRadio>
</h:panelGrid>
<h:outputText styleClass="rich-label" value="Entre com os dados:" />
<h:inputText label="Dados" size="15" id="meuInput" required="true" value="#{etiquetasController.num_notafiscal}"
class="meuInput" onblur="javascript:mantemFocus();">
<rich:ajaxValidator event="onblur"/>
<f:validateLength minimum="6" maximum="15" />
</h:inputText>
<c:if test="${not empty etiquetasController.num_notafiscal}">
<br />
<rich:dataTable id="etiquetas" rendered="true" var="item" value="#{etiquetasController.etiquetas}" style="width:400px">
<rich:column id="numped">
<f:facet name="header"><h:outputText styleClass="headerText" value="Fotnecimento" /></f:facet>
<h:outputText value="#{item[0]}" />
</rich:column>
<rich:column id="nota">
<f:facet name="header"><h:outputText styleClass="headerText" value="Nota Fiscal" /></f:facet>
<h:outputText value="#{item[9]}" />
</rich:column>
<rich:column id="datanota">
<f:facet name="header"><h:outputText styleClass="headerText" value="Data Nota" /></f:facet>
<h:outputText value="#{item[10]}">
<f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo"/>
</h:outputText>
</rich:column>
<rich:column id="nome">
<f:facet name="header"><h:outputText styleClass="headerText" value="Nome Cliente" /></f:facet>
<h:outputText value="#{item[3]}"/>
</rich:column>
</rich:dataTable>
<h:commandLink value="Imprimir" action="#{etiquetasController.executarEtiqueta}" />
</c:if>
</h:form>
</rich:panel>
</ui:define>
</ui:composition>
</body>
</html>
Codigo Java onde executa o Relatório, so funciona usando commandLink.
@SuppressWarnings("unchecked")
//executa o relatório através do actionListener
public void executarEtiqueta() throws java.text.ParseException, IOException, ParseException {
this.todosResultsPesq();
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
//pega o caminho do arquivo .jasper da aplicação
InputStream reportStream = context.getExternalContext().getResourceAsStream("/reporter/etiquetas/EtiquetaEndereco.jasper");
//envia a resposta com o MIME Type PDF
response.setContentType("application/pdf");
/*for�a a abertura de download
response.setHeader("Content-disposition",
"attachment;filename=relatorio.pdf");
*/
try {
ServletOutputStream servletOutputStream = response.getOutputStream();
//envia o título para o relatório, usando o parâmetro criado
Map<String, String> parametros = new HashMap<String, String>();
parametros.put("fornecimento", "xxxx");
List dados = new ArrayList();
Map record = null;
//varre a consulta e separa os objetos
for (Iterator iterator = todosResultsPesq().iterator();
iterator.hasNext();) {
Object[] o = (Object[]) iterator.next();
record = new HashMap();
//coloca em um Map cada um dos campos criados
//manualmente pelo relatório
record.put("fornecimento", o[0].toString());
record.put("isrisco", Boolean.parseBoolean(o[1].toString()));
record.put("endereco_entrega", o[2].toString());
record.put("nome_cliente", o[3].toString());
record.put("endereco", o[4].toString());
record.put("bairro", o[5].toString());
record.put("cidade", o[6].toString());
record.put("cep", o[7].toString());
record.put("observacao_entrega", o[8].toString());
record.put("num_notafiscal", Integer.parseInt(o[9].toString()));
record.put("data_nf", this.convertTimestamp(o[10].toString()));
//adiciona o List dados
dados.add(record);
}
//cria uma fonte de dados para cole��es
JRBeanCollectionDataSource fonteDados = new JRBeanCollectionDataSource(dados);
//envia para o navegador o PDF gerado
JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream,parametros,fonteDados);
servletOutputStream.flush();
servletOutputStream.close();
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//evita erro do JSF após completar
//a geração do relatório
//avisando o FacesContext que a resposta está completa
context.responseComplete();
}
}
Obrigado
Victor
Victor Lima
Posts
29/10/2009
Andrei Hirata
Toda vez que o usuario usar o sistema para pesquizar algo com o codigo de barras,deve ficar focalizado sempre no seu input para que assim as pesquisas sejam feitas
Neste caso a logica seria assim
jTextField.requestFocus(); //aqui ele força o focus no seu componente
if querybusca encontrou valor
pega valor e adiciona na grid
jTextField.requestFocus(); //focaliza o focus para outra consulta
é isto que vc quer?um comando para forçar o focus para sempre fazer busca?
OBS:vc deve usar um if assim tambem
se o jtextfield for vazio entao
nao faca nada
SE nao tiver isto, quando vc tentar finalizar a venda toda hora vai ficar focando no seu jtext
estou dando uma logica funcinal e simples.se nao entender eu posto um codigo para vc
29/10/2009
Victor Lima
Sim , exatamente, eu quero que ao sair do inputText ele executar a funcao executarEtiqueta()
e retornar ao inputText.
Tentei de varias maneiras e consegui de uma forma usando o codigo anterior para dar o focus so que quando renderiza depois de um submit o campo perde o foco, sendo que ele deve ficar ali até que o usuario esteje utilizando.
tentei fazer isso mas tambem nao deu certo :
<h:outputText styleClass="rich-label" value="Entre com os dados:" />
<h:inputText label="Dados" size="15" id="meuInput" required="true" value="#{etiquetasController.num_notafiscal}"
class="meuInput" reRender="etiquetas" onblur="linkimprime.click();submit();" >
<h:commandButton id="linkimprime" value="Imprimir" action="#{etiquetasController.executarEtiqueta}" />
no evento onblur ele chamaria um link que tem uma action que imprime o relatório , mas nao da certo.
Eu fiz esse sistema no delphi, com um EditText, que no evento onExit ele busca os dados e executa o relatório para impressora. e depois dou EditText.SetFocus; e pronto retorna ao campo selecionando.
O que nao sei sao as regras para utilizar isso na WEB com jsf.
Valeuu pela força no aguardo.
Victor
29/10/2009
Andrei Hirata
id = "tblLocais"
rows = "10"
columnClasses="col"
value="#{listaBean.adicionado}"
var='item'
border="1"
cellpadding="2"
cellspacing="0"> <f:facet name="header">
<h:outputText value="#{msg.langTblLocais}"/>
</f:facet> aee a sua lista.Aqui exemplo de percorrer. List lista = new ArrayList();
... preencha a lista com seus objetos;
for (Iterator iterator = lista.iterator(); iterator.hasNext(); ) {
SuaClasse obj = (SuaClasse) iterator.next();
System.out.println (obj.x1 + "," + obj.x2);
} OU EXEMPLO List<Pessoa> ps = new ArrayList<Pessoa>();
ps.add(new Pessoa("Maria 1.5"));
for (Pessoa p : ps)
System.out.println(p.getNome()); assim seu codigo seria List<Pessoa> ps = new ArrayList<Pessoa>();
for (Pessoa p : ps)
if ValorCapturadoNoJedit ==p.codigo { faca algo } else { faca nada }
DEU PARA ENTENDER?
29/10/2009
Andrei Hirata
29/10/2009
Andrei Hirata
29/10/2009
Victor Lima
Veja se te explico melhor:
Na tela que printei, tem uns controles radio button e combobox, e um inputText do JSF.
Quando defino os controles posiciono o cursor no inputText e com um Leitor de Codigo de Barra começo a ler os codigos dentro deste campo.
O formulário é submetido quando o cursor sai do campo. onblur a pesquisa é realizada com sucesso, veja a tela printada e o codigo:
<h:outputText styleClass="rich-label" value="Entre com os dados:" />
<h:inputText label="Dados" size="15" name="meuInput" id="meuInput" required="true" value="#{etiquetasController.num_notafiscal}"
classes="meuInput" onblur="javascript:mantemFocus();submit();" >
<a4j:support event="onblur" action="#{etiquetasController.executarEtiqueta}" reRender="etiquetas" ajaxSingle="true" />
<f:validateLength minimum="6" maximum="15" />
</h:inputText>
Destaquei o firebug para voce ver que eu preciso apos submeter a pesquisa voltar ao campo, porque o usuario irá realizar outra pesquisa em intervalos curtos, um atraz do outro.
E o mais importante é que ele realiza a pesquisa e preciso enviar para impressora o relatório, mas nao tenho ideia de como fazer isso sem um botão, preciso fazer isso como um evento ao sair do campo.
Veja meu console esta pesquisando normalmente:
29/10/2009 16:56:45 com.sun.faces.renderkit.html_basic.HtmlBasicRenderer getForComponent
WARNING: Unable to find component with ID filter in view.
Hibernate:
select
pedidos1_.fornecimento as col_0_0_,
pedidos1_.isrisco as col_1_0_,
cliente0_.endereco_entrega as col_2_0_,
cliente0_.nome_cli as col_3_0_,
cliente0_.logradouro as col_4_0_,
cliente0_.bairro as col_5_0_,
cliente0_.cidade as col_6_0_,
cliente0_.cep as col_7_0_,
pedidos1_.obs_entrega as col_8_0_,
notas2_.notafiscal as col_9_0_,
notas2_.data_cria as col_10_0_
from
public.cliente cliente0_
inner join
public.pedido pedidos1_
on cliente0_.cod_cli=pedidos1_.cod_cli
inner join
public.nota_fiscal notas2_
on cliente0_.cod_cli=notas2_.cod_cli
where
notas2_.notafiscal=?
16:56:45,410 DEBUG IntegerType:133 - binding '596089' to parameter: 1
16:56:45,412 DEBUG StringType:172 - returning '8707912417' as column: col_0_0_
16:56:45,412 DEBUG BooleanType:172 - returning 'true' as column: col_1_0_
16:56:45,413 DEBUG StringType:172 - returning 'RUA JOAO DE OLIVEIRA SOARES n � 241 apt 202 JARDIM CAMBURI VITORIA ES CEP 29090390' as column: col_2_0_
16:56:45,413 DEBUG StringType:172 - returning 'Odarlindo Alberto Plaster' as column: col_3_0_
16:56:45,413 DEBUG StringType:172 - returning 'RUA JOAO DE OLIVEIRA SOARES n� 241 241' as column: col_4_0_
16:56:45,416 DEBUG StringType:172 - returning 'JARDIM CAMBURI' as column: col_5_0_
16:56:45,416 DEBUG StringType:172 - returning 'VITORIA' as column: col_6_0_
16:56:45,417 DEBUG StringType:172 - returning '29090390' as column: col_7_0_
16:56:45,417 DEBUG StringType:172 - returning 'LV' as column: col_8_0_
16:56:45,418 DEBUG IntegerType:172 - returning '596089' as column: col_9_0_
16:56:45,418 DEBUG DateType:172 - returning '01 Setembro 2009' as column: col_10_0_
E outro problema é que se utilizo um botao para imprimir a pagina fica em branco e perde a sessao.
voce acha que isso é possivel ?
obrigado pela ajuda
Victor
29/10/2009
Andrei Hirata
Agora to vendo seu codigo com mais atenção.o complicado é q aqui neste forum não tem aquele sistema de formatação de código e ae atrapalha no entendimento.
29/10/2009
Andrei Hirata
<h:panelGrid columns="2">
<h:inputText id="myinput" value="#{userBean.name}">
<a4j:support event="onkeyup" reRender="myform" focus="myinput"/>
</h:inputText>
<h:outputText id="outtext" value="#{userBean.name}" />
</h:panelGrid>
</h:form>
29/10/2009
Andrei Hirata
voce acha que isso é possivel ? ------------------------------------ Preciso saber do processo da impressao.Ou seja...os processos do clicar até a impressão..
29/10/2009
Victor Lima
Eu dei exemplo de um botao mas na verdade preciso utilizar no evento onblur, quando perde o foco.
Realizei os testes com sua utlima resposta utilizando
<a4j:support event="onkeyup" action="#{etiquetasController.executarEtiqueta}" reRender="etiquetas,etiqueta" ajaxSingle="true" focus="meuinput" />
ele so nao renderiza o grid para visualizar a pesquisa mas imprime duas vezes o mesmo relatório.
a funcao que chama o relatório esta abaixo. e coloquei ela na action do <a4j:support .
@SuppressWarnings("unchecked")
//executa o relatório através do actionListener
public void executarEtiqueta() throws java.text.ParseException, IOException, ParseException {
this.todosResultsPesq();
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
//pega o caminho do arquivo .jasper da aplicação
InputStream reportStream = context.getExternalContext().getResourceAsStream("/reporter/etiquetas/EtiquetaEndereco.jasper");
//envia a resposta com o MIME Type PDF
// response.setContentType("application/pdf");
/*for�a a abertura de download
response.setHeader("Content-disposition",
"attachment;filename=relatorio.pdf");
*/
try {
ServletOutputStream servletOutputStream = response.getOutputStream();
//envia o título para o relatório, usando o parâmetro criado
Map<String, String> parametros = new HashMap<String, String>();
parametros.put("fornecimento", "xxxx");
List dados = new ArrayList();
Map record = null;
//varre a consulta e separa os objetos
for (Iterator iterator = todosResultsPesq().iterator();
iterator.hasNext();) {
Object[] o = (Object[]) iterator.next();
record = new HashMap();
//coloca em um Map cada um dos campos criados
//manualmente pelo relatório
record.put("fornecimento", o[0].toString());
record.put("isrisco", Boolean.parseBoolean(o[1].toString()));
record.put("endereco_entrega", o[2].toString());
record.put("nome_cliente", o[3].toString());
record.put("endereco", o[4].toString());
record.put("bairro", o[5].toString());
record.put("cidade", o[6].toString());
record.put("cep", o[7].toString());
record.put("observacao_entrega", o[8].toString());
record.put("num_notafiscal", Integer.parseInt(o[9].toString()));
record.put("data_nf", this.convertTimestamp(o[10].toString()));
//adiciona o List dados
dados.add(record);
}
//cria uma fonte de dados para cole��es
JRBeanCollectionDataSource fonteDados = new JRBeanCollectionDataSource(dados);
//envia para o navegador o PDF gerado
// JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream,parametros,fonteDados);
JasperPrint print = JasperFillManager.fillReport(reportStream, parametros, fonteDados);
JasperPrintManager.printPage(print, 0, false);
servletOutputStream.flush();
servletOutputStream.close();
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//evita erro do JSF após completar
//a geração do relatório
//avisando o FacesContext que a resposta está completa
context.responseComplete();
}
}
29/10/2009
Victor Lima
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
<script language="javascript">
function foco()
{
this.document.getElementById('meuinput').focus();
}
</script>
<body onload="javascript:foco();" >
<ui:composition template="../layouts/template.xhtml">
<ui:define name="content">
<rich:panel style="width:800px;height:300px">
<f:facet name="header">
<h:outputText value="Impressão de Etiquetas"/>
</f:facet>
<h:form id="etiqueta">
<h:panelGrid columns="3">
<h:outputText styleClass="rich-label" value="Tipo de Etiqueta" />
<rich:comboBox size="2" label="Tipo de Etiqueta" defaultLabel="Selecione a Etiqueta" id="etiqueta" required="false" value="">
<f:selectItem itemValue="Endereçamento"/>
<f:selectItem itemValue="Simples"/>
<f:validateLength minimum="4" maximum="30" />
</rich:comboBox>
<h:selectOneRadio styleClass="rich-label">
<f:selectItem itemLabel="Numero de Nota Fiscal" itemValue="nota"/>
<f:selectItem itemLabel="Numero do Pedido" itemValue="pedido"/>
<a4j:support event="onclick" reRender="tipo"/>
</h:selectOneRadio>
</h:panelGrid>
<h:outputText styleClass="rich-label" value="Entre com os dados:" />
<h:inputText label="Dados" size="15" name="meuInput" id="meuinput" required="true" value="#{etiquetasController.num_notafiscal}"
classes="meuinput" onblur="javascript:mantemFocus();submit();" >
<a4j:support event="onblur" action="#{etiquetasController.executarEtiqueta}" reRender="etiquetas,etiqueta" ajaxSingle="true" focus="meuinput" />
<f:validateLength minimum="6" maximum="15" />
</h:inputText>
<br/>
<br/>
<br/>
<br/>
<c:if test="${not empty etiquetasController.num_notafiscal}">
<br />
<rich:dataTable id="etiquetas" rendered="true" var="item" value="#{etiquetasController.etiquetas}" style="width:400px">
<rich:column id="numped">
<f:facet name="header"><h:outputText styleClass="headerText" value="Fornecimento" /></f:facet>
<h:outputText value="#{item[0]}" />
</rich:column>
<rich:column id="nota">
<f:facet name="header"><h:outputText styleClass="headerText" value="Nota Fiscal" /></f:facet>
<h:outputText value="#{item[9]}" />
</rich:column>
<rich:column id="datanota">
<f:facet name="header"><h:outputText styleClass="headerText" value="Data Nota" /></f:facet>
<h:outputText value="#{item[10]}">
<f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo"/>
</h:outputText>
</rich:column>
<rich:column id="nome">
<f:facet name="header"><h:outputText styleClass="headerText" value="Nome Cliente" /></f:facet>
<h:outputText value="#{item[3]}"/>
</rich:column>
</rich:dataTable>
</c:if>
</h:form>
</rich:panel>
</ui:define>
</ui:composition>
</body>
</html>
29/10/2009
Andrei Hirata
Sobre o informado....
para resolver o problema da grid é easy
TODOS EVENTOS USANDO BOTAO AJAX QUANDO TIVER RELACIONADO COM UMA TABLE OU GRID DEVE USAR reRender.Segue um exemplo de um programa que fiz
<a4j:commandLink id="excluirRegistro"
action="#{tiposLocaisC.excluir}"
reRender="tblTiposLocais"
>
Imprimir duas vezes?Opaaaaa....ae vc precisa compilar e me mostrar porq ta entrando duas vezes na funcao imprimir..
Faz o favor me manda um email destas telas e codigo q vc postou em um arquivo word.que vejo para vc mais tarde.olhar este codigo por aqui é muito ruim..
APROVEITANDO VOU POSTAR UM TOPICO E VOU PEDIR UMA AJUDA TAMBEM
29/10/2009
Andrei Hirata
Clique aqui para fazer login e interagir na Comunidade :)