Ao Manter Foco em um inputText preciso executar um relatório ao sair deste Campo. JSF RichFaces
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
Curtidas 0
Respostas
Andrei Hirata
28/10/2009
Não entendi exatamente oque vc quer.mas pelo que entendi vc quer algo assim..
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
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
GOSTEI 0
Victor Lima
28/10/2009
Boa Tarde Andrei Inoue Hirata,
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
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
GOSTEI 0
Andrei Hirata
28/10/2009
Então amigo eu vou facilitar seu trabalho..
Toda vez que a pessoa clicar no BOTAO INSERIR VALOR.
Adicione o valor em uma lista.
Assim atualize sua tabela,se usar ajax = comando reRender..algo assim
quando o usuario for adicionar o mesmo valor..E agora oq devo fazer?
SIMPLES..
pegue o valor digitado
percorra a lista e veja se este valor é igual,
se for igual vc incrimenta o valor..SE posse produto,vc incrementaria a quantidade
ouuu se for igual vc nao deixa fazer nada..
VEJA QUE É MAIS FACIL TRABALHAR COM LISTA.ISTO SERVE PARA DATA MODEL..VOU TE PASSAR UM EXEMPLO BABA DA LISTA.Eu acho que ligar uma tabela em jsf com a lista vc ja sabe ne?
NA DUVIDA>>.
rich:dataTable rowClasses="classOne,classTwo"
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?
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?
GOSTEI 0
Andrei Hirata
28/10/2009
ignorar A SOLUÇÃO ABAIXO...ERA A RESPOSTA PARA OUTRO FORUM
GOSTEI 0
Andrei Hirata
28/10/2009
Ñão sei se isto funciona..Mas antes de dar uma solução mais complexa....
Quando vc da um <h:commandButton este comando faz uma solicitação para o servidor e atualiza a tela.é como se fosse um submit e por isto ao atualizar a tela, a função de focalizar é perdido mesmo.
Oque vc poderia fzer é usar um ajax.vc tem o richfaces instalado?
o <a4j:commandButton poderia resolver seu problema.ESTOU CHUTANDO>'so tentando.
Se não der eu tenho mais uma solução.
GOSTEI 0
Victor Lima
28/10/2009
Boa Tarde,
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
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
GOSTEI 0
Andrei Hirata
28/10/2009
Respondendo sua duvida sobre Ao sair do campo executa algo...
<input type="text" onblur="your_function()" name=...>
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.
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.
GOSTEI 0
Andrei Hirata
28/10/2009
Isto aqui pode resolver seu problema de retornar ao edit apos impressao
<h:form id="myform">
<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>
<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>
GOSTEI 0
Andrei Hirata
28/10/2009
e sobre istoo
E outro problema é que se utilizo um botao para imprimir a pagina fica em branco e perde a sessao.
voce acha que isso é possivel ? ------------------------------------ Preciso saber do processo da impressao.Ou seja...os processos do clicar até a impressão..
voce acha que isso é possivel ? ------------------------------------ Preciso saber do processo da impressao.Ou seja...os processos do clicar até a impressão..
GOSTEI 0
Victor Lima
28/10/2009
Boa tarde,
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();
}
}
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();
}
}
GOSTEI 0
Victor Lima
28/10/2009
vou postar todo codigo da tela.
<?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>
<?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>
GOSTEI 0
Andrei Hirata
28/10/2009
ele so nao renderiza o grid para visualizar a pesquisa mas imprime duas vezes o mesmo relatório.
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
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
GOSTEI 0
Victor Lima
28/10/2009
ok Valeu a força.
obrigado
Victor
obrigado
Victor
GOSTEI 0
Andrei Hirata
28/10/2009
GOSTEI 0
Victor Lima
28/10/2009
Nao tenho ideia rsrsrs.
GOSTEI 0
Andrei Hirata
28/10/2009
valeu mesmo assim:> . qualquer duvida estamos por ae.E aproveitando.quais as tecnlogias envolvidas no seu projeto?
Exemplo:jsf,hibernate,ejb3,richfaces e blabla
Exemplo:jsf,hibernate,ejb3,richfaces e blabla
GOSTEI 0
Victor Lima
28/10/2009
No meu projeto, tenho.
JSF, RichFaces , Hibernate , JPA e Spring.
so esses.
Construi o sistema do 0, mas estou agarrado em alguns detalhes para terminar.
valeuu ai.
eu consegui foca no campo. agora so falta imprimir. Ta dando um erro no actionListener. Está pesquisando ao sair do campo. o foco volta para o campo, mas nao imprime nada.
olha o codigo:
<h:outputText styleClass="rich-label" value="Entre com os dados:" />
<h:inputText label="Dados" size="15" name="meuInput" id="meuinput" actionChangeListener="" required="true" value="#{etiquetasController.num_notafiscal}" classes="meuinput" event="onblur" >
<a4j:support event="onblur" actionListener="#{etiquetasController.executarEtiqueta}" imediate="true" focus="meuinput" reRender="etiquetas,etiqueta" ajaxSingle="true" />
<f:validateLength minimum="6" maximum="15" />
</h:inputText>
O engraçado que se eu tiro esse codigo actionListener="#{etiquetasController.executarEtiqueta}" , passa a nao funcionar e é ele que chama o relatório, que nao sai.
valeu a força
Victor
JSF, RichFaces , Hibernate , JPA e Spring.
so esses.
Construi o sistema do 0, mas estou agarrado em alguns detalhes para terminar.
valeuu ai.
eu consegui foca no campo. agora so falta imprimir. Ta dando um erro no actionListener. Está pesquisando ao sair do campo. o foco volta para o campo, mas nao imprime nada.
olha o codigo:
<h:outputText styleClass="rich-label" value="Entre com os dados:" />
<h:inputText label="Dados" size="15" name="meuInput" id="meuinput" actionChangeListener="" required="true" value="#{etiquetasController.num_notafiscal}" classes="meuinput" event="onblur" >
<a4j:support event="onblur" actionListener="#{etiquetasController.executarEtiqueta}" imediate="true" focus="meuinput" reRender="etiquetas,etiqueta" ajaxSingle="true" />
<f:validateLength minimum="6" maximum="15" />
</h:inputText>
O engraçado que se eu tiro esse codigo actionListener="#{etiquetasController.executarEtiqueta}" , passa a nao funcionar e é ele que chama o relatório, que nao sai.
valeu a força
Victor
GOSTEI 0
Andrei Hirata
28/10/2009
Pelo que to entendendo.Como o ajax não da um submit,é provavel que a funcao do relatorio esta sendo chamada para se imprimir o relatorio MAS nao consegue mandar estes dados para serem processados.Faça um teste.Volte para a opcao SEM USAR AJAX E VE OQ ACONTECE.Se funcionar é isto mesmo.
Agora como arrumar isto.olhamos isto depois
EM RELACAO AO SEU ACTION LISTENER É O SEGUINTE
public String updateRitos(ActionEvent event){//VEJA QUE ESTA FUNCAO É DO TIPO ACTIONEVENT
int index = getbuscarListaRitos().indexOf(ritos);//aqui executa oq vc quer
facade.update(ritos);
return "sucessoRitos";
}
A FUNCAO QUE VC VAI CHAMAR USANDO ACTIONLISTENER DEVE SER DO TIPO ACTIONEVENT
se nao for nunca vai funcionar mesmo COM AJAX
Agora como arrumar isto.olhamos isto depois
EM RELACAO AO SEU ACTION LISTENER É O SEGUINTE
public String updateRitos(ActionEvent event){//VEJA QUE ESTA FUNCAO É DO TIPO ACTIONEVENT
int index = getbuscarListaRitos().indexOf(ritos);//aqui executa oq vc quer
facade.update(ritos);
return "sucessoRitos";
}
A FUNCAO QUE VC VAI CHAMAR USANDO ACTIONLISTENER DEVE SER DO TIPO ACTIONEVENT
se nao for nunca vai funcionar mesmo COM AJAX
GOSTEI 0
Victor Lima
28/10/2009
favor fechar chamado
atenciosamente
VIctor
atenciosamente
VIctor
GOSTEI 0