[RESOLVIDO]UPDATE (Horas) com JSF

14 respostas
M

Boa tarde

Estou tentando fazer um UPDATE em uma tabela, utilizando JSF.
Eu consigo passar os dados para serem atualizados em uma outra pagina assim:

Classe @ManagedBean

public Horas getHoras() {
            return horas;
}
        
public void setHoras(Horas horas) {
            this.horas = horas;
}

public String editaHora(){
            Horas h = selecionaLinha();
            setHoras(h);
            return "atualizateste";
}
        
        
public Horas selecionaLinha(){             
        Horas c = (Horas) horasTotal.getRowData();
        return c; 
}

Tragos as informações que preciso para o meu objeto “Horas”, Assim:

<fieldset>
     <legend>Atualizar Horas</legend>
            <h:panelGrid columns="2" columnClasses="coluna,coluna2">
                <h:outputLabel value="Entrada:"/>
                <h:inputText value="#{horasBean.horas.entrada}"/>                
                <h:outputLabel value="Almoço:"/>
                <h:inputText value="#{horasBean.horas.almoco}"/>
                <h:outputLabel value="Retorno:"/>
                <h:inputText value="#{horasBean.horas.retorno}"/>
                <h:outputLabel value="Saida:"/>
                <h:inputText value="#{horasBean.horas.saida}"/>
                <h:outputLabel value="Adicional:"/>
                <h:inputText value="#{horasBean.horas.adicional}"/>
            </h:panelGrid>                
</fieldset>

