dic 23

Procesar varios registros de una rejilla

Hace unos dias, en un artículo anterior, en el que comparabamos V6 y V7, no para criticar, sino para ver las diferentes formas de llegar a los mismos resultados en determinadas operaciones:

Encuentra las diferencias entre V6 y V7

Prometi a Miguel un ejemplo para ver como se realizaba un ejemplo para procesar varios elementos de una rejilla marcandolos con check como el de la imagen.

En V6 este ejemplo se podria realizar de 2 formas:

  1. Con una rejilla multiseleccion y una toolbar, creando un proceso con origen LISTA y recorriendo los registros para procesarlos y ejecutando el proceso desde la toolbar.
  2. Con una rejilla incrustada en un formulario y un boton que ejecuta el proceso para recorrer los rejistros seleccionados.

Como la misión no es desarrollar el ejemplo en V6, vamos a continuar y a ver como realizarlo en V7.

Y en V7 necesitariamos lo siguiente:

Un formulario, en el ejemplo hemos incluido 2 controles objeto, que muestran 2 rejillas de 2 tablas.

El ejercicio es conseguir procesar varios registros de la rejilla inferior y procesarlos para subirlos a la rejilla superior, pulsando el boton “INCLUIR”.

Para ello necesitamos crear un evento en el formulario como el siguiente:

En el se procesan los registros seleccionados de la rejilla inferior y recorremos la lista, realizando las operaciones necesarias en cada uno. Al finalizar el proceso ejecutamos las sentencias de “Interfaz: Recalcular control()” , para asegurarnos de que las rejillas se actualizan correctamente para reflejar los cambios.

Ahora ya solo nos queda incluir el boton y asignarle el evento anterior

Un ejercicio muy sencillo, cuando se sabe, claro.

PDF Creator    Enviar artculo en formato PDF   
comments: 8 »
dic 22

Sorprendidos!

Posted in foro, novedades, velneo

:O

Si, asi es, es la cara que se me quedo ayer cuando vi como, por primera vez, Velneo hace publica una noticia con la suficiente antelación a la publicación oficial de la nueva versión 7.6

Todo empezo con el anuncio en Facebook, que nos dejo perplejos, nuestro arquitecto Juan Muñoz, se tomaba un descanso tras acabar la versión 7.6, mientras sus compañeros se dedican a documentar las mejoras implementadas.

Notición: La 7.6 esta finalizada, comienza la fase de documentación.

Por si fuera poco, esa misma tarde David Gutierrez nos anuncia oficialmente las novedades que incluye la nueva versión.

Mas sorprendente aún, 😀 , nos anuncia que “algunas” de las ideas han sido incluidas en la nueva versión y me pregunto ¿cuales?, estoy intrigado, quién sera el afortunado. Porque parecen haberse creado 2 bandos entre los que apoyamos la idea de “INTRO-TAB” y los que apoyan la idea de “Android”.

Esta claro, que, no todos podemos estar igual de satisfechos, ya que hay opiniones para todos.

Solo hemos tenido que esperar un dia para saber la solución, Velneo nos ha vuelto a sorprender haciendo publicas la nueva situación de las ideas que los usuarios han votado.

Y a pesar de los problemas que puedan presentarse, debido a la multiplataforma, no me queda mas remedio que quitarme el sombrero, por el esfuerzo realizado por el equipo de Velneo para solucionar este problema. ¡¡Chapeau!!

La segunda idea, tambien ha sido estudiada, y eso es mucho, y muy importante, porque, a pesar de que no este claramente definida la postura final, el simple hecho de que hemos sido informados, ya es un avance muy importante.

Y no voy a dudar de su palabra, de que intentarán hacerlo lo mejor posible, ¡¡Gracias por la información!!

Y no menos importante, una noticia de la que ya habiamos sido informados en la presentación del 12 de noviembre, se trata de la implementación de “Aceptar sin cerrar formulario”, con alguna mejora más.

Pero esto, no de beria ser visto como un problema por aquellos que solicitaron otras ideas como primordiales:

porque una vez conseguido nuestro proposito principal, ¿que nos impide apoyar a los que solicitaron estas ultimas ideas?.

Al final va a resultar que noticias como estas: “Desde mi punto de vista” y “La importancia de TAB o INTRO” y debates como este, “Enter o Tab, prioridad máxima” si son importantes, y digo yo,

No se trata de estar en dos bandos, unos contra otros, se trata de definir prioridades, y personalmente, conseguida la priodidad que teniamos, nuestro apoyo puede convertirse en nuevos votos para el resto de ideas, para que sean tenidas en cuenta en un futuro breve.

A Velneo, gracias, por hacernos sentir, que de verdad las cosas estan cambiando.

No se si estar mas agradecido por las novedades que nos esperan tras las navidades, o por el simple hecho de haber sido informados.

En cualquier caso, es uno de los mejores regalos que nos podian hacer.

¡¡¡GRAAAAAAAAACIIIIIIAAAAAAASSSSSSS!!!

PDF    Enviar artculo en formato PDF   
comments: 1 »
dic 22

Glosario A-Z

Posted in glosario

¡¡¡Feliz dia de la salud!!!

Hoy sintiendolo mucho, los que no tenemos suerte para los premios, ya llevo 3 años sin ver absolutamente nada de nada, tendremos que resignarnos y estar contentos y felices por tener una buena salud y esperemos que no falte trabajo, que visto como esta el patio, no nos podemos quejar, y como toca currar fuera de casa …

Aqui os dejo un pequeño glosario con terminos que se usan frecuentemente en Velneo V6 y V7.

