oct
17
Lo prometido es deuda, , y aunque en realidad no había prometido nada, si es cierto que algunos de vosotros os habiais interesado por el libro, por su contenido y por algún que otro detalle.
Asi pues, he decidido publicar el índice de capítulos de los que consta el libro, con más de 450 páginas repartidas en 17 capítulos y 13 apéndices, para aprender a programar con Velneo V7.
Cambia el chip con Velneo V7
Índice de capítulos:
- Aplicaciones que puedes desarrollar.
- La arquitectura y sus componentes.
- Obtener el servidor de Velneo V7 y los componentes.
- Administrar usuarios y grupos.
- Crear soluciones y proyectos.
- La estructura de la base de datos.
- Completando el proyecto de datos.
- Programar la interfaz de la aplicación.
- Objetos básicos.
- Crear las instancias de datos y de aplicación.
- Ejecutar la aplicación.
- Búsquedas, funciones y procesos.
- Informes e impresoras lógicas.
- Profundizando en los objetos.
- Aplicando vDiseño.
- Instalación de la solución.
- Cátalogo de Open Apps.
Y voy a desvelar otro secretillo, que parecía levantar especial interés, la portada del mismo.
Aquí la teneis:

Y sobre todo, para aquellos que deseen recoger su ejemplar en papel durante el evento ¡Life Is Soft 2011! , no olvideis que debeis hacer la reserva desde la pagina de registro del evento, antes del dia 25 de este mes.
Si no podeis asistir, podreis consegirlo en papel, PDF o ePub a partir de Life Is Soft directamente desde la tienda OnLine.
Estareis informados a través del blog de cualquier nueva noticia y seguiré ampliando información sobre el libro.
Garcias a todos por visitarme.
oct
17
Continuación del artículo:
MVC en Velneo V7
A estas alturas de desarrollo de Velneo V7, tengo que decir que lo veo poco viable, pero como no hay nada imposible, voy a dejar aqui una de mis habituales ideas chorras.
Y antes de entrar en detalles vamos a comparar, que es un “Proceso” y que es un “Evento”, pero dejando claro que en adelante, al referirme a Eventos lo hago siempre pensando en los objetos del proyecto de aplicación, quedando excluidos por tanto los “Eventos de tablas” ya que nada tienen que ver con el interfaz:
- Proceso es, una secuencia de instruciones que se ejecutan en orden secuencial y siguendo las normas de programación estructurada similares a las de cualquier otro lenguaje de programación. Esto quiere decir, que también disponemos de bucles, condiciones, y otras estructuras de flujo que funcionan exactamente igual que en los lenguajes de 3 generación.
- Evento es, un proceso asociado a un objeto del interfaz de usuario, como puede ser un formulario, una rejilla, etc.
Y en que se asemejan los Procesos y los Eventos, si nos atenemos a esta definición:
- Los procesos y los eventos son exactamente iguales en cuanto a la forma de programar y ejecutar. De echo, todas las sentencias que podemos utilizar en los procesos, también están permitidas en los eventos, aunque esto no sucede a la inversa.
- Ambos tienen un Origen, que puede ser Ninguno, o una Tabla del proyecto de datos y en caso de ser una tabla, el origen puede ser de Ficha o de Lista
- Los eventos también pueden ser sin origen, ya que tenemos Formularios Sin origen y en ellos también podemos definir eventos
- El origen Ficha nos permite poder utilizar un evento en un Formulario y el origen Lista nos permite utilizarlo en objetos de tipo Lista como las Rejillas.
Ahora que ya conocemos las similitudes, ¿cuales son las diferencias?
- Los Eventos van siempre asociados a un objeto del interfaz y por tanto se ejecutan siempre en 1º plano, pero desde el evento tambien podemos llamar a otros objetos en 3º plano
- Los Eventos, al estar asociados a un objeto del interfaz, permite hacer uso de todas las sentencias de Interfaz, que en los Procesos aparecen desactivadas.
- El Proceso es un objeto y el Evento es un Subobjeto de un objeto del proyecto de aplicación.
Inicialmente, la idea de este artículo fué:
Si son tan parecidos, porque no crear un nuevo objeto llamado “Evento” pero externo al objeto, y que nos permita usar las sentencias de Interfaz.
Y una vez creado este objeto, podriamos llamarlo desde varios formularios o varias rejillas (siempre que el origen del Evento se corresponda con el Objeto que lo llama).
De esta forma, el objeto Formulario no necesitaria tener definidos los eventos, solo las “Conexiones de evento” y llamariamos al “Evento” como un objeto independiente y externo al objeto que lo ejecuta.
También pense:
El mismo objeto “Proceso”, seria viable para esta tarea, simplemente con añadirle una nueva propiedad que lo diferencie de los procesos habituales, y que activará las sentencias de interfaz.
Luego podriamos llamar a estos procesos de la misma forma que indiqué anteriormente.
Y finalmente me di cuenta de que,
- el Evento debe ir unido al objeto, porque al activar las sentencias de Interfaz, con ellas podemos hacer uso de los controles incluidos en cada uno de los objetos (formularios, rejillas, etc.), es decir, desde un Evento puedo usar un control de edición del formulario que lo ejecuta, y ¿que pasa si utilizo el mismo Evento para 2 formularios de la misma tabla (que ésta erá la idea inicial) pero en uno de los formularios no existe dicho control de edición?. Pues que habría problemas, ¡seguro!
Asi pues, desisti de mi idea y de poner esta posibilidad en el “Foro de ideas” y por tanto, de acercarnos un poco mas al MVC,
Pero a veces, de las ideas equivocadas, también sale algo bueno, y en este caso, ha mi me ha servido como escusa perfecta para ver las diferencias y similitudes que existen entre Procesos y Eventos y desarrollar este artículo.
Y llegados a este punto, solo hay una conclusión lógica o moraleja que podemos sacar de este estudio.
Podemos cambiar al protagonista de nuestra peli de espias por cualquier otro (el Modelo) … James Bond, Super Agente 86, Am Brosio, y con ello conseguiremos mejorar notablemente la calidad de la información que guardamos en nuestra base de datos.
Pero, lo que no podemos es, separar la información obtenida (la Vista) y la forma de obtener dicha información: los mamporros, las amenazas y demas (el Controlador).
Imaginaos ahora un espia, que a la primera de cambio, le preguntamos, y sin necesidad de iniciar una tortura como dios manda, nos suelta todo lo que sabe. En este caso ya no estariamos hablando de espias, estariamos hablando de agentes dobles y eso quizá merezca otra historia, pero hoy no, ¡mañññaaaaannnnnaaaaa!
oct
11
Seguimos con la segunda parte de: ¡Las variables globales son prescindibles?
Claro que se podía mejorar el ejemplo: ¿cómo?
En V7 tenemos un nuevo subobjeto que no se valora lo suficiente, un objeto que dejamos marginado y que en ocasiones usamos, porque no queda mas remedio, la “Variable Local”.
Y es cierto, cuando creamos un Proceso, Evento o Función, no queda más remedio que usarlo, porque las “Variables locales” se van creando a medida que introducimos las sentencias. En condiciones normales, puede ser que incluso funcionen correctamente.
Pero ahora disponemos de “Variables locales” en objetos como la búsqueda, que pueden ser utilizadas en las Condiciones de los índices e incluso como Contenido para realizar la búsqueda por “Parte izquierda” o “Entre limites” de cada componente.
Asi pues, vamos a realizar el mismo ejemplo de ayer, pero esta vez, sin Variables globales:
Creamos una búsqueda, con los mismos componentes que en el ejemplo anterior, y usando los mismos índices: un componente EJE, usando el índice EJE (del campo #EJE de la tabla).
En la búsqueda creamos una variable EJER (numérica), y la utilizamos como Parte izquierda para la resolución del índice.

Y desde el proceso o evento que ejecuta la búsqueda, creamos un manejador de objeto con la búsqueda, asignamos el valor a la(s) variable(s) local(es) y finalizamos Disparando el manejador de objeto , obteniendo como resultado una lista de registros correspondiente a la tabla de la búsqueda.

El resultado debe ser, en el peor de los casos, el mismo que en el ejemplo anterior, con la variable global.
Pero he dicho, en el peor de los casos, porque aunque la lista de registros obtenida va a ser exactamente la misma, el tiempo empleado en realizar la consulta será considearblemente menor, claro dependiendo de cuantos registros tengamos almacenados en dicha tabla.
oct
10
¿Pregunta? o ¡Afirmación!, he ahí la cuestión …
Asi es, otra de tantas decisiones que hay que tomar, y que YO mismo, como muchos otros, sobre todo de los que aprendimos con versiones anteriores de Velneo, hemos usado (y abusado) de ellas.
V7 es otra cosa, y a veces, nos empeñamos en decir que algo no funciona cuando en realidad somos nosotros los que hacemos un mal uso, o uso incorrecto de los elementos que tenemos a nuestar disposición, y uno de ellos es la Variable global.
Y ya puestos, el título del post incita a cuestionar si el uso de las Variables globales es recomendable o no. Y cada uno tendrá su propia respuesta y estara en la certeza de que sus aplicaciones son las mejores que hay y que todo lo que hace lo hace bien, igual que yo, por supuesto. No estaba criticando a nadie, yo me incluyo en ese paquete.
Pero es bueno reconocer cuando uno se equivoca, porque ello nos permite mejorar y poner los medios para evitar esa y otras equivocaciones similares en el futuro.
La respuesta a esa Pregunta/Afirmación es, por mi parte, una rotunda ¡AFIRMACIÓN!, que voy a escenificar con un sencillo ejemplo, que me temo, somos muchos los que hemos abusado de el (aunque solo puedo confirmar mi experiencia).
Tenemos una variable global “$BC_EJERCICIO@proyecto.dat” y como era costumbre adquirida, al cambiar a V7, esa costumbre paso a ser “un vicio”, y lejos de preguntarnos si era la forma correcta de hacerlo, la usamos y nos autoconvencimos de que debia ser asi.
Tenemos una Búsqueda de la tabla “Facturas”, que es, multiejercico, para este ejemplo, y en la búsqueda usamos un Índice por el campo #BC_EJERCICIO (Ejercicio) para mostrar unicamente las facturas del ejercicio actual.
A la búsqueda le incluimos un componente por el Índice “BC_EJERCICIO”, correposdiente al campo #BC_EJERCICIO, con resolución de la “Parte izquierda” y en el contenido, le indicamos directamente la Variable global: $BC_EJERCICIO@proyecto.dat

Y como realizamos el ejemplo:
Desde un proceso o evento, asignamos el valor a la variable global, lanzamos la búsqueda y retornamos la lista a la salida.

Hasta aqui todo es correcto, y el ejemplo debe funcionar bien.
Pero, …. ¿se puede mejorar el ejemplo?
Pues claro que se puede, piensa en ello y mañana tendremos la solución …
oct
7
Se dice, se comenta, se rumorea ….
Que no es posible incluir los acumulados de los importes de una página, al inicio de la página siguiente.
Eso es, lo que pretendemos es incluir un “Suma y sigue …” al inicio de cada página del informe, y surgen un problema en el calculo de los acumulados en las variables que utilizamos para la impresión de dichos importes.
A raíz de aqui, buscamos una solución sencilla que nos resuelva el problema:

y parte de esa solución esta en duplicar las variables y los calculos necesarios para los acumulados.
Asi es, puesto que tenemos dos variables PIE_DEB (para el acumulado del debe) y PIE_HAB (para el acumulado del haber) y que son las que utilizamos en el pie de página del informes (y estos cálculos los hace correctamente).
He decidido que necesitariamos otras 2 variables (aunque en la imagen solo se ve una de ellas) CAB_DEB (para el suma y sigue del Debe) y CAB_HAB (para el suma y sigue del Haber).
Y hasta aqui, no hay diferencias sustanciales en nuestro informe, salvo por el hecho de usar 4 variables en vez de 2.

El informe ya tenia 2 “Cálculos” PIE_DEB y PIE_HAB para realizar las operaciones con las variables PIE_DEB y PIE_HAB respectivamente, y las propiedades en cada uno de ellos para sumar en Modo: Acumulado y en Fórmula, el importe (#IMP_DEBE o #IMP_HABER) de cada una de las columnas.
Con esto, ya conseguimos que aparezcan las sumas en el pie de página correctamente …

Ahora, falta realizar los Cáculos para que aparezca el “Suma y sigue …” en la cabecera de cada página, antes de la primera línea de la página.
Y para eso creamos 2 nuevos Cálculos, uno llamado CAB_DEB y otro llamado CAB_HAB y en ellos usamos las propiedades Modo: Absoluto y en Fórmula, indicamos la diferencia entre el importe de la variable acumulada del pie de pagina anterior y el importe de la linea: PIE_DEB-#IMP_DEBE para la primera columna y PIE_HAB-#IMP_HABER para la segunda.
Y despues de realizar las pruebas con un informe con varias páginas de registros, he podido comprobar que funciona correctamente.
oct
5
Aqui os dejo un artículo que escribi hace ya tiempo, pero por motivos que ahora no logro recordar, se quedo en el tintero, pero como aún está vigente y es un tema que durante los proximos años cambiará el modo de ver la información, asi que lo dejo caer:
Estas semanas he andado bastante liado por diversos motivos, … todos ellos de trabajo: avanzar en unos proyectos, actualizaciones en otros, … lios, lios y mas lios.
Tomar decisiones es complicado, y hay que tomar tantas decisiones cada dia,
Hoy me he levantado con un mal pie, y he decidido aunque me pese, dar un mal paso. Tenia el ordenador del chico averiado desde hace varias semanas, y tenia que solucionar el entuerto, asi que he decidido (una de tantas decisiones) instalar Linux como sistema operativo, por varias razones. No es la primera vez que instalo Ubuntu, pero casi siempre por motivos de tiempo, y sobre todo porque antes (V6) no podia trabajar con Linux, y poque siempre usaba ordenadores de desecho para instalarlo y probarlo, aunque al final no tenia tiempo para nada.
Dicho y echo, descargo Ubuntu 10.10 y a instalar, y poco mas de 40 min. después ya tenia el escritorio en pantalla y dispuesto para trabajar. Hacia ya bastante tiempo que no lo tocaba, quizá desde la versión 8.10, ya ni lo recuerdo.
El caso es que ahora se me presenta un problema al cual debo dar solución, el ordenador de mi hija tiene Windows XP (original en CD), el de mi hijo tiene Ubuntu 10.10 (original y descargado de http://www.ubuntu.com/), y en los portatiles tengo Windows Vista (original y preinstalado) y Windows 7 (original y preinstalado).
Tengo 4 ordenadores, y cada uno tiene un sistema operativo diferente (tendre que comprarme un Mac para la colección completa), y tengo que trabajar, pero hay veces que tengo que realizar tareas, pruebas que me llevan bastante tiempo y que consumen la potencia del procesador a tope, entonces porque tengo que cruzarme de brazos mientras 2 equipos intercambian información, si tengo otros 2 equipos a mi disposición.
Y la solución empieza a llegar desde la nube.
Antes tenia los documentos en Word, pero si quiero poder utilizarlos en Ubuntu pense en hacerlo con OpenOffice, bueno, esto ya lo hacia desde hace varios años con una versión de OpenOffice para Windows. Pero ahora quiero más, y ese más, se traduce en quiero los documentos, pero no quiero tener que trasladarlos de un equipo a otro con el PEN, y no quiero tener que montar un Servidor en casa para tener todo el trabajo centralizado.
Habia que decidir que aplicaciones usar:
- para los documentos: MS-Office , OpenOffice, CorelOffice, …
- para los blogs: WordPress, BlogSpot, Blogger, … (esta decisión ya fue tomada en su dia)
- para navegar: Internet Explorer, Firefox, Chrome, Opera, Safari, …
- para Chatear: Mesenger, Skype, …
- para eMail: Outlook, Yahoo, Hotmail, Gmail, Thunderbird, …
- para FTP: Filezilla, CuteFTP, SmartFTP, AceFTP, …
- y para programar: Velneo, PHP, Java, .NET
Y la solución a todas estas dudas la encontré en la nube, …
- para los documentos, GoogleDocs
- para los articulos del blog, WordPress
- para navegar, FireFox
- para chatear, Skype
- para el correo electronico, WebMail
- para el FTP, Filezilla
- y para programar, Velneo V7
y curiosamente, todos ellos tienen algo en común.
- A todos ellos puedo acceder desde cualquiera de los ordenadores que tengo en casa y tambien fuera de casa, ya sean Windows o Linux, solo necesito una conexion a internet.
- Ahora no me preocupo porque uno de los equipos se pueda averiar, no perderé mi trabajo
Y los clientes, ¿que sistema operativo usan?, y la verdad es que me da igual, eso deben decidirlo ellos mismos, yo instalaré mi aplicación y les daré soporte sobre mis productos. El resto, es un problema, pero no para mi.
Open your mind, be cloud !!!
sep
24
He tenido un sueño,
y como todos los sueños,
a veces son dificiles de interpretar,
pero no me preocupa,
quizá algún dia lo entienda.
Estaba amaneciendo,
y ante mi habia un camino,

en realidad había mas de un camino,
pero yo había elegido este,
y avanzaba caminando,
sin prisa pero sin pausa,
algo me decia que debia continuar,
y trás un buen rato caminando,
y al final del camino, una puerta,
la puerta estaba cerrada,
y al abrir la puerta,
vi una autovia con varios carriles,

y uno de ellos, como prolongación del camino anterior,
me permitia seguir mi camino, a mi ritmo,
pero tuve que decidir,
tomar una decisión importante,
porque ahora tenia varios carriles a mi disposición
y la libertad para elegir
por cual de ellos queria viajar,
incluso cambiando de carril a mi antojo,
pero todos ellos con un destino común,
un destino que me llevaba a …
… luego me desperte,
relajado y con las pilas cargadas.
Estaba amaneciendo,
y ante mi habia un camino,
un camino corto,
y al final del camino, una puerta,
la puerta estaba abierta,

y al mirar a través de la puerta,
vi una autopista con muchos carriles …
No se, quizá algún dia,
pueda llegar a entenderlo.
sep
19
Aqui os dejo la entrevisa realizada por nuestro amigo Javier Duran, a quién felicito por el resultado.
Entrevista a José Luis de A.S.C.
un saludo y nos vemos en ¡Life is soft!.
José Luis
sep
19
Todo sistema informatico, para ser implantado requiere de 3 fases fundamentales,
- El análisis
- El diseño
- La programación
Vamos a ver en que consiste cada una de éstas fases:
- El análisis, consiste en realizar el planteamiento del problema, reunir la documentación e información preliminar y determinar los requisitos necesarios para completar todo el desarrollo.
- El diseño, consiste en especificar las caracteristicas que debe tener el producto terminado y como alcanzar dicho objetivo
- La programación, se encarga de desarrollar todas las especificaciones descritas en el diseño mediante la creación del software necesario para implementar el diseño.
Todos habeis visto en alguna ocasión alguna de las muchas versiones que se han realizado sobre “Los 3 mosqueteros” y ahora seguramente esperais que os cuente la peli para entender estos conceptos, ¿verdad?, pues no, ésta vez no hay peli. Por cierto, os habeis dado cuenta que “Los tres mosqueteros” llevaban capa, al igual que Caperucita Roja, pues algun dia os contare una historia sobre las “capas”.
Bueno vale, os contare un cuento, pero será el de “Los 3 jabalies”:
Erase una vez un bosque en el que vivian 3 jabalies, y como no, un lobo hambriento.
Un dia hartos de que el lobo les acosara con sus tremendos colmillos y con su gran bocaza, decidieron que debían construir una choza para refugiarse en los momentos de peligro.
- El jabalí programador, dijo vamos a construir una casa que nunca podrá derribar y empezo a programar, … y cuando hubo acabado, como por casualidad, el lobo apareció, y soplo y soplo hasta que la choza destruyó.
- El jabali diseñador, dijó, voy a diseñar una casa que ni siquiera un elefante derribará, y comenzo a desarrollar, … y cuando hubo acabado, como siempre, el lobo volvió para incordiar, y comenzo a soplar y soplar, y aunque un poco más le costó, al final la casa derribó.
- El jabalí analista, dijo finalmente, voy a analizar una casa y cuando haya termiando, tú (al jabali diseñador) la diseñaras y tú (al jabali programador) la crearás y asi lo hicierón.
Al finalizar, como siempre, el lobo (jefe del proyecto) empezó a soplar y soplar, luego empezo a golpear y por mas que soplaba y golpeaba, la casa no se derribaba.
Si bién es cierto, que despues de tanto ajetreo, los jabalies tubieron que hacer alguna reforma y redecorar algunos detalles de la choza, pero ésta se mantuvo en pie y por fin el proyecto llegó a buen puerto.
Después de leer el cuento, seguramente habrá varias dudas que os mantendrán intrigados, vamos a resolverlas ya, no os volvais impacientes:
- ¿Porque jabalies en vez de cerditos?, pues es lógico, hemos indicado al principio del cuento que estaban en el bosque, y la inmensa mayoria de los cerdos que conocemos son de granja, además de evitar así polemicas sobre si el cuento tiene o no, derechos de autor y evitar las posibles represalias de la S.G.A.E.
- ¿Porque el lobo siempre aparece cuando ya han terminado?, pues sencillo, porque como jefe de proyecto que es, debe estar enterado de todo lo que hacen los jabalies.
Este cuento, como todos, viene con moraleja:
En cualquiera de los 3 casos comentados anteriormente, solo el 3º consiguió su objetivo, y lo hizó porque a diferencia de los dos anteriores, trabajarón en equipo, y ello les condujó al éxito.
Además, el problema principal en la mayoria de las aplicaciones que realizamos, y yo también he cometido esos errores, es el tiempo.
Asi es, el tiempo, y no me refiero a la climatología, si llueve, si hace calor, si nieva, aunque esto también influye en nuestro estado de animo.
Me refiero a “otro” tiempo, al tiempo que dedicamos a cada una de estas tareas, y es que hay una regla que no falla (ya que se trata de una simple regla estadistica y la estadistica nunca falla, ya que se regula asi misma en el mismo momento en que hay variaciones).
Esta regla es la del 80/20, que seguro conocereis, y según la cual debemos dedicar el 80% de nuestro tiempo y recursos a las tareas o fases más importantes y asi minimizaremos los errores cometidos, que serán el 20% y ademas, dichos errores serán mas faciles de solucionar y no afectaran a la estructura principal del proyecto.
Y aquí viene donde uno debe pensar y decidir cuales son las fases mas importantes y cuales no.
Yo he resuelto este dilema desde hace mucho tiempo, ¿quereis saber como?
Cuando nos casamos (mi esposa y yo), llegamos a un acuerdo para evitar futuras discusiones:
- En casa, siempre seria yo quien tomara las decisiones importantes
- Pero ella sería quien decidiría que tareas son importantes y cuales no.
Espero vuestras aportaciones
|