====|| O Problema ||======
Porem o que eu não consigo e pegar os valores dos inputText(#{horasBean.horas.entrada})
pq eles já estão setados no objeto.
Como passar nova informação no inputText e setar para usar no select?

Tentei assim, mas não funcionou, pq ele pegas as informações antigas do objeto:

public String btnAlterar(){
            setHoras(horas);
            horasDAO.alterarHorasWeb(horas);
            return "horas";
}

14 Respostas

O

O seu objeto “horas” é do tipo List? Por exemplo…
No ManagedBean…

//Lista de horas que é usado pela sua tabela
List&lt;Hora&gt; horas = new ArrayList&lt;Hora&gt;();

//Hora da tabela que foi selecionada para edição ou será salva
Hora horaSelecionada = new Hora();

//getters e setters omitidos

com isto, no seu xhtml ou jsp, você pode usar assim…

&lt;fieldset&gt;  
     &lt;legend&gt;Atualizar Horas&lt;/legend&gt;  
            &lt;h:panelGrid columns="2" columnClasses="coluna,coluna2"&gt;  
                &lt;h:outputLabel value="Entrada:"/&gt;  
                &lt;h:inputText value="#{horasBean.horaSelecionada.entrada}"/&gt;                  
                &lt;h:outputLabel value="Almoço:"/&gt;  
                &lt;h:inputText value="#{horasBean.horaSelecionada.almoco}"/&gt;  
.
.
.

O seu botão “Atualizar” deve chamar um método para atualizar o List de horas, e também indicar o ID da tabela a ser dada refresh depois de tudo acontecer. Este refresh, no caso de uso de primefaces 2.2 poderia ficar assim…

&lt;p:commandButton value="Atualizar Tabela" action="#{horasBean.methodoAtualizarList}" update="idTabela" /&gt;

Poste aí os resultados.

M

Oliver, isso tudo eu já consegui fazer.

To com problema na verdade nos SET´s.
Não sei porque eu não estou conseguindo mais setar as variaveis:

Segue o MB...
import dao.HorasDAO;
import dao.UsuarioDAO;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.inject.Named;
import model.Horas;
import model.TotalHrs;
import model.Usuario;
import util.Calculo2;


@Named
@SessionScoped
@ManagedBean
public class HorasBean implements Serializable{
           
        private HorasDAO horasDAO;
        private Horas horas = new Horas();
        private DataModel<Horas> horasTotal;
        private String Id;
        private UsuarioDAO usuarioDAO;
        private int meses;
        private int ano;
        private Date dataInicial;
        private Date dataFinal;
        private TotalHrs total;       
        Horas horaSelecionada = new Horas();

	 // === GET´s e SET´s === \\
...
/---Metodo que carrega os dados === horas.xhtml ---//        
        public DataModel<Horas> getHorasTotal() {
            String iduser = getId();
            int mes = getMeses();
            int an = getAno();
            horasDAO = new HorasDAO();
            
            Calculo2 calc = new Calculo2();
            //se não informar a data carregar todos os registros
                if (getMeses() == 0){
                    List<Horas> horasList = horasDAO.carrega(iduser);
                    setTotal(calc.calcularTotal(horasList));
                    horasTotal = new ListDataModel<Horas>(horasList);
                }else {
                    List<Horas> horasList = horasDAO.carrega(iduser, mes, an);
                    calc.calcularTotal(horasList);
                    horasTotal = new ListDataModel<Horas>(horasList);
                }
            return horasTotal;
        }
  
        public Horas selecionaLinha(){                     
        Horas c = new Horas();
        c = (Horas) horasTotal.getRowData();
        Usuario us = getUsuarios();
        c.setCod_func(us.getIdusuario());        
        return c; 
        }
        
        public String btnAlterar(){
            Horas hrs = getHoraSelecionada();
            System.out.println(hrs.getEntrada());// Está aparecendo a mesma hora do banco, 
            //que foi setado no inicio pelo "selecionaLinha"
            //Deveria ser o valor que digito no inputText da pagina
            horasDAO = new HorasDAO();            
            horasDAO.alterarHorasWeb(hrs);
            return "horas";
        }
XHTML:
<?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:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:head>
        <title>Atualiza Horas</title>
        <!--Chamada ao arquivo CSS -->
        <link rel="StyleSheet" type="text/css" href="css/estilo.css" media="screen" />
    </h:head>
    <h:body>
         <!--Coloca os dados no centro(center) da tela -->
         <div align="left">
        <h:form>
            <h1><h:outputText value="Atuzalização de Horas do XTIME" styleClass="titulo"/></h1>
           <fieldset>
                <legend>Parametros para Atualizar</legend>
            
            <h:panelGrid columns="2" columnClasses="coluna,coluna2">
                <h:outputLabel value="Nome:"/>
                <h:outputLabel value="#{horasBean.usuarios.nomeCompleto}"/>
                <h:outputLabel value="Codigo:"/>
                <h:outputLabel value="#{horasBean.usuarios.idusuario}"/>
                <h:outputLabel value="Departamento:"/>
                <h:outputLabel value="#{horasBean.usuarios.dep}"/>
                <h:outputLabel value="Data:"/>                                                
                <h:outputLabel value="#{horasBean.horaSelecionada.data}">
                    <f:convertDateTime pattern="dd/MM/yyyy"/>
                </h:outputLabel>    
            </h:panelGrid>
            </fieldset>
            
            <fieldset>
                <legend>Atualizar Horas</legend>
            <h:panelGrid columns="2" columnClasses="coluna,coluna2">
                <h:outputLabel value="Entrada:"/>
                <h:inputText id="entrada" value="#{horasBean.horaSelecionada.entrada}"/>                  
                <h:outputLabel value="Almoço:"/>
                <h:inputText value="#{horasBean.horaSelecionada.almoco}"/>
                <h:outputLabel value="Retorno:"/>
                <h:inputText value="#{horasBean.horaSelecionada.retorno}"/>
                <h:outputLabel value="Saida:"/>
                <h:inputText value="#{horasBean.horaSelecionada.saida}"/>
                <h:outputLabel value="Adicional:"/>
                <h:inputText value="#{horasBean.horaSelecionada.adicional}"/>
            </h:panelGrid>                
            </fieldset>
        </h:form>
          </div>
         <h:form>
         <div align="center">
             <fieldset>
              <legend>Justificativa</legend>
                <h:outputLabel value="Justificativa: "/>
                <h:selectOneMenu value="#{horasBean.horaSelecionada.justificativa}">
                    <f:selectItem itemValue="" itemLabel="Justificativa"/>
                    <f:selectItem itemValue="1" itemLabel="Banco Horas"/>
                    <f:selectItem itemValue="2" itemLabel="Atestado Medico Dia"/>
                    <f:selectItem itemValue="3" itemLabel="Atestado Medico horas"/>
                    <f:selectItem itemValue="4" itemLabel="Ferias"/>
                    <f:selectItem itemValue="5" itemLabel="Licenca Medica"/>
                    <f:selectItem itemValue="6" itemLabel="Licenca Maternidade"/>
                    <f:selectItem itemValue="Outros" itemLabel="Outros"/>                    
                    <f:selectItem itemValue="8" itemLabel="Falta Injustificada"/> 
                </h:selectOneMenu>
                <br/>
                <tr align="center"><h:outputText value="Observações: " /></tr>                   
                <h:inputTextarea value="#{horasBean.horaSelecionada.obs}" rows="6" cols="50"/>
                
            </fieldset>
            <br/> 
            </div>
             </h:form>
         <div align="center">
        <h:form>
            <h:commandButton value="Cancelar" action="horas"/> 
            <h:commandButton value="Alterar" action="#{horasBean.btnAlterar}"/>           
            <h:commandButton value="Voltar" action="horas"/>
        </h:form>
         </div>    
    </h:body>
</html>
<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="2.0"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">

<managed-bean>
      <managed-bean-name>horasBean</managed-bean-name>
      <managed-bean-class>controller.HorasBean</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>
  
    <navigation-rule>
        <from-view-id>/index.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>total</from-outcome>
            <to-view-id>/total.xhtml</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>fechamento</from-outcome>
            <to-view-id>/fechamento.xhtml</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>periodo</from-outcome>
            <to-view-id>/periodo.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
    <navigation-rule>
        <from-view-id>/horas.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>atualizateste</from-outcome>
            <to-view-id>/atualizateste.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
    <navigation-rule>
        <from-view-id>/total.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>case1</from-outcome>
            <to-view-id>/atualizateste.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
</faces-config>
O

Na linha 15 do seu xhtml experimente trocar isto…

&lt;h:form&gt;

Por isto…

&lt;h:form id="formUsuarios" prependId="false"&gt;

Faça isto em todos os formulários (mas sempre com um id diferente). Este prependId desativa a auto-atribuição de Ids para os componentes da página.

M

Oliver, ainda não consegui, vê se é isso mesmo o correto, por favor:

<?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:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.prime.com.tr/ui">
    <h:head>
        <title>Atualiza Horas</title>
        <!--Chamada ao arquivo CSS -->
        <link rel="StyleSheet" type="text/css" href="css/estilo.css" media="screen" />
    </h:head>
    <h:body>
         <!--Coloca os dados no centro(center) da tela -->
         <div align="left">
        <h:form id="formUsuarios" prependId="false">
            <h1><h:outputText value="Atuzalização de Horas do XTIME" styleClass="titulo"/></h1>
           <fieldset>
                <legend>Parametros para Atualizar</legend>
            
            <h:panelGrid columns="2" columnClasses="coluna,coluna2">
                <h:outputLabel value="Nome:"/>
                <h:outputLabel value="#{horasBean.usuarios.nomeCompleto}"/>
                <h:outputLabel value="Codigo:"/>
                <h:outputLabel value="#{horasBean.usuarios.idusuario}"/>
                <h:outputLabel value="Departamento:"/>
                <h:outputLabel value="#{horasBean.usuarios.dep}"/>
                <h:outputLabel value="Data:"/>                                                
                <h:outputLabel value="#{horasBean.horaSelecionada.data}">
                    <f:convertDateTime pattern="dd/MM/yyyy"/>
                </h:outputLabel>    
            </h:panelGrid>
            </fieldset>
            
            <fieldset>
                <legend>Atualizar Horas</legend>
            <h:panelGrid columns="2" columnClasses="coluna,coluna2">
                <h:outputLabel value="Entrada:"/>
                <h:inputText id="entrada" value="#{horasBean.horaSelecionada.entrada.hours}"/>                  
                <h:outputLabel value="Almoço:"/>
                <h:inputText id="almoco" value="#{horasBean.horaSelecionada.almoco}"/>
                <h:outputLabel value="Retorno:"/>
                <h:inputText id="retorno" value="#{horasBean.horaSelecionada.retorno}"/>
                <h:outputLabel value="Saida:"/>
                <h:inputText id="saida" value="#{horasBean.horaSelecionada.saida}"/>
                <h:outputLabel value="Adicional:"/>
                <h:inputText id="adcional" value="#{horasBean.horaSelecionada.adicional}"/>
            </h:panelGrid>                
            </fieldset>
        </h:form>
          </div>
         <h:form id="formJustificativa" prependId="false">
         <div align="center">
             <fieldset>
              <legend>Justificativa</legend>
                <h:outputLabel value="Justificativa: "/>
                <h:selectOneMenu value="#{horasBean.horaSelecionada.justificativa}">
                    <f:selectItem itemValue="" itemLabel="Justificativa"/>
                    <f:selectItem itemValue="1" itemLabel="Banco Horas"/>
                    <f:selectItem itemValue="2" itemLabel="Atestado Medico Dia"/>
                    <f:selectItem itemValue="3" itemLabel="Atestado Medico horas"/>
                    <f:selectItem itemValue="4" itemLabel="Ferias"/>
                    <f:selectItem itemValue="5" itemLabel="Licenca Medica"/>
                    <f:selectItem itemValue="6" itemLabel="Licenca Maternidade"/>
                    <f:selectItem itemValue="Outros" itemLabel="Outros"/>                    
                    <f:selectItem itemValue="8" itemLabel="Falta Injustificada"/> 
                </h:selectOneMenu>
                <br/>
                <tr align="center"><h:outputText value="Observações: " /></tr>                   
                <h:inputTextarea value="#{horasBean.horaSelecionada.obs}" rows="6" cols="50"/>
                
            </fieldset>
            <br/> 
            </div>
             </h:form>
         <div align="center">
        <h:form id="formBtns" prependId="false">
            <h:commandButton value="Cancelar" action="horas"/> 
            <h:commandButton value="hrs" action="#{horasBean.btnAlterar}"/>           
            <h:commandButton value="Voltar" action="horas"/>
        </h:form>
         </div>    
    </h:body>
</html>
M

Acabei de fazer um teste tirando os “FORMS”, deixando apenas um, mas não ta funcionando!

Alguma dica? Ate mesmo p teste?

O

Na linha 6 do seu xhtml está…

xmlns:p="http://primefaces.prime.com.tr/ui"&gt;

Este endereço vc usa para o primefaces 2.2. O JAR que vc está usando é desta versão?

M

É esse o jar “PrimeFaces 2.2.1”!
Eu utilizei o primafaces para fazer um teste, se no input dele setaria o setHoras

Já criei outra class para fazer o manegerBean, mas o problema persiste… não funciona o Set!

O

Cara… verifique os imports do seu HorasBean. Você está usando:

import javax.enterprise.context.SessionScoped;

mas deveria ser

import javax.faces.bean.SessionScoped;

testa aí.

M

Oliver, agora eu não intendi…
Eu mudei o import para o javax.faces.bean.SessionScoped, e agora nem a tela inicial que eu passo o parametro pra filtrar não seta mais o “ID”

Esse cara aqui:

public DataModel<Horas> getHorasTotal() { String iduser = getId();//Esse cara não recebe mais a informações que recebia anteriormente, que estava normal, agora ele vem "null" int mes = getMeses();

O
Ao meu ver, a falha agora está no HorasBean. Você deve inicializar todas as variáveis para que o xhtml possa carregá-las e/ou atribui valores para elas quando uma ação é realizada. Experimente alterar o HorasBean para isto:
@SessionScoped  
@ManagedBean  
public class HorasBean implements Serializable{  
             //colocando new nos tipos não-primitivos e também nos tipos String...
        private HorasDAO horasDAO = new HorasDAO();  
        private Horas horas = new Horas();  
        private DataModel&lt;Horas&gt; horasTotal = new DataModel&lt;Horas&gt;();  
        private String Id = new String();  
        private UsuarioDAO usuarioDAO = new UsuarioDAO();  
        private int meses;  
        private int ano;  
        private Date dataInicial = new Date();  
        private Date dataFinal = new Date();  
        private TotalHrs total = new TotalHrs();         
        Horas horaSelecionada = new Horas();  
  
     // === GET´s e SET´s === \\
M

Utilize o método merge do objeto EntityManager para realizar o update.

M

Oliver,
Primeiro quero agradecer a atenção e a disposição em me ajudar!
Esse é meu primeiro projeto com Java Web.

Fiz como vc havia mencionado,

  • Tirei o “Named”
  • Iniciei todos os objetos com “new”

A primeira parte das telas voltou a funcionar, consigo passar o Id do usuario fazer o filtro, apresentar as informações que estão no banco de dados, ate pegar as informações apresentar em um outra pagina que é para editar.

Essa continua dando problema, nessa pagina (“atualiza horas”) eu altero os valores do inputText mas ele não seta as informações.

Mais alguma sugestão?
Muito obrigado pela ajuda!

M

Oliver,
Fiz alguns testes aqui, e está fucionando.
Mas antes de finalizar o topico vou apenas confirma se está correto o meu problema.

Parece que o problema é o seguinte eu estou passando um objeto do tipo java.sql.Time e o inputText é String!
O problema está sendo nessa conversão.
Vou apenas confirma isso e já posto o resultado.
Obrigado amigo pela paciência e ajuda!

M

Obrigado pela ajuda e o problema era mesmo o tipo do objeto que eu tentava setar.
Fiz uma conversão de Time para String e funcionou perfeitamente!

Criado 31 de janeiro de 2012
Ultima resposta 3 de fev. de 2012
Respostas 14
Participantes 3