[RESOLVIDO] Seleção de linha errada no PrimeFaces

Bom dia, pessoal.

A situação:
Dentro de um dataTable, tenho um commandButton em cada linha. Ao clicar neste commandButton, uma dialog é exibida com um campo de data. Ao informar a data e clicar em salvar, é feito um update em uma tabela do banco.

O problema:
Quando clico em um determinado botão, de uma determinada linha, os valores selecionados sempre equivalem ao primeiro registro deste dataTable. Ou seja, consigo selecionar qualquer registro, mas o valor não vem corretamente, vem sempre referente ao primeiro registro exibido no dataTable.

Alguém que passou por este problema ou sabe como sulucioná-lo, peço ajuda.
Desde já, muito obrigado.

Segue meu XHTML:

<!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:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <link href="../script/css/style.css" rel="stylesheet" type="text/css"
              media="all" />
        <title>RH :: Horas Extras</title>
    </h:head>

    <h:body>

        <ui:include src="#{applicationBean.headerFile}" />

        <h:form id="mainForm">

            <p:growl id="mainGrowl" showDetail="true" />

            <p:panel id="mainPanel">
                <f:facet name="header">

                    <p>Minhas Horas Extras</p>

                    <p>
                        <p:commandButton value="Todas" 
                                         action="#{horaExtraBean.loadMinhasHorasExtras()}"
                                         update=":mainForm:dataTableHEs"
                                         icon="ui-icon-circle-zoomin">
                        </p:commandButton>

                        <p:commandButton value="Aguardando RH" 
                                         action="#{horaExtraBean.loadByEstadoAguardando()}"
                                         update=":mainForm:dataTableHEs"
                                         icon="ui-icon-clock">
                        </p:commandButton>

                        <p:commandButton value="Aprovadas" 
                                         action="#{horaExtraBean.loadByEstadoAprovadas()}"
                                         update=":mainForm:dataTableHEs"
                                         icon="ui-icon-circle-check">
                        </p:commandButton>

                        <p:commandButton value="Pagamento em Folha" 
                                         action="#{horaExtraBean.loadByEstadoPagamentoEmFolha()}"
                                         update=":mainForm:dataTableHEs"
                                         icon="ui-icon-note">
                        </p:commandButton>

                        <p:commandButton value="Banco de Horas" 
                                         action="#{horaExtraBean.loadByEstadoBancoDeHoras()}"
                                         update=":mainForm:dataTableHEs"
                                         icon="ui-icon-disk">
                        </p:commandButton>

                        <p:commandButton value="Reprovadas" 
                                         action="#{horaExtraBean.loadByEstadoReprovadas()}"
                                         update=":mainForm:dataTableHEs"
                                         icon="ui-icon-circle-close">
                        </p:commandButton>

                        <span class="commandButton-cadastrar">
                            <p:commandButton value="Cadastrar"
                                             oncomplete="dialogModalCadastrar.show()"
                                             icon="ui-icon-plusthick">
                            </p:commandButton>
                        </span>
                    </p>

                </f:facet>

                <p:dataTable id="dataTableHEs" var="mhe" value="${horaExtraBean.loadMinhasHorasExtras()}" rowKey="#{mhe.id}"
                             paginator="true" rows="20" selectionMode="single" selection="#{horaExtraBean.horaExtra}" >

                    <p:column headerText="Data Cad.">
                        <h:outputText value="#{mhe.dataCadastro}">
                            <f:convertDateTime pattern="dd/MM/yyyy" />
                        </h:outputText>
                    </p:column>

                    <p:column headerText="Data">
                        <h:outputText value="#{mhe.dataHoraExtra}">
                            <f:convertDateTime pattern="dd/MM/yyyy" />
                        </h:outputText>
                    </p:column>

                    <p:column headerText="Motivo">
                        <h:outputText value="#{mhe.motivo.descricao}" />
                    </p:column>

                    <p:column headerText="Aprovação Sup.">
                        <h:outputText value="#{mhe.aprovadoSupervisorOutput}" />
                    </p:column>

                    <p:column headerText="Data Aprov. Sup.">
                        <h:outputText value="#{mhe.dataAprovadoSupervisor}">
                            <f:convertDateTime pattern="dd/MM/yyyy" />
                        </h:outputText>
                    </p:column>

                    <p:column headerText="Aprovação RH">
                        <h:outputText value="#{mhe.aprovadoRHOutput}" />
                    </p:column>

                    <p:column headerText="Data Aprov. RH">
                        <h:outputText value="#{mhe.dataAprovacaoRH}">
                            <f:convertDateTime pattern="dd/MM/yyyy" />
                        </h:outputText>
                    </p:column>

                    <p:column headerText="Motivo Cancelam.">
                        <h:outputText value="#{mhe.motivoCancelamento.descricao}" />
                    </p:column>

                    <p:column headerText="Folga Agend.">
                        <h:outputText value="#{mhe.dataFolgaAgendada}">
                            <f:convertDateTime pattern="dd/MM/yyyy" />
                        </h:outputText>
                    </p:column>

                    <p:column headerText="Tot. Horas">
                        <h:outputText value="#{mhe.quantidadeHoraExtraGerada}" />
                    </p:column>

                    <p:column headerText="Tipo">
                        <h:outputText value="#{mhe.tipoHoraExtraGerada}" />
                    </p:column>

                    <p:column headerText="Obs.">
                        <h:outputText value="#{mhe.observacoes}" />
                    </p:column>

                    <p:column>
                        <p:commandButton rendered="true"
                                         oncomplete="dialogModalAgendarFolga.show()"
                                         update=":mainForm:panelGridAgendamento"
                                         icon="ui-icon-calendar" title="Agendar Folga" >
                            <f:setPropertyActionListener target="#{horaExtraBean.horaExtra}" value="#{mhe}" />
                        </p:commandButton>
                    </p:column>

                </p:dataTable>
            </p:panel>

            <p:dialog id="dialogModalAgendarFolga" header="Agendar Hora Extra" widgetVar="dialogModalAgendarFolga"
                      modal="true" width="320" height="70" resizable="false">

                <p:ajax event="close" update=":mainForm:dataTableHEs" />

                <h:panelGrid id="panelGridAgendamento" columns="3" cellpadding="1" class="dialog-form">

                    <p:outputLabel for="calendarData" id="lblData" value="Data:" />
                    <p:calendar widgetVar="mhe" id="calendarData" value="#{mhe.dataFolgaAgendada}" navigator="true" pattern="dd/MM/yyy" showOn="button">
                        <f:convertDateTime pattern="dd/MM/yy" timeZone="GMT-3" type="date" locale="pt" dateStyle="short"/>
                    </p:calendar>

                    <p:commandButton value="Salvar" icon="ui-icon-check"
                                     action="#{horaExtraBean.updateDataFolgaAgendada(mhe)}"
                                     onclick="dialogModalCadastrar.close()" />

                </h:panelGrid>
            </p:dialog>

        </h:form>

        <p:dialog id="dialogModalCadastrar" header="Cadastro de Hora Extra" widgetVar="dialogModalCadastrar"
                  modal="true" width="320" height="170" resizable="false">
            <h:form>

                <h:panelGrid id="panelGridDialog" columns="2" cellpadding="1" class="dialog-form">

                    <p:outputLabel for="calendarData" id="lblData" value="Data:" />
                    <p:calendar id="calendarData" value="#{horaExtraBean.horaExtra.dataHoraExtra}" navigator="true" pattern="dd/MM/yyy" showOn="button">
                        <f:convertDateTime pattern="dd/MM/yy" timeZone="GMT-3" type="date" locale="pt" dateStyle="short"/>
                    </p:calendar>

                    <p:outputLabel for="autoCompleteMotivo" id="lblMotivo" value="Motivo:" />
                    <p:autoComplete id="autoCompleteMotivo" value="#{horaExtraBean.horaExtra.motivo.descricao}" completeMethod="#{motivoBean.autocompleteDescricao()}" dropdown="true" scrollHeight="150" />

                    <p:outputLabel for="spinnerTotalDeHoras" id="lblTotalDeHoras" value="Qdt. de Horas:" />
                    <p:spinner id="spinnerTotalDeHoras" value="#{horaExtraBean.horaExtra.quantidadeHoraExtraGerada}" size="2" />

                    <p:outputLabel for="inputTextAreaObservacoes" value="Observações:" />
                    <p:inputTextarea id="inputTextAreaObservacoes" value="#{horaExtraBean.horaExtra.observacoes}" cols="24" rows="3" />

                    <p>
                        <p:commandButton value="Solicitar" action="#{horaExtraBean.insertBasic()}"
                                         update=":mainForm:mainPanel"
                                         onclick="dialogModalCadastrar.close()"
                                         icon="ui-icon-check"/>
                    </p>                    

                </h:panelGrid>
            </h:form>
        </p:dialog>
    </h:body>
