Desarrollo de Sistemas ERP/CRM y Software Libre, Linux, Desarrollo de Proyectos, Programación OpenSource. Web

miércoles, noviembre 30, 2005

Soporte en el SIG para Grids de datos editables.

Haciendo un rehuso de las librerias SourceGrid2 del sitio www.devage.com de Davide Icardi, el SIG brinda soporte para componentes de GRID, encapsulando la DLL de Icardi de manera que el usuario no tenga que hacer referencias a esta para desarrollar sus modulos.

Actualmente 3 componentes utilizan la DLL SourceGrid2

  1. QueryBrowserControl, control para la visualizacion avanzada de registros de consultas SQL, con funcionalidades de operaciones con datos, Insercion, Actualizacion, Borrado, Impresion, etc. Y ademas cuenta con la tecnologia de Filtros Inteligentes descripta en un articulo de este blog.
  2. SmallQueryBrowserControl, control con las mismas caracteristicas de QueryBrowserControl, aunque reducidas en aspecto y con la particularidad de funcionar sin necesidad de consultas SQL.
  3. EditableDataControl, Control del listado, con funcionalidades de edicion en columnas especificas y eventos asociados, muy util en ventanas con gran cantidad de elementos de este tipo donde la edicion se puede realizar in situ.
Una de las bugs reconocidos de SourceGrid2 es su incompatibilidad (esperamos que temporal) con los clientes de ventanas MDI (Multiple Document Interface) donde si tenemos una ventana abierta y maximizada con un componente Grid, entonces si se abre otra ventana con componente Grid la aplicacion se vuelve inestable y se bloquea o tiene comportamiento extraño si para esta se ha usado alguno de los metodos de AutoSize, Stretch o AutoStretch, para lo cual es necesario en el uso de los componentes del SIG, proporcionar los anchos de las columnas deseados.

Mas adelante les comentare de otros componentes rehusados en el SIG.

Soporte en el SIG para versionado de DLLs

EL SIG, ya originalmente fue diseñado para de forma segura, proveer a los usuarios de sistemas de gestion de las herramientas necesarias para el trabajo con bases de datos, esto es que los sistemas de gestion se programan modularmente y estas DLLs con la funcionalidad son colgadas en la red en un servidor con una estructura determinada y un esquema de seguridad tal que cuando los usuarios del sistema se registran estos reciben informacion sobre el esquema de la aplicacion y cuando realizan las acciones las DLLs necesarias son enviadas desde el servidor y corridas localmente que mediante una interfaz de datos con el servidor realizan las operaciones de datos en el servidor. Para toda esta operacion se han establecido caches de DLLs mediante versionado donde si el usuario no tiene la ultima version de la DLL en el cache pues esta se manda desde el servidor actualizandose sin necesidad de volver a bajarlas en otro momento, una optimizacion importante cuando se dispone de conexiones dialup de baja velocidad.

Otra mejora de optimizacion es la utilizacion de un cliente actualizable por el mismo proceso, en resumen el usuario nunca dispone de la ultima version del cliente y el nucleo del SIG por lo que estos son bajados a la maquina del cliente desde la red en cada ejecucion (red local, por supuesto, en caso de no poder realizarse la operacion, se utilizaria el ultimo cliente utilzado).

Aun quedan mejoras por introducir en el SIG, pero a medida que se esta utilizando, nueva optimizaciones son incorporadas y facilmente actualizadas en las maquinas clientes y en las aplicaciones sin requerir gran esfuerzo de mantenimiento.

sábado, noviembre 19, 2005

Anterior articulo sin imagenes

El anterior articulo dedicado a la Navegación Guiada, no contenia imagenes por ser dificiles para introducir en el editor de blogs de Blogger.com, si es de su interes solicite el documento original y le sera enviado por correo, para esto escriba a: ernesto@consumimport.mincex.cu, con gusto le enviare una copia con las imagenes correctas.

jueves, noviembre 10, 2005

Filtrado de Informacion Inteligente para Navegacion de Datos

Filtrado de Información para la Navegación Guiada de la misma.

