Disponible la nueva versión Velneo 24

Con este post anunciamos que la nueva versión Velneo 24 ya está disponible para su descarga, con novedades y mejoras que seguirán haciendo de Velneo la plataforma completa de desarrollo de aplicaciones empresariales de referencia, en español y con código empresarial abierto y personalizable. Bienvenido a una nueva experiencia en el desarrollo de la interfaz de tus aplicaciones.

Maximizar tu productividad mientras programas, mejorar la velocidad en cloud (en local también, por supuesto) y crear recursos de calidad para la formación de programadores han sido las principales áreas de trabajo para esta versión.

Tanto si ya eres suscriptor de Velneo como si estás pensando en cambiar de plataforma, en esta nueva versión encontrarás importantes novedades que te harán la vida más fácil como programador de aplicaciones empresariales.

Durante los próximos días se publicarán entradas en este blog sobre cada una de las novedades principales, junto con los vídeos en los que se explica cada una de ellas.

Puedes visitar la página de novedades para obtener más información. ¡Disfruta desde ya mismo de la nueva versión Velneo 24!

Este artículo Disponible la nueva versión Velneo 24 es original de Velneo.

Sabías que … (6)

Se ha hecho esperar pero ya tenemos una nueva entrega de nuestro famoso juego “Sabías que“. En este post veremos curiosidades sobre gráficos, manejadores y CSS… ¡en vDevelop!.

Por si te perdiste las cinco primeras entregas del “juego”, no está de mas recordarlas:

¿Sabías que..?

Los gráficos nativos se pueden imprimir con vReport, pero con ciertas limitaciones.

    • Si queremos imprimir un gráfico nativo de Velneo podremos hacerlo con VReport teniendo en cuenta lo siguiente:
      • En Vreport no se ejecutarán los eventos del gráfico y por lo tanto cualquier asignación de variables locales no tendrá efecto
      • Si el modo de leyenda es “Interactiva” tampoco podemos reflejar el estado de visualización de las series
    • El gráfico nativo de Velneo es un objeto estático que solo puede ser personalizado en vReport mediante el proceso que lo alimenta y el uso de variables globales.
    • Sin embargo en QML podemos usar el componente ChartView, interactuar con él, guardar en disco una foto e imprimirla en vReport.

Las Cestas con el mismo nombre se reutilizan cuando son creadas en un manejador llamado por otro.

    • Aunque muchos ya lo sabréis, no está de más recordar este comportamiento ya que puede ocasionar errores graves en nuestra aplicación.
    • Despista el hecho de que tengamos que usar el comando “Cesta: crear cesta local” y sin embargo la cesta se reutilizará si le asignamos el Nombre de una Cesta creada previamente en un manejador padre.
    • Usaremos el comando “Cesta: limpiar” inmediatamente después de crearla para asegurarnos de que no se reutiliza.
    • Más información en la ayuda de Velneo.

Los manejadores de evento encadenados se comportan como un solo proceso.

    • Ejecutar un manejador de evento desde otro manejador no implica generar un nuevo proceso.
    • Las transacciones abiertas en el segundo manejador no se cierran hasta que termina el primer manejador
    • Es un comportamiento diferente al de los procesos y por eso es importante recordarlo.
    • Más información en la ayuda de Velneo.

Obtener el primer y último día del mes.

    • En Velneo disponemos de la función daysInMonth(fecha)
Set (FECHA, currentDate())
Set (PRIMERDIA, setDate(FECHA), month(FECHA), 1)
Set (ULTIMODIA, setDate(FECHA), month(FECHA), daysInMonth(FECHA)))
    • En Javascript restamos un día al primer dia del mes siguiente
var fecha = new Date();
var primerDia = new Date(fecha.getFullYear(), fecha.getMonth(), 1);
var ultimoDia = new Date(fecha.getFullYear(), fecha.getMonth() + 1, 0);

Un Manejador de Evento puede utilizarse para validar los datos antes de guardar.

    • Ejecutar un Manejador de evento VALIDAR_REGISTRO con variable Local LOK para el retorno.
    • Ejecutando los comandos “Set retorno de proceso = No” y “Finalizar proceso” el valor de LOK será 0, de lo contrario 1.
    • Comprobamos el valor de LOK para validar la Ficha.
    • De esta forma podemos ejecutar VALIDAR_REGISTRO como si fuera una función.
    • Nos servirá para comprobar la Ficha antes de Guardar y en el evento On_Close si el usuario cambia de pestaña sin Guardar.
Interfaz: Ejecutar manejador de evento (VALIDAR_REGISTRO, LOK)
If (LOK)
  Interfaz: Aceptar
else
  ...

CSS en vDevelop.

    • ¿No te gusta el aspecto de vDevelop? ¿Has notado como tu vista cansada sufre desde que usas Velneo?
    • Construye entonces tu propio CSS tal como lo harías para una aplicación de vClient para tu mejor cliente.
    • Usa el parámetro -stylesheet=<path>\hoja_estilo.css en vDevelop.exe y todo cambiará.
    • Y aunque no te lo creas está documentado.
    • Tenemos en Internet algún ejemplo de CSS en Qt-Creator que podemos aplicar a vDevelop.

En la imagen siguiente se muestra el editor de código con fuente de espaciado fijo, consolas y 14pt.

Ordenar Controles en los Formularios.

    • El panel de subObjetos de vDevelop muestra la lista de todos los controles en la pestaña del mismo nombre.
    • Seguro que más de una vez habrás pensado que es una herramienta claramente insuficiente.
    • Hay procedimientos que pueden pasar desapercibidos.
    • Por ejemplo, ¿ cómo podemos ordenar varios objetos rápidamente ?

      • Mantén pulsado Shift y haz click en varios controles en el mismo orden en que deben ser ordenados.
      • Pulsa Ctrl+X para cortar los controles seleccionados.
      • Selecciona un Control del formulario.
      • Pulsa Ctrl+V para pegar los controles.
      • Los controles se situarán después del control seleccionado y en el orden deseado.

Condiciones de Estilo en Rejillas, no sobrescribir el valor de Color de fondo.

    • En el subObjeto “Condición de estilo” de la Rejilla podemos definir las propiedades de Color de texto y Color de fondo.
    • Aunque solo queramos cambiar el Color de texto, el Color de fondo se aplicará siempre, que será blanco por defecto.
    • Si la Rejilla tiene un color de fondo alternado (efecto de cebra), aplicado mediante CSS, cuando se aplica la “Condición de estilo” las columnas afectadas perderán el efecto cebra.
    • Para evitarlo no tenemos más que definir un color transparente en la propiedad Color de fondo. Un color transparente se obtiene poniendo a cero el canal alfa del Selector de color.

Usar funciones en vReport.

    • Desde un informe vReport tenemos acceso a las tablas y al resto de objetos del Proyecto de datos de la Aplicación.
    • Por lo tanto, podemos ejecutar Funciones del Proyecto de datos desde el Editor de fórmulas.
    • Una aplicación inmediata puede ser imprimir los acumulados en el Encabezado del agrupamiento en lugar de hacerlo en el pie.
    • Esto es otra forma de hacer más potentes y dinámicos nuestros informes

