[RESOLVIDO]UPDATE (Horas) com JSF

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";
}

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.

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…

[code]
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 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";
    }[/code]

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>

[code]<?xml version='1.0' encoding='UTF-8'?>

horasBean controller.HorasBean session
<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>

[/code]

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.

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

[code]<?xml version='1.0' encoding='UTF-8' ?>

Atualiza Horas

Parametros para Atualizar
        <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>
[/code]

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

Alguma dica? Ate mesmo p teste?

Na linha 6 do seu xhtml está…

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

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

É 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!

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í.

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();

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:

[code]@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<Horas> horasTotal = new DataModel<Horas>();
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 === \\  [/code]

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

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!

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!

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!