[RESOLVIDO]<p:confirmDialog> Exclui ultimo registro da tabela

Olá, sou iniciante no java e estou com um problema(aparentemente comum), mas não conseguir solucionar meu problema, com os topicos que já li.

Vamos lá então: Tenho uma tabela que lista os professores cadastrados no sistema. Quando excluo pelo <p:confirmDialog> o mesmo exclui o ultimo campo da tabela(independente de qual campo selecionar).
Quando chamo o metodo(Bean), sem o confirmDialog, o mesmo funciona normalmente.

Segue meu MB:

[code]package managedbean;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import br.es.saocamilo.entidade.Professor;
import br.es.saocamilo.persistencia.ProfessorDao;

@ManagedBean(name=“ProfessorMB”)
@RequestScoped
public class ProfessorMB {

private Professor professor = new Professor();

public Professor getProfessor() {
	return professor;
}

public void setProfessor(Professor professor) {
	this.professor = professor;
}

public String salvar() {
	new ProfessorDao().salvarOuAlterar(professor); 
	return "";
}

public String alterar(Professor p) {
	new ProfessorDao().salvarOuAlterar(p);
	return "";
}

public String excluir(Professor p){
	new ProfessorDao().deletar(p);
	return"";
}
	
public List consulta() {
		return new ProfessorDao().consultar();
}


public String ver(Professor professor) {
	this.professor = professor;
	return "CadastroProfessores.xhtml";
}

public String formataData(Date dt){
	return new SimpleDateFormat("dd/MM/yyyy").format(dt);
}

}

[/code]

Minha Tabela:

[code]<p:dataTable border=“1” var=“pro” value="#{ProfessorMB.consulta()}" id=“messages"
paginator=“true” rows=“10” emptyMessage=“Categorias não encontradas!”>
<p:column filterBy=”#{pro.idProfessor}">
<f:facet name=“header”>Codigo</f:facet>
#{pro.idProfessor}
</p:column>
<p:column filterBy="#{pro.nome}">
<f:facet name=“header”>Nome</f:facet>
#{pro.nome}
</p:column>
<p:column>
<f:facet name=“header”>Telefone</f:facet>
#{pro.tel}
</p:column>
<p:column>
<f:facet name=“header”>Acao</f:facet>

							<p:commandLink action="#{ProfessorMB.ver(pro)}" ajax="false">
								 <button><img src="images/a.png" width="22" height="22" title="Alterar Professor"/> </button>
							</p:commandLink> 
							
							<p:commandLink id="showDialogButton" onclick="confirmation.show()" type="button">
								 <button><img src="images/x.png" width="22" height="22" title="Excluir Professor"/> </button>
							
								<p:confirmDialog id="confirmDialog" message="Deseja confirmar ação?"  
					                header="Excluir Professor" severity="alert" widgetVar="confirmation">
					                <p:commandButton id="confirm" value="Sim" update="messages" onclick="confirmation.hide()"  
					                actionListener="#{ProfessorMB.excluir(pro)}" />  
			       				 <p:commandButton id="decline" value="Nao" onclick="confirmation.hide()" /> 
							</p:confirmDialog>
							
							</p:commandLink>
							
							
						</p:column>
						
					</p:dataTable>

[/code]

Utilizo Primefaces 3.4 + JSF 2.0.

Se alguém puder me ajudar, agradeceria muito.

OBS.: sou novo no forum, desculpe-me se estou postando em local errado.

Nesse caso está ocorrendo o seguinte, vc está criando uma confirmDialog para cada item da lista, e quando vc invoca o show(), te sobra a última :smiley:

As soluções são várias, mas já que vi que seu managedBean é requestScope hoje eu posso te indicar esta daqui; http://www.primefaces.org/showcase/ui/datatableContextMenu.jsf

resumindo:

primeiro vc precisa criar sua confirmDialog fora das columns, ou até mesmo fora da datatable;

como no exemplo, em vez do seu context menu chamar a action, abre seu confirmDialog, que executará a mesma coisa do exemplo;

só altera a rowKey para #{pro.id}

e pronto vc seleciona e remove o seu objeto numa request só

Primeiro, obrigado pela dica “TJvargas”, mas a única alteração, foi que ao invés de deletar o ultimo registro, passou a deletar o primeiro.