Evitar la ejecución de un Dock de Formulario.

    • El objeto Dock de Formulario es una potente herramienta para mostrar o gestionar información de forma permanente en nuestra aplicación.
    • Un Dock de Formulario es accesible en vDevelop desde cualquier objeto del proyecto de aplicación.
    • Además de mostrar u ocultar el Dock, disponemos del comando “Interfaz: set dock features” para determinar su comportamiento de cara al usuario.
    • Pero, ¿cómo podemos evitar que se cree un Dock de formulario según el perfil del usuario?
    • Muy sencillo, pongamos un comando “Set retorno de proceso = NO” en el manejador PRE_INI del formulario y ya no habrá rastro del Dock en nuestra aplicación.

 

Y ahora confiesa… ¿cuántas de estas curiosidades gráficos, manejadores y CSS… ¡en vDevelop! sabías? 

Déjame un comentario mas abajo y comenzamos el debate.

La entrada Sabías que … (6) se publicó primero en AyudaVelneo.

¡Por fin se termino 2017!

Pues si, parecía que no se iba a terminar nunca pero..

¡Por fin se terminó 2017!

La verdad es que si me preguntas como me ha ido el año, te contestaría con otra pregunta ¿a nivel personal, o a nivel profesional?

Llevaba tiempo queriendo escribir este post pero he preferido dejar pasar algo de tiempo para coger mayor perspectiva de todo lo vivido el año pasado.

¡Por fin se termino 2017!

En este post te contaba como me había ido 2016 y los planes que tenía para 2017…

Pero la vida es caprichosa y a veces tu quieres ir por un camino, y ella te lleva por otro.

Objetivos que tenía para 2017

Tenía 3 objetivos principales para el modelo de negocio que tengo con Ayudavelneo:

Centrarme en los desarrolladores que comienzan en Velneo.

Realizar webinar y seminarios de iniciación.

Obtener ingresos recurrentes.

Como puedes ver, sólo conseguí uno de los tres objetivos principales que me propuse para el año 2017.

Después de todos los problemas de salud que aparecieron a principios de año tuve que pivotar el modelo y buscar nuevos objetivos para el último trimestre de 2017 como te conté aquí.

Obtener ingresos recorrentes a través del blog o del software sigue siendo mi asignatura pendiente. Espero avanzar en este apartado durante 2018.

2017 a nivel personal

¿El vaso está medio lleno o medio vacío?

Pues eso es lo que me ha pasado a nivel personal.

Lo que a mediados del año 2017 era el vaso medio vacío (con todos los problemas de salud), mirándolo desde la distancia en estos primeros meses de 2018, se ha convertido en vaso medio lleno.

He retomado muchos hábitos que había olvidado:

  • Desayunos mas saludables.
  • Respetar las horas de sueño (estoy en proceso).
  • Desconectar de la tecnología (o intentarlo) los fines de semana.
  • He vuelto a la lectura ¡de libros en papel!.
  • He vuelto a entrenar (de hecho me estoy preparando el maratón de Madrid del día 22 de abril).
  • Dedicar tiempo de calidad para los míos.

Como consecuencia de todo ello, he perdido 8 kilos desde marzo de 2017.

Al final por muchas metas que nos planteemos a nivel profesional, si la salud no te respeta… y tu no te respetas a ti mismo, difícilmente vas a poder lograrlos.

Lo malo de todo esto es que la vida nos tenga que dar algún sustillo para que nos demos cuenta de ello.

2017 a nivel profesional

Sin lugar a dudas el mejor año desde que estoy con el proyecto ayudavelneo.

Tanto el “Servicio de desarrollo online” como el “Bono de 10 horas de desarrollo” han sido un completo éxito.

Ahora mismo en el “mundo Velneo” hay una realidad: las empresas siguen necesitando desarrolladores en Velneo con experiencia (sólo hay que ver las últimas ofertas de trabajo que han aparecido en el foro).

El “Servicio de desarrollo online” era perfecto para ellas.

Este servicio sólo tiene un problema: el pago es posterior al servicio.

Si se solapan proyectos, puedes tener bastante dinero pendiente de cobro.

Eso supone un riesgo… que he asumido y en algún caso no me ha salido bien.

De hecho sigo intentando resolverlo.

En cuanto al “Bono de 10 horas de desarrollo” es perfecto para empresas que tienen alguna necesidad puntual o programadores que se están iniciando en la plataforma y necesitan un empujón inicial.

Este servicio tiene una ventaja: el pago es anterior a prestar el servicio.

Aquí me ha ocurrido todo lo contrario, he tenido que devolver el importe de algún bono.

Al final es un servicio, no un producto por lo que si ya tienes las horas comprometidas, es mejor devolver el importe que no poder atender a un cliente.

Volvemos a los ingresos recurrentes…

Como consecuencia de estos servicios, he recibido ofertas para pasar a formar parte de alguna empresa (tanto de desarrollo como cliente final) como asalariado.

De momento las he rechazado o me han rechazado al saber mis pretensiones económicas.

Si tengo que abandonar mis sueños por cumplir los sueños de otros, tiene que merecer mucho la pena en todos los aspecto… y uno de ellos es el monetario.

¿Y en 2018 qué?

Pues de momento he aceptado 3 proyectos a largo plazo que me van a tener entretenido durante todo este 2018.

De ahí que esté rechazando algunas ofertas que me habéis hecho llegar a través de la página de contacto para los servicios antes mencionados.

Los webinar tendrán que esperar.

Seguiré escribiendo de manera regular y mi prioridad serán los desarrolladores que se están iniciando en la plataforma.

Tengo pensado cambiar el lead magnet que recibís cuando os suscribís al blog: un curso de 9 horas es un “ladrillo”… hay que hacer algo mas “consumible”.

Invertir en formación será otra prioridad para este año:

  • GTD
  • Oratoria
  • Metodologías Agiles
  • Marketing online

Y a nivel personal me gustaría sacarme el título de entrenador de futbol para formar a chavales (la formación me sigue encantando).

Veremos que se cumple… pero eso ya será un capítulo aparte.

Y a ti, ¿cómo te ha ido 2017? 

No seas tímido y déjame un comentario mas abajo.

La entrada ¡Por fin se termino 2017! se publicó primero en AyudaVelneo.

Nuevos contenidos en la página de formación de Mi Velneo

La página de formación de Velneo sigue creciendo. Si estás buscando tutoriales sobre las últimas novedades de Velneo, utilidades avanzadas o buenas prácticas, podrás encontrar nuevos contenidos.

Ya tenéis disponible en la misma todos los vídeos del curso de actualización 2017 celebrado a finales de 2016 para suscriptores de Velneo y que incluía los siguientes temas:

Si quieres profundizar en tu conocimiento de Velneo… ¡ya no tienes excusa!

Este artículo Nuevos contenidos en la página de formación de Mi Velneo es original de Velneo.

No tengo tiempo para iniciarme en Velneo

Hace unos días realicé una encuesta a los suscriptores para saber cual era su principal problema a la hora de desarrollar con la plataforma. Uno de los problemas mas repetidos era “No tengo tiempo para iniciarme en Velneo“.

Resulta curioso que el principal problema no sea como crear vistas de datos, como lanzar las búsquedas o como utilizar los enlaces indirectos.

El principal problema es el tiempo.

 