Endeca, una empresa norteamericana de IT desarrolló hace algunos años un concepto innovador para la navegación de los datos en catálogos extensos a la que denominó Guided Navigation, mediante la cual la información catalogada en dimensiones de la misma es enmarcada en un contexto de navegación donde por cada dimensión de datos se efectúa un calculo de los posibles filtros a aplicar y donde cada calculo que muestre diversidad de criterios es presentado como opciones de filtrado según el tipo de datos en particular y el significado de estos datos, ejemplo de esto tendríamos en el caso de valores de cantidad o precio, donde en el primero se filtraría por rangos posibles, creándose varios filtros de acuerdo a la distribución de los datos en el conjunto y en el de precio se mostrarían filtros también por rangos pero con una semántica orientada de acuerdo al tipo de aplicación especifico (en el caso de una tienda virtual podría ser: menos de $10, $10 a $20, $20 a $50, mas de $50) dándole así posibilidad al usuario que navega el catalogo de centrarse en productos acorde a su interés de gasto, o en el caso de ser un campo de tipo de registro, pues pueden mostrarse los resultados mas interesantes primero o los que mas resultados encierren (Ej. Tipo de tela en un catalogo de ropa: Lino, Algodón, Mezclilla, Seda, Otros). En el caso de no existir diversidad para un campo específico este no se mostraría ahorrándonos la molestia de tener que visualizar filtros sin interés para la búsqueda o permitiéndonos hacer un refinamiento en campos dependientes de este (Ej. País, Ciudad, donde primeramente podríamos tener un conjunto de filtros para País de esta forma: Cuba, Jamaica, México, Brasil, Ecuador, Otros y cuando se seleccione el filtro Cuba el filtro por el campo país ya no sea de interés al ser todos los registros del mismo País, siendo entonces de interés el campo Ciudad pudiéndose crear un filtro para ciudades según el conjunto de datos filtrados para el país Cuba Ej. Ciudad Habana, Santiago de Cuba, Pinar del Río, Matanzas, Otras)

Un esquema de filtrado como este tiene como propósito que los usuarios que navegan los datos buscando “algo” en particular llegarán a los resultados mas cercanos a los que quieren pues cada nuevo criterio de filtrado generara un conjunto no vacío de elementos que son similares en cierta medida al que se busca originalmente, en contraposición a los esquemas donde se tienen que introducir criterios de búsqueda que implican un conocimiento previo (muchas veces a fondo) de la estructura de los datos y donde los conjuntos de resultados nulos pueden resultar comunes y contraproducentes en sitios web donde esto atenta contra la accesibilidad y el dinamismo necesario para atrapar clientes (las principales tiendas virtuales de libros y otros artículos utilizan la tecnología de Endeca o alguna similar, Ej. Barnes & Noble, Amazon, etc.), estimando un incremento de las ventas de entre un 5 y un 10 por ciento, según estimados realizados por la propia empresa Endeca.

La implementación de este esquema para navegación de registros es relativamente fácil y dependiendo del tipo de medio y el momento de exposición del citado contexto de navegación se pueden hacer algunas mejoras de rendimiento convenientes según la cantidad de elementos a navegar.

Básicamente, una aproximación efectiva al esquema completo se basa en meta-información insertada en la consulta y donde el diseñador de la misma puede incorporar todos los datos necesarios para los campos que este mostrará o gestionará los filtros (no necesariamente coinciden).

Ejemplo de esto es...

Supongamos un conjunto de datos donde se tienen los campos:

Nombre, Edad, Dirección, Sexo, Escolaridad (6to, 9no, 12vo, Universitario), Provincia, Municipio, Salario.

Para el cual podríamos tener un conjunto de datos como el que sigue:

Ahora, es evidente que para el diseño de los datos de esta tabla las columnas tendrían tipos de datos comunes entre cadenas de caracteres, números enteros, reales o de tipo índice o llaves foráneas (referidas como números enteros) pero los tipos de filtros se aplican según la semántica de los campos, ya sean descripción, cantidad, valor, edad, nomenclador, etc. infinito dado el numero infinito de posibilidades del mundo real que pueden ser recogidas por los datos de una tabla.

Atendiendo a los significados de los campos de la tabla escogeremos filtros que pueden ser aplicados a cada campo para tener una idea de cómo funciona este método de filtrado.

De esta forma tendremos que al campo de Nombre le aplicaremos un filtro de Nombre propio, que nos mostrara para cualquier conjunto de datos de tipo cadena de caracteres un número máximo predeterminado de rangos, formados a partir de las primeras letras que tengan diversidad en el campo. En el caso de la tabla seria para 5 rangos A..., E..., J..., O..., Y..., donde si el filtro J fuera seleccionado entonces quedaría JO..., JU... ya que estaríamos filtrando por los que empiezan por J y entonces para este campo la diversidad comienza a partir de la segunda letra y así sucesivamente.

En el campo Edad se pueden tomar dos alternativas, atendiendo a la naturaleza de valor entero del dato hacer rangos de valores calculados a partir de cualquier algoritmo particular, pudiéndose obtener algo como: 15 a 24 años, 25 a 45 años, 58 a 75 años o atendiendo a la definición semántica del dato: Adolescentes, Jóvenes, Adultos, Tercera Edad.