A

  • Acción, es un objeto de la caja de aplicaciones que nos permite ejecutar otros objetos. Una de las principales utilidades de este objeto el poder ejecutar otros objetos desde los menús, toolbars, botones, etc.
  • Actualización, es un subobjeto de una tabla que nos permite acumular valores de campos en otros campos de otras tablas a través de los enlaces a las tablas maestras o enlaces indirectos a tablas reales. P.E. Podemos acumular el importe total de un albarán desde las lineas del albarán, sumando todos los importes de cada linea, a través del enlace a la cabecera del albarán.
  • Apache, es un servidor web HTTP de código abierto multi-plataforma (para Windows, Linux, Mac).
  • API, es un conjunto de funciones y procedimientos (o métodos) que nos permiten trabajar a bajo nivel con los datos del sistema (Application Programming Interface).
  • Array, es un conjunto de elementos que tienen las mismas propiedades. De esta forma podemos definir una matriz para una única variable numérica con 10 valores diferentes, Para asignar o recuperar el valor de un Array, necesitamos indicar la posición del valor a leer/modificar.
  • Asistente de formulas, es uno de los paneles de Velneo V7, destinado a escribir fórmulas o expresiones matemáticas, alfabéticas, etc. La principal ventaja del uso de éste asistente, es evitar errores en la sintaxis de las expresiones.

B

  • Base de datos, es la aplicación que permite crear estructuras de para almacenar datos y gestionarlos posteriormente a través de consultas.
  • Base de datos externa, es el objeto que permite establecer conexiones con otras bases de datos a través de un driver ODBC.
  • Bloc de formularios, es un objeto que nos permite ver las fichas de una lista, facilitando el movimiento al registro anterior/siguiente y primero/último.
  • Búsqueda, es el objeto que permite realizar consultas sobre los registros de una tabla, para ello podemos utilizar los indices y condicionar dichas consultas para mostrar únicamente los registros necesarios.

C

  • Cadena de formato, es la representación visual de un valor, ya sea numérico, alfabético, fecha, hora, etc. Por ej.: en el caso de un valor numérico, podemos decidir si se visualizarán los decimales y cuantos se visualizarán, los separadores de millares, etc.
  • Cadena de texto, o cadena de caracteres, es una secuencia de caracteres alfanuméricos.
  • Caja de Datos, corresponde a la estructura de la base de datos en donde vamos a crear las Tablas y todas las relaciones existentes entre ellas. Para los que ya conocían versiones anteriores, corresponde al panel izquierdo del antiguo editor de mapas. En esta versión, la diferencia reside en que podemos crear varias cajas, permitiendo modularizar la aplicación en aplicaciones mas pequeñas y sencillas de mantener.
  • Caja de Aplicaciones, no va a permitir almacenar todos los objetos visuales para crear la interface con el usuario, como formularios, rejillas, búsquedas, menús, acciones.
  • Campo, es cada uno de los elementos que forman un registro de una tabla y que contiene o permite almacenar un dato del registro.
  • Casillero, es un objeto que nos permite visualizar un conjunto de registros mediante una cuadricula de X filas por Y columnas. Es ideal para la representación de fotografiás o para trabajar con los terminales táctiles (como los utilizados en los restaurantes).
  • Cesta, es un objeto que podemos utilizar en ejecución para almacenar registros en la memoria de vClient, para procesarlos en cualquier momento.
  • Conexión de evento, permite conectar un Evento de formulario, a una acción en ese mismo formulario, es decir, permite ejecutar un proceso local tras a la ganancia/perdida de foco de un subobjeto, etc.
  • Constante, es un objeto que permite almacenar un valor que permanece invariable a lo largo de toda la ejecución de la aplicación.
  • Contenido inicial, es el valor que se le asigna a un campo cuando se crea un registro (en las altas), este valor también se puede calcular mediante una expresión, y en este caso el valor del campo será calculado cada vez que alguno de los componentes de la expresión sea modificado.

D

  • Demonio, es un objeto similar al proceso, pero en este caso la ejecución la realiza siempre vServer sin necesidad de intervención del usuario, ya que se ejecuta automáticamente cada X milisegundos (donde el valor de X lo establece el programador durante el desarrollo de la aplicación). El tiempo establecido para la ejecución de un demonio, es el tiempo que transcurre entre el final de una ejecución y el comienzo de la siguiente ejecución.
  • Deshacer transacción, permite invertir todos los procesos ejecutados en caso de que una transacción no finalice correctamente.
  • Dibujo, es el objeto que nos permite almacenar dibujos estáticos dentro de los proyectos de la aplicación, como iconos y otros gráficos que van a ser utilizados en la aplicación y a los que el usuario final no tiene acceso.
  • Dock, es el sub-objeto que permite dividir un marco en partes y que utiliza un formulario sin origen para mostrar su contenido.
  • DLL, es una librería externa de funciones, creada en “C” o “Delphi”

E

  • ECMASCRIPT, se trata de un lenguaje de Script aceptado como estándar que soporta características de la programación orientada a objetos, similar a JavaScript.
  • Editor de esquemas, es modulo de vDevelop que nos permite crear los esquemas para la base de datos que hemos definido. También podemos usar el editor de esquemas para definir la propia base de datos de forma visual. Editor visual de proyectos, permite visualizar los proyectos en vDevelop del mismo modo que lo hace el editor de esquemas con las tablas. Enlace indirecto real, permite establecer un vinculo entre dos tablas que no son Maestra-Histórica pero que tienen elementos comunes que permiten establecer dicho vinculo. P.E. Entre la tabla de lineas de albarán y la tabla de stock, podemos establecer un vinculo utilizando los campos Articulo y Almacén, que son comunes a las 2 tablas. Enlace plural, es el vinculo que se establece entre una tabla (maestra) y otra tabla (histórica) cuando creamos un campo enlazado a la tabla maestra, es decir, lo que en anteriores versiones llamábamos históricos. Esquema de tablas, es la representación visual de la estructura de la base de datos. El esquema de tablas nos facilita enormemente la comprensión del diseño lógico de la base de datos y los enlaces existentes entre las tablas.
  • Estructura de tablas, es la definición de las tablas en si, es decir, los campos de la tabla, los indices de ordenación, las actualizaciones, los enlaces a otras tablas (maestros y plurales).
  • Evento de formulario, son procesos locales definidos en los formularios que podemos asociar a un botón del formulario o a un evento en la ejecución del mismo, como puede ser, mover el ratón sobre un objeto del formulario, pulsar el botón derecho del ratón u otras acciones.
  • Evento de tabla, es cada uno de los procesos que podemos asignar a una tabla y que serán ejecutados cada vez que se produzca un Alta, Modificación o Baja en dicha tabla. Los eventos pueden ser de 3 tipos: Anterior, Interno y Posterior, dependiendo del momento en que se ejecutara el proceso definido.

