Este fin de semana he estado de limpieza. Sí, limpiando mi server de la nube que estaba hecho un pequeño “cajón desastre” y lo necesitaba, por agilidad mía al trabajar con los proyectos y del server también al cargar.

Mi problema era que tenía en el server una solución solamente, “shared” donde tenía muchos proyectos, algunos creados por mí, otros que eran de las open apps que me bajo de Velneo para probar, etc. Necesitaba limpiarlo porque ver la vista de los proyectos en la solución era una maraña bastante difícil de seguir, además al abrir la solución tardaba lo suyo.

Ahora ya está limpio, claro, ágil, además esta tarea me ha ayudado a descubrir unas cuantas cosas, buenas y otras no tan buenas.

Aquí van las buenas:

– Se pueden borrar proyectos!

Simplemente desde el vdevelop, proyectos cargados y botón derecho del ratón, eliminas. No permite eliminar si el proyecto está editado, pero se puede “Des-editar” con la opción “Deshacer desprotección proyecto”

– Se pueden mover objetos entre proyectos! Se mueven también los objetos que el objeto movido esté utilizando, con lo que no hay que ir uno por uno.

Tenía mi proyecto en la solución shared, quería moverlo a la solución “Biblioteca” y pude hacerlo gracias a esta opción, siguiendo estos pasos:

  1. Creé una nueva solución
  2. Dentro de la nueva solución, creé nuevo proyecto de datos y nuevo proyecto de aplicación
  3. En los proyectos originales que estaban en shared, modifiqué sus propiedades, heredando los nuevos, creados en la solución nueva
  4. En los proyectos originales de datos y de aplicación, fui moviendo cada objeto a los nuevos proyectos. Al mover, pasa todo a la carpeta que le indiques, no obstante, hay que ordenar después porque se mueven los objetos que use el primero.

También utilicé esta opción para limpiar iconos que estaba usando de otros proyectos. Moviendo objetos y re-nombrando después en el proyecto nuevo.

– Renombrar objetos y  que los otros usen el nuevo objeto (renombrado) es tan fácil como en 6x.

Estaba heredando y usando unos iconos de proyecto que me había ido bajando de open apps desde el principio, y no estaba muy ordenado. Así que fui moviendo los iconos de los proyectos “anticuados” al proyecto “iconos” que viene por defecto con vBase.

Después en el proyecto iconos, localicé un icono que se adecuase a mi propósito, lo corté y después renombré los que venían del otro proyecto con el nombre del original del proyecto de iconos. Así con todos hasta tener todo limpio. Y después volví a instalarme vBase de modo que ya dejé el proyecto de iconos original.

Todos los objetos de mi proyecto Biblioteca que usaban cualquier icono, renombrado o no, lo capturaron de nuevo sin problema, a pesar de que no eran objetos de su propio proyecto, sino de uno heredado.

En definitiva, que fue un trabajo de “encaje de bolillos” que funcionó a la perfección como siempre, Velneo V7 conserva toda la esencia de esto que ya disfrutábamos en 6x.

Y las no tan buenas

– No se pueden mover proyectos entre soluciones

– Importar componentes te copia las soluciones de un server a otro. Creo que sería interesante si se pudiesen mover las soluciones o algo así como importar dentro del mismo server.

Aunque esto creo que me ha pasado por el desconocimiento inicial, ahora ya no me pilla en un desorden tal ;-)

Organización servidores

Ahora tengo dos servidores en la nube (como son gratis :-) organizados del siguiente modo:

Server 1:

Con las soluciones:

– shared

Open apps que necesite para otros proyectos (que estarán en las otras soluciones).

En esta no tocaré nada para desarrollar. Sólo serán las cosas originales de Velneo.

Por ejemplo cuando Velneo saque una nueva versión de vBase, la reinstalaré, se re-escribirá y todos los proyectos que la hereden ya tendrán todo lo nuevo.

– Mis soluciones

– Biblioteca

– …

Los proyectos aquí siempre podrán heredar los proyectos que estén en shared.

Una solución por aplicación es lo más sensato y organizado.

Server 2:

Con la solución shared solamente. Este servidor lo creé nuevo, registrándome con otra cuenta de e-mail en la página de Velneo, será para bajarme pruebas de las open apps. Se puede decir que será usado de forma temporal para probar, aprender de otras apps, etc.


Al comenzar a aplicar estilos gráficos en Velneo V7 es un poco confuso, porque hay un nuevo concepto que condiciona mucho la aplicación de estos estilos y son los layouts.

Éstos controlan muchas cosas del aspecto de los formularios, de forma automática y supone un punto importante a tener en cuenta al aplicar estilos, por la inserción de los dibujos de cabecera y pie, etc.

Los objetos que nos proporciona la “open app” para el estilo de formulario son:

  • FORM_BGR -> Fondo formulario
  • FORM_FOOT -> Pie formulario
  • FORM_1_HEAD_LEFT -> Cabecera izquierda de formulario principal
  • FORM_1_HEAD_RIGHT -> Cabecera derecha de formulario principal
  • FORM_2_HEAD_LEFT -> Cabecera izquierda de formulario secundario
  • FORM_2_HEAD_RIGHT -> Cabecera derecha de formulario secundario

¿Cómo?

A continuación indico paso a paso lo que hago para aplicar el estilo en un formulario:

  • Dibujo de fondo. En el formulario aplico el dibujo para fondo formulario que viene en la plantilla.
  • Sin márgenes. Todos los márgenes a 0. Esto lo hago para conseguir que los dibujos de cabecera y pie queden sin separación del extremo de la ventana.
  • Layout de cabecera. Este layout horizontal agrupará los controles dibujo de cabecera (izquierda y derecha). Los layouts también tiene propiedad de aplicar márgenes y separación entre controles, para este, todo a 0 para dejar los controles unidos unos a otros.
  • Espaciadores fijos. Para suplir la ausencia de márgenes, necesito espaciadores a la izquierda y derecha del formulario, al lado de los campos y controles del formulario.
  • Layout del pie. Este layout horizontal agrupará los botones del pie de formulario. En este caso como el dibujo de pie es uno solo, podemos dejarlo con márgenes y separación entre controles.

Este es el aspecto del formulario con las pautas que comento:

velneo estilo formulario vmountain

Y este es el aspecto final:

velneo estilo formulario vmountain final


A continuación recopilo (y transcribo directamente) un extracto de la ayuda on-line de Velneo V7 porque a menudo me encuentro buscando en la ayuda cuando me entra la duda: ¿El alfa40 admitía guiones? y así muchas veces a lo largo de mi vida programando…

Velneo cuenta desde siempre con tipos de campo alfabético comprimidos (alfa40, alfa64 y alfa128), es decir, que ocupan menos espacio en disco con la limitación de que no incluyen algún pequeño “subconjunto” de caracteres que especifica a continuación.

Por otro lado, es muy útil utilizar la conversión para crear el índice, así el éste ocupará menos espacio y además para las búsquedas nos puede hacer un favor, porque no diferencia si buscas una palabra con tilde o sin ella, por poner un ejemplo.

Los tipos de campo son:

Alfabéticos:

Hay varios tipos de campos de campos alfabéticos. Los tipos Alfa 128, Alfa 64 y Alfa 40 están optimizados en su uso del espacio en disco. Los tipos Alfa 256, Alfa Latin1 tienen tablas de 256 caracteres estándar y Alfa UTF-16 se corresponde con el estándar Unicode. Para campos que vayan a contener una dirección de correo electrónico o una senda Windows, deberá utilizar un campo Alfa 256, Alfa Latin1 o Alfa UTF-16, pues los Alfa 128, Alfa 64 y Alfa40 no soportan en su tabla de caracteres ni la arroba (@) ni la barra de directorios (\).

