Inicio > Flash > seldaiendil > Buscador en datagrid

Buscador en datagrid

Experto:
Usuario:
Fecha: 10/03/2008
Valoración: (5,00 sobre 5) Categoría: Flash
20/12/2007
francofr05, usuario preguntando en Flash
Usuario
Hola q tal?
tengo un catalogo de peliculas en un componente datagrid que se carga mediante una base de datos en access. mi pregnta es como puedo hacer un buscador en el mismo flash que selecciones el rango en el datagrid. Por ejemplo buscar en la columna ID "0016" y que se seleccione esa pelicula.
22/12/2007
francofr05, experto respondiendo en Flash
Experto
Es posible.
Al crear el DataGrid deberías asignarle el dataProvider, no?
Bien pues lo que haremos es trabajar con el array que contiene dataProvider para buscar la película.
Por ejemplo, si el array que se asigna al dataProvider se llama "lista" tu código sería así:

---
miDataGrid.dataProvider = lista;
---

Entonces solo nos queda buscar en ese array el índice de la película.
Para este ejemplo, utilizaré la película con el ID 56, de un array que contenga 1000 películas.

Ahora deberemos crear una función de busqueda.
Para ello nos dividimos, dependiendo si el array está ordenado o desordenado:

Una vez creadas ambas funciones se utilizan de la misma forma. Al final explico cómo.

===============================================

ORDENADO:
Si el array está ordenado iremos dividiendo el array por la mitad, y seguiremos buscando en la mitad que contenga el ID.

---
function buscar(array:Array, ID, columna, minimo:Number, maximo:Number) {
if (minimo == undefined) minimo = 0;
if (maximo == undefined) maximo = array.length;
var comparar = ((maximo - minimo) / 2) + minimo;
if (columna == undefined) {
if (array[comparar] == ID) return comparar;
else if (array[comparar] < ID) buscarOrdenada(array, ID,, comparar, maximo);
else buscarOrdenada(array, ID,, minimo, comparar);
} else {
if (array[comparar][columna] == ID) return array[comparar];
else if (array[comparar][columna] < ID) buscar Ordenada(array, ID, columna, comparar, maximo);
else buscarOrdenada(array, ID, columna, minimo, comparar);
}
return false;
}
---

Esta función mira si el objetivo esta en la primera o en la segunda mitad, entonces se llama a si misma pero buscando en la mitad resultante. Llegará un momento en que la mitad resultante sea una sola película.

===============================================

DESORDENADO:

Si el array está desordenado solo queda analizar uno por uno los items:

---
function buscar(array:Array, ID, columna) {
if (columna == undefined) for (iTemp in array) if (array[iTemp] == ID) return iTemp;
else for (iTemp in array) if (array[iTemp][columna] == ID) return array[iTemp];
return false;
}
---

===============================================

Para utilizarlo basta con que escribas:
(Reemplaza el texto en mayusculas)

---
var pelicula:Object = buscar(LISTA, ID, COLUMNA);
---

Para ambas versiones es necesario indicar los siguientes parámetros:

LISTA: array que contiene las películas.
ID: El texto, numero u objeto que se buscará.
COLUMNA: Variable o número de columna que contiene el ID

Si estás buscando la película que en la columna "Precio" tenga el valor "13.00" para subir el precio sería así:

---
var pelicula:Object = buscar(array, "13.00", "Precio");
trace(pelicula.Nombre);
pelicula.Precio = "14.00";
---

Incluso, si cada item del array es otro array (array[0][0]) puedes indicar el número de la columna:

---
var pelicula:Object = buscar(array, "13.00", 7);
trace(pelicula[0]);
pelicula[7] = "14.00";
---
Ambas funciones devuelven false si no coincide ningún resultado.


Una vez copiado el código de la función (dependiendo si tienes el array ordenado o no) solo tienes que ejecutarla como en los ejemplos.

Y recibirás de la función el objeto que contiene todos los datos de la película

Ante cualquier problema no dudes volver a preguntar.

Suerte
---
Sel
27/12/2007
francofr05, usuario preguntando en Flash
Usuario
Incrible respuesta... me sorprendio la verdad.

El unico inconveniente es que la idea era que buscara sin necesidad de que se hayan introducido todas las palabras. Ejemplo para buscar en la columna de titulo se ingresa "enanitos" y se selecciona "blancanieves y los siete enanitos". Si no es posible no hay problema. Igual te brindare tu puntaje por lo anterior
29/12/2007
francofr05, experto respondiendo en Flash
Experto
Vaya, siendo asi la cosa se complica lo ideal sería poder utilizar Expresiones Regulares pero ActionScript 2.0 no las acepta (si ya tienes el Flash 9 te explico como usarlas, porque usa ActionScript 3.0 que si puede).

Una solución sería crear una función que busque una palabra dentro de otra, no que sean inguales, per me temo que consumiría muchos recursos (y por lo tanto tiempo), y si la lista es larga no nos conviene.

...

Perdón, pero llevo como media hora pensando y me parece que esa es la unica opción a parte de no utilizar una busqueda tan exaustiva.

En un caso así en que uno tiene que decidir entre consumir tiempo o comodidad (servirle lo que busca) al cliente, suelo darle la leccion a el/ella. Me explico: podrías insertar una casilla de verificación (si sabes usar DataGrid imagino que sabes usar casillas, si no es así dimelo y te lo explico). Si la casilla está seleccionada se hace una busqueda exaustiva, sino solo se buscan títulos exactamente iguales a el parámetro de busqueda.

Si te interesa te lo explico y puedo crearte las funciones, pero ahora mismo son las 6 de la mañana y como que prefiero descansar xD
Solo dime si te interesa y te explico.

Saludos
---
Sel
10/03/2008
francofr05, usuario preguntando en Flash
Usuario
Excelente. Una fantástica solución.
Más opciones
Enlaces patrocinados