Poderia me informar onde estou errando ainda?

[code] <p:confirmDialog for=“prof” id=“confirmDialog” message="Deseja confirmar ação?"
header=“Excluir Professor” severity=“alert” widgetVar=“confirmation”>
<p:commandButton id=“confirm” value=“Sim” update=“prof” onclick=“confirmation.hide()“
actionListener=”#{ProfessorMB.excluir(pro)}” />
<p:commandButton id=“decline” value=“Nao” onclick=“confirmation.hide()” />
</p:confirmDialog>

					<p:dataTable border="1" var="pro" value="#{ProfessorMB.consulta()}" id="prof"
								selectionMode="single" paginator="true" rows="10" selection="#{ProfessorMB.professor}"
								 emptyMessage="Categorias não encontradas!" rowKey="#{pro.idProfessor}">
						<p:column  filterBy="#{pro.idProfessor}">
							<f:facet name="header">Codigo</f:facet>
							#{pro.idProfessor}
						</p:column>
						<p:column  filterBy="#{pro.nome}">
							<f:facet name="header">Nome</f:facet>
							#{pro.nome}
						</p:column>
						<p:column>
							<f:facet name="header">Telefone</f:facet>
							#{pro.tel}
						</p:column>
						<p:column>
							<f:facet name="header">Acao</f:facet>
							
							<p:commandLink action="#{ProfessorMB.ver(pro)}" ajax="false">
								 <button><img src="images/a.png" width="22" height="22" title="Alterar Professor"/> </button>
							</p:commandLink> 
							
							<p:commandLink id="showDialogButton" onclick="confirmation.show()" type="button">
								 <button><img src="images/x.png" width="22" height="22" title="Excluir Professor"/> </button>
							</p:commandLink>
								
							
						</p:column>
						
					</p:dataTable>
	
	[/code]

agora vc não passa mais argumento na sua action, ou seja, seu método remove do managedBean passa a ser sem parâmetros e vai remover esse mesmo objeto professor aqui: selection="#{ProfessorMB.professor}";

Falta o contextMenu aí também conforme o exemplo do primefaces;

Pois aí com o botão direito na linha para excluir vc acaba selecionando um professor de bonus;

Se vc entendeu a idéia que é selecionar um item da lista antes de excluir, não precisa ser com contextMenu, pode usar essa idéia aqui também:
http://www.primefaces.org/showcase/ui/datatableRowSelectionSingle.jsf que vc primeiro seleciona alguém e depois clica em visualizar ou excluir lá embaixo.

é isso aí, como não sei se vc segue algum padrão visual, essas são as dicas, caso vc precise seguir algum padrão visual, vc pode usar um pouco de criatividade para atingir isso.

Obrigado cara, segui o exemplo e as dicas que você me falou e consegui.

Ficou assim o meu código, caso alguém precise…

[code] <p:dataTable id=“prof” var=“pro” value="#{ProfessorMB.consulta()}" rowKey="#{pro.idProfessor}“
selection=”#{ProfessorMB.professor}" selectionMode=“single”>

				        <p:column headerText="Codigo">  
				            #{pro.idProfessor} 
				        </p:column>  
				  
				        <p:column headerText="Nome">  
				            #{pro.nome}  
				        </p:column>  
				  
				        <p:column headerText="Telefone" >  
				            #{pro.tel} 
				        </p:column>  
				        
				         <f:facet name="footer">  
				            <p:commandButton id="prof" value="Detalhes" icon="ui-icon-search"  
				                    update=":form" oncomplete="proDialog.show()" action="#{ProfessorMB.ver(pro)}"/>  
				        </f:facet> 
				          <f:facet name="footer">  
				            <p:commandButton value="Excluir" icon="ui-icon-trash"  onclick="confirmation.show()" />  
				        </f:facet> 
				   	</p:dataTable>
				   
				   
				   <p:confirmDialog  id="confirmDialog" message="Deseja confirmar ação?"  
										                header="Excluir Professor" severity="alert" widgetVar="confirmation">
										                <p:commandButton id="confirm" value="Sim" update=":form" onclick="confirmation.hide()"  
										                action="#{ProfessorMB.excluir}"/>  
								       				 <p:commandButton id="decline" value="Nao" onclick="confirmation.hide()" /> 
					</p:confirmDialog>

[/code]