F

  • Filtro, es una acción que permite obtener todos los registros de una lista que cumplen una o varias condiciones.
  • Formulario, es el objeto que permite visualizar los datos de una ficha o registro de una tabla.
  • Función (expresión), es una expresión aritmética o matemática que utilizaremos en el asistente de formulas. Revisar .
  • Función (proceso), es un objeto similar a los procesos ya que se programa de la misma forma, pero a diferencia de estos, a una función definida por el usuario, podemos pasar parámetros y como resultado, al finalizar, obtenemos un valor de retorno.

G

H

  • Herencia, es la capacidad que posee un objeto de conocer las características y propiedades de todos los objetos heredados por este.
  • Herencia inversa, es la propiedad que permite acceder a objetos definidos en las cajas que heredan a la caja actual, en vez de a objetos de las cajas heredadas.

I

  • Imagen SVG (Scalable Vector Graphics), es un formato de gráficos escalable. Esto quiere decir que los gráficos no pierden calidad al aumentar o disminuir su tamaño, pues se trata de imágenes vectoriales.
  • Impresora lógica, es un objeto que nos permite indicar en cada informe cual sera el destino del mismo. La función de este objeto debemos completarla asignando cada impresora lógica a una impresora física.
  • Indice, es el archivo asociado a una tabla de datos y cuya misión consiste en mantener ordenados los registros de la tabla de datos según los criterios de ordenación establecidos en el indice.
  • Informe, es el objeto que nos permite definir y organizar la salida de los datos de nuestras tablas a través de la impresora.
  • Inspector: Objetos, muestra todos los objetos de una caja organizados por tipo y alfabéticamente, para poder localizar cualquier objeto rápidamente.
  • Inspector: Qué usa, cambia constantemente y muestra todos los objetos que son usados por el objeto en el cual nos situamos actualmente.
  • Inspector: Dónde se usa, cambia constantemente y muestra todos los objetos que utilizan al objeto en el cual nos situamos actualmente.
  • Inspector: Campos, también se actualiza automáticamente al cambiar el objeto en el que trabajamos actualmente, mostrando la estructura de campos de la tabla asociada a dicho objeto.
  • Instancia, es la ubicación física que utilizará una aplicación para almacenar los datos de las tablas durante la ejecución de la misma. Según esto, podemos tener una misma aplicación, con varias instancias (p.e. Para diferentes empresas o ejercicios).

J

  • JavaScript, es un lenguaje de script, utilizado principalmente por los navegadores web, que permite crear interfaces de usuario mejoradas y crear paginas web dinámicas.
  • JDBC, es un API que permite el acceso a bases de datos desde el lenguaje Java (Java Database Connectivity)

K

L

  • Librería externa, es una aplicación desarrollada bajo lenguajes de programación como C o Delphi que permiten aportar un valor añadido a los desarrollos con funciones que no son soportadas directamente por la propia herramienta.
  • LML, lenguaje de etiquetas similar a XML “reinventado” por un servidor. 😀
  • Localizador, es un objeto de las cajas de aplicaciones que nos permite seleccionar un registro de una lista a través de una ventana de selección. De esta forma, no es necesario conocer el código del registro para poder editar los datos (p.e.: en un formulario)
  • Lupa, es el objeto que nos permite realizar filtros sobre una rejilla durante la ejecución de la aplicación.

M

  • Maquetar, es organizar los controles de un objeto, p.e., alinear varios campos de edición en un formulario.
  • Marco, permite definir cual sera el formulario utilizado inicialmente como interfaz de usuario al ejecutar la aplicación.
  • Menú, es el objeto que permite agrupar acciones y también otros menús, para mostrarlos en ejecución como menús desplegables (popup)
  • Multipartir, es una acción que permite dividir una lista de registros, creando listas mas pequeñas que comparten el mismo campo de ordenación utilizado antes de la división.
  • Multiplataforma, es la capacidad que tiene una aplicación para poder ser ejecutada en distintas plataformas (Windows, Linux, Mac), sin necesidad de realizar cambios (importantes, al menos) o que esta adaptada a varias plataformas manteniendo un interfaz de usuario y características comunes a todas ellas.
  • Multivista, es un objeto que nos permite encadenar otros objetos y mantenerlos sincronizados entre si. Lo que anteriormente conocíamos como doble bala, pero que, en la versión actual ha sido mejorado permitiendo enlazar múltiples objetos.

N

  • Navegante, es la herramienta que nos permite obtener datos de diferentes tablas a través de los enlaces definidos (Maestros e Históricos) en la estructura de tablas de las cajas de datos.

O

  • ODBC, es un estándar de acceso a datos (Open Database Connectivity), cuyo propósito es traducir las consultas de datos de las aplicaciones a un lenguaje común que permita conectar diferentes bases de datos entre si.
  • Operador aritmético, es un signo que nos permite realizar operaciones matemáticas como la suma, resta, multiplicación, división ( + – * / )
  • Operador lógico, es un signo que nos permite realizar operaciones lógicas como AND, OR, XOR

P

  • PopUp, es un menú desplegable.
  • Proceso, es el objeto de Velneo que nos permite escribir secuencias de código, de la forma mas parecida a como se realiza en otros lenguajes de programación. Este objeto, al igual que los Eventos de tabla (Triggers) y los Demonios, se programan exactamente de la misma forma.
  • Propiedad, de un objeto, es cada una de las características especiales que definen un objeto, como identificador, heredable, publico, tamaño.
  • Puerto serie, es el objeto que nos permite establecer una conexión con un dispositivo conectado a través del puerto serie.
  • Punto de inserción, es un subobjeto que nos permite indicar los lugares donde podremos utilizar la herencia inversa.

Q

