..:: MX Studio Fóruns ::..: Filtro de GRID para GRID - ..:: MX Studio Fóruns ::..

Jump to content

Publicidade




Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Filtro de GRID para GRID ***diferente do ASFusion

#1 User is offline   hanem 

  • Group: Membros
  • Posts: 10
  • Joined: 04-August 06

Posted 07 November 2006 - 11:15 AM

Feliz Natal à Todos
-----------------------------------------------------------------------------------------------

Gostaria de saber como posso filtrar um grid (flash form) para outro com base apenas em seu primeiro valor, ou seja, inserido o valor numérico no primeiro e o segundo me retornasse com os valores pertinentes a este valor.

Ex: GRID 1 = EMPRESA1, EMPRESA2, etc...
GRID 2 = CONTATOS_EMPRESA1+CONTATOS_EMPRESA2,etc

Sei que no site do AsFusion existe um script applyFilter(segue abaixo) para o grid, porém este script retorna todos os valores possíveis Assim se inserir o valor 1, o script me retornará 1, 11, 21, 31, 111, etc...

-----------------------------------------------------------------------------------------------

<cfformitem type="script">
function applyFilter( term:String, grid:mx.controls.DataGrid, columns:Array ):Void {

var filterTerm:String = term.toString().toLowerCase();

if(filterTerm.length > 0) {
if(_global.unfilteredData[grid.id] == undefined){
if (_global.unfilteredData == undefined){
_global.unfilteredData = {};
}
_global.unfilteredData[grid.id] = grid.dataProvider.slice(0);
}

var filteredData:Array = [];

for(var i = 0; i< _global.unfilteredData[grid.id].length; i++) {
var item:Object = _global.unfilteredData[grid.id][i];
var added:Boolean = false;

for(var j = 0; j< columns.length; j++){
if(!added){
var value:String = item[columns[j]].toString().toLowerCase();
if(value.indexOf(filterTerm) != -1) {
filteredData.push(item);
added = true;
}
}
else {
break;
}
}
}

grid.dataProvider = filteredData;

}
else {
if(_global.unfilteredData[grid.id] != undefined) grid.dataProvider = _global.unfilteredData[grid.id];
}
}
</cfformitem>
0

#2 User is offline   pcsilva 

  • Group: Moderadores
  • Posts: 1940
  • Joined: 23-January 05

Posted 08 November 2006 - 12:49 AM

ColdFusion
<cfset q=QueryNew("") >
<cfset QueryAddColumn(q,"id",listtoarray("1,2,3,4")) >
<cfset QueryAddColumn(q,"nome",listtoarray("Bil,Arnô,Epaminondas,Azuil")) >
<cfset QueryAddColumn(q,"idade",listtoarray("20,21,20,21")) >

<cfform name="form_grid" format="flash">

<cfformitem type="script">

function isFieldsValue(row:Object,critica:Object):Boolean{
var i:String = "";
var r:Boolean = true;
for (i in critica){
if(row[i] != critica[i]){
r = false;
}
}
return r;
}

function query(datasource,critica:Object,stat:Array,maxRow:Number):Array{
var data:Array = datasource.getDataProvider();
var i = 0;
var r:Array = [];
if(maxRow == null){
return [];
}
if(critica == null){
while( i < data.length){
if(r.length < maxRow){
r.push(data[i]);
}else{
i=data.length;
}
i=i+1;
}
}else{
while( i < data.length){
if(r.length < maxRow){
if(isFieldsValue(data[i],critica)){
r.push(data[i]);
}
}else{
i=data.length;
}
i=i+1;
}
}
return r;
}
</cfformitem>


<cfgrid name="Grid1" query="q">
<cfgridcolumn name="nome" header="Nome Completo" width="260" />
<cfgridcolumn name="idade" header="Idade" width="120" />
<cfgridcolumn name="id" display="false" />
</cfgrid>
<cfinput type="button" name="bt" onclick="Grid2.dataProvider = query(Grid1,{idade:20},['nome','id'],3);">
<cfgrid name="Grid2">
<cfgridcolumn name="nome" header="Nome Completo" width="260" />
<cfgridcolumn name="id" display="false" />
</cfgrid>
</cfform>

0

#3 User is offline   hanem 

  • Group: Membros
  • Posts: 10
  • Joined: 04-August 06

Posted 08 November 2006 - 11:56 AM

Pedro,

Obrigado mais uma vez por sua ajuda...

O código funciona perfeitamente para uma query de mesmo nome, porém estou utilizando queries of queries, ou seja, mais de uma query com base na principal e com nomes diferentes já que cada uma possui a função SELECT DISTINCT.

Assim, imagine que uma empresa possa ter mais de um endereço e cada endereço tenha mais de um contato, o uso do DISTINCT torna-se necessário para retornar um único valor após o clique do usuário:

EMPRESA1
...............ENDEREÇO1
................................CONTATO1
................................CONTATO2
...............ENDEREÇO2
................................CONTATO1
................................CONTATO2