iniciarme en velneo

La verdad es que no se como me sorprende.

En esta sociedad en la que vivimos se da una paradoja muy interesante en las empresas de programación:

el principal bien que tenemos es el tiempo… y nos dedicamos a programar a toda prisa nuevas funcionalidades en nuestras aplicaciones sin pararnos a pensar si el desarrollo que estamos realizando es realmente necesario para nuestros clientes.

Me pasa incluso a mi. Llevo queriendo sacar tiempo para empezar a desarrollar en QML ya ni me acuerdo desde cuando… y la semana pasada tampoco lo conseguí.

Si no lo habéis hecho todavía, os aconsejo leer este post de Alfonso Gutiérrez. Es para pensar y reflexionar sobre ello.

Causas de la “escasez de tiempo”

La gran mayoría de los que desarrollamos en Velneo somos pequeñas empresas o autónomos. No tenemos grandes departamentos en nuestra empresa de ventas, contabilidad ni de programación.

Estoy convencido de que una de las principales causas de la escasez de tiempo que impide “iniciarme en Velneo” es el “síndrome del hombre orquesta“: como voy a dejar que otro haga esto.. si yo soy el que mejor lo hace.

Gran error.

Yo facturo, yo vendo, yo me encargo de la contabilidad, yo programo, yo hago las nóminas, etc etc etc. y al final no tengo tiempo para lo importante.

Tener tiempo para pensar que vamos a desarrollar en las aplicaciones para hacer rentables nuestras empresas.

Si te sirvo de ejemplo, te voy a contar 4 medidas que he tomado para “ganar tiempo”:

  • Contratar una asesora: Lo siento no soy contable ni asesor fiscal. En España hay demasiados trámites burocráticos y cada 3 meses hay que presentar impuestos. Susana se encarga de todo esto. Es lo primero que hice cuando me decidí a ser autónomo hace ya algunos años. No me arrepiento en absoluto… es mas cada 3 meses me compadezco de ella.
  • Contratar un diseñador para la web: la primera versión de la web la desarrolle, la instalé y la configuré yo. Cuando decidí que era hora de actualizarla por completo (con el aspecto que ves ahora) lo primero que decidí es que no la iba a hacer yo (y se hacerlo puesto que ya lo había sufrido una vez). Otra decisión acertada. En este caso fue mi amigo Dan quien se encargó de ello.
  • Aprender a decir NO y rechazar algunos trabajos: antes decía a todos los trabajos que me llegaban que si. No me preocupaba si “eran rentables” sólo me preocupaba “poder facturar“. Si te fijas acabo de hacer una comparación muy sutil pero bastante importante “rentabilidad vs facturación“. Ahora sólo cojo trabajos que van a ser rentables.
  • Externalizar todos los trabajos mecánicos que tengas en tu empresa. El tiempo que ganarás compensará con creces la inversión que tengas que realizar.

La cuenta es muy sencilla. Ponte un precio/hora (el precio que quieres ganar por tu trabajo). Mira las horas que inviertes en trabajos mecánicos o trabajos que podrías delegar. Multiplica tu precio hora por esas horas que empleas en trabajos que podrías delegar. Y ahora mira cuanto te costaría delegar esos trabajos. ¿Te compensa? A mi te aseguro que si.

Consejos para “iniciarme en Velneo”

El primer consejo que te daría es que comiences poco a poco (vamos, que no quieras desarrollar un ERP el primer día… ni siquiera el segundo jejeje) y sobre todo que te comprometas.

Trata tu formación en Velneo como si de un proyecto de unos de tus clientes se tratase. Resérvate horas en tu planificación semanal. Será la única forma de que avances.

Puedes comenzar con estos post que he seleccionado para “Comenzar con el desarrollo en Velneo“.

Después puedes realizar algún curso online gratutio como este o de pago como el programa formativo “Despega con Velneo V7“.

Por último si no consigues comprometerte con la formación, lo mejor que puedes hacer es un curso presencial. De esta forma te comprometes si o si.

Repite conmigo “voy a iniciarme en Velneo”.

¿Qué medidas vas a tomar para conseguirlo?

Cuéntamelas dejándome un comentario mas abajo.

 

La entrada No tengo tiempo para iniciarme en Velneo aparece primero en AyudaVelneo.

Comienza el curso escolar 2017/2018

La verdad es que estoy como los niños cuando empiezan el nuevo curso escolar: con mucha ilusión por reencontrarme con los “amigos virtuales” ( o sea tu) y deseando hacer cosas nuevas en el blog.

curso escolarEste 2017 no está siendo como yo esperaba a nivel personal.

Cuando estaba a punto de irme de vacaciones para olvidar mis problemas de salud, (y cuando digo a punto de salir, quiero decir la noche antes con las maletas ya preparadas) tuvimos que llevar a mi hijo mayor al hospital: operación de apendicitis y cancelación de las vacaciones.

Tampoco me puedo quejar. Todo se ha cogido a tiempo y no deja de ser ya una “anécdota” familiar.

Siendo sinceros… alguna asignatura pendiente me ha quedado.

De mis propósitos de año nuevo, algunas asignaturas me han quedado pendientes para “septiembre”:

  • Todavía no he logrado crear un sistema de ingresos recurrentes.
  • Creación de un nuevo curso de iniciación.
  • Escribir artículos con mas regularidad. Esto está muy relacionado con el punto 1… si no logro ingresos recurrentes, tengo que intercambiar tiempo por ingresos… y ahí salgo perdiendo.

Prometo aplicarme para “aprobar” estas asignaturas.

¿Y este nuevo curso escolar qué?

La verdad es que estoy muy ilusionado con el proyecto ayudavelneo.

Sentir que con los artículos ayudo a los desarrolladores que se están iniciando en Velneo a ser mas productivos y a obtener beneficios desde el minuto uno, me produce una gran satisfacción.

Además gracias al blog cada vez mas a menudo me llegan propuestas de trabajo: desarrollos, cursos online, cursos presenciales así como ofertas de trabajo en empresas.

Esta última opción, de momento está descartada.

Como te he comentado anteriormente, he prometido aplicarme para “recuperar” las asignaturas que llevo suspensas.

En esta última parte del año, he decidido emprender las siguientes acciones:

  • Publicar un post todos los martes. Si además hay post de algún invitado, se publicarán los jueves.
  • Crear un nuevo curso de iniciación en Velneo para todos aquellos de vosotros que estáis empezando a desarrollar con la plataforma.
  • Enviar un boletín o newsletter los viernes a todos los suscriptores del blog,  con las novedades y artículos interesantes que aparezcan relacionados con Velneo. Si no te has suscrito todavía, puedes hacerlo al pie de este post.
  • Como los grandes clubes de futbol (quitando al Barcelona este año… jejeje), yo también he “fichado” a un nuevo colaborador para el blog: El “profesor vBacterio“. Algún experimento interesante mezclando Velneo y vJavaScript ya he visto que saldrá de su laboratorio.

Además durante el verano he recibido algunos e-mails en los que me preguntábais si los “Cursos Online” relacionados con QML iban a volver a estar disponibles.

Aunque en un principio había decidido no volver a ponerlos a la venta, al final he recapacitado y vuelven a estar disponibles:

También están disponibles en el menú superior de la web (opción “Cursos”)