R

  • Refresco, es la capacidad que permite a la base de datos, actualizar la información que están visualizando en ese momento, cuando algún usuario realiza alguna transacción y esta afecta directamente a la visualización de datos por parte de otros usuarios.
  • Registro, es cada una da las fichas que se almacenan en una tabla. En una tabla de Clientes, cada registro es la ficha o conjunto de datos de cada uno de los clientes.
  • Rejilla, es el objeto que nos permite visualizar el contenido de una tabla de datos.
  • Retorno, es el resultado obtenido tras la ejecución de un proceso, función, o consulta en la base de datos. Cuando se trata de una función el retorno es un valor, pero cuando se trata de un proceso o una consulta, el retorno puede ser una lista de registros o un único registro (ficha).

S

  • Servicio, es una aplicación ejecutada automáticamente por el sistema y que no requiere intervención por parte del usuario.
  • Sincronización, es la propiedad que tienen los objetos para ser actualizados cuando alguno de ellos sufre algún cambio o modificación, y este cambio afecta a la representación visual de los demás.
  • Sitio, es el conjunto o la totalidad de objetos que forman un proyecto. Debe estar formado como mínimo por una Caja de Datos y por una Caja de Objetos. Aunque no esta limitado el numero de cajas que lo forman, ya que dependerán de la complejidad del proyecto. Un Sitio es una ubicación física donde se almacenan las cajas que forman nuestros desarrollos.
  • SQL, es un lenguaje de consulta estructurado (Structured Query Language) para acceder a bases de datos relacionales