EMPRESA2
...............ENDEREÇO1
................................CONTATO1
................................CONTATO2
...............ENDEREÇO2
................................CONTATO1
................................CONTATO2

Você deve estar se perguntando por que não uso a CFTREE, por 2 motivos, primeiro que cada um destes itens tem mais informações distintas (telefone, e-mail, site, etc) o que seria inviável colocar tudo na árvore e por fim pela conveniência do CFGRID de trazer o valor conforme o clique (grid.selectedItem.EMPRESA,grid.selectedItem.CONTATO, etc), possibilitando um melhor controle do que será exibido na tela.

PS: se for possível comente o código...


0

#4 User is offline   pcsilva 

  • Group: Moderadores
  • Posts: 1940
  • Joined: 23-January 05

Posted 09 November 2006 - 01:41 AM

Não entendi, poderia explicar novamente?

ColdFusion
<cfset q=QueryNew("") >
<cfset QueryAddColumn(q,"id",listtoarray("1,2,3,4")) >
<cfset QueryAddColumn(q,"nome",listtoarray("Bil,Arnô,Epaminondas,Azuil")) >

<cfset q2=QueryNew("") >
<cfset QueryAddColumn(q2,"id",listtoarray("1,2,3,4")) >
<cfset QueryAddColumn(q2,"cargo",listtoarray("pedreiro,porteiro,segurança,vendedor")) >

<cfset q3=QueryNew("") >
<cfset QueryAddColumn(q3,"id",listtoarray("1,2,3,4")) >
<cfset QueryAddColumn(q3,"idade",listtoarray("20,21,20,21")) >

<cfform name="form_grid" format="flash" onload="init_AS();">

<cfformitem type="script">
function init_AS(){
_root.q2 = [
<cfoutput query="q2" >
{id:#q2.id#,cargo:'#q2.cargo#'},
</cfoutput>
{}];
_root.q3 = [
<cfoutput query="q3" >
{id:#q3.id#,idade:'#q3.idade#'},
</cfoutput>
{}];
var n = _root.q2.pop();
n = _root.q3.pop();
}


function isFieldsValue(row:Object,critica:Object):Boolean{
var i:String = "";
var r:Boolean = true;
for (i in critica){
if(row[i] != critica[i]){
if(critica[i]==null){
alert(i+' não possui valor!','Selecione um item!');
}
r = false;
}
}
return r;
}

function query(database,critica:Object,stat:Array,maxRow:Number):Array{
var i = 0;
var r:Array = [];
if(maxRow == null){
return [];
}
if(critica == null){
while( i < database.length){
if(r.length < maxRow){
r.push(database[i]);
}else{
i=database.length;
}
i=i+1;
}
}else{
while( i < database.length){
if(r.length < maxRow){
if(isFieldsValue(database[i],critica)){
r.push(database[i]);
}
}else{
i=database.length;
}
i=i+1;
}
}
return r;
}
</cfformitem>

<cfformgroup type="horizontal">
<cfgrid name="Grid1" query="q">
<cfgridcolumn name="nome" header="Nome Completo" />
<cfgridcolumn name="id" display="false" />
</cfgrid>
<cfinput type="button" name="bt" onclick="Grid2.dataProvider = query(_root.q2,{id:_root.Grid1.selectedItem.id},['cargo','id'],1); Grid3.dataProvider=[];" value=">>">
<cfgrid name="Grid2">
<cfgridcolumn name="id" display="false" />
<cfgridcolumn name="cargo" header="Cargo" />
</cfgrid>
<cfinput type="button" name="bt2" onclick="Grid3.dataProvider = query(_root.q3,{id:_root.Grid2.selectedItem.id},['idade','id'],1);" value=">>">
<cfgrid name="Grid3">
<cfgridcolumn name="id" display="false" />
<cfgridcolumn name="idade" header="Idade" />
</cfgrid>
</cfformgroup>
</cfform>

0

#5 User is offline   hanem 

  • Group: Membros
  • Posts: 10
  • Joined: 04-August 06

Posted 09 November 2006 - 05:46 PM

Pedro,

Era exatamente isto que eu precisava....VALEU !!!

Gostaria de saber também como faço para tornar um CFGRID inteiro editável conforme o clique do usuário no botão.

Aproveito ainda para parabenizar sua ajuda aos usuários do fórum, além de incentivá-lo a publicar um livro e tembém disponibilizar serviços consultivos através de um website próprio.

Grande Abraço
0

#6 User is offline   pcsilva 

  • Group: Moderadores
  • Posts: 1940
  • Joined: 23-January 05

Posted 09 November 2006 - 06:56 PM

ColdFusion
<cfform onload="carregar_variaveis();">
<cfformitem type="script">
function carregar_variaveis(){
grid.editable = true;
}
</cfformitem>
</cfform>

0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic



Publicidade




2 User(s) are reading this topic
0 membro(s), 2 visitante(s) e 0 membros anônimo(s)