De momento esto es todo lo que tenía que contarte..

¿Qué te han parecido mis “medidas” para aprobar en septiembre? ¿Acertadas?

¿Prefieres recibir la newsletter el fin de semana?

Déjame un comentario mas abajo y comenzamos el debate.

La entrada Comienza el curso escolar 2017/2018 aparece primero en AyudaVelneo.

Nuevos contenidos en la página de formación de Mi Velneo

Como anunciamos con la salida de la versión Velneo 21, dentro de la zona privada Mi Velneo, existe ahora una nueva página de formación, que incluye la posibilidad de registrarse para los próximos seminarios online, así como cursos y videotutoriales disponibles para cualquier usuario registrado de nuestra web.

El contenido de la página de formación sigue creciendo. Ya tenéis disponible en la misma todos los vídeos del curso de actualización 2016 celebrado en noviembre de 2015 para suscriptores de Velneo y que incluía los siguientes temas:

Si quieres profundizar en tu conocimiento de Velneo… ¡no te vas a aburrir!

Este artículo Nuevos contenidos en la página de formación de Mi Velneo es original de Velneo.

Sabías que (2) …

Vamos con una nueva entrega de nuestro mítico juego… “Sabías que“.

Por si te perdiste la primera parte del juego y quieres ganar el primer “quesito” del trivial, aquí te dejo el enlace ¿Sabías que?… Parte 1

¿Sabías que..?

¿Sabías que se puede ocultar la Barra de Estado con un comando nativo de Velneo?

    • Usar el comando Interfaz: Ocultar (STATUS_BAR).
    • Podemos usarlo al inicio de la Aplicación en el evento POS_INI del marco Autoexec.
    • También disponemos de la función del API theMainWindow.hideStatusBar().

¿Sabías que a veces los comandos Else y Else if no funcionan correctamente porque …?

    • Los comandos de instrucción Else y Else if siempre deben estar precedidos de un comando If o Else if. Los comandos If y Else if deben estar situados al mismo nivel y no puede haber ninguna otra línea al mismo nivel entre ambos, ni siquiera un Rem.

¿Sabías que se puede convertir un control de puntero a maestro en un control de edición alfabética?

    • El control de edición del puntero a maestro tiene un comportamiento especial para permitir el Autocompletado o la selección de un registro desde la Vista de datos.
    • Si solo nos interesa mostrar el Nombre del maestro como un control de edición alfabética añadimos el string vacío “” al contenido del campo.
      Por ejemplo el contenido   “” + #PUNTERO_MAESTRO.NAME  hará que las propiedades Autocompletar y Tipo de botones desaparezcan.
      Fijando a 1 el valor de la propiedad Solo lectura conseguimos un control no editable.
    • Recordad que la clase VBoundFieldEdit representa al control de edición de puntero a maestro y la clase VLineEdit al control de edición alfabética.

¿Sabías que se puede determinar el tamaño de los iconos del objeto de lista ListView?

    • El tamaño de los Iconos en un objeto de lista ListView se determina con el tamaño del Dibujo del proyecto que asignamos a la propiedad Icono nulo.
    • Añade al proyecto un objeto Dibujo y ponle un tamaño con el editor (por ejemplo 150x100px) y lo asignas a la propiedad Icono nulo del ListView.

¿Sabes cuándo se calculan por primera vez los valores iniciales de los campos de una Tabla?

    • Desde un formulario se calculan siempre en primer plano.
    • En el plano que corresponda cuando se ejecuta el comando Crear nueva ficha en memoria.
    • La función del API VRegister.setTable() es la que ejecuta los valores iniciales. Tenedlo en cuenta en los bucles que añaden registros a una tabla.
    • Crear Copia de ficha en memoria no ejecuta valores iniciales. Podemos usar el comando Calcula campos dependientes, pero solo funciona con fórmulas que contienen campos de la tabla.
    • Los Tubos de ficha o lista no ejecutan los valores iniciales. Solamente se ejecutan los valores iniciales que dependan de otros campos de la tabla de destino

¿Sabes el orden de las señales cuando se han definido mas de una vez sobre el mismo control?

    • Un objeto de lista del proyecto con una conexión de evento Cambio de seleccionado se incrusta en un control Vista de datos del formulario.
    • En el control Vista de datos definimos la misma conexión de evento Cambio de seleccionado.
    • Se ejecutarán los 2 manejadores de evento, pero siempre primero el manejador de evento del objeto del proyecto.
    • De esta forma podemos tener funcionalidad común en el objeto del proyecto (por ejemplo guardar el ID seleccionado) y en los distintos formularios disparar una conexión de evento con un manejador de evento personalizado cuya primera línea podrá ser

Interfaz: Get variable local de vista de datos (CTR_LISTA, NID_FICHA, NID_FICHA_LISTA)

La variable local de la Vista de datos NID_FICHA tendrá un valor fijado previamente por la conexión de evento del objeto de lista.

¿Sabías que VReport SOLO tiene acceso al proyecto de datos?

    • Desde el editor de fórmulas de VReport solo tenemos acceso a los controles del proyecto de datos de la tabla de entrada (funciones, constantes, variables globales, …)

¿Sabías que un proceso ejecutado desde un formulario recibe como entrada la ficha en memoria que está en Alta o Modificación?

    • El comando Ejecutar proceso ejecutado desde un manejador de evento o desde un botón del formulario pasa como entrada la Ficha que tenemos en memoria en Alta o Modificación.
    • Por lo tanto podemos modificar los campos de la Ficha en memoria sin generar nueva transacción (equivale al comando Pedir formulario).
    • ¡¡Ojo!! no es lo mismo que ejecutar los comandos Crear manejador de objeto, Añadir ficha al objeto y Disparar objeto. En este caso lo que pasamos al proceso es la ficha en disco.

¿Sabías que puedes aplicar formato HTML/CSS a los controles de Texto estático en los formularios?

    • La propiedad Nombre de los controles de tipo Texto estático aceptan código HTML/CSS que se interpreta en tiempo de diseño y en ejecución.
      Un ejemplo de lo que se puede conseguir se muestra en la captura siguiente. Encima de cada Texto estático aparece el contenido de la propiedad Nombre.

VAF_S2_HTML

    • Como se puede ver podemos usar directamente Titulares H1, H2, …, colorear texto, crear líneas horizontales con un simple <hr>, insertar imágenes desde la carpeta caché o directorio por defecto, subíndices y superíndices.
    • No es una funcionalidad documentada, por lo tanto puede desaparecer en futuras versiones.

Y ahora confiesa… ¿cuántas sabías? 

Déjame un comentario mas abajo y comenzamos el debate.

La entrada Sabías que (2) … aparece primero en AyudaVelneo.

Webinar Velneo 20 y QML 2

El pasado martes 22 de noviembre estuve de “maestro de ceremonias” en un webinar con Jorge Hontoria, en el que nos estuvo contando las novedades sobre QML 2 incluidas en Velneo 20.

Lo primero dar las gracias a los casi 150 inscritos para el webinar y sobre todo a los 70 asistentes que tuvimos en directo.

¿Qué vimos en el webinar sobre QT y QML 2?

Comenzamos el webinar realizando una pequeña introducción sobre QT 5, la plataforma de desarrollo sobre la que está desarrollada Velneo.

Después Jorge nos hizo un repaso de los nuevos componentes incluidos en QML 2:

  • Window
  • Dialogs
  • Controls
  • Layouts
  • Particles

Así como a los nuevos módulos:

  • Positioning
  • Sensoring

Para concluir el webinar, realizamos un primer ejemplo con QML 2 dentro de Velneo 20.

Vídeo del webinar Velneo 20 y QML 2

Por si no tuvisteis ocasión de asistir al webinar en directo, aquí os dejo el vídeo.

¿Y ahora qué?

Hemos organizado un “Seminario QML 2” que tendrá lugar los días 20, 21 y 22 de diciembre de 16 a 19 horas (hora de Madrid).

Tendréis toda la información disponible mañana viernes 25 de noviembre.

Por sugerencia de Jorge, y por si hay alguien interesado en realizar este nuevo seminario, he vuelto a poner a vuestra disposición los cursos online realizados sobre vJavaScript y QML.

En el “Seminario QML 2” no se verá nada de introducción por lo que si estás interesado en apuntarte al seminario, es mas que aconsejable que refresques lo aprendido en los seminarios precedentes.

¿Qué te ha parecido el webinar Velneo 20 y QML 2? 

Déjame un comentario mas abajo y comenzamos el debate.

La entrada Webinar Velneo 20 y QML 2 aparece primero en AyudaVelneo.

Las variables en Velneo

El tema de las variables en Velneo siempre ha suscitado dudas y algún que otro quebradero de cabeza, debido al mal uso de los planos de ejecución y del ámbito de las variables.

Recordemos el artículo ayudavelneo.com/el-peligro-de-las-variables-en-velneo-v7 para comprenderlo mejor.

En Velneo a Fondo hemos recopilado la información que hay dispersa en diferentes artículos y en la propia ayuda de Velneo y queremos preparar un artículo en el que podamos encontrar lo más interesante sobre el uso de las variables en nuestras aplicaciones.

Si crees que debemos añadir un concepto o idea nueva sobre las variables en Velneo no dudes en comentarlo.

Las variables en Velneo V7

Tipos de variables en Velneo

Las variables en Velneo V7 son objetos que permiten almacenar datos individuales. Hay dos tipos: las variables globales y las variables locales.

La variable global es un objeto del proyecto de datos, cuyo contenido es global a la aplicación y común, en el ámbito de red, para todos los usuarios si su persistencia es en disco, y de carácter local si su persistencia es en memoria.

Un objeto es un elemento definible dentro de un proyecto que, en tiempo de ejecución, realiza las tareas de un programa. La Rejilla es un objeto.

La variable local es un subobjeto definible dentro de un objeto. Se trata de una variable local al objeto en el que ha sido declarada, y solamente será accesible desde ese objeto o desde otros subobjetos del mismo. La persistencia de este tipo de variables es en memoria.

Un subobjeto es un objeto que está contenido en otro objeto y que no tiene ninguna entidad por sí mismo, ya que depende totalmente del objeto contenedor. El manejador de evento es un subobjeto.

Las variables contienen valores de tipo alfabético, numérico, fecha, hora, tiempo y booleano. Además pueden ser al mismo tiempo arrays unidimensionales.

Ámbito de las variables globales en disco

El contenido de una variable global en disco es común a todos los usuarios y planos de ejecución (tanto en los clientes como en el servidor).

Los planos de ejecución entran en juego cuando desarrollamos en una arquitectura cliente-servidor como la de Velneo V7.

Existen 4 planos de ejecución:
       El 1º plano es el hilo principal de ejecución en el cliente, con el que interactúa el usuario de nuestras aplicaciones.
       El 2º plano también se ejecuta en el cliente, pero a diferencia del 1º plano, la ejecución es asíncrona, es decir, no interrumpe el resto de procesos.
       El 3º y 4º planos se ejecutan en el servidor, el primero de forma síncrona y el segundo asíncrona.

Por tanto, si desde una sesión de Velneo vClient V7 se modifica una variable global en disco, esta modificación afectará tanto a los clientes que estén ejecutando la misma instancia como a los procesos que hagan uso de ella en el servidor (procesos ejecutados en 3º y 4º  plano).

Una instancia es una aplicación abierta en Velneo vServer que está en ejecución. Es posible abrir en un mismo Velneo vServer diferentes instancias de una misma aplicación. Una aplicación Velneo está compuesta por proyectos, tanto de datos como de aplicación, que serán instanciados de forma independiente.

Debemos tener en cuenta que cada vez que se usa una variable global en disco, vClient solicitará al servidor el valor de dicha variable, por si ha cambiado, lo que supone una conexión (socket) a través del enganche correspondiente, lo que puede ralentizar el proceso sobre todo en cloud.

Un socket es una conexión que se establece cada vez que queremos comunicar dos máquinas. La comunicación se ralentiza sobre todo al establecer el socket, ya que una vez establecida el traspaso de información es rápido. En cloud nuestras aplicaciones deben generar el menor número de sockets posible y para ello hemos de optimizar nuestras aplicaciones.

Debemos evitar el uso de variables globales en disco en la definición de propiedades de campos de las tablas. Por ejemplo, un valor inicial basado en una variable global en disco ralentizará el alta del registro. En la Interfaz de nuestras aplicaciones, un campo fórmula con una variable global en disco se recalcula en cada registro de la Rejilla o en comandos de Recorrer lista, lo que en redes lentas se traduce en una mala experiencia de usuario.

Ámbito de las variables globales en memoria

Las variables globales en memoria existen solo en la sesión de la máquina donde se ejecuta la aplicación. Si ejecutamos varios vClients en una misma máquina, las sesiones se ejecutan en diferentes espacios de memoria y por lo tanto no comparten las variables globales en memoria.

En el servidor, la instancia de la aplicación comparte la memoria con todas las sesiones iniciadas por los usuarios, en consecuencia en 3º y 4º plano, cualquier cambio de una variable global en memoria en una sesión afectará al resto de sesiones.

Cada vez que un usuario se conecta al servidor mediante vClient se crea una nueva sesión de usuario también llamado enganche. La sesión es efímera, solo debe dejar un rastro en forma de Log o histórico.

Las variables globales en memoria de un mismo proyecto de datos no se replican entre el cliente y el servidor. Si el vClient  modifica una variable global en memoria, ésta misma variable en 3º y 4º plano no se verá afectada por la modificación de vClient, son espacios de memoria separados.

Los procesos en 1º y 2º plano comparten la memoria en la misma sesión de vClient. Un proceso en 2º plano que modifica una variable global en memoria afectará al resto de procesos en 1º y 2º plano.

Una sesión de vClient solo comparte con otros vClient de la red (local o remota) los siguientes datos:

    • Las tablas de la instancia de datos del vServer
    • Las tablas en memoria en 3º y 4º plano de la instancia de datos del vServer
    • Las variables globales en disco
    • Las variables globales en memoria en 3º y 4º plano de la instancia de datos del vServer

Cuando una variable global (en memoria o disco) es modificada en 1º plano, todos los elementos del interfaz activos en ese momento se actualizan inmediatamente. Todas las fórmulas de las propiedades de los objetos se vuelven a calcular. Habrá que tenerlo en cuenta en nuestras aplicaciones para evitar comportamientos no controlados.