T

  • Tabla de datos, son los archivos encargados de almacenar conjuntos de registros con una estructura común de forma ordenada.
  • Tabla estática, son pequeñas tablas de datos creadas internamente por el programador que están limitadas a un pequeño número de registros. Ademas, el usuario no tiene accesos a crear o modificar registros en estas tablas.
  • Tabla maestra, es aquella tabla que posee un campo #CODIGO de Clave Única, numérico o alfanumérico
  • Tabla maestra arbolada, es aquella tabla de datos, en la que los códigos de los registros tienen una estructura similar a la utilizada en en P.G.C. (plan general contable), y en donde un registro puede ser maestro de otro grupo de registros de la misma tabla y también histórico de otro registro.
  • Tabla histórica, es aquella que no tiene un indice de Clave Única, y por tanto, no puede ser maestra de ninguna otra tabla. Pero si puede tener múltiples enlaces a otras tablas maestras, y sera pues, histórica de todas ellas.
  • Tabla sub-maestra, es una tabla cuyo código de Clave Única, depende directamente de la tabla maestra asociada, y por tanto, el código de Clave Única de esta tabla esta compuesto por el código de la tabla maestra + el código de la tabla submaestra. (Ejemplo, en una tabla sub-maestra de lineas de facturas, el código sera: #FACTURA + #CODIGO).
  • Toolbar, es un objeto que permite agrupar y ejecutar un conjunto de acciones.
  • Transacción, es un conjunto de órdenes que se ejecutan formando una unidad de trabajo, es decir, en forma indivisible.
  • Trigger, véase Evento de tabla.
  • Tubo de ficha, es objeto de las cajas de aplicaciones que nos permite crear un registro en una tabla a partir de otro registro de la misma tabla o de otra tabla diferente, pero que normalmente tienen datos comunes.
  • Tubo de lista, es objeto de las cajas de aplicaciones que nos permite crear una lista de registros en una tabla a partir de otra lista de registros de la misma tabla o de otra tabla diferente, y que también suelen tener datos comunes entre el origen y el destino.

U

V

  • vAdmin, es la Consola de configuración remota para administrar el vServer.
  • Variable global, es aquella variable que puede ser usada en cualquiera de las cajas de datos y de aplicaciones que forman la aplicación. Se usa también para condicionar las búsquedas por cualquiera de sus indices.
  • Variable local, es aquella variable que solo puede ser usada en el objeto en el que es definida.
  • vClient, es el Cliente de acceso a cajas de objetos (iRunner en versiones 6.x)
  • vDataClient, es el Cliente de acceso a cajas de datos. Aplicación que nos permite acceder a todas las tablas de datos e indices, sin necesidad de tener definidos los objetos propios para esta tarea.
  • vDevelop, es el Entorno de desarrollo integrado de base de datos de Velneo (el Editor de mapas en las versiones 6.x y anteriores), que permite al desarrollador (analista y/o programador) definir las relaciones entre tablas y los objetos para la representación gráfica de los datos.
  • ViewFlow, es un objeto que permite mostrar una lista de registros de forma grafica.
  • vModApache, es…
  • vServer, es el Servidor de bases de datos de Velneo.
  • vTranslator, es la herramienta para la traducción de aplicaciones a otros idiomas.

W

X

  • XML, lenguaje de etiquetas aceptado como estandard.

Y

Z

  • Acción, es un objeto de los proyectos de aplicaciones que nos permite ejecutar otros objetos. Una de las principales utilidades de este objeto el poder ejecutar y encadenar otros objetos como busquedas, procesos, rejillas, formularios, etc. desde los menús, toolbars, botones, etc.


PDF Download    Enviar artculo en formato PDF   
comments: Comentarios desactivados en Glosario A-Z
dic 21

Paginador de registros

En el articulo anterior, proponiamos una solución a un problema concreto, como siempre, una solucion sencilla a un problema aparentemente complejo, ¿Quitar o no quitar los punteros sigular de plural?

Pues bien, como no debemos quitar nada, porque “Quitar” es sinonimo de “Robar” y eso no esta bien, he decidido que para este ejemplo la frase apropiada es “¡Divide y venceras!”

Ademas, esta división tambien nos reporta beneficios, y no solo en tiempo, sino también economicos (cuando las tarifas de moviles se calculan por volumen de transmisión de datos), aunque el mejor, es la menor carga soportarda por el servidor, y que se traduce en beneficio para el resto de usuarios que trabajan simultaneamente. Ya sabeis, si mis operaciones no saturan la capacidad de vServer, este estará disponible para realizar otras operaciones en menos tiempo y de forma más eficiente.

Basicamente, cuando programamos mal, nos damos cuenta porque la consulta o tarea que esta realizando el servidor es excesivamente lenta y debemos mejorarla para ganar esa velocidad que nos falta. Pero cuando un proceso funciona aparentemente bien, pocas veces intentamos mejorarlo simplemente para quitar carga al servidor y mejorar las tareas de los demas.

Basandonos en esto, voy a explicar como realizar un paginador, que nos permita ver los registros de una tabla (con un volumen de datos elevado).

¿Quien ha pensado alguna vez en hacer una web  mostrando enormes volumenes de datos sin utilizar paginadores?

La respuesta es sencilla, en internet, son tan habituales que no hacerlo seria una excepción.

Y sin embargo, ¿porque? cuando mostramos una rejilla con vClient, nadie piensa en poner un paginador.

Sera porque la respuesta es rapida y no tenemos necesidad, y nos da igual.

En cualquier caso, aqui dejo el ejemplo, y para realizarlo vamos a necesitar los siguientes objetos:

  • una variable global, una para saber el numero de pagina actual
  • otra variable global, para saber el numero de registros a mostrar en cada pagina
  • una busqueda, para mostrar los registros de la tabla, en nuestro ejemplo, sera una busqueda por el indice ID completo, que retorne todos los registros.
  • un proceso para ejecutar la busqueda y retornar la lista de registros
  • una rejilla para mostrar el resultado
  • un formulario, con un control objeto para ejecutar el proceso y mostrar la rejilla y sobre todo, con algunos botones y eventos para controlar nuestro paginador, que es a fin de cuentas, el ejercicio que nos proponemos aqui.

Empecemos pues,

Aqui esta el resultado de nuestro formulario con la rejilla y el paginador, y ahora los vamos a desmenuzar para ver todos sus componentes.

En este momento, necesitaras crear una rejilla de la tabla para la que vas a realizar el ejercicio, y sobre el formulario, como puedes ver, aparece un control objeto que es donde se muestra la rejilla.

El control objeto ejecuta un proceso para retornar la rejilla. Este proceso se encarga de ejecutar la búsqueda y seleccionar los registros a visualizar dependiendo de la página activa en cada momento.

En este punto, si aún no has creado las variables globales, deberias crearlas para usarlas en el proceso, y recuerda que deben ser numéricas. Necesitas una variable global llamada $PAGINA_ACT, para saber en que página nos encontramos y otra llamada $PAGINADOR para saber el nº de registros a mostrar en cada página.

La búsqueda que vamos a definir no es nada compleja. Solo una simple búsqueda por ID con todos los registros de la tabla.

Ahora que yatenemos todos los objetos necesarios para realizar el ejercicio, ha llegado el momento de crear los Eventos del formulario, y el primer evento que vamos a ver es el de inicio del formulario. En este evento le vamos a indicar a las variables globales, los valores por defecto, página actual = 1 y el nº de registros que queremos visualizar en cada página.

Ahora, crea una conexión de evento y le asocias el evento creado, para que el evento se ejecute al inicar el formulario.

Seguimos creando el evento para movernos a la primera pagina y es muy similar al anterior, unicamente tenemos que refrescar el control objeto al finalizar el evento para actualizar nuevamente la rejilla.

Ahora veamos el evento para movernos a la página anterior, solo debemos comprobar si la página actual es > 1 y restar 1 a la variable global.

Ahora que ya tenemos los eventos, solo queda ir a las propiedades de los botones y asociarles su evento correspondiente a cada uno, mediante la propiedad “Ejecutar evento”.

El artículo esta incompleto, solo hemos visto los eventos para movernos a la “Primera página” y para ir a la “Página anterior“, pero con estos ejemplos, ya no deberia resultar dificil crear otros 2 eventos para ir a la “Página siguiente” y a la “Ultima página“, asi pues, consideralo parte del ejercicio y terminalo tú mismo.

En realidad, a pesar de todo este rollo que he metido, se tarda menos en realizar el ejercicio completo que en escribir el articulo.

PDF Download    Enviar artculo en formato PDF   
comments: 15 »
dic 20

Soluciones sencillas para optimizar el rendimiento.

Nuestro amigo sat.sbinario plantea el siguiente problema en el foro de V7

Preocupación con el rendimiento con número de registros elevado y optimización

en el que expone lo siguiente:

Hola a todos:

La situación es esta. Tabla con 40 campos (2 de ellos singular de plural por índice), unos 10 índices y 180000 registros.

He notado que el rendimiento de la aplicación cuando se trabaja con esta tabla decae notablemente. Por ejemplo, una rejilla que muestra todos los registros (resultado de una búsqueda), “se ve” en pantalla mientras la carga cómo va refrescando los datos, en especial los resueltos a través de los punteros singular de plural. Además cuando utilizas algún localizador asociado a la tabla, tienes tiempos de espera notables, que incluso provocan la rotura del vClient si no eres suficientemente paciente.

Esto nunca me había pasado en v6, así que lanzo varias preguntas.

¿Se debe a los punteros singular de plural? ¿A los componentes visuales? ¿Qué aspectos intervienen en estos tiempos de espera? ¿Optimización? ¿Alguna experiencia con número de registros elevados?

Un saludo y gracias.

Y despues de varias respuestas en el mismo hilo del foro se llega a la conclusion de que el problema esta en los “Punteros singular de plural”. Y la verdad, considero que es un problema muy puntual, para casos especiales.

Como ya sabeis, yo suelo protestar mucho donde otros no protestan, pero como me gusta llevar la contraria a todos, 😀 , donde los demas se quejan, yo busco soluciones,  asi que analicemos el planteamiento y veremos la solución:

Planteamiento:

  1. La tabla tiene “muchos campos”
  2. La tabla tiene varios “punteros singular de plural por indice”
  3. La tabla tiene 180000 registros, pero podria tener más.

Problema:

Ya hemos identificado que el problema son los “punteros singular de plural por indice”

Solución:

A la vista de estos parametros tenemos varias soluciones posibles:

  1. El problema son los “Punteros” pues una solución sencilla es “Quitar los punteros”, 😀 , creo que es la más fácil, la mas sencilla de implementar y la que mejor soluciona el problema. Ahhhhhhhhh, vale, ¡que no se puede hacer eso!, :( , pues vamos a buscar otra solución.
  2. En el foro se aporta una solución que también es valida, dejar los punteros en la tabla, pero quitarlos de la rejilla. Es una buena solución, pero que pasa si necesito mostrar columnas a través de los punteros y no puedo eliminarlos, esta solución tampoco es valida.
  3. Olvidemos el problema principal, que parecen ser los “Punteros” y centremonos en el resto de parámetros de la ecuación. Haber, para que necesito mostrar 180000 registros, acaso tengo que memorizarlos, :( , ¿necesito verlos todos? si falta uno, o faltan 1000 registros, ¿te vas a dar cuenta?. Pues ahi tienes la solución, prepara un paginador y muestra los registros de 100 en 100 o de 5000 en 5000 y veras como la velocidad aumenta considerablemente. Ademas, antes de mostrar cantidades indecentes de información, deberiamos pensar todos en el ahorro economico (si, economico), porque vamos a utilizar las aplicaciones con moviles, y las compañias van a cobrar por volumenes de transmisión de datos, y de esta forma, además, matamos 2 pajaros de un tiro (ahorramos dinero a nuestros clientes, beneficiandoles a ellos, y reducimos su factura de consumo telefónico, perjudicando al operador de telefonia).

Piensa en verde, porque ahorrar es sano, sobre todo para el bolsillo, … y en estos tiempos que corren, más.

Y ahora me direis algunos, … ¿y como se hace un paginador en V7? … vale, vale, lo preparo y otro dia os lo cuento. 😉

Create PDF    Enviar artculo en formato PDF   
comments: 5 »
dic 17

Nuevos servicios del blog

Posted in ideas, utilidades

Agradecemos todas aquellas peticiones que nos sirven para mejorar el servicio que intentamos prestar a la comunidad, y las tenemos todas en cuenta, y dicho esto, comunicampos algunos cambios que hemos efectuado en el blog con la unica intención de facilitar las siguientes tareas:

  • Al final de cada articulo y justo antes de los comentarios, hemos instalado nuevas opciones para facilitar la descarga de los articulos en PDF y el envio de los mismoa a una cuenta de eMail. A partir de ahora, podras guardar en tu equipo los articulos que sean de tú interés para poder leerlos cuando no tengas conexión.
  • También y para aquellos que nos solicitan la lectura del blog desde el móvil (si que estais pillados, 😀 ),  hemos activado un nuevo servicio precisamente para facilitar la lectura desde el iPhone, pero manteniendo nuestro estilo actual para aquellos que prefieren leernos desde su escritorio tradicional.

Otras peticiones, como el uso de etiquetas, se estan valorando pero creo que, más interesante que el propio uso de etiquetas para los articulos es el propio buscador, y es que, con el buscador, puedes localizar cualquier articulo publicado y por cualquiera de las palabras que aparecen en el texto del articulo.

De todas formas podeis dejar vuestras opiniones, pero personalmente no suelo usar las “nubes de etiquetas”, porque simplemente, me cuesta mas encontrar la palabra que busco entre todas las etiquetas, que escribir las palabras en el buscador. Ademas eso nos limita a que mediante la nube de etiquetas, solo encontrareis el articulo deseado si he realizado el etiquetado adecuadamente, lo que obliga a hacer uso de un excesivo numero de palabras para etiquetar y de elegir correctamente las palabras. Lo dicho, complicado tanto para vosotros como para mi.

Mi voto particular es por el buscador pero si lo considerais útil, usare las etiquetas también.

Y sobre todo, muy agradecido, porque este interes mostrado por mejorar este blog, solo puede significar una cosa, que os gusta leerme, aunque no siempre os guste lo que digo, y eso, a mi tambien me gusta, asi que, todos contentos. :)

PDF Printer    Enviar artculo en formato PDF   
comments: 5 »
dic 17

¿Lógica? o ¿Matemática?

Posted in humor, off topic

Dos monjitas salieron del convento para vender bizcochos. Una de ellas era conocida como Hermana Matematica (HM) y la otra como Hermana Logica (HL).

Ya estaba oscureciendo y ellas aun estaban bien distantes del convento:

HL: ¿Notaste que un hombre nos está siguiendo ya hace rato?
HM: Sí, yo creo saber lo que él está queriendo.
HL: Lógico. El está queriendonos violentar sexualmente.
HM: ¡Oh no! Y si mantenemos este paso él no va a demorar ni 15 minutos en alcanzarnos.
HL: La única cosa lógica que podemos hacer es andar más aprisa.
HM: Pero eso no va a funcionar.
HL: Claro que no está funcionando. El hombre está haciendo la única cosa lógica que puede hacer. El también está andando más aprisa.
HM: ¿Y entonces? ¿Qué podemos hacer? ¡Con este paso él nos va a alcanzar en un minuto!
HL: La única cosa lógica que podemos hacer es dividirnos. Tú te vas por aquel lado y yo por ese. Logicamente él no podrá seguirnos a la dos al mismo tiempo.

Después de eso el hombre decidió seguir a la Hermana Lógica (HL). La Hermana Matematica (HM) llegó al convento super preocupada con lo que podría haber pasado con la Hermana Lógica (HL). Hasta que finalmente llega la
Hermana Lógica!

HM: Querida Hermana Lógica. Gracias a Dios ya estás aquí. ¡Cuentame lo que sucedió!
HL: Sucedió la única cosa lógica que podría suceder. El hombre no pudo seguirnos a las dos al mismo tiempo y entonces empezó a seguirme.
HM: Eso ya lo se, ¿pero que sucedió entonces?
HL: Sucedió la única cosa lógica que podría suceder. Yo comencé a correr lo más rápido que podía.
HM: ¿Y ahí?
HL: La única cosa lógica sucedió. El me alcanzó.
HM: ¡Oh Dios mio! ¿Y qué fue lo que hiciste?
HL: Hice la única cosa lógica que podría hacer. Me levanté el hábito.
HM: ¡Oh querida hermanita! ¿Y qué fue lo que el hombre hizo?
HL: La única cosa lógica que el podría hacer. Se bajó los pantalones.
HM: ¡Oh no! ¿Y que sucedio entonces?
HL: Caramba, ¿no es lógico hermana? Una monja con el hábito levantado corre mucho más rápido que un hombre con los pantalones bajados !!!!!

Y si estabas pensando en un final mas sucio, mejor reza tres Ave Marías !!!!!!!!

PDF Download    Enviar artculo en formato PDF   
comments: 5 »
dic 16

Parametros en funciones de V7

Posted in analisis, ideas

Uno de los problemas en el artículo anterior, que diferencia también a V6 y V7 es el paso de parametros a las funciones, en V6 no hay limite (aparentemente), mientras en V7 existe un limite de 10 parametros como máximo.

En realidad, ¿para que estan los limites?, ¿para que estan los obstaculos?, … ¡para superarlos!

Los limites están porque alguien, consciente o inconscientemente quiere impedirnos que esos limites sean superados, en este caso, se debe simplemente, a que el departamente de desarrollo ha considerado que 10 parametros era más que suficiente para poder ejecutar cualquier operación con este objeto.

Pero hay excepciones, y en esos casos, en que nos encontramos con un obstaculo, y un muro nos impide seguir nuestro camino, tenemos varias opciones:

  1. sentarnos y esperar a que el muro sea derribado
  2. acelerar e intentar saltarlo, chocando repetidamente hasta cansarnos
  3. intentar rodearlo, aunque ello nos suponga un esceso de tiempo y de esfuerzo

o con un poquito de imaginación, y un poquito de esfuerzo también, pero sin excederse,

  • abrir una puerta que nos permita cruzar al otro lado

Y para solucionar el probema de la limitación de parametros en las funciones, hemos abierto esa puerta:

Para esto, solo necesitamos pasar 1 o varios parametros en la llamada a la función, y en cada parametro podemos encadenar tantos valores como sea necesario, usando un separador “;”, por ejemplo.

Dentro de la función, como ya habeis imaginado vosotros, solo necesitaremos usar la funcion del sistema StringSection para volver a separar los valores de cada parametro recibido, y procesarlos como sea necesario.

La solución es sencilla, y no solo permite pasar algunos parametros más a la función, sino que elimina completamente la barrera.

Soluciones como esta, las estamos inventando a diario, pero es dificil imaginar una solución y mucho menos cuando aún no se ha presentado el problema.

….

Uhmmmmmmm

….

y ya puestos, si hemos abierto una puerta para pasar al otro lado, me pregunto:

¿porque no puedo utilizar la misma puerta para volver?

y la respuesta es ¡SI!, la puerta se abre en las dos direcciones,

por tanto, tambien puedo realizar la misma operacion para retornar varios resultados de una misma función, encadenando los valores antes de retornar el resultado y volviendolos a separar en el proceso o evento que recibe el resultado de la función.

Yo, he abierto la puerta, pero si alguien tiene alguna idea para que la puerta sea automatica y se abra sola ante nuestra simple presencia, eso siempre es de agradecer.

PDF Creator    Enviar artculo en formato PDF   
comments: 21 »
dic 15

Encuentra las diferencias entre V6 y V7

Posted in foro, vDevelop

Para los que venimos de V6, el cambio a V7 puede ser mas sencillo que para otros desarrolladores que se inician y tienen que cambiar totalmente “El Chip”, pero ese camino de “rosas” que debemos recorrer los mas avanzados en este aspecto, tambien esta lleno de “espinas” que debemos evitar.

Aqui voy a esponer algunas de las principales diferencias que hay entre V6 y V7, y esta vez no para criticar, sino para que los usuarios de V6 no pierdan gran cantidad de tiempo en averiguar esas pequeñas “tonterias” que nos amargan el dia

  1. Una de las diferencias entre V6 y V7 es la forma en que podemos sumar y restar dias a una fecha determinada. En V6 podiamos hacerlo sumando directamente los dias a la fecha “fHoy() + 10” o “fHoy() – 30” en la expresión, para obtener la fecha resultante. Ahora debemos hacerlo mediante la función “AddDays( currentDate() , 10)” para sumar y “AddDays( currentDate() , -30)” para restar
  2. Otra pequeña “gran” diferencia es la edición de campos en formularios, mientras en V6 un campo numérico o alfanumérico se podia editar con el mismo EDIT, en V7 necesitamos un control de “Edición” para campos alfanuméricos y un “Microscroller” para campos numéricos, ya que si ponemos un campo numérico en un “Edit” se convierte en texto automáticamente, al menos cuando se trabaja con variables locales.
  3. No busques las funciones de NumeroEnLetras() y FechaDiasFijos() porque en V7 no exiten y te las tienes que definir tu mismo. Y la función para calcular el DC de un número de cuenta bancario, tampoco está. Entiendo que estas funciones no han sido incluidas debido a la internacionalización de la herramienta y a que son funciones que varian dependiendo del idioma o pais, aunque esta excusa no es aplicable a la función FechaDiasFijos().
  4. Tambien han desaparecido todas las funciones que habia en V6 en el grupo de Códigos de Barras.
  5. En V6 disponiamos de una función de proceso “ExtraerDato()” para parsear cadenas de texto y tenias que copiarla en todos los mapas donde era necesaria. En V7 no la busques, tenemos una función del sistema que realiza la misma tarea de manera mas eficiente: “StringSection()”
  6. En V6, para indexar un indice condicionado, necesitabamos obligatoriamente un campo “Check” o “Booleano” para usarlo en la condición del indice. En V7 podemos indicar la exprexión directamente sobre la condición del indice, si bien esto puede penalizar el rendimiento de la base de datos.
  7. Otra diferencia importante, es la conexión entre vClient y vServer en las versiones V6 y V7, ya que mientras V6 consume una única licencia de usuario por maquina (aún teniendo varias aplicaciones en ejecución), en V7 se consume una licencia de usuario por cada aplicación o instancia que se ejecuta (incluso en la misma maquina), lo cual es un inconveniente, ya que se necesitan muchas mas licencias en V7.
  8. En V6, para cambiar la clave de acceso del usuario, se hace desde el menu de vClient directamente. En V7 es necesario crear una accion “Archivo: cambiar contraseña de usuario” y ejecutar dicha acción desde algun lugar de la aplicación.
  9. Jorge Velasco, me dice que no puede usar mas de 10 parametros en las funciones de V7, mientras que las funciones de V6 no tienen limite de parametros (aparentemente) (editado el 16-dic-2010) y esta es una la solución que yo utilizo para resolver este problema: Parametros en funciones.

Espero que podamos mejorar este articulo entre todos y añadir todas aquellas cosas que puedan llevar a error o confusión.

De momento dejo aqui una pequeña lista, pero ire completandola a medida que vayan apareciendo esos pequeños detalles.

PDF    Enviar artculo en formato PDF   
comments: 16 »
dic 14

Crónica de un problema sin solución

Posted in off topic

La semana pasada ha sido una semana … rara, por no decir otra cosa.

Si partimos del echo de tener 2 dias de fiesta en mitad de la semana (lunes “dia de la Constitición española” y miercoles “dia de la Inmaculada”), eso nos deja una semana que da mucho de si para la fiesta y poco para el trabajo.

El martes, ya por la mañana temprano, recibo una llamada de un cliente:

Cliente: Jose, tengo un problema muy grave, los equipos funcionan fatal y se bloquean mucho, necesito que vengas.

Esto, dicho en un tono que no dejaba lugar a dudas, podia ser cualquier cosa menos una broma, y no lo era

Jose (yo): Calmate, dime que pasa

Cliente: ¡vamos a formatear todos los equipos y a volver a instalarlos!, vente sin prisas.

Jose: ¿Cuando quedamos?

Cliente: El lunes que viene, a primera hora.

Aqui ya no sabia que decir, me descuadró totalmente, era “martes”, el miercoles era fiesta y el jueves era dia laboral de nuevo, y si tan grave era, porque  me decia el “lunes” próximo.

Agradezco que me avisara con tiempo, pero no podia entenderlo, si el problema era tan grave

Ayer, lunes por la mañana temprano, preparado para un largo dia y a lidiar con 10 ordenadores que habia que formatear y reinstalar,

Lunes, 7:30

suena el despertador, me levanto, voy a comprar el pan, a mi vecino (el panadero con horno de leña de toda la vida), los chicos se levantan para ir al cole, desayunamos

Lunes, 8:25

Llevar a los chicos al instituto en auto.

Lunes, 8:35

Salir pitando para la capital, si consigo llegar antes de las 9:00 , es buena hora para encontrar aparcamiento, ya que suele haber gente que se va al trabajo a esa hora.

Lunes, 8:55

Aparcando en la capital, y con suerte, justo al llegar y a 20 metros del local del cliente otro vehiculo sale de su estacionamiento y se va, otro vehiculo y yo llegamos casi al mismo tiempo (yo llegue primero y señalice la maniobra), casi tengo que pegarme con el, el muy capullo me queria quitar la plaza de aparcamiento, ¡que morro le echan algunos!

Lunes, 9:00

Esperando al cliente en la puerta del local, no tiene hora fija de llegada, pero no me importa esperar 10 minutos.

Lunes, 9:15

El cliente ya esta aqui, yo dispuesto a currar como nunca para solucionar “el problemon”

Lunes, 9:15

El cliente invita a un cafe, parece mas tranquilo, que el dia de la llamada telefónica, vamos a un bar cercano donde preparan unos buenos desayunos, y mientras tomamos un cafe y unas tostadas charlamos, de otras cosas, el problema informatico no se menciona en ningún momento de la conversación, aunque  la verdad, yo estaba un poco impaciente por empezar a currar, para terminar cuanto antes.

Lunes, 10:45

Por fin, se acaba la charla y vamos a empezar a currar, cualquiera diria que hay un problema, esta calma me mata.

Lunes, 10:50

De nuevo en el local del cliente para currar, el cliente me comenta que quiere formatear los equipos, echa la culpa a posibles virus, alguien ha estado usando el servidor para leer el correo electronico y navegar por la web.

Parece que ha solucionado el problema de los virus, ha instalado un nuevo antivirus pero los equipos se le bloquean mucho y apenas puede trabajar cuando intenta conectar al servidor.

Le comento que si ha instalado un nuevo antivirus, es posible que los problemas sean del propio Firewall, que no habian configurado, y parece que asi es, configuramos el Firewall y todo solucionado.

Lunes, 11:05

Bueno, ya que estas aqui, hazme unas modificaciones en unos informes y en unas rejillas.

Lunes, 12:30

Hora de las cañas, de nuevo al bar de enfrente (otro distinto) y unas cañitas, mientras charlamos de cosas intrascendentes

Lunes, 13:45

De vuelta a casa

Y llegados a este punto, no se en que situación me encuentro:

  • ¿Deberia estar cabreado, por que me ha tenido toda la semana preocupado?
  • ¿Deberia estar contento porque el problema ha tenido fácil solución?
  • ¿Deberia estar cabreado por hacerme perder la mañana solo para rectificar unos informes y pantallas que le podria haber enviado por eMail?
  • ¿Deberia estar contento porque lo único que hemos hecho en toda la mañana, a sido tomar unos cafes y tomar unas cañas?

La verdad, ¡NO LO SE!

Y entonces, porque el titulo del articulo es ese, si el problema real tenia fácil solución.

Porque lo que no tiene solución, es que la próxima vez que le ocurra un problema, volverá a avisar mosqueado y con urgencia. 😀

Y es que, hay pocos clientes, que cuando tienen un problema, lo analizan y te dicen donde podria estar la causa del mismo, para intentar solucionarlo.

PDF Download    Enviar artculo en formato PDF   
comments: 2 »