Alfa 256: Tipo alfabético estándar que incluye todos los caracteres de la tabla ANSI. Se recomienda usar los tipos Alfa indicados más adelante para optimizar el uso del espacio en disco. El rango máximo del campo es 65535 bytes (65535 caracteres).
Alfa 128: Es un tipo alfanumérico que incluye letras mayúsculas, minúsculas, acentos, signos de puntuación y números. Este tipo de campo es empaquetado y cada 8 caracteres que el usuario introduzca se comprimen en 7 para grabarlos al disco. El rango máximo del campo es 65534 bytes (74896 caracteres).
Alfa 64: Es un tipo alfanumérico que incluye letras mayúsculas, signos de puntuación y números. Este tipo de campo es empaquetado y cada 4 caracteres que el usuario introduzca se comprimen en 3 que serán grabados al disco. El rango máximo del campo es 65532 bytes (87376 caracteres).
Alfa 40: Es un tipo alfanumérico que incluye letras mayúsculas, números, guión y espacio. Este tipo de campo es empaquetado y cada 3 caracteres que el usuario introduzca se comprimen en 2 que serán grabados al disco. El rango máximo del campo es 65534 bytes (98301 caracteres).
Alfa Latin1: Es un tipo alfanumérico que incluye los 256 caracteres correspondientes a Unicode Latin 1 (ISO 8859-1). Se recomienda usar los tipos Alfa indicados anteriormente para optimizar el uso del espacio en disco. El rango máximo del campo es 65535 bytes (65535 caracteres).
Alfa UTF-16: Es un tipo alfanumérico que incluye todos los caracteres correspondientes a la tabla de caracteres Unicode (ISO 10646). Este tipo de campo al comprender toda la tabla Unicode requiere de dos bytes para prepresentar cada caracter. Se recomienda usar los tipos Alfa indicados anteriormente para optimizar el uso del espacio en disco. El rango máximo del campo es 65534 bytes (32767 caracteres)

Numérico:

Usado para datos numéricos. Se mantiene la precisión numérica hasta el quinto decimal. El rango máximo del campo es 6 bytes (Del 0 al 281474976710655, o con signo del -140737488355327 al 140737488355327, con 6 decimales del 0,000000 to 2814749767,10655). De esta configuración se ha de excluir el campo ID que tiene como rango máximo 4 bytes (Del 0 al 4294967295).

Fecha:

Permite introducir fechas con diversos formatos. Por defecto admite el formato de fecha ISO 8601. Otros formatos permitidos son: ddmmaa,dd-mm-aaaa, dd-mmm-aaaa. El carácter de separación puede ser el guión o la barra.

Hora:

Permite introducir horas en formato HH:MM:SS. No almacena milisegundos.

Tiempo:

Permite introducir tiempos que son la unión de una fecha y una hora con el formato DD:MM:AA HH:MM:SS.sss

Booleano:

Es un campo lógico que permite definir el contenido como 1 ó 0 (Sí o No).

Objeto:

Campo con contenido variable que se almacena en un contenedor aparte de los datos, por lo que el tamaño del registro no aumenta con su uso, si no que este se contabiliza en su contenedor. El nombre de este fichero será el mismo de la tabla y con la extensión CND. El fichero de índices del contenedor tiene la extensión CNI. En el fichero de datos lo que se guarda es la dirección donde está el objeto en el contenedor.

Dibujo: Su contenido es un gráfico con cualquier resolución y número de colores. Se admite cualquier formato en la importación pero se almacena con compresión JPG o PNG dependiendo del formato de entrada. El rango máximo del campo es 8 GBytes.
Texto: Su contenido es un texto de longitud variable. Se almacena en bloques de 512 bytes por lo que la unidad mínima de contenido es de ese tamaño. El rango máximo del campo es 8 GBytes.
Texto enriquecido: Su contenido es un documento con formato que permite seleccionar fuentes, estilos, alineación, etc. El formato se define mediante tags. El rango máximo del campo es 8 GBytes.

Fórmula:

Campos virtuales que no ocupan espacio en disco ni modifican la estructura de la base de datos. Se calculan con la expresión de tipo fórmula que define el campo en tiempo real, en cada instante que se hace uso del valor del campo. Al ser un cálculo en memoria y no guardarse en disco, no tiene las limitaciones de los tipos de campo correspondientes. No es posible su uso como componente de índices. El tipo de campo fórmula a utilizar depende del resultado buscado, no de los tipos de parámetros utilizados en el cálculo.

