Artículo: Cómo buscar y eliminar una lista de elementos de otra mediante @formulas »
JUAN F. RUIZ F. - SEP 21, 2006 (02:23:59 PM)
En este caso, es algo que hice hace algún tiempo enredando un poco con el lenguaje de formulas ( esto no quiere decir que a alguien se le haya ocurrido antes, por supuesto ... ).
Puedes encontrar el ejemplo incluido con el articulo en mi base de datos de Ejemplos
Introducción
Aunque el lenguaje de fórmulas no es mi preferido ( menos el de la versión 6 que ya es un VERDADERO lenguaje ) hay veces que debemos recurrir a el y lo que sí tengo que reconocer es que para ciertos aspectos puede resultar muy potente como en el caso que se nos da aquí ...
Objetivo
El objetivo de este truco es conseguir que dadas dos listas podamos buscar los elementos de una de ellas en la otra eliminándolos si los encuentra guardando el resultado en otra lista.
Cómo se hace
Nos generamos con el Designer una nueva base de datos y creamos un formulario nuevo al que llamaremos por ejemplo "Eliminador". No tocaremos ninguna de las propiedades del formulario porque no nos van a hacer falta. Creamos la siguiente serie de campos :
- Form : Tipo texto, calculado al crear y su fórmula será el literal "Eliminador".
- ListaOriginal : Tipo texto, permitirá varios valores y como separador tanto para editar como para visualizar se utilizará sólo la coma.
- ListaBusqueda : Tipo texto, permitirá varios valores y como separador tanto para editar como para visualizar se utilizará sólo la coma.
- Resultado : Tipo texto, permitirá varios valores y como separador tanto para editar como para visualizar se utilizará sólo la coma.
Además nos crearemos un botón que contendrá el siguiente código :
FIELD Resultado := Resultado; A := @ReplaceSubstring( ListaOriginal ; ListaBusqueda ; "@" ); B := @Implode( A ; "," ); C := @ReplaceSubstring( B ; "@" ; "" ); D := @Unique( C ); E := @Explode( D ; "," ); @SetField( "Resultado"; E )
Más adelante, explico el código.Si echamos un vistazo al formulario veremos que nos quedará de la siguiente manera ( tablitas y decoraciones aparte ) :
La explicación
Vayamos observando línea a línea el código del botón :
FIELD Resultado := Resultado;
Esta primera línea es necesaria puesto que todo campo de un documento que vaya a ser modificado mediante fórmulas debe ser definido mediante el comando FIELD. Si sólo vamos a leer los valores de un campo no hace falta.
A := @ReplaceSubstring( ListaOriginal ; ListaBusqueda ; "@" );
La función @ReplaceSubstring es la que hace la mayor parte del trabajo de este truco: buscará uno a uno cada elemento del campo "ListaBusqueda" ( que recordemos es un campo de texto de múltiples valores ) en el campo "ListaOriginal" ( que tambien es un campo de texto de múltiples valores ). Si encuentra el elemento lo reemplazará por el tercer argumento que hemos puesto : la arroba ( "@" ). El resultado de la función se guarda en la variable temporal "A".
B := @Implode( A ; "," );
Ahora transformamos la variable A que es una lista en una cadena guardándola en la variable B. Observamos que le hemos indicado a la función @implode que utilize como separador la coma ( de ahí que solo se permitan comas para edición en la definición de los campos de múltiples valores del formulario.
C := @ReplaceSubstring( B ; "@" ; "" );
Como lo que queremos no es sólo reemplazar los elementos encontrados por otro elemento sino eliminarlos deberemos borrar todos los caracteres arroba que haya colocado anteriormente la función @ReplaceSubString. Para ello indicamos como elemento de sustitución la cadena vacía ( "" ). Guardamos el resultado en la variable temporal C.
D := @Unique( C );
El problema ahora es que nos quedarán elementos vacíos en la cadena que deberemos eliminar. Para ello nos viene de perlas la función @unique que elimina elementos repetidos de una cadena o lista de texto. Lo que devuelva @Unique lo asignamos a la variable temporal D.
E := @Explode( D ; "," );
Ya estamos casi al final, deberemos convertir de nuevo la cadena, una vez eliminados los "elementos vacíos" de la cadena. Para ello utilizamos la función @Explode indicándole que use como carácter de separación la coma ( "," ) y guardamos el valor en la variable temporal E.
@SetField( "Resultado"; E )
Por último actualizamos el valor del campo "Resultado" del documento con el valor de la variable temporal E que, recordemos, contendrá la lista de elementos que contenidos en el campo "ListaOriginal" no son iguales a ninguno de los elementos en el campo "ListaBusqueda".