En el campo Dirección, es mas complicado implementar un filtro ya que la naturaleza de estos datos es propicia a que se utilice un campo de cadenas de carácter para almacenarlo, además de no contar con regularidades que puedan ser aprovechadas y cualquier análisis sobre la misma podría ser engorroso y no brindar resultados interesantes, por eso no implementaremos un filtro para este campo de la misma manera que pueden ser aplicados varios filtros sobre un mismo campo o sobre varios campos a la vez.

Para el campo Sexo de acuerdo a como se implemente el tipo de datos podríamos tener un filtro de Nomenclador en el caso de ser el dato una referencia a otra tabla con los sexos (a pesar de ser solo dos, tendríamos nuestra tabla normalizada). En todo caso la diversidad del campo se obtiene cuando la cantidad de opciones es mayor que una, para este caso: Masculino, Femenino, pudiéndose mostrar inclusive información de cuantos resultados encierra cada filtro, En el mismo caso están los campos de Escolaridad, Provincia y Municipio. En el caso de Provincia y Municipio estos podrían formar un filtro anidado o escalado, de manera que el filtro para Municipio solo se aplicaría en el caso que para el filtro de Provincia no exista diversidad, permitiéndole al usuario filtrar primero en esa dimensión y posteriormente en la siguiente y así sucesivamente. Ej. Para el primer filtro de Provincias tendríamos: Ciudad Habana, Santiago de Cuba, Pinar del Río, seleccionando Ciudad Habana el filtro de provincias no tendría diversidad lo que implicaría que se efectuara el filtrado por Municipios, obteniéndose un nuevo filtro que aunque anteriormente tenia diversidad al existir una dimensión superior a el en jerarquía no se mostraba resultando en: Boyeros, Cerro, Playa, además de resultar una característica interesante, los filtros anidados pueden tener muchos niveles y particularidades de acuerdo a la estructura de la información y la semántica de la misma.

El Salario presenta la particularidad que como es un valor real (o flotante, como se prefiera) es posible la creación de rangos de Salarios acorde a la particularidad del sistema y además de que el valor $0.00 representa a la persona que no percibe un Salario así que podríamos obtener un rango de la siguiente manera: Sin Salario, $101.00 - $120.00, $224.00 - $340.00, $424.00 - $543.00.

Así para el conjunto de datos mostrado en la tabla obtendríamos el siguiente contexto de navegación.

(Nótese la relación de preferencia del Contexto de Navegación sobre el Conjunto de datos)

En este contexto además de resaltar los filtros de interés para la navegación de los datos con solo leerlo le da una idea al usuario de cómo es el conjunto de datos que esta navegando, sobre todo si es un conjunto extenso que por su magnitud no puede ser visualizado completamente, permitiéndole con pocas interacciones llegar al conjunto de resultados que son de interés para su búsqueda.

Ej. El usuario busca una persona del municipio Boyeros, cuyo nombre empieza por J y que es Universitario.

Haciendo clic en el filtro J... la búsqueda se refinaría a un conjunto de 3 personas

Seleccionando el filtro Boyeros se refinaría aun más la búsqueda al siguiente conjunto:

Para finalmente filtrar por Universitario y llegar al único resultado:

Donde el contexto de navegación quedaría vacío al no existir diversidad en ninguno de los campos de la tabla, llegándose a un registro que cumple con todos los requisitos (o al menos se le acerca) en todas las dimensiones especificadas o de interés.

Elementos de la Navegación.

En el momento que el usuario navega la información es importante contar con varios elementos que le ayudarán a auxiliarse en la misma. Estos son el Panel de Resultados, que no es mas que donde los resultados aparecen listados, El Contexto de Navegación, donde son listados los filtros calculados acorde al conjunto de datos listados y la Barra de Navegación (además de cualquier otra parafernalia de paginado, etc.) que nos permitirá visualizar que filtros hemos aplicado ya y de acuerdo a su composición particular entonces seria posible eliminar algún filtro ya aplicado, o un conjunto de estos según se prefiera.

Es importante señalar que es conveniente cuando se va a aplicar un filtro chequear si ya no existe un filtro sobre el mismo campo o tipo antes para en ese caso reemplazarlo ya que seria incomodo mostrar varios filtros parecidos sucesivamente además de resultar poco eficiente. (Ej. ... > J... > JO... > JOS... por ... > JOS...)

Entre los eleOtro aspecto interesante de la Barra de Navegación es que podría ofrecernos un método de negar un filtro.

Filtro Negado.