Fórmula Numérica: Fórmula cuyo resultado será un dato numérico.
Fórmula Alfabética: Fórmula cuyo resultado será una cadena alfabética Unicode
Fórmula Fecha: Fórmula cuyo resultado será un dato tipo fecha
Fórmula Tiempo: Fórmula cuyo resultado será un dato tipo tiempo (fecha y hora con milisegundos).
Fórmula Plural: Fórmula cuyo resultado será un dato numérico y que se calcula en base a los registros de un enlace plural. Este tipo de campo recorre todo registros del plural y efectúa la fórmula por cada registro encontrado para determinar el valor de la misma. Debido a esto, no utilice un campo de este tipo cuando prevea que los registros de la tabla van a tener un gran número de históricos, pues se ralentizaría la presentación de datos en pantalla en tiempo de ejecución. Se recomienda el uso de Actualizaciones para resolver la problemática que resuelve la Fórmula Plural.

Fórmula Dinámica: Su contenido es una fórmula que se define en tiempo de ejecución, y por tanto puede ser definida por el usuario final. Se trata de la definición de la fórmula y no del cálculo de su valor efectivo, para el que existen diferentes herramientas, entre ellas obtener su valor a través de otra fórmula o contenido inicial. Hemos de definir la tabla enlazada de la que se alimentará la fórmula. Puede ser la tabla en curso u otra tabla. En tiempo de ejecución dispondremos del Asistente de fórmulas para su definición. El rango máximo del campo es 65535 bytes (65535 caracteres).

Puntero Virtual: Su contenido es virtual ya que se trata de punteros de caracter virtual que no guardan información en disco. Se asigna de forma automática cuando se selecciona un enlace virtual.


En Velneo V7 no tenemos fórmulas dinámicas (por el momento) pero en V6 sí, y son súper útiles. Nosotros las usamos mucho para por ejemplo tablas de configuración, parámetros de la aplicación, entre otros fines.

En las tablas de configuración solemos poner valores por defecto en las fórmulas dinámicas para así agilizar el trabajo a la hora de la instalación etc. pero las funciones de Velneo tienen una particularidad al referirnos a ellas en contenidos iniciales y procesos en campos de tipo fórmula dinámica. Se trata de que no se puede poner en el proceso o contenido inicial la función directamente, sino que va con un código. Y también ese código de la función se muestra cuando se pone el campo fórmula dinámica en una rejilla o al imprimir la fórmula dinámica

Me pasó ayer, y cogí “el toro por los cuernos” y recopilé, de una vez por todas y para siempre (mientras no añadan más funciones en Velneo V6) los códigos que corresponden a las funciones:

Velneo V6x Funciones en Formulas Dinamicas codificacion

Los parámetros de las funciones serían exactamente igual que en la función original, separados por , si corresponde y entre paréntesis.

Un ejemplo de contenido inicial de la fórmula dinámica sería así:

“f025( %CAMPO-CONDICION%,  %CAMPO1%, %CAMPO2%)” + fRepiteCadena( “”, 1 )

El fRepiteCadena siempre lo pongo al final porque en caso contrario da error (y ciertamente no me acuerdo cómo lo averigüé)

Espero que pronto podamos tener las fórmulas dinámicas en V7, o algo mejor ;-)


Claro que es posible!

He visto esta entrada en el foro de Velneo V7 y he dicho, esto se merece un post!

Me parece que preguntarse esto es como si cuando salió la primera versión de Velneo, entonces era Velázquez, nos preguntásemos, ¿es posible aprender Velázquez sin conocer algo de…? Bueno, entonces no había nada igual!

Conocer Velneo V6 nos sirve desde el punto de vista conceptual, de aprender ese modo nuevo de pensar, de relacionar tablas, de cambiar el chip con Velneo.

Creo que la competencia más dura con que se encuentra Velneo V7 es con Velneo V6.