Variables del sistema

Aunque la ayuda dice que son variables de tipo local predefinida en el sistema, se puede considerar que su ámbito es global a la aplicación. Están siempre disponibles a través del editor de fórmulas y algunas, como sysUserName, sysCacheClientPath y sysIsAdministrator, se fijan al inicio de la aplicación y su valor estará siempre disponible en cualquier plano de ejecución.

Ámbito de las variables locales

Las variables locales sólo son accesibles desde la instancia del objeto en que se han definido.

Si el objeto es un formulario, las variables locales también son accesibles desde los subobjetos de dicho formulario. Cuando instanciamos el mismo formulario 2 veces, las variables locales de ambas instancias son totalmente independientes.

Los subobjetos de un formulario son los controles, conexiones de evento, manejadores de evento, variables locales, inserciones y extensiones de ficha.

Para insertar un control del proyecto en un formulario usamos un control Vista de datos (o un separador, caja o pila de formularios) que hace de contenedor de dicho control. Las variables locales del control insertado no se comparten con el formulario anfitrión porque el subobjeto es el control Vista de datos y no el objeto incrustado.

Por ejemplo, cuando insertamos una Rejilla en una Vista de datos, las variables locales de la Rejilla no se comparten con las variables locales del formulario.

La tabla no es un subobjeto del formulario y por lo tanto la tabla y el formulario no comparten las variables locales.

Hay una excepción con la compartición de variable locales en el objeto Búsqueda. Si tiene un formulario declarado para introducir las variables locales y éstas coinciden en nombre con las variables locales de la Búsqueda entonces se traspasan automáticamente los valores del formulario a la Búsqueda.

Variables locales especiales

Existen 3 variables locales cuyo identificador está reservado. Se pueden crear manualmente o a través de la opción “Crear variables locales eventos” del menú de Objetos.

    • EVENT_SENDER_ID: De tipo alfabética. Contiene el identificador del control que envía la señal. Estará vacía si el que envía la señal es el propio objeto.
      La variable EVENT_SENDER_ID podemos usarla dentro de un manejador para conocer qué Botón ha sido pulsado si existen varios botones que disparan el mismo manejador de evento.
    • EVENT_SENDER_COL: De tipo alfabética. Permite obtener información de la columna en la que estamos posicionados cuando se lanza la señal. Estará vacía en todos los eventos salvo los de columna editable de rejilla.
    • EVENT_PARAMS: De tipo array alfabética. Contiene información que podrá ser leída desde el manejador de evento que ha ejecutado la señal disparada.

Acceso a variables locales de Vistas de datos

Ya hemos dicho que un objeto del proyecto insertado en un formulario no comparte las variables locales, sin embargo Velneo proporciona comandos que nos van a permitir leer y escribir valores desde el formulario en las Vistas de datos que contenga.

Las Vistas de datos son objetos del proyecto que gestionan Listas de registros de una tabla, la excepción es el formulario que gestiona solo una Ficha. Las Vistas de datos se pueden incrustar en un formulario para mostrar, entre otras cosas, las relaciones maestro-detalle de nuestro proyecto de datos.

Existen 5 controles del formulario que permiten incrustar objetos Vista de datos:

    • Vista de datos propiamente dicha que mostrará objetos aparcables (rejilla, multivista, casillero, …) mediante un proceso cargador
    • Separador de formularios que mostrará varios formularios en pestañas
    • Splitter que mostrará varios formularios con un separador ajustable
    • Pila de formularios para crear asistentes mediante formularios sucesivos
    • Caja de formularios que mostrará varios formularios en otro tipo de pestañas

Existen 2 comandos de Velneo que nos dan acceso a las variables locales del objeto incrustado en la Vista de datos:

    • Interfaz: Set variable local de vista de datos
    • Interfaz: Get variable local de vista de datos

Tened en cuenta que estos 2 comandos solo funcionan con objetos incrustados en formularios como Vista de datos. No se puede acceder a variables locales de otro formulario. Por ejemplo, si queremos acceder a las variables locales de un Dock del marco de la Aplicación tendremos que diseñar 2 formularios, uno principal que será el Dock y otro secundario, incrustado como Vista de datos, que contendrá las variables locales que queremos gestionar. El comando que lee el valor de una variable local quedará de la siguiente manera:

Interfaz: Get variable local de vista de datos (.AUTOEXEC.DOCK_CONFIG.CTR_VISTADATOS, VAR_LOCAL, VAR_LOCAL_RETORNO)

Acceso a las variables en Velneo usando el API

En Velneo se ha desarrollado un API que incluye un conjunto de clases que aportan los objetos y funciones para acceder a los elementos de nuestros proyectos. Para programar el API se han incorporado 2 lenguajes, Javascript y QML. En ambos lenguajes podemos usar el conjunto de funciones del estándar EcmaScript-262 (ver http://doc.qt.io/qt-5/qtqml-javascript-functionlist.html).

La interfaz de programación de aplicaciones, abreviada como API (del inglés: Application Programming Interface), es el conjunto de subrutinas, funciones y procedimientos (o métodos, en la programación orientada a objetos) que ofrece cierta biblioteca para ser utilizado por otro software como una capa de abstracción.

Con el API de Velneo podemos acceder a cualquier variable de nuestros proyectos. La herencia permite el acceso y uso de cualquier objeto de la aplicación desde cualquier script.

La herencia es la propiedad que permite que un proyecto pueda hacer uso de los objetos de otro proyecto.

Acceso con el API a las variables globales

Las variables globales son objetos del proyecto de datos. Desde el API usaremos la clase VApp para el acceso a dichas variables.

La clase VApp representa a la aplicación. Siempre estará instanciada en el objeto global theApp.

Las funciones del objeto theApp para el acceso a variables globales son globalVarTo<tipo>() y setGlobalVar(), la primera obtiene el valor de la variable global (tendremos que especificar el tipo de dato que vamos a obtener) y la segunda establece el valor de la variable global.

La variable global se identifica desde el script con el formato “ALIAS_PROYECTO_DATOS/Identificador

El Identificador es la etiqueta alfanumérica que identifica de forma unívoca al objeto dentro del proyecto y para el mismo tipo de objeto. Este identificador será el que usemos para referenciarlo en las propiedades de otros objetos. El identificador constará de mayúsculas y números exclusivamente.

El objeto theApp representa al proyecto de aplicación principal, es decir, la instancia desde la que iniciamos nuestra aplicación. Por lo tanto, mediante el mecanismo de la herencia tendremos acceso a todos los proyectos de datos de la cadena de herencia. Usar la función mainProjectInfo() de la clase VApp para obtener información del proyecto principal y de todos los objetos de la herencia.

En el siguiente ejemplo obtenemos un JSON con todas las variables globales de la Herencia.


// Obtiene un Array con todas las variables globales en la herencia
// Proyecto principal
var mainProjectInfo = theApp.mainProjectInfo()
// Obtenemos el JSON
alert(JSON.stringify(getAllVarGlobal(mainProjectInfo), null, "  ")

function getAllVarGlobal(ProjectInfo, aLisVarGlobal){
        // Inicializa el array
        aLisVarGlobal = aLisVarGlobal || []
        // Añade al array las variables globales del proyecto
        aLisVarGlobal = getVarGlobal(ProjectInfo, aLisVarGlobal)
        // Proyectos heredados (bucle recursivo en toda la herencia)
        for(var i=0, count=ProjectInfo.legacyProjectCount(); i<count; i++){
                var oProyHeredado = ProjectInfo.legacyProjectInfo(i)
                if (oProyHeredado.type() == 0) {
                        // Solo exploramos los proyectos de Datos
                        getAllVarGlobal(oProyHeredado, aLisVarGlobal)
                }
        }
        return aLisVarGlobal
}

// Devuelve todas las variables globales del proyecto
function getVarGlobal(oProyecto, aVarGlobal){
        var count = oProyecto.objectCount(VObjectInfo.TypeVariable)
        var oObjVarGlobal = null
        for(var i=0; i<count; i++){
                oObjVarGlobal = oProyecto.objectInfo( VObjectInfo.TypeVariable, i )
                aVarGlobal.push ( 
                        {
                                idRef: oObjVarGlobal.idRef(),
                                id: oObjVarGlobal.id(),
                                name: oObjVarGlobal.name(),
                                valor: theApp.globalVarToString(oObjVarGlobal.idRef()).substr(0, 100)
                        }
                )
        }
        return aVarGlobal
}

Acceso con el API a las variables LOCALES

Las variables locales pertenecen a objetos que pueden ser ejecutados desde los proyectos de datos y aplicación. Desde el API usaremos la clase VRoot para acceder al objeto principal que está en ejecución.

La clase VRoot representa al objeto en ejecución. Siempre estará instanciada en el objeto theRoot, accesible desde los scripts del objeto actual.

Las funciones del objeto theRoot para el acceso a las variables locales son VarTo<tipo>() y setVar(), la primera obtiene el valor de la variable local (tendremos que especificar el tipo de dato que vamos a obtener) y la segunda establece el valor de la variable local.

La variable local se identifica con su Identificador único en el objeto al que pertenece.

Para acceder a las variables locales del objeto incrustado en un formulario como una Vista de datos tendremos que obtener el objeto theRoot que representa a dicho objeto incrustado. Existe para ello la función root() que aplicada al objeto Vista de datos nos permitirá acceder a sus variables locales.

Veamos un ejemplo. Obtenemos el ID del registro seleccionado en una Rejilla y lo asignamos a la variable local del formulario incrustado como Vista de datos.

// Formulario principal
var oForm = theRoot.dataView()
// Rejilla con la lista de Fichas
var oGRDLista = oForm.control("GRD_LISTA")
var oLista = new VRegisterList(theRoot)
// Reiniciamos la variable local NID
theRoot.setVar("NID",0)
// Ficha seleccionada en la Rejilla
var nSel = oGRDLista.currentSelect()
if (nSel > -1) {
        // Lista de Fichas de la rejilla
        oGRDLista.getList(oLista)
        // Ficha seleccionada en la Rejilla
        var oFicha = oLista.readAt(nSel)
        // Fijamos la variable local NID
        theRoot.setVar("NID", oFicha.fieldToInt("ID"))
        if (oFicha) {
                // Mostramos la Ficha en el formulario incrustado como Vista de datos
                var oVistaDatos = oForm.control("FRM_INCRUSTADO")
                oVistaDatos.setRegister(oFicha)
                // Establecemos el valor de la variable local de la Vista de datos
                oVistaDatos.root().setVar("NID", oFicha.fieldToInt("ID"))
                // Accedemos al objeto en ejecución de la Vista de datos mediante la función root()
                //         y obtenemos el valor de la variable local de la Vista de datos
                alert(oVistaDatos.root().varToInt("NID"))
        }
}

Existe otra clase VObjectInstance que nos permite instanciar objetos de la aplicación de la misma forma que lo hacemos con el comando de Velneo “Crear manejador de objeto”. Para disparar el objeto usaremos la función exec(). Antes de disparar el objeto podemos asignar valores a las variables locales con setVar(). Después de ejecutar exec() y si éste devuelve true, obtenemos el valor de las variables locales con la función VarTo<tipo>().

Variables globales y locales de tipo Array

Las variables array en Velneo no son un objeto independiente del proyecto. Para disponer de un array tendremos que poner a 1 la propiedad Array de una variable global o local.

Los arrays son siempre unidimensionales y el tipo de dato que contiene lo determina el Tipo de la variable. Los elementos del array se acceden mediante la posición que ocupan, siendo 0 la primera posición. En las fórmulas podemos obtener el valor de un elemento concreto del array usando la sintaxis ID_ARRAY[<posición>].

Acceso a variables array globales

Los valores de las posiciones en un array global se pueden leer desde Velneo con la sintaxis ID_ARRAY_GLOBAL[<posición>], pero la asignación de valores solo se puede realizar a través del API. Se podrá trabajar con variables globales de tipo array a través del API de JavaScript mediante las funciones de variables globales de tipo array de la clase VApp.

El uso de un array global facilita la gestión de determinada información al poder agrupar n-variables globales en una sola.

Las funciones del objeto theApp para el acceso a variables array globales son globalVarArrayTo<tipo>() y setGlobalVarArray(), la primera obtiene el valor de una posición de la variable array global (tendremos que especificar el tipo de dato que vamos a obtener) y la segunda establece el valor de una posición de la variable array global. El segundo parámetro de estas funciones es la posición del elemento del array, empezando en 0. Podemos conocer el tamaño de una variable array global mediante la función globalVarArraySize().

Vamos a ver un ejemplo de gestión de variable array global usando el API de Velneo.
Hemos creado en el proyecto de datos una variable global en memoria G_CONEXION de tipo Array. En ella queremos guardar algunos datos de la Sesión actual.
El tamaño del array se irá adaptando al número de elementos creados.

Disponemos de 2 procesos javascript, uno que inicializa los valores del array y otro obtiene un determinado elemento del array.

// Script PRO_CONEXION_INI_JS – Fija los elementos del array global G_CONEXION
// ----------------------------------------------------------------------------
// Usuario conectado
theApp.setGlobalVarArray("MiApp_dat/G_CONEXION", 0, theApp.userName());

// ¿Es administrador?
theApp.setGlobalVarArray("MiApp_dat/G_CONEXION", 1, theApp.isAdministrator()?"Sí":"No");

// Fecha-Hora de la conexión
var f = new Date();
var dias_semana = new Array('domingo','lunes','martes','miércoles','jueves','viernes','sábado');
var fecha = dias_semana[f.getDay()]
+ " " + f.getDate() + "/" + (((f.getMonth()+1)<10?"0":"")) + (f.getMonth() + 1) + "/" + f.getFullYear()
+ " " + ((f.getHours()<10)?"0":"") + f.getHours() + ":" + ((f.getMinutes()<10)?"0":"") + f.getMinutes();
theApp.setGlobalVarArray("MIApp_dat/G_CONEXION",2,fecha);
//theApp.setGlobalVarArray("MiApp_dat/G_CONEXION", 2, f.toLocaleString());

// Código de Pais
theApp.setGlobalVarArray("MiApp_dat/G_CONEXION", 3, theApp.sysCountryIsoCode());

// Nombre de máquina
theApp.setGlobalVarArray("MiApp_dat/G_CONEXION", 4, theApp.sysMachineName());

// Script PRO_CONEXION_GET_JS – Obtiene un elemento del array global G_CONEXION // -------------------------------------------------------------------------------- // Devuelve el valor del elemento del Array G_CONEXION pasando como parámetro un String CVALOR que describe la información solicitada var aValores = new Array("USER","ISADMIN","DATELOGIN","COUNTRY","MAQUINA") var cValor = theRoot.varToString("CVALOR") var pos = aValores.indexOf(cValor) // Devuelve en VRETORNO el valor del elemento del Array theRoot.setVar("VRETORNO",theApp.globalVarArrayToString("MiApp_dat/G_CONEXION", pos)) En el proyecto de Aplicación podremos usar una función que obtenga directamente cualquier valor del array global: Mensaje(        "Usuario - " + fun:[email protected]_dat.dat("USER") + "\n" +        "Administrador - " + fun:[email protected]_dat.dat("ISADMIN") + "\n" +        "Conectado el - " + fun:[email protected]_dat.dat("DATELOGIN") + "\n" +        "Código de país - " + fun:[email protected]_dat.dat("COUNTRY") + "\n" +        "Máquina - " + fun:[email protected]_dat.dat("MAQUINA"), Informacion)

Acceso a variables array LOCALES

Las variables array locales son el mismo subobjeto variable pero con el valor de la propiedad Array a 1.

Disponemos de un conjunto de comandos Array: que utilizaremos en los procesos para gestionar los valores del array local. Podemos asignar un valor, eliminar uno o todos los elementos del array, obtener el tamaño, ordenar el array e insertar un elemento. Para obtener el valor de un elemento del array no existe un comando, simplemente usamos la sintaxis ID_ARRAY_LOCAL[<posición>].

Existen 2 comandos de Velneo que nos dan acceso a las variables array locales del objeto incrustado en la Vista de datos:

    • Interfaz: Set ítem de variable local array de vista de datos
    • Interfaz: Get ítem de variable local array de vista de datos

Estos comandos funcionan de la misma forma que con las variables locales, indicando el elemento del array empezando en 0.

Desde el API disponemos también de las funciones del objeto theRoot para el acceso a las variables array locales, las cuales son VarTo<tipo>() y setVar(). La primera obtiene el valor de un elemento de la variable array local (tendremos que especificar el tipo de dato que vamos a obtener) y la segunda establece el valor de un elemento de la variable array local. El segundo parámetro de estas funciones es la posición del elemento del array, empezando en 0.

Hagamos un ejercicio interesante sobre el acceso a variables locales array. A veces queremos pasar parámetros a un formulario y nos encontramos que en Velneo solo es posible hacerlo cuando usamos el comando Crear manejador de objeto. Para los formularios que se muestran en modo Vista, o en los comandos Pedir formulario y Modificar ficha con formulario, tenemos que recurrir a variables globales u otras técnicas con el API, json, … En este caso os propongo una solución creada íntegramente con Velneo nativo, que consiste en guardar los parámetros del formulario en una Vista de datos de un dock de la aplicación y usar los comandos de acceso a las variables array locales del objeto incrustado en la Vista de datos.

    • Creamos un formulario FRM_PARAMETROS que solo contenga tantos Arrays como formularios tenga nuestra aplicación que necesiten acceso a parámetros.
    • En el evento PRE_INI de FRM_PARAMETROS opcionalmente podemos inicializar los valores de los parámetros. Los valores del array se almacenan como cadenas de texto. Con los números y booleanos la conversión no presenta problemas, con las fechas y tiempos usaremos el formato ISO.
  Rem (Manejador PRE_INI de FRM_PARAMETROS)
  Rem (Aquí podemos documentar los formularios que van a necesitar acceso a parámetros y los inicializamos si es necesario)
  Rem (Parámetros del formulario FRM_CLIENTE)
  Array: Set ( AFRM_CLIENTE, 1, "parámetro 1", LOK)
  Array: Set ( AFRM_CLIENTE, 2, 200.45, LOK)
  Array: Set ( AFRM_CLIENTE, 3, 1, LOK)
  Array: Set ( AFRM_CLIENTE, 4, dateToString(currentDate(), "yyyy-MM-dd"), LOK)
  Array: Set ( AFRM_CLIENTE, 5, dateTimeToString(currentDateTime(), "yyyy-MM-dd hh:mm"), LOK)
  Rem (Parámetros del formulario FRM_PEDIDO)
  Array: Set ( AFRM_PEDIDO, 1, "", LOK)
  
    • En un dock de la aplicación insertamos un control Vista de datos CTR_PARAMETROS con el formulario FRM_PARAMETROS. La Vista de datos tendrá la propiedad Visible a 0 porque no necesita interfaz, sin embargo será un contenedor de parámetros que funcionalmente actuará igual que las variables globales en memoria, ya que accederemos a él en toda la aplicación a través del objeto Marco Autoexec.
    • Y eso es todo. Ya podemos fijar valores de los parámetros antes de ejecutar un formulario y leer dichos parámetros en el PRE_INI del formulario.

En un proceso determinado ejecutamos lo siguiente:

  Crear nueva ficha en memoria (hNuevaFicha, [email protected])
    Rem ( Establecemos los parámetros que deben tenerse en cuenta en el formulario)
    Interfaz: Set ítem de variable local array de vista de datos (.AUTOEXEC.DOCK_APP.CTR_PARAMETROS, AFRM_CLIENTE, 1, "CODIGO_HU33")
    Interfaz: Set ítem de variable local array de vista de datos (.AUTOEXEC.DOCK_APP.CTR_PARAMETROS, AFRM_CLIENTE, 2, 2565.32)
    Pedir formulario ([email protected], LOK)
    If (LOK)
      Alta de ficha (hNuevaFicha)
        Mensaje ("Nueva ficha: " + #NAME)

En el manejador PRE_INI del formulario FRM_CLIENTE_EDI:

  If (! registerExist())
    Rem ( Obtenemos los valores iniciales desde el formulario de FRM_PARAMETROS)
    Interfaz: Get ítem de variable local array de vista de datos (.AUTOEXEC.DOCK_APP.CTR_PARAMETROS, AFRM_CLIENTE, 1, CNOMBRE_INI)
    Interfaz: Get ítem de variable local array de vista de datos (.AUTOEXEC.DOCK_APP.CTR_PARAMETROS, AFRM_CLIENTE, 2, NIMPORTE_INI)
    Modificar campo (NAME, CNOMBRE_INI)
    Modificar campo (IMPORTE, NIMPORTE_INI)

Conclusión

En este artículo hemos hecho un repaso de los aspectos más importantes del objeto variable de Velneo. Para más detalles de los comandos y funciones del API acudir siempre a la documentación de Velneo en el apartado de vDevelop.

La manera más rápida de acceder es buscar en Google la expresión “variable velneo”.

Tened muy claros los conceptos de ámbito de las variables y cómo acceder a las variables globales y locales tanto desde otros objetos como desde el API.

Si crees que falta algo importante sobre las variables en Velneo no dudes en comentarlo.

La entrada Las variables en Velneo aparece primero en AyudaVelneo.