Cuando queremos especificar que un filtro es inverso a su definición (Ej. Quiero mostrar las personas que no sean de Ciudad Habana) es conveniente contar con algún método de hacerlo ya sean en el Contexto de Navegación especificando que el filtro ha de aplicarse negado o ya sea en la Barra de Navegación donde los filtros que estén aplicados posteriormente a este deberán ser desechados por referirse al conjunto complemento al de búsqueda y ser los filtros posteriores inciertos.

Navegación Guiada en el SIG.

El SIG cuenta con soporte para todas las especificaciones hechas arriba por medio de la clase Filter la cual puede ser extendida para crear variedades de filtros propios aunque en el SIG se incluyen un conjunto bastante abarcador de los mismos, con soporte para Filtros Anidados, Negados y Reemplazo de filtros ya existentes. También el control QueryBrowserControl, posee métodos para adicionarle un conjunto de filtros a la consulta y para visualizar y gestionar la Barra de Navegación y el Contexto de Navegación, con formularios específicos para todas las operaciones.
Ejemplo:
Nótese la adición de filtros en el primer bloque del tipo CompleteStringFilter con los nombres: Responsable, Clientes, Importadores con los campos: dbo._sig_users_fullname, ClientesYProveedores.Nombre y ClientesYProveedores_1.Nombre respectivamente de acuerdo a la consulta en particular y nótense también las marcas en la consulta referentes a la parte de los campos (/c.../c), la zona de GROUP BY (/g GROUP BY .../g), la zona del ORDER BY (/o ORDER BY .../o) y el lugar donde se insertan los filtros aplicados (/f), todas sin excepción deben ser proporcionadas por el desarrollador para el correcto funcionamiento del sistema de filtrado guiado.

Tipos de Filtros Incorporados en el SIG.

El SIG cuenta con una cantidad abarcadora de filtros pre-programados con diferentes usos, desde rangos de Cantidades, Valores Monetarios, Cadenas de Caracteres, Nombres Propios, de tipo Verdadero o Falso, de Nomencladores, etc.

  • CompleteStringFilter, Este filtro puede aplicársele a los datos de tipo cadena de caracteres y el mismo proporcionara tantos filtros como cadenas distintas exista en el campo en cuestión, con la particularidad de poder decidir si mostrar las cadenas vacías como una opción mas y con que texto.

  • IdentifyerStringFilter, Es el filtro de Nombre propio, siguiendo la regla descrita para el campo Nombre analizado arriba.

  • CountFilter, Filtro de Cantidades, customizable para reflejar rangos de valores y sus unidades de medida, así como tratamiento especial para algunos valores.

  • MoneyValueFilter, Filtro de valores monetarios, igualmente customizable para reflejar rangos de acuerdo a comportamientos pre-definidos para ciertos tipos de aplicaciones (tiendas virtuales, aplicaciones económico-financieras, etc.)

  • ForeignKeyFilter, Filtro de nomenclador, generalmente en las consultas se referencia a las tablas de nomenclador para extraer información referente al significado de las llaves, lo cual es aprovechado por el filtro para establecer al igual que el CompleteStringFilter un listado de ocurrencias ordenado descendentemente propicio para mostrar los tipos de registro listados en el conjunto.

  • IntegerMeaningStringFilter, Es un filtro diseñado para ser usado en los campos donde se tienen valores enteros que tienen un significado especial no relacionado con alguna otra tabla de referencia y cuyo significado es codificado en las aplicaciones de forma fija sin que el conjunto de valores posible puede extenderse con esto. Generalmente usado para designar campos con conjuntos de valores pequeños (Ej. Sexo, 0 = Masculino, 1 = Femenino) que por cuestiones de ahorro de espacio se designan con números.

  • BitFilter, Filtro de valores Verdadero o Falso, con posibilidad de customizar los textos de los filtros de acuerdo al significado del campo.

  • DateFilter, Filtro de fechas, crea rangos a partir de la fecha actual, customizable y pre-diseñado también para mostrar rangos nombrados de acuerdo a la cantidad de días desde la fecha actual (Ej. Hoy, Ayer, Hace 1 Semana, etc.)

En el SIG es posible inclusive a través del sistema de librerías compartidas, escribir sus propias definiciones de filtros y compartirlos de un modulo a otro sin necesidad de reescribir código innecesariamente.

Mostrado como ejemplo tenemos el código fuente del filtro incluido en el sistema CompleteStringFilter para su análisis.

Datos personales

Licenciado en Ciencias de la Computacion, Facultad de Matematicas y Computacion, Universidad de la Habana, 2004. Telefono: 45-3619, Cel: 282-8661