</html>

Bom dia.

Quando você faz seleção por commandButton em um dataTable, não deve informar os parâmetros rowKey, selection e selectionMode.

Experimenta rodar sem eles. Deve funcionar.

Bom dia, Juno.

Cara, tirei os 3 atributos, mas o erro persiste.

Quando você clica no botão Agendar Folga, ele efetivamente chama o método setHoraExtra com o parâmetro correto? (Coloca um println na primeira linha do método).

Juno, o metódo setHoraExtra é chamado quando clico no commandButton “Agendar Folga”, antes de aparecer a dialog (e o parâmetro do método está com o id correto). Entretanto, após ter definido a data na dialog, quando clico no commandButton “Salvar”, o método setHoraExtra não é chamado, e o id vai errado. Como falei no primeiro post, vai o id da primeira tupla do dataTable.

Você está clicando no botao ‘agendarHoraFOlga’ de dentro do dataTable?

Em um de seus dialogs, você está fazendo referência a variavel interna do dataTable

value="#{[b]mhe[/b].dataFolgaAgendada}"

Conforma o que você disse.

Está aparentemente errado as referências.

no datatable ao executar o commandButton você passa os dalores para o MB

<f:setPropertyActionListener target="#{horaExtraBean.horaExtra}" value="#{mhe}" />

Mas no dialog você ainda faz referência a variavel do datatable, por isso o primeiro registro é chamado.

value="#{mhe.dataFolgaAgendada}"

Arrume o seu dialog para trazer a referência carrega ao MB

#{horaExtraBean.horaExtra.dataFolgaAgendada}

Algo assim

Sim, Weder.

Existe outra forma de pegar o objeto da tupla?

Era exatamente isso, Weder.

Obrigado pela ajuda de vocês. Problema solucionado. :slight_smile:
Bom dia!

Realmente, no primeiro dialog você referencia a variável mhe, interna do dataTable.

!!

Valeu… disponha