Estamos comparándolas todo el tiempo, cuando muchas veces no nos damos cuenta que son herramientas distintas, que han sido diseñadas por el mismo arquitecto, que ha aplicado su filosofía, pero que la ha re-escrito completamente. Creo que si empezamos a desarrollar en Velneo V7 comparándola con V6 lo que sucede es que estaremos limitados por V6, sin aprovechar realmente todo lo que V7 nos ofrece.

En el blog de Velneo V6 hay numerosos artículos que nos introducen a esta filosofía, que nos muestran conceptos básicos en Velneo, pero sobre todo lo que más nos va ayudar es lanzarse con una aplicación, viendo antes los ejemplos que hay de open apps y poco a poco empezar a conocer esta herramienta.

Además, en el canal de youtube de Velneo hay muchos vídeos que nos muestran esa filosofía, nos dan a conocer a su gente, etc.


El objeto multivista lo podemos comparar con el “doble bala” que teníamos con Velneo 6x, pero esta vez tenemos más posibilidades. No es doble, sino que es “n”, es infiniiiiiiiiito :-) quiero decir que podemos visualizar tantas posibilidades como queramos o como el diseño de la aplicación y la usabilidad lo permitan.

A continuación expongo una mini-reseña de uso de este objeto, que nos brinda muchas posibilidades y vamos a ver una de ellas, muy básica:

En mi caso el multivista muestra en modo multiobjeto, en primer lugar un arbolado de ubicaciones y a continuación un casillero con los libros en ella.

Multivista Velneo Propiedades

  • Tabla asociada: de la que vamos a mostrar los registros
  • Objeto 1: Objeto de lista que nos mostrará los registros de la tabla anterior. Puede ser cualquier objeto de lista, como: una rejilla, árbol, otro multivista, etc.
  • Proceso sincronizador: proceso de origen ficha de la tabla anterior que hará que se carguen los registros de la vista siguiente. Recordad siempre, origen ficha, porque este proceso se lanzará cuando nos posicionemos en uno de los registros de la tabla del objeto 1.
  • Objeto 2: Objeto de lista que nos mostrará los registros de la tabla que se hayan cargado en el proceso sincronizador anterior.
  • Proceso sincronizador: lo mismo de antes… y así hasta tener tantas vistas como desees…

Por último el multivista lo insertaremos como “control objeto” dentro de un formulario, ya sea este primer formulario con origen alguna tabla o ninguna, da igual.

En el control objeto que lo lanza, llamamos primero a una búsqueda que indicará que lista de registros se mostrará y a continuación al propio multivista.

Y este es el resultado:

Multivista V7 VelneoEl primer objeto es un árbol y el segundo es un casillero. El casillero tiene a su vez un drag & drop.


Drag and Drop

03Sep09

¿Qué es?

El “drag” es una propiedad que podemos asignar a los controles de un formulario, que en vdevelop la tenemos en castellano:

  • “Arrastrable para mover”: no mantiene en la lista original el registro que hemos arrastrado
  • “Arrastrable para copiar”: mantiene en la lista original el registro que hemos arrastrado, con lo cual podemos hacer de nuevo el drag sobre el mismo registro.

propiedad drag - arrastrar

El “drop” es un sub-objeto que tenemos disponible en los objetos de lista, por ejemplo en rejillas y casilleros. Este sub-objeto lo que hace a su vez es una llamada a un proceso determinado.

Casillero con drop

propiedades proceso drop

¿Cómo se hace?

En primer lugar quiero resaltar que es sumamente sencillo realizarlo y en ejecución es muy visual, queda bien y me parece que hace los entornos de las aplicaciones mucho más intuitivos

  1. Definir el proceso de drop. Se deberá indicar en propiedades del proceso la tabla de origen y la tabla de destino. La de origen será la misma del objeto en el que hacemos el “Drag” y la de destino será la del “Drop”. Por ejemplo, yo genero desde un casillero de libros, arrastrando desde ahí genero automáticamente el préstam
  2. En el casillero de origen, marcar la propiedad “Arrastrable para…”
  3. En el casillero de destino, crear el sub-objeto “Drop” que llame al proceso generado en el paso 1.
  4. A continuación para que refresque se indica en el formulario el evento con la instrucción para recalcular control.

Y ya está!