Criar rich:dataTable Dinamicamente

Boa tarde povo.
Vou tentar explicar o que preciso.

Na imagem que eu coloquei em anexo, tenho um listBox de Regionais. Se o usuario selecionar uma regional e clicar em consultar eu tenho que criar um rich:dataTable
se ele selecionar duas regionais duas tabelas e por ai vai.

Como faço isso?

Você pode usar um datagrid que vai listar todas as regionais selecionadas. E dentro do datagrid vc cria o rich:datatable.
Ou seja, você popula um list com todas as regionais selecionadas e exibe esse list com o datagrid e dentro do datagrid vc cria um datatable listando o conteudo q vc quer exibir

Não consegui te entender amigo =[
Como vou criar minhas varias tabelas?
Preciso criar uma tabela pra cada regional e nao uma apenas.

Então.

Acredito que vc possua uma classe Regional, certo?
Quando vc selecionar as regionais que quer pesquisar e mandar buscar, vc vai ter um list.
vc vai percorrer esse list usando um datagrid. E dentro de cada Regional, vc possui um List do que vc quer exibir na table, certo?
é só criar um datatable dentro do grid com esse list que vc quer.

Bem, se eu entendi a sua dúvida corretamente, seria ± isso…hehehe

Sim eu tenho uma classe Regional, quando o usuario seleciona as opçoes no SelectManyListBox eu pego todas os codigos das Regionais q ele selecionou.

Tem como vc me dar um exemplo, por favor? Usando o dataGrid.

Ficaria ± assim:

// Aqui vc percorre a lista de regionais selecionadas
<rich:dataGrid value="#{seuBean.regionais}" var="regional" columns="3" elements="9">
       
       // Dentro do seu datagrid, vc percorre a sua lista, referente a regional que vc quer.
       <rich:dataTable value="#{regional.suaLista}"></rich:dataTable>
        
</rich:dataGrid>

E no seu Bean, vc faz a lógica pra quando mandar pesquisar, setar na list as regionais selecionadas

Hum começando a entender Marcos.
Só que no meu select vai ser em uma entidade(tabela) de ranking é a tabela de ranking q eu tenho as regionais. Entao se o usuario seleciona duas regionais eu traria os ranking’s das regionais selecionadas.

Mas sua entidade Regional não possui um list de ranking não?

Deixa eu tentar te explicar melhor pra vê se vc consegue me ajudar.

Na verdade eu vou ter sempre duas listRanking vou fazer duas consultas no Ranking, caso o usuario selecione duas Regionais eu terei quatro tabelas e quatro listRanking, como vou fazer isso com o dataGrid?

Crie um panelGroup na sua pagina e faca o binding dele com um bean:

&lt;h:panelGroup binding="#{bean.dataTableGroup}" /&gt;

Ai Nesta classe abstrata crio o dataTabelGroup e adicono as RichDataTable nele

package br.com.xyz.mbean;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;

import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
import javax.faces.component.html.HtmlGraphicImage;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.component.html.HtmlPanelGroup;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.DateTimeConverter;
import javax.faces.el.MethodBinding;
import javax.faces.model.DataModel;

import org.ajax4jsf.component.html.HtmlAjaxCommandLink;
import org.richfaces.component.html.HtmlColumn;
import org.richfaces.component.html.HtmlDataTable;
import org.richfaces.component.html.HtmlDatascroller;

import br.com.mbean.qualidade.BasicMbeanInterface;
import br.com.vo.ComponentType;
import br.com.vo.CustomColumnsVO;
import br.com.vo.CustomTableVO;

/**
 * @author Leandro de Godoy
 * @date 24/03/2011
 * 
 */
public abstract class DataTableModel implements BasicMbeanInterface{

    private HtmlPanelGroup dataTableGroup;
    
    public  DataModel model;
    

    /**
     * @author Leandro de Godoy
     */
    public DataTableModel() {
	super();
    }

    /**
     * // Executa a implementacao do metodo na classe implementadora
     * 
     * @author Leandro de Godoy
     * @date 24/03/2011
     * 
     * @return
     */
    public abstract CustomTableVO getCustomTableVO();

    /**
     * // Executa a implementacao do metodo na classe implementadora
     * 
     * @author Leandro de Godoy
     * @date 24/03/2011
     * 
     * @return
     */
    public abstract List&lt;CustomColumnsVO&gt; loadCustomColumns();

    /**
     * // Método que cria o objeto HtmlDataTable
     * 
     * @author Leandro de Godoy
     * @date 24/03/2011
     * 
     * @param customTableVO
     */
    @SuppressWarnings(&quot;deprecation&quot;)
    private void populateDataTable(CustomTableVO customTableVO) {
	HtmlDataTable dataTable = new HtmlDataTable();
	CustomTableVO customDataTable = getCustomTableVO();
	dataTable = new HtmlDataTable();
	//dataTable.setValueExpression(&quot;value&quot;, createValueExpression(
	//	customDataTable.getValueExpression(), ListDataModel.class));
	dataTable.setVar(customDataTable.getVar());
	dataTable.setRows(customDataTable.getRows());
	dataTable.setSortMode(customDataTable.getSortMode());
	dataTable.setAlign(customDataTable.getAlign());
	dataTable.setId(customDataTable.getId());

	for (CustomColumnsVO vo : customDataTable.getColunas()) {
	    HtmlColumn column = new HtmlColumn();
	    if (vo.getColumnId() != null) {
		column.setId(vo.getColumnId());
	    }
	    column.setSortable(true);
	    column.setSortBy(vo.getExpression());
	    dataTable.getChildren().add(column);

	    HtmlOutputText outPutText = new HtmlOutputText();
	    outPutText.setValue(vo.getColumnName());
	    column.setHeader(outPutText);

	    if (vo.getComponentType().equals(ComponentType.OUTPUT_TEXT)) {
		HtmlOutputText outputValue = new HtmlOutputText();
		outputValue.setValueExpression(&quot;value&quot;, createValueExpression(
			vo.getExpression(), vo.getColumnClassType()));
		column.getChildren().add(outputValue);
	    } else if (vo.getComponentType().equals(ComponentType.COMMAND_LINK)) {
		HtmlAjaxCommandLink link = new HtmlAjaxCommandLink();
		link.setActionListener(createActionListenerMethodBinding(vo
			.getActionListenerMethodBinding()));
		link.setOncomplete(vo.getOnComplete());
		link.setDisabled(vo.getDisabled());
		HtmlOutputText textLink = new HtmlOutputText();
		textLink.setValueExpression(&quot;value&quot;, createValueExpression(vo
			.getExpression(), vo.getColumnClassType()));
		if (vo.getColumnClassType().equals(Date.class)) {
		    DateTimeConverter dateConverter = (DateTimeConverter) FacesContext
			    .getCurrentInstance().getApplication()
			    .createConverter(DateTimeConverter.CONVERTER_ID);
		    dateConverter.setPattern(&quot;MM/yyyy&quot;);
		    dateConverter.setLocale(new Locale(&quot;pt_Br&quot;));
		    textLink.setConverter(dateConverter);
		}
		link.getChildren().add(textLink);
		column.getChildren().add(link);
	    } else if (vo.getComponentType().equals(ComponentType.BUTTON)) {
		HtmlAjaxCommandLink link = new HtmlAjaxCommandLink();
		link.setActionListener(createActionListenerMethodBinding(&quot;#{mbPeriodoOperacao.actionEdit}&quot;));
		link.setOncomplete(vo.getOnComplete());
		link.setDisabled(vo.getDisabled());		
		HtmlGraphicImage image = new HtmlGraphicImage();
		image.setUrl(&quot;/images/_deletar.jpg&quot;);
		image.setStyle(&quot;border: none;&quot;);
		link.getChildren().add(image);
		link.setReRender(dataTable.getId());
		column.getChildren().add(link);
		
	    }
	}

	HtmlDatascroller scroll = new HtmlDatascroller();
	dataTable.setFooter(scroll);
	
	dataTable.setValue(getModel());
	dataTableGroup = new HtmlPanelGroup();
	dataTableGroup.getChildren().add(dataTable);

	dataTable.processValidators(FacesContext.getCurrentInstance());
	dataTable.processUpdates(FacesContext.getCurrentInstance());

    }

    /**
     * // Método que cria as colunas com os parametro informados
     * 
     * @author Leandro de Godoy
     * @date 24/03/2011
     * 
     * @param columnName
     * @param expression
     * @param columnType
     * @param componentType
     * @return
     */
    public final CustomColumnsVO createColumn(String columnName,
	    String expression, Class&lt;?&gt; columnType,
	    ComponentType componentType, String actionListenerMethodBinding,
	    Boolean disabled, String onComplete) {
	CustomColumnsVO v = new CustomColumnsVO();
	v.setColumnName(columnName);
	v.setColumnClassType(columnType);
	v.setComponentType(componentType);
	v.setActionListenerMethodBinding(actionListenerMethodBinding);
	v.setDisabled(disabled);
	v.setOnComplete(onComplete);
	

	if (expression != null) {
	    v.setExpression(expression);
	    String expr = expression.replace(&quot;#&quot;, &quot;&quot;).replace(&quot;{&quot;, &quot;&quot;).replace(
		    &quot;}&quot;, &quot;&quot;);
	    String[] partsName = expr.split(&quot;\\.&quot;);
	    v.setColumnId(partsName[partsName.length - 1] + &quot;Column&quot;);
	}
	return v;
    }

    /**
     * // Método que cria um MethodBinding a partir de uma expression String
     * 
     * @author Leandro de Godoy
     * @date 24/03/2011
     * 
     * @param actionListenerString
     * @return
     */
    @SuppressWarnings(&quot;deprecation&quot;)
    private MethodBinding createActionListenerMethodBinding(
	    String actionListenerString) {
	FacesContext facesContext = FacesContext.getCurrentInstance();
	MethodBinding mb = facesContext.getApplication().createMethodBinding(
		actionListenerString,
		new Class[] { javax.faces.event.ActionEvent.class });
	return mb;
    }

    /**
     * // Método que cria um ValueExpression a partir de uma expression em
     * String
     * 
     * @author Leandro de Godoy
     * @date 24/03/2011
     * 
     * @param valueExpression
     * @param valueType
     * @return
     */
    private ValueExpression createValueExpression(String valueExpression,
	    Class&lt;?&gt; valueType) {
	FacesContext facesContext = FacesContext.getCurrentInstance();
	return facesContext.getApplication().getExpressionFactory()
		.createValueExpression(facesContext.getELContext(),
			valueExpression, valueType);
    }

    /**
     * Classe Interna para conversao de valores tipo Date informada em campos de
     * LINK
     * 
     * @author Leandro de Godoy
     * @date 24/03/2011
     * 
     */
    class DateConverter implements Converter {
	@Override
	public Object getAsObject(FacesContext arg0, UIComponent arg1, String s) {
	    Calendar c = GregorianCalendar.getInstance();
	    String[] parts = s.split(&quot;/&quot;);
	    String mes = parts[0];
	    String ano = parts[1];
	    c.set(Calendar.MONTH, new Long(mes).intValue());
	    c.set(Calendar.YEAR, new Long(ano).intValue());
	    c.set(Calendar.DAY_OF_MONTH, c
		    .getActualMinimum(Calendar.DAY_OF_MONTH));
	    return c.getTime();
	}

	@Override
	public String getAsString(FacesContext arg0, UIComponent arg1, Object o) {
	    DateFormat sdf = new SimpleDateFormat(&quot;MM/yyyy&quot;);
	    sdf.setTimeZone(TimeZone.getTimeZone(&quot;America/Sao_Paulo&quot;));
	    Date data = (Date) o;

	    return sdf.format(data);
	}

    }

    public HtmlPanelGroup getDataTableGroup() {
	if (dataTableGroup == null) {
	    populateDataTable(new CustomTableVO()); // Populate datatable.
	}
	return dataTableGroup;
    }

    public void setDataTableGroup(HtmlPanelGroup dataTableGroup) {
	this.dataTableGroup = dataTableGroup;
    }

    /**
     * // Método que forca a criacao od modelo de dados na 
     * classe implementadora  
     *
     * @author Leandro de Godoy
     * @date 24/03/2011
     *
     * @return
     */
    public abstract DataModel getModel() ;

    public abstract void setModel(DataModel model) ;
    
    
    

}


public enum ComponentType {

    COMMAND_LINK, OUTPUT_TEXT, BUTTON;

}





/**
 * @author Leandro de Godoy
 * @date 24/03/2011
 *
 */
public class CustomColumnsVO {

    /**
     * Expressao de valore da coluna
     */
    private String expression;

    /**
     * Nome da Coluna
     */
    private String columnName;

    /**
     * ID da coluna
     */
    private String columnId;

    /**
     * Classe do Objeto na Coluna Caso Date , sera utilizado o converter de Data
     */
    private Class&lt;?&gt; columnClassType;

    /**
     * Tipo do component: Button Link OutPutText
     */
    private ComponentType componentType;

    /**
     * em caso de Botao excluir e editar, expressao de validação de
     * habilita/desabilita
     */
    private Boolean disabled = false;

    /**
     * MethodBinding do componente
     */
    private String actionListenerMethodBinding;

    /**
     * javaScript a ser executado no fim da requisicao ajax
     */
    private String onComplete;

    /**
     * @author Leandro de Godoy
     */
    public CustomColumnsVO() {

    }



/**
 * @author Leandro de Godoy
 * @date 24/03/2011
 *
 */
public class CustomTableVO {

	/**
	 * ID da table
	 */
	private String id = &quot;table&quot;;

	/**
	 * numero de Linhas da Tabela
	 */
	private int rows = 5;

	/**
	 * Expressao Binding do value da tabela
	 */
	private String valueExpression;

	/**
	 * nome da var utilizadad pela tabela
	 */
	private String var = &quot;item&quot;;

	/**
	 * alingn da tabela
	 */
	private String align = &quot;center&quot;;

	/**
	 * Tipo de Sort da tabela
	 */
	private String sortMode = &quot;single&quot;;

	/**
	 * Lista de colunas da tabela
	 */
	private List&lt;CustomColumnsVO&gt; colunas;
	

Com isso vc consegue criar um panelGroup e adicionar as tabelas a ele de forma programatica.

Estou tentando entender isso ai que vc postou e fazer aqui.

Eu criei essa classe abstrata

[code]public abstract class DataTableModel {

private HtmlPanelGroup dataTableGroup; 
public  DataModel model;  

 public HtmlPanelGroup getDataTableGroup() {   
	 if (dataTableGroup == null) {   
	     populateDataTable(new TableRankingTotalVendas()); // Populate datatable.   
	 }   
	    return dataTableGroup;   
 }   
	  
public void setDataTableGroup(HtmlPanelGroup dataTableGroup) {   
   this.dataTableGroup = dataTableGroup;   
}   

private void populateDataTable(TableRankingTotalVendas customDataTable){   
	HtmlDataTable dataTable = new HtmlDataTable();   		        
	dataTable = new HtmlDataTable();   		         
	dataTable.setVar(customDataTable.getVar());   
	dataTable.setRows(customDataTable.getRows());  		       
	dataTable.setId(customDataTable.getId());   
	     
	for(ColumnsTableRankingTotalVendas colunaTableTotVenda : customDataTable.getColunas()) {   
	    HtmlColumn column = new HtmlColumn();   
	    if(colunaTableTotVenda.getColumnId() != null) {   
	      	column.setId(colunaTableTotVenda.getColumnId());   
	    }   
	         
	    dataTable.getChildren().add(column);   
	      
	    HtmlOutputText outPutText = new HtmlOutputText();   
	    outPutText.setValue(colunaTableTotVenda.getColumnName());   
	    column.setHeader(outPutText);  		           
	               
    }   
} 	      

}[/code]

Como faço pra popular as colunas? De acordo com minha lista de objetos? O que seria no rich:dataTable o value="#{bean.meuListDataModelComMinhaLista}"
Outra coisa nao entendi pra que serve esse expression

Bom agora que vc tem esta classe abstrata o seu bean deve extender ela e implementar os metodos abstratos os dados da tabela devem estar em um DataModel, o valueExpression e a expressao usada nos campos values do dataTabel tipo se vc criasse a tabela na mao teria que colocar no value dela algo como isso value="#{bean.lista}", vc vai ter qeu customizar um pouco este codigo que te passei pra adaptar a sua necessidade , poste + codigo do que vc esta tentando fazer ai pra que eu possa te ajudar.

Eu to meio perdido eu vi seu dataModel declarado no inicio da classe abstrata mas n sei onde vou criar o meu. No meu primeiro post eu coloquei a imagem das tabelas q eu tenho que criar, sao tabelas simples, até agora eu so criei isso que postei pq estou perdido.

entao na classe abstrata vc tem os metodos


  public abstract DataModel getModel() ;  
  
    public abstract void setModel(DataModel model) ; 

Entao qdo seu bean extender esta classe vc vai ter que implementar estes metodos
neste caso o getModel deve retornar um new ListDataModel(suaListaDeObjetosAqui);

Ok leo fiz isso, no meu bean eu preciso criar o que agora? Um dataTableGroup?

Esta assim o DataTableModel

[code]package br.com.vivo.utils;

import javax.el.ValueExpression;
import javax.faces.component.html.HtmlColumn;
import javax.faces.component.html.HtmlDataTable;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.component.html.HtmlPanelGroup;
import javax.faces.context.FacesContext;
import javax.faces.el.MethodBinding;
import javax.faces.model.DataModel;

import org.hibernate.type.ComponentType;

public abstract class DataTableModel {

private HtmlPanelGroup dataTableGroup; 
public  DataModel model;  

 public HtmlPanelGroup getDataTableGroup() {   
	 if (dataTableGroup == null) {   
	     populateDataTable(new TableRankingTotalVendas()); // Populate datatable.   
	 }   
	    return dataTableGroup;   
 }   
	  
public void setDataTableGroup(HtmlPanelGroup dataTableGroup) {   
   this.dataTableGroup = dataTableGroup;   
}   

private void populateDataTable(TableRankingTotalVendas customDataTable){   
	HtmlDataTable dataTable = new HtmlDataTable();   		        
	dataTable = new HtmlDataTable();   		         
	dataTable.setVar(customDataTable.getVar());   
	dataTable.setRows(customDataTable.getRows());  		       
	dataTable.setId(customDataTable.getId());   
	     
	for(ColumnsTableRanking coluna : customDataTable.getColunas()) {   
	    HtmlColumn column = new HtmlColumn();   
	    if(coluna.getColumnId() != null) {   
	      	column.setId(coluna.getColumnId());   
	    }   
	         
	    dataTable.getChildren().add(column);   
	      
	    HtmlOutputText outPutText = new HtmlOutputText();   
	    outPutText.setValue(coluna.getColumnName());   
	    column.setHeader(outPutText);  		           
	               
    }   
}


 /**  
 * // Método que cria as colunas com os parametro informados  
 *      
 * @param columnName  
 * @param expression  
 * @param columnType  
 * @param componentType  
 * @return  
 */   
public final ColumnsTableRanking createColumn(String columnName,   
    String expression, Class<?> columnType,   
    ComponentType componentType, String actionListenerMethodBinding,   
    Boolean disabled, String onComplete) {   
	ColumnsTableRanking v = new ColumnsTableRanking();   
v.setColumnName(columnName);   
v.setColumnClassType(columnType);   
v.setComponentType(componentType);   
v.setActionListenerMethodBinding(actionListenerMethodBinding);   
v.setDisabled(disabled);   
v.setOnComplete(onComplete);   
   

if (expression != null) {   
    v.setExpression(expression);   
    String expr = expression.replace("#", "").replace("{", "").replace(   
        "}", "");   
    String[] partsName = expr.split("\\.");   
    v.setColumnId(partsName[partsName.length - 1] + "Column");   
}   
return v;   
}   


/**  
 * // Método que cria um ValueExpression a partir de uma expression em  
 * String   
 * @param valueExpression  
 * @param valueType  
 * @return  
 */   
private ValueExpression createValueExpression(String valueExpression,   
    Class<?> valueType) {   
FacesContext facesContext = FacesContext.getCurrentInstance();   
return facesContext.getApplication().getExpressionFactory()   
    .createValueExpression(facesContext.getELContext(),   
        valueExpression, valueType);   
}

/**  
 * // Método que cria um MethodBinding a partir de uma expression String     
 * @param actionListenerString  
 * @return  
 */   
@SuppressWarnings("deprecation")   
private MethodBinding createActionListenerMethodBinding(   
    String actionListenerString) {   
FacesContext facesContext = FacesContext.getCurrentInstance();   
MethodBinding mb = facesContext.getApplication().createMethodBinding(   
    actionListenerString,   
    new Class[] { javax.faces.event.ActionEvent.class });   
return mb;   
}   



/**  
 * // Método que forca a criacao od modelo de dados na  
 * classe implementadora    
 *  
 * @author Leandro de Godoy  
 * @date 24/03/2011  
 *  
 * @return  
 */   
public abstract DataModel getModel() ;   

public abstract void setModel(DataModel model) ;   

}
[/code]

Tenho que fazer mais coisas pra utilizar? como faço pra utilizar agora?

bom se vc ja criou o ManagedBean e extendeu a classe Abstrata agora na sua pagina vc coloca <h:panelGroup binding="#{bean.dataTableGroup}" />
com isso ele vai criar o dataTableGroup que no seu bean ta jogando a tabela dentro dele.

Tenho que criar um HtmlPanelGroup dataTableGroup no meu bean entao?

Eu nao to entendendo como vou ir criando as tabelas no meu bean.

Tem como me mostrar como vc faz no seu bean?

Velho agora vc deve criar o seu ManagedBean e registra- lo no faces config, apos feito isso vc deve fazer o seu managedBean extender a classe Abstrata e deve implementar os metodos abstratos da classe.
poste como ficou seu managedBean.