# Introducción

[Velneo](https://www.velneo.com/) es una plataforma de desarrollo **low-code** diseñada para facilitar la creación de aplicaciones de gestión empresarial de manera rápida y eficiente. Su enfoque permite reducir la cantidad de código necesario, lo que agiliza el proceso de desarrollo y facilita la adaptación a las necesidades específicas de cada negocio.

## Características Principales

* **Base de Datos Integrada**: Velneo cuenta con su propio motor de base de datos, lo que garantiza una coherencia total entre los datos y la interfaz de usuario. Esta integración elimina la necesidad de sincronizar manualmente la base de datos con la aplicación, simplificando el desarrollo y mantenimiento.&#x20;
* **Programación Visual**: La plataforma ofrece herramientas de programación visual que permiten a los desarrolladores crear interfaces y funcionalidades de forma intuitiva, reduciendo la complejidad y el tiempo de desarrollo.
* **Multiplataforma**: Las aplicaciones desarrolladas con Velneo pueden ejecutarse en diversos sistemas operativos, como Windows, Linux, macOS, iOS y Android, sin necesidad de adaptaciones adicionales.&#x20;
* **Despliegue Flexible**: Las soluciones creadas pueden ser implementadas tanto en servidores locales como en la nube, ofreciendo flexibilidad según las necesidades de la empresa. ​

## Aplicaciones y Plantillas Predefinidas

La plataforma dispone de plantillas de aplicaciones predefinidas, como [vERP (Enterprise Resource Planning) y su ecosistema](https://velneo.es/verp/) que pueden ser personalizadas para adaptarse a las necesidades específicas de cada negocio. Estas plantillas permiten optimizar y automatizar procesos clave dentro de una organización.


# Requerimientos de Velneo

Todos los componentes de Velneo para Windows, Linux y macOS son de 64 bits así que solamente podremos usar Velneo en sistemas operativos con arquitectura de 64 bits.

El sistema operativo debe estar siempre actualizado con los últimos parches de seguridad.

Requiere recursos suficientes para la ejecución del sistema operativo y los diferentes componentes en función de los requerimientos de las aplicaciones.

{% hint style="warning" %}
En máquinas virtualizadas, debemos configurar una asignación fija de memoria, no dinámica.
{% endhint %}

## Windows

### Componentes

* Arquitectura x86-64.
* Procesadores con soporte de[ SSE 4.2](https://es.wikipedia.org/wiki/SSE4) y AVX2

### Versiones

* Windows 10 (1809 o superior) 64 Bits.
* Windows 11 64 Bits.
* Direct3D 11.

{% hint style="warning" %}
Puede dar error tras la instalación de los componentes si Windows Update no está activo y actualizado con todas las últimas revisiones. En concreto se requiere la[ Actualización para Universal C RunTime en Windows](https://support.microsoft.com/es-es/help/2999226/update-for-universal-c-runtime-in-windows).
{% endhint %}

### Velneo vServer

* Arquitectura x86-64.
* Procesadores con soporte de[ SSE 4.2](https://es.wikipedia.org/wiki/SSE4) y AVX2
* Sistema operativo para servidor. Versiones:
  * Windows Server 2019 64 bits.
  * Windows Server 2022 64 bits.
  * Windows Server 2025 64 bits.

### vModApache

* Apache versión 2.4 de 64 bits.

## Linux

### Componentes

Distribuciones basadas en Debian y derivados (Ubuntu, etc.) con las siguientes características:

* Arquitectura x86-64
* Procesadores con soporte de[ SSE 4.2](https://es.wikipedia.org/wiki/SSE4) y AVX2
* Kernel 5.15
* GLIBC 2.35 64 bits
* OpenSSL 3.0
* Versión recomendada Ubuntu 22.04 LTS
* Se recomienda el sistema de ventanas x11, ya que aunque se soporta wayland, este soporte todavía es parcial.

### Velneo vServer

Distribuciones basadas en Debian y derivados (Ubuntu, etc.) con las siguientes características:

* Arquitectura x86-64
* Procesadores con soporte de[ SSE 4.2](https://es.wikipedia.org/wiki/SSE4) y AVX2
* Kernel 5.15
* GLIBC 2.35 64 bits
* OpenSSL 3.0
* Versión recomendada Ubuntu 22.04 LTS

### vModApache

* Apache versión 2.4 de 64 bits en modo *Worker*.

### Dependencias en Ubuntu

Si queremos ejecutar por ejemplo Velneo vServer en alguna otra distribución y nos devuelve un error del tipo, por ejemplo:

```
user@ubuntu:~/Velneo-vServer$ ./vServer.sh -s /port=6900
./vServer.sh: 57: exec: ./vServer: not found
```

Debemos comprobar que contamos con todas las librerías necesarias; para ello, podemos hacer lo siguiente:

* Nos situamos en el directorio donde hemos extraído Velneo vServer y ejecutamos los siguientes comandos:
  * `user@ubuntu:~/Velneo-vServer$ export LD_LIBRARY_PATH=.`
  * `user@ubuntu:~/Velneo-vServer$ ldd vServer | grep “not found” | sort | uniq`
  * Ejemplo de salida:
    * `libpulse.so.0 => not found`
    * `libstdc++.so.6 => not found`
  * Debemos ahora, en función de nuestra distribución de Linux, buscar en el manual de Linux cómo instalar esas librerías que nos faltan.

Si trabajamos con una distribución sin interfaz, el servidor no requerirá librerías de interfaz pero, en el caso de querer ejecutar otros componentes de Velneo (vClient, por ejemplo) necesitaremos al menos que estén presentes los siguientes paquetes de librerías, además de los que pueda requerir el sistema:

```
sudo apt install libgl1-mesa-glx libxrender1 libpulse0 libglib2.0-0 libxslt1.1 libxcomposite1 libgstreamer1.0 libgstreamer-plugins-base1.0 libxtst6 libnss3 libfontconfig1 libxi6 libxcursor1 libasound2 libpulse-mainloop-glib0 libxrandr2 libegl1-mesa     libxkbcommon-x11-0 libmagic1 libxdamage1 libxkbfile1
```

## macOS

Los componentes de Velneo son binarios universales capaces de ser ejecutados en entornos con procesador ARM en macOS.

### Componentes

* macOS 11 ARM.
* macOS 12 ARM.
* macOS 13 ARM.
* macOS 14 ARM.
* macOS 15 ARM.
* macOS 26 ARM.

{% hint style="warning" %}
Obsoletos: macOS 10 (soporte finalizado el 12 de septiembre de 2022) y anteriores.
{% endhint %}

## Android

### Componentes

* Android 8 a Android 13, 32 y 64 bits(De API level 26 a API 33).
* Procesador: ARMv7, ARM64-v8a, mínimo 1 GHz.
* Memoria RAM: Recomendado +1GB.
* Espacio en memoria de usuario/interna: Recomendado +1GB.
* Pantalla para aplicaciones móviles: Recomendado +1024×768.

## iOS

### Componentes

* iOS 14 a 17.
* Espacio en memoria de usuario/interna: Recomendado +1GB.
* Pantalla para aplicaciones móviles:  Recomendado +1024×768.

## TLS/SSL

Velneo soporta SSL tanto a nivel de protocolo ([protocolo VATPS](/velneo-vserver/funcionalidades/protocolo-vatps)) como en el control de formularios [visor html](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/visor-html). Para ello necesita **OpenSSL3.0**.

Velneo instala las librerías necesarias para Windows, macOS, Android e iOS y en Linux se delega en el sistema operativo.

Si no se encuentran las librerías de SSL instaladas en un equipo, en el caso de los componentes cliente, se mostrará el siguiente mensaje al intentar conectarse a un servidor por vatps:

*"No es posible la conexión por vatps. Las librerías de TLS/SSL no están disponibles."*

En el caso del servidor, el mensaje se mostrará en el panel de mensajes de Velneo vAdmin.

De cara a mejorar la seguridad, es posible [limitar las versiones de TLS activas en el ámbito del servidor](/velneo-vserver/instalacion-y-configuracion/parametros-configurables-de-velneo-vserver#limitar-las-versiones-de-tls-activas).

### Windows

Velneo instala las librerías necesarias libcrypto-3-x64.dll libssl-3-x64.dll para los componentes de la plataforma.

### Linux

En Linux se delega en el sistema y requiere que esté instalado OpenSSL 3.0.x. Si tienes instalada una versión diferente de OpenSSL entonces deberás instalar la versión que Velneo requiere.

### macOS

En macOS se instalan las librerías en el paquete bundle de los componentes.

### Android

En Android se instalan junto con el componente Velneo vClient.

### iOS

En iOS hace uso de las librerías propias del sistema operativo.

## Recursos

Suficiente espacio en disco para instalar los componentes de Velneo, más espacio de caché, etc., mínimo 2GB para los componentes.&#x20;

A este mínimo tendremos que añadir espacio suficiente para los datos de las aplicaciones, que dependerá directamente del número y tamaño de las tablas que tenga la o las aplicaciones que se vayan a servir.&#x20;

Se recomienda utilizar discos SSD junto con una controladora de alta calidad para mejorar el rendimiento y la fiabilidad del sistema.

La configuración de memoria debe comprender la memoria requerida por el sistema operativo más memoria suficiente para la ejecución de componentes y también en función del tamaño de las aplicaciones. Mínimo de 4 Gb de RAM adicionales a los requerimientos del sistema.

### Renderización

Para la visualización de [QML](/velneo-vdevelop/scripts/lenguajes/qml) se usa por defecto renderización por hardware.

En el [Visor Html](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/visor-html) se usa por defecto:

* **Direct3D11** en Windows.
* **Metal** en macOS e iOS.
* **OpenGL** en Linux y Android.

Por tanto, en cada sistema han de estar instaladas las librerías correspondientes (habitualmente no es necesario instalarlas porque ya deberían venir con el propio sistema operativo).

Solamente en el caso de que desde soporte nos lo pidan, podremos cambiar la configuración por defecto. Para ello, podemos cambiar las siguientes variables del sistema:

#### QSG\_RHI\_BACKEND

* **metal** (Por defecto en macOS, no disponible en el resto).
* **opengl** (Por defecto en linux).
* **d3d11** (por defecto en Windows y no disponible en el resto).

#### QT\_QUICK\_BACKEND

En el caso de que queramos cambiar la configuración de la renderización de [QML](/velneo-vdevelop/scripts/lenguajes/qml), además tendremos que configurar también la variable del sistema **QT\_QUICK\_BACKEND** con el valor que corresponda ("**rhi**" se usará según estén disponibles: OpenGL o Direct 3D (Windows), o el valor "**hardware**" que es el valor por defecto).

#### QT\_OPENGL (Obsoleto, sólo si se usa OpenGL en Windows)

* Si no la configuramos o la configuramos con el valor "**desktop**", aplica OpenGL.

Si la configuramos con el valor "**software**", renderiza en 2D usando motor software de pintado en vez de hardware.

{% hint style="warning" %}
En el caso de [Velneo Web](/velneo-vclient-web) se usa el modo software y no puede ser modificado.
{% endhint %}

#### Deshabilitar GPU en visor html

Si en el [Visor Html](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/visor-html) de Velneo vClient queremos inhabilitar opengl y usar sólo software, ejecutarlo con el parámetro`--disable-gpu` . Ejemplo: `vClient.exe --disable-gpu`.

## Recomendaciones sobre instalaciones locales

### Copias de seguridad

Establece un sistema automatizado de copias de seguridad para asegurar la recuperación de datos críticos.

Es recomendable tener dos copias de seguridad y a poder ser a una distancia prudencial una de la otra.

No es habitual, pero un desastre natural o cualquier otro tipo de desastre puede llevar al traste con todo el negocio de una empresa.

Separar la copia de seguridad del lugar central de la información ayuda a que sea posible una recuperación total  y permitir la continuidad de negocio.

Aunque pueda no ser el caso, en las medidas de seguridad altas de la LOPD, en su artículo 102 detalla está circunstancia:

*"Artículo 102*&#x20;

*Copias de respaldo y recuperación*

*Deberá conservarse una copia de respaldo de los datos y de los procedimientos de recuperación de los mismos en un lugar diferente de aquel en que se encuentren los equipos informáticos que los tratan, que deberá cumplir en todo caso las medidas de seguridad exigidas en este título, o utilizando elementos que garanticen la integridad y recuperación de la información, de forma que sea posible su recuperación."*

Por otro lado, el **Instituto Nacional de Ciberseguridad** también recomienda tener una copia fuera de la organización.

#### Recuperaciones periódicas para verificar consistencia de la copia

Tener un sistema de copias y no realizar una recuperación periódica, nos pone en una situación peligrosa ya que puede darse el caso de que ante un desastre no podamos acceder a la información.

La LOPD en su artículo 94, incluso en las medidas de nivel básico, incluye la obligatoriedad de comprobar la correcta recuperación de las copias de seguridad 2 veces al año.

El responsable del fichero se encargará de verificar cada seis meses la correcta definición, funcionamiento y aplicación de los procedimientos de realización de copias de respaldo y de recuperación de los datos.

Recomendamos, monitorizar las tareas de copia y realizar una comprobación manual cada 3 meses.

### Monitorización

Conocer en todo momento la carga y recursos disponibles de una máquina nos puede ayudar a conocer si estamos ofreciendo el mejor servicio a los usuarios de las aplicaciones.

Existen en el mercado múltiples herramientas que permiten monitorizar distintos parámetros de la máquina y guardar un histórico para un análisis a posteriori.

Con una herramienta de monitorización podemos tomar decisiones a largo plazo:

* ¿Dónde se encuentran los cuellos de botella para mejorar el rendimiento?¿Disco, CPU, Memoria?
* ¿A que horas tengo más carga del sistema?
* ¿Cuándo me quedare sin espacio en disco?
* ¿Es conveniente cambiar de hardware?
* ¿Hay algún proceso del sistema que está perturbando el buen funcionamiento del servidor?

Y también nos sirve para actuar sobre una incidencia en el momento de que ocurre:

* La máquina está con muy poca memoria RAM y provoca que el vServer vaya más lento.
* Una actualización del sistema está ralentizando la máquina.
* El antivirus se ejecuta a unas horas de máxima carga de trabajo.
* La máquina está recibiendo un ataque de denegación de servicio.

Recomendamos usar herramientas de monitorización centralizada, ya que permite monitorizar varias máquinas desde una única herramienta.

Recomendamos monitorizar el uso de recursos tanto en el ámbito de la máquina como en el ámbito de vServer.

#### Sistema de alertas

Cuando mantenemos aplicaciones empresariales, es importante enterarnos de los problemas antes que los usuarios, un sistema de alertas alineado con la herramienta de monitorización o la propia aplicación puede ayudarnos a enterarnos y solucionar las incidencias antes de que el usuario lleve a percibirlas.

Unas alertas relativas al consumo excesivo de CPU o memoria, por cualquier circunstancia de la máquina o sistema operativo, hace ralentizar el funcionamiento de la aplicación. En ese caso el usuario sufre una alteración en la ejecución de las aplicaciones que se hubiera solucionado rápidamente por el administrador o supervisor de la instalación.

Dichas alertas pueden ser por email o SMS y enviadas mediante la herramienta de monitorización.

Ejemplo de alertas que nos pueden ayudar a resolver el problema antes de que lo sufra el usuario

* Consumo de CPU por encima del 75% durante más de 30 minutos.
* Consumo de memoria física por encima del 90%.
* Espacio libre inferior al 10%.
* Aumento significativo de la latencia entre el cliente y el servidor.
* Sistema operativo sin parches de seguridad.
* Uso excesivo lecturas o escrituras en el disco.

### Seguridad

Mantén los componentes del sistema actualizados y realiza auditorías de seguridad periódicas para proteger tu entorno.

### Comunicaciones

En aquellos ordenadores en los que vayamos a acceder a servidores remotos a través de Internet, es recomendable disponer una línea de comunicaciones de *backup* para así poder seguir trabajando en el caso de que en el proveedor principal se produzca una interrupción de su servicio.

## Recomendaciones sobre servidores accesibles a través de internet

### Protocolo

Velneo vServer usa por defecto el protocolo de Internet IPV4. En el caso de que queramos usar [IPV6](https://es.wikipedia.org/wiki/IPv6), tendremos que [configurarlo](/velneo-vserver/instalacion-y-configuracion/parametros-configurables-de-velneo-vserver#activar-ipv6-ipv-6). &#x20;

Hay que tener mucho cuidado con la configuración de servidores para que no haya conflicto de puertos, lo que puede hacer que un servidor no pueda ponerse a la escucha.

Habilitar una regla en el firewall del sistema operativo y/o router para permitir el tráfico entrante y saliente por el puerto que tengamos asignado para Velneo vServer (por defecto el puerto 690).

### Configuración del sistema operativo relativa a sockets

Se recomienda configurar una serie de valores en el sistema operativo del servidor para optimizar la gestión de los *sockets*.

#### Windows

Debemos configurar en el registro de Windows (fichero **regedit.exe**) el tiempo que viven los enganches finalizados. Para ello debemos configurar en la siguiente clave del registro de Windows:

`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters`

Las siguientes entradas con los valores siguientes:

`TcpTimedWaitDelay=dword:0000001e`\
`StrictTimeWaitSeqCheck=dword:00000001`

Y, por línea de comandos (CMD), configurar cuántos puertos están disponibles:

```
netsh int ipv4 set dynamicport tcp start=5000 num=55000
```

#### Linux

Debemos configurar los ficheros abiertos ya que en Linux, considera ficheros abiertos tanto los archivos que estén abiertos como los sockets activos. El valor recomendado es de 100000.

El cómo configurarlo dependerá de la distribución usada. A continuación facilitamos las instrucciones para hacerlo en Ubuntu, que es una de las distribuciones que recomendamos:

En primer lugar, debemos comprobar cuál es el límite actual:

```
user@ubuntu:~$ ulimit -n
```

El valor que recomendamos es 100000 así que, si el valor obtenido es inferior, para configurarlo haremos lo siguiente:

```
# editar el archivo siguiente
user@ubuntu:~$ sudo vim /etc/security/limits.conf

# añadir las líneas siguientes
* soft     nproc          100000
* hard     nproc          100000
* soft     nofile         100000
* hard     nofile         100000
root soft     nproc          100000
root hard     nproc          100000
root soft     nofile         100000
root hard     nofile         100000

# editar el archivo siguiente
user@ubuntu:~$ sudo vim /etc/pam.d/common-session

# añadir esta línea
session required pam_limits.so

# reinicia sesión y ejecuta el comando siguiente

user@ubuntu:~$ ulimit -n 100000
```

{% hint style="warning" %}
Una vez configurado, debemos reiniciar el equipo para que el cambio se haga efectivo.
{% endhint %}

## Hyperthreading

Velneo es capaz de ver y usar los procesadores con hyperthreading, pero el rendimiento depende del tipo de procesador, sus capacidades, el uso real...

Nuestra recomendación por defecto es desactivar hyperthreading y deshabilitar los C-States y los P-States de las CPU en la UEFI/BIOS.

Además, en el sistema operativo, sobre todo en el caso de Windows, activar el modo de rendimiento máximo.

Recomendamos todo esto porque hypertrheading, por ejemplo, la simulación de hilos que realiza suele requerir computación extra y tiene pérdidas de tiempo, como sucede con los C-States y los P-States.

Todo esto, no obstante, redunda en un mayor consumo de energía.

Esta recomendación es general, porque finalmente depende de muchos factores (no es lo mismo un procesador Intel que un AMD, por ejemplo), con lo que lo más recomendable es probar distintas configuraciones de la máquina particular para ver cuál es la más eficiente en su caso.

## **Velneo Cloud**

La opción más sencilla, si no quieres "pelearte" con los sistemas operativos para disponer de tu Velneo vServer, es usar [Velneo Cloud](/velneo-cloud/que-es-velneo-cloud). Nosotros nos encargamos de darte un servicio sobre un sistema operativo configurado y optimizado para cumplir los requisitos que necesita Velneo vServer y así te olvidas de librerías y actualizaciones.


# Notas de la versión 37

Es conveniente leer la información siguiente antes de actualizar a esta versión.

**Ver** [**requerimientos de la versión**](/velneo/requerimientos-de-velneo).

Ver [recomendaciones para actualizar instalaciones en producción a una nueva versión de Velneo](/velneo-vdevelop/buenas-practicas-de-programacion/recomendaciones-para-actualizar-instalaciones-en-produccion-a-una-nueva-version-de-velneo).

## Ya no se soportan los protocolos inseguros TLS 1.0 y TLS 1.1

A partir de esta versión, Velneo vServer deja de soportar los protocolos TLS 1.0 y TLS 1.1 por considerarse inseguros. La [versión mínima soportada es la 1.2](/velneo-vserver/instalacion-y-configuracion/parametros-configurables-de-velneo-vserver#limitar-las-versiones-de-tls-activas).

## Actualización de librerías OpenSSL a la versión 3.6.1

Se han actualizado las librerías de [OpenSSL](https://www.openssl.org/) a la versión 3.6.1. Esta actualización incorpora mejoras de seguridad y correcciones de estabilidad. Si tu aplicación utiliza certificados o configuraciones específicas de OpenSSL, te recomendamos verificar su correcto funcionamiento tras la actualización.

## Actualización de la compilación de Android a Qt 6.5.10

Se ha actualizado la compilación de Android a Qt 6.5.10 para cumplir con el requisito de Google Play de tamaños de página de 16 KB en librerías nativas. Este requisito es obligatorio para nuevas publicaciones en Google Play.

## Obligatoriedad de actualizar la solución de vLanzadera a su versión 37

Si actualizamos a la versión 37 de vServer, es obligatorio actualizar también la aplicación vLanzadera a su versión 37, ya que las versiones anteriores de vLanzadera no son funcionales en Velneo 37.

Podrás obtenerla en nuestra [página de descargas](https://velneo.es/mivelneo/descargas/). Una vez instalada, debemos reiniciar la instancia, ejecutarla y dejar que se lancen los procesos de migración.

## Los comandos de consumo de servicio web y XmlHttpRequest usan HTTP/2 por defecto

En versiones anteriores, los comandos de [consumo de servicio web](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/consumo-servicio-web) y la clase [XmlHttpRequest](/velneo-vdevelop/scripts/lenguajes/javascript/clases/xmlhttprequest) utilizaban HTTP/1.1 por defecto, y HTTP/2 estaba disponible únicamente mediante una [clave beta](https://doc.velneo.com/velneo/notas-de-la-version#activar-soporte-http2). En esta versión, **HTTP/2 es el protocolo por defecto**.

{% hint style="info" %}
Se recomienda comprobar el correcto funcionamiento de los procesos que consumen servicios web externos y de los scripts que usen XmlHttpRequest tras la actualización, especialmente aquellos que dependan de cabeceras HTTP. Recuerda que para asegurar la compatibilidad entre HTTP/1 y HTTP/2, las cabeceras HTTP deben definirse en minúsculas.
{% endhint %}

Si algún servicio externo al que conectes no es compatible con HTTP/2, podemos forzar el uso de HTTP/1 mediante una nueva [clave beta](/velneo/funcionalidades-comunes/creacion-de-claves-beta):

* **Clave**: disableHttp2
* **Valor**: FAE25622943A43D81F00A2D73B3F545D887C776E
* **Ámbito**: cliente, servidor y Apache

## Desaparecen los comandos de instrucción de proceso del grupo Scripts

En la versión 36 [dejaron de ser funcionales](https://doc.velneo.com/v/36/velneo/notas-de-la-version#dejan-de-ser-funcionales-los-comandos-de-instruccion-de-proceso-del-grupo-scripts) los comandos de instrucción de proceso del [grupo Scripts](https://doc.velneo.com/36/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/basicos/scripts-grupo-de-comandos). En esta versión se eliminan definitivamente del árbol de comandos de instrucción y del combo de selección de comandos en vDevelop.\
\
Si aún tenías referencias a estos comandos en tus proyectos, debes sustituirlos por [procesos JavaScript](/velneo-vdevelop/scripts/lenguajes/javascript/procesos-javascript) o [fórmulas JavaScript](/velneo-vdevelop/scripts/lenguajes/javascript/formulas-javascript).

## Nueva firma digital con Azure Trusted Signing

Se ha implementado el proceso de [Trusted Signing de Azure](https://learn.microsoft.com/es-es/azure/trusted-signing/) para la firma de ejecutables (.exe) y librerías en Windows, sustituyendo el sistema de firma anterior. Esto no afecta a la funcionalidad de las aplicaciones, pero el certificado de firma es diferente al de versiones anteriores. Este nuevo sistema garantiza el origen y procedencia de los ejecutables y asegura "la reputación" para evitar mensajes de advertencia ante la instalación.

## Nuevo servicio HTTPS

{% hint style="info" icon="circle-exclamation" %}
Para los usuarios del cloud de Velneo que tengan activado el servicio de Velneo vModApache, tras actualizar a la versión 37 se debe [reiniciar la URC completa](/velneo-cloud/panel-de-control-vserver-cloud/urc).
{% endhint %}

[Velneo vServer](https://doc.velneo.com/37/velneo-vserver/que-es-velneo-vserver) incorpora un **servicio HTTPS ligero** con una potente funcionalidad de *virtual hosts* que permite, en un Velneo vServer, acceder a las APIs configuradas en las [instancias](/velneo-vadmin/gestion-de-aplicaciones/instancias) de las aplicaciones.

En local, creará un *virtual host* por defecto para el puerto 443.

En [Velneo Cloud](https://doc.velneo.com/37/velneo-cloud/que-es-velneo-cloud), el puerto establecido es el 8000 y no puede cambiarse. **Dicho puerto no está abierto y disponible**, sino que se redirige por proxy inverso desde Apache, por el puerto que se tenga configurado. En el caso de desarrollo, se puede ver en el panel el puerto HTTPS asignado.

En el caso de producción, usará el estándar 443 correspondiente a HTTPS y estará también visible en el panel de control.

En Cloud, en servidores con Apache, se usará también el puerto estándar 443. Permitirá el acceso a vAdminWeb y vDataClientWeb, por ejemplo: [https://c3.velneo.com:XXXX2/login](https://doc.velneo.com/velneo/https:/c3.velneo.com:XXXX2/login), y la creación de *paths*/*location* para servir aplicaciones de Velneo en el *virtual host* por defecto, en sustitución de vModApache.

Los *location* de vModApache prevalecen sobre los del servicio HTTPS de Velneo. A medida que los vayan eliminando, se podrá usar ese mismo *path* para el servicio HTTPS de Velneo.

* En Cloud en desarrollo, se redirigirá al puerto correspondiente terminado en 2. Solo será posible usar vAdminWeb y vDataClientWeb, por ejemplo: [https://c3.velneo.com:XXXX2/login](https://doc.velneo.com/velneo/https:/c3.velneo.com:XXXX2/login)
* Esto es así porque el servicio HTTPS es un servidor ligero que requiere un proxy inverso anterior.

Mediante este servicio también podremos ejecutar directamente en nuestros servidores tanto [vAdmin](/velneo/velneo-web#administrar) como [vDataClient Web](/velneo/velneo-web#gestionar-bbdd).

## Incidencias

### Problemas con la actualización automática de vClient cuando éste ha sido instalado en modo "solo para mi" (resuelto el versión 37.1)

En instalaciones de **vClient 37.0** en modo **solo para mí**, se reproduce una incidencia al conectar contra un **vServer de versión diferente**. En ese escenario, no se inicia la actualización automática del vClient.

Para solucionarlo, recomendamos seguir los pasos siguientes antes de actualizar servidores a una nueva versión. Es algo que se puede hacer ya, para que quede todo correcto en el momento que decidamos actualizar versión de vServer:

Descargar el proceso siguiente:

{% file src="/files/p4Khz8kranEKZOmrLRht" %}

[Importarlo](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-edicion#importar) en el proyecto de aplicación de la/s solución/es del servidor y ejecutarlo en primer plano desde el proceso [ON\_INIT\_CLIENT](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso#proceso-on_init_client).

Cuando sea ejecutado por un usuario que haya instalado el vClient en modo "solo para mi" se descargará un vUpdater con el bug corregido.

A partir de ese momento, cuando actualicemos nuestro servidor a una nueva versión, la actualización automática de vClients instalados en modo solo para mi se podrá llevar a cabo sin problemas.

Esto queda resuelto en la versión 37.1. Lo anterior solamente es necesario hacerlo en instalaciones con la versión 37.0.

### Error en el generador de interfaz (Resuelta en versión 37.1)

El [generador de interfaz](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-objetos#generar-interfaz-control--g), al generar el código fuente para el formulario de menú `ID_TABLA_MEN`, específicamente en el evento de búsqueda `TXT_BUS_KEY`, escribe fuera del bloque los subprocesos o funciones secundarias definidos dentro de una estructura condicional (`If` / `ElseIf`).

### Rejillas editables: cambio de comportamiento con la edición de registros al usar teclas de cursor (Resuelta en versión 37.1)

En versiones anteriores de Velneo, al editar un registro en una rejilla editable y utilizar las teclas de cursor arriba/abajo, el sistema permitía editar el registro anterior o siguiente automáticamente. Sin embargo, en la versión 37, aunque el foco se mueve al otro registro, este no entra en modo de edición automáticamente.

## Mejoras de rendimiento en beta

Estamos trabajando también en mejoras de rendimiento en distintos ámbitos.

Si quieres disfrutar de la versión beta de estas mejoras, debes [activar ciertas claves beta](/velneo/funcionalidades-comunes/creacion-de-claves-beta) correspondientes en el cliente, en el caso de los objetos de interfaz, y también en el servidor, en el caso de los procesos.

Estas son las distintas claves beta que podemos configurar:

#### [Rejillas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla) estándar, carga y movimiento optimizados (requiere el [estilo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla#estilos) *Optimizado*)

* **Clave**: optimizarRejillasClient
* **Valor**: 8DF627183E075E86BADCF82C11D4F931E8BF62D8
* **Ámbito**: cliente

{% hint style="danger" %}
Si activamos esta clave, debemos tener en cuenta que los [totales de los pies de rejilla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla/propiedades-de-columna#tipo-contenido-pie) deben calcularse en **tercer plano**.
{% endhint %}

#### [Formularios](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario), fórmulas optimizadas

* **Clave**: `optimizarFormulariosClientFormulas`
* **Valor**: `ED979A19EEFC93EE0E4F58FB93F432BF258E1E33`
* **Ámbito**: cliente

#### Procesos, optimización de parámetros

* **Clave**: `optimizarInstruccion`
* **Valor**: `F15868161C0B05825E38ADE94001D5D9926CDFB7`
* **Ámbito**: cliente, servidor y Apache

#### Optimizaciones de rendimiento del servidor HTTP

Habilita *TLS session resumption* (*session tickets*, *session sharing*, *session persistence*) para evitar *full handshake* en cada conexión.

Prioriza *ciphers* ECDHE+AES-GCM con aceleración hardware AES-NI.

Habilita preferencia de *cipher* del servidor

Reduce *timeout* de *handshake* SSL a max 5s (por defecto es 10s).

* **Clave**: `enableOptimizarHttpServer`
* **Valor**: `758A2F71FA7CEB82E0A89BFEB470951D623B03F4`
* **Ámbito**: servidor


# Funcionalidades comunes a los componentes de Velneo

En este apartado veremos funcionalidades comunes a los distintos componentes de **Velneo**.

[Instalación](/velneo/funcionalidades-comunes/instalacion)

[Conexión con Velneo vServer](/velneo/funcionalidades-comunes/conexion-con-velneo-vserver)

[Cambiar el estilo visual](/velneo/funcionalidades-comunes/cambiar-el-estilo-de-visualizacion)

[Ver u ocultar barras de herramientas](/velneo/funcionalidades-comunes/ver-u-ocultar-barras-de-herramientas)

[Mensajería interna entre usuarios](/velneo/funcionalidades-comunes/mensajeria-interna-entre-usuarios)

[Soporte de alta resolución (HighDPI)](/velneo/funcionalidades-comunes/soporte-de-alta-resolucion-highdpi)

[Carpetas de trabajo de los componentes de Velneo](/velneo/funcionalidades-comunes/carpetas-de-trabajo-de-lo-componentes-de-velneo)

[Numeración de versiones de Velneo](/velneo/funcionalidades-comunes/numeracion-de-versiones-de-velneo)

[Certificado de firma digital para componentes Windows](/velneo/funcionalidades-comunes/certificado-de-firma-digital-para-componentes-windows)


# Instalación

Para descargar los componentes de la plataforma, puedes acceder a nuestra [página de descargas](https://velneo.es/mivelneo/descargas/).

La forma de instalar los componentes de Velneo dependerán de la plataforma.

## Windows

Todo componente de Velneo para Windows consisten en un ejecutable que inicia de un asistente de instalación.

Por defecto, los componente se instala en la carpeta **C:\Program Files** (si instalamos la versión de 64 bits) o en la carpeta **C:\Program Files (x86)** (si instalamos la versión de 32 bits), aunque podremos cambiarla en el asistente de instalación, por ejemplo, en el caso de que en la máquina donde se esté instalando un componente no se tengan privilegios de administrador, podremos seleccionar como carpeta de instalación una a la que el usuario tenga acceso.

Lo anterior es válido para los componentes de 64 bits. Los de 32 bits sí requieren privilegios de administrador para su instalación.

### Parámetros de instalación

#### /S

Instala el componente de Velneo en modo silencioso o desatendido. Ejemplo:

`[senda]velneo-win64-vserver-setup.exe /S`

{% hint style="info" %}
Si instalamos un componente de Velneo en modo desatendido y no es compatible con la máquina donde se está instalando, por ejemplo, que estamos instalando el componente en una versión no soportada de un sistema operativo o que estamos instalando un componente de 64 bits en una máquina de 32 bits, la instalación continuará igualmente. Cuando instalamos en modo normal, se abortará la instalación.
{% endhint %}

#### /D

Permite hacer la instalación del componente en un directorio distinto al directorio por defecto. El parámetro deber ir seguido del símbolo = y la senda. Ejemplo:

`[senda]\velneo-win32-vserver-setup.exe /S /D=c:/carpeta`

#### /allusers

Instala el componente de Velneo para todos los usuarios. Es el modo de instalación por defecto. Es decir:

`[senda]velneo-win64-vclient-setup.exe /S` sería igual que `[senda]velneo-win64-vclient-setup.exe /S /allusers`

#### /currentuser

Instala el componente de Velneo para el usuario en curso (modo **sólo para mi).** Ejemplo:

`[senda]velneo-win64-vclient-setup.exe /S /currentuser`

{% hint style="warning" %}
Los componentes [Velneo ODBC Driver](/velneo-odbc-driver/que-es-velneo-odbc-driver) y [Velneo vServer](/velneo-vserver/que-es-velneo-vserver) no pueden ser instalados en modo sólo para mi (/currentuser) solamente pueden ser instalados para todos los usuarios (/allusers).
{% endhint %}

## Linux

Descomprimir el fichero \*tar.gz en una carpeta del usuario con el que vaya a ejecutarse y, una vez descomprimido, ejecutar el fichero \*.sh. Si surge algún problema, recomendamos [comprobar si faltan instalar alguna librería necesaria](https://doc.velneo.com/velneo/funcionalidades-comunes/pages/-M7D76mK3N_KHlrBrJVh#cuando-falten-librerías-o-en-otras-distribuciones-de-linux). En el caso del servidor de aplicación, hay una [serie de cosas que debemos tener en cuenta](https://doc.velneo.com/velneo/funcionalidades-comunes/pages/-M7D76tXtRs0F0Cr5WFX#instalación-en-linux).

## mac OS

Hacer doble clic sobre el archivo \*.dmg, n caso de que no se haya abierto una ventana nueva del Finder, mira en el escritorio del ordenador. Habrá aparecido un nuevo icono con el mismo nombre del archivo DMG. El icono tendrá esta imagen:

[![](/files/-M7D78at-Mgj3NbTESd4)](http://www.secretosinformaticos.com/wp-content/uploads/2011/10/iconoDMG1.png)

Hacer doble clic en este icono, lo que abrirá una ventana. En dicha ventana aparecerá el programa que queremos instalar. Ya sólo nos queda pinchar en el programa y sin soltar, arrastrar el icono a la carpeta **Aplicaciones**.

## Android

La instalación se hará a través de [GooglePlay](https://play.google.com/store/apps/details?id=com.velneo.vclient.v7).

## iOS

La instalación se hará a través de la [App Store](https://itunes.apple.com/us/app/velneo-vclient/id1040113146?l=es\&mt=8).


# Conexión con Velneo vServer

Sea cual sea el producto que usemos de la plataforma, éste requerirá la conexión con un [Velneo vServer](/velneo-vserver/que-es-velneo-vserver). La ventana de conexión a Velneo vServer es idéntica en todos los casos y en ella tendremos que especificar:

![](/files/-M7D78DKNymcwb4Jro7c)

### Servidor

En este parámetro especificaremos la VRL (Velneo Resource Locator) del servidor, que deberá tener la estructura siguiente:

\[vatps\://]IPSERVIDOR\[:NUM\_PUERTO]

Donde:

#### **\[vatps//]**

Indica el esquema de conexión. Indica que conectará al servidor usando el protocolo [vatps](/velneo-vserver/funcionalidades/protocolo-vatps). Si solamente especificamos el dominio, el sistema asumirá el esquema vatps\://.&#x20;

{% hint style="info" %}
En el caso de que tengamos un [instalador personalizado](/velneo-vclient/funcionalidades-especificas/instalador-personalizado-de-velneo-vclient) o un acceso directo de versiones antiguas que se conectaban por vatp al servidor, si no logra establecer la conexión procedará a intentar conectarse por vatps.
{% endhint %}

#### **IPSERVIDOR**

Será el nombre o la IP del servidor donde se encuentra a la escucha el servicio de Velneo vServer. El formato dependerá de si estamos usando el protocolo de Internet [IPV4](https://es.wikipedia.org/wiki/IPv4) o [IPV6](https://es.wikipedia.org/wiki/IPv6). Velneo vServer por defecto usa IPV4; si queremos que use IPV6, tendremos que [configurarlo](/velneo-vserver/instalacion-y-configuracion/parametros-configurables-de-velneo-vserver#activar-ipv6-ipv-6).

#### \[:NUM\_PUERTO]

Será el número de puerto en el que el servidor está a la escucha. Velneo vServer por defecto usa el el puerto 690, por lo que, si el servidor al que nos vamos a conectar usa dicho puerto, podremos omitirlo. En caso de usar un puerto diferente, entonces tendremos que especificarlo.

{% hint style="info" %}
si se trata de un servidor cloud, econtraremos su VRL en el [panel de control cloud](https://velneo.es/mi-velneo/cloud/) de dicho servidor, en el apartado **vServer**, el dato con la etiqueta **Servidor.**
{% endhint %}

**Ejemplos**:

vatps\://localhost o vatps\://127.0.0.1 conectará con el servidor que tenemos instalado en la misma máquina y que está a la escucha en el puerto 690.

vatps\://\[::1] (conectará con el servidor que tenemos instalado en la misma máquina y que está a la escucha en el puerto 690 en una red con [IPV6 activado](/velneo-vserver/instalacion-y-configuracion/parametros-configurables-de-velneo-vserver#activar-ipv6-ipv-6)).

vatps\://198.162.0.7 (conectará con un servidor de la red local cuya IP es 198.168.1.7 y que está a la escucha en el puerto 690).

vatps\://\[2001:db8:85a3:8d3:1319:8a2e:370:7348]:6900 (conectará con un servidor cuya IPV6 es \[2001:db8:85a3:8d3:1319:8a2e:370:7348] y que está a la escucha a través del puerto 6900.

vatps\://c1.velneo.com:6900 (conectará con un servidor alojado en el cloud de Velneo y que está a la escucha en el puerto 6900).

Si escribimos `localhost` el sistema asumirá vatps\://localhost.

{% hint style="danger" %}
Es estrictamente obligatorio el uso de únicamente minúsculas en la VRL (Velneo Resource Location).

El incumplimiento de esta regla puede generar distintos tipos de problemas:

1. Fallos explícitos: se producirá un error que advierte sobre la no coincidencia de la huella digital (checksum).
2. Comportamiento anómalo: la aplicación podría iniciar, pero manifestar errores y efectos secundarios indeseados, sutiles y difíciles de diagnosticar que afectan la estabilidad y la visualización de datos.
   {% endhint %}

{% hint style="info" %}
Si al conectarnos con un servidor con el protocolo VATPS se produce un error de TLS/SSL, aparecerá en la barra de estado de la ventana de conexión una opción para ver las excepciones que se han producido y permitir ignorarlas, de este modo, el servidor se incluirá como excepción y ya podrá ser accedido desde esa máquina.
{% endhint %}

{% hint style="warning" %}
No es posible conectarnos usando VATPS contra un servidor de versiones anteriores a la 32 que no admitan conexión segura ([protocolo vatp](/velneo-vserver/funcionalidades/protocolo-vatp)).
{% endhint %}

### Usuario

Nombre de un usuario declarado en Velneo vServer.

### Contraseña

Contraseña del usuario declarado en el parámetro anterior.

En la instalación de [Velneo vServer](/velneo-vserver/que-es-velneo-vserver) en local se crea por defecto un usuario llamado **velneo**, sin contraseña, para que podamos comenzar su administración.

En el caso de un servidor en el [cloud de Velneo](/velneo-cloud/que-es-velneo-cloud), las credenciales son enviadas por correo cuando lo creas.

Si aceptamos, se procederá a la conexión con Velneo vServer, mostrándose en la parte inferior del formulario de conexión el progreso de la conexión. Si no es posible establecer la conexión el sistema devolverá el siguiente mensaje en la parte inferior izquierda del formulario de conexión: “Error conexión con el servidor”.

Si el servidor es encontrado pero hemos introducido mal el usuario o la contraseña, el sistema devolverá el mensaje de error siguiente: "Usuario/Contraseña incorrectos".

Si el servidor está disponible y los datos de acceso son correctos, entonces accederemos al interfaz del producto ejecutado. En el caso de [Velneo vClient](/velneo-vclient/que-es-velneo-vclient), entonces accederemos a la ventana de selección de aplicación.

![](/files/-M7D78DOxneNGrzBbSk0)

En la ventana se muestran todos los [proyectos de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) accesibles para el usuario; en la captura de pantalla anterior se ve una lista. Si no apareciese ninguno quiere decir que el usuario no tiene ningún proyecto de aplicación asignado.

Para ejecutar un proyecto de aplicación tendremos que hacer doble clic sobre él.

Finalmente accederemos al interfaz del proyecto de aplicación.

Si estamos ejecutando una aplicación con Velneo vClient y se produce una interrupción de las comunicaciones, el timeout mínimo para que el servidor de por perdido en enganche y pase a eliminarlo es de 5 minutos. Esto quiere decir que al menos debe estar ese tiempo con la conexión interrumpida, para que el servidor de por extinguido ese enganche.

Si el servidor se encuentra realizando tareas importantes (procesos en 3º plano, regeneraciones, etc.) esta tarea de controlar los clientes no se efectúa, por lo que el tiempo de desconexión se vería aumentado.

En cualquier caso, el tiempo mínimo para que se produzca esa desconexión es de 5 minutos. Este timeout es configurable; para ampliar información sobre cómo cambiarlo consultar el capítulo [enganches](/velneo-vadmin/monitorizacion#enganches) de Velneo vAdmin.

## Conexión desde Android e iOS

![](/files/-M7D78DQz1qEwMloDIDk)

Cuando ejecutamos por primera vez [Velneo vClient](/velneo-vclient/que-es-velneo-vclient) tanto en Android como en iOS tendremos que configurar la/s conexión/es al servidor o a los servidores con los que queremos conectarnos. Para crearlas, pulsaremos el botón + de la esquina superior derecha de la ventana, especificaremos los datos de conexión (servidor, usuario y contraseña). Una vez creada o creadas las conexiones ya quedarán grabada en la lista de conexiones y en futuras ocasiones simplemente tendremos que seleccionarla para establecer la conexión, pues recordarán las credenciales:

![](/files/-M7D78DRDHL6Vp80hbE-)


# Cambiar el estilo de visualización

Es posible personalizar el estilo de visualización del interfaz de todos los ejecutables de Velneo.\
Para ello debemos ejecutar la opción Ver/Personalizar/Estilos. El sistema desplegará una ventana con los estilos disponibles.

El estilo **fusion** permite homogeneizar la visualización de las aplicaciones en distintos sistemas operativos de una forma sencilla y muy adaptable.

Estilos **sistema** permite adaptarse a la configuración de estilo de la máquina en la que se ejecuta Velneo.

El cambio de estilo será aplicado inmediatamente después de su selección.

También es posible aplicar un estilo concreto mediante línea de comandos al llamar al ejecutable; para ello tendremos que poner en el argumento del ejecutable de Velneo el modificador: -style=Estilo, siendo Estilo el nombre del estilo concreto que queramos usar.

Por ejemplo, si queremos aplicar el estilo Fusion al ejecutar una instancia concreta, podemos crear un acceso directo que ponga:

`"C:\Archivos de programa\Velneo\vClient.exe" -style=Fusion "vatp://usuario:contraseña@dominio:puerto/ID_APP"`

También es posible aplicar una css externa a la interfaz del ejecutable que se lance (Velneo vDevelop, Velneo vClient,. etc).

Para ello se debe indicar la senda del archivo css en el arranque, añadiendo el parámetro --stylesheet=SENDA\_FICHERO\_CSS.

Ejemplo: vamos a ejecutar Velneo vDevelop aplicando la css almacenada en el fichero css.css que hemos incluido en el mismo directorio que el ejecutable:

`vDevelop.exe --stylesheet=css.css`

Haz clic [aquí](https://doc.qt.io/qt-5.12/stylesheet-examples.html) para conocer las clases que pueden ser personalizadas en Velneo mediante css.


# Cambiar el aspecto

En **macOS e iOS** sigue funcionando de manera nativa, y tanto el modo claro como oscuro, aplican la paleta de colores configurada en el sistema.

Es posible cambiar el aspecto de la interfaz de los ejecutables de Velneo.

Para ello debemos ejecutar la opción Ver/Personalizar/Aspecto. El sistema desplegará una ventana con los aspectos disponibles:

* **Sistema**: la paleta de colores será establecida por completo por la configuración de esquema de colores del sistema.&#x20;
* **Claro**: en macOS e iOS aplica la paleta de colores del modo claro configurada en el sistema. En el resto de las plataformas se fuerza una paleta de colores basada en el [estilo Fusión](/velneo/funcionalidades-comunes/cambiar-el-estilo-de-visualizacion).
* **Oscuro**: en macOS e iOS aplica la paleta de colores del modo oscuro configurada en el sistema. En el resto de las plataformas se fuerza una paleta de colores basada en el [estilo Fusión](/velneo/funcionalidades-comunes/cambiar-el-estilo-de-visualizacion).

{% hint style="info" %}
El estilo windowsvista (de Windows) no responde al cambio de aspecto y no tiene soporte para el modo oscuro.
{% endhint %}


# Ver u ocultar barras de herramientas

Es posible hacer visibles u ocultar las barras de herramientas de cada uno de los componentes de Velneo. Para ello accederemos a la opción **Herramientas** del menú **Ver**. Esto hará que se despliegue una ventana con todas las barras de herramientas de la aplicación:

![](/files/-M7D78-TajudCVVOx1oN)

Si la casilla de verificación que se incluye antes del nombre de la barra de herramientas está activada, indica que la barra de herramientas es visible.

Si la casilla de verificación que se incluye antes del nombre de la barra de herramientas está inactivada, indica que la barra de herramientas está oculta.


# Mensajería interna entre usuarios

La mensajería interna es una funcionalidad disponible en todos los componentes de la plataforma. Permite el envío y recepción de mensajes de texto entre usuarios y también se utiliza para notificaciones automáticas del sistema. Cuando recibimos un mensaje se muestra un icono o si es una alerta un icono con un mensaje de aviso en la esquina derecha de la barra de estado del marco del componente que tengamos abierto.

Al hacer clic sobre el icono o el texto de la barra de estado se nos mostrará el panel de mensajería interna.

Desde este panel podemos enviar un nuevo mensaje o responder a alguno de los recibidos.

Desde cualquier componente podemos acceder al panel de mensajes y alertas desde la opción **Mensajes y alertas** del menú **Ver**.

Para que el panel de mensajes y alertas esté disponbile en Velneo vClient debemos configurar una [acción](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion) que dispare el comando [Mensajes y alertas](https://doc.velneo.com/velneo/funcionalidades-comunes/pages/-M7D76mwXQoG2Q3VOTw7#mensajes-y-alertas...).&#x20;

En [Velneo vAdmin](/velneo-vadmin/que-es-velneo-vadmin) existe la posibilidad de enviar un mensaje a cualquier usuario desde la toolbar de la opción usuarios, donde se ha añadido un botón que permite enviar un mensaje al usuario seleccionado de la lista.

Añadir que también existen mensajes automáticos que el sistema nos envía por este canal.

Los mensajes, en esta versión se almacenan en memoria por lo que una vez cerrado el componente desaparecen de las bandejas.


# Soporte de alta resolución (HighDPI)

Velneo ofrece soporte de alta resolución para todos sus componentes, denominado comercialmente **Retina Display** o **soporte HighDPI**. Este soporte permite que las aplicaciones se ejecuten en entornos de alta resolución adaptándose automáticamente mientras mantienen su tamaño aparente.

## Plataformas soportadas

La funcionalidad está disponible para:

* Windows
* Linux
* OS X
* Android
* iOS

## Concepto de Device Pixel Ratio

El ratio de píxeles del dispositivo es:

* 1 para DPI normal.
* 2 para alta resolución.

En dispositivos de alta resolución, la resolución física duplica la lógica, escalando elementos al doble de tamaño físico mientras se mantiene el tamaño lógico.

## Comportamiento en múltiples pantallas

Si la pantalla principal soporta HighDPI, al resto aplicará HighDPI, si lo soportan, o zoom, si no es así.

## Variables de entorno de sistemas operativos para HighDPI

{% hint style="info" %}
Estas variables son para ajuste puntual o depuración. Para uso permanente en producción, la solución recomendada es adaptar los formularios al escalado del sistema.
{% endhint %}

Se trata de variables que podemos configurar en el ámbito del sistema operativo.

#### QT\_ENABLE\_HIGHDPI\_SCALING

Habilita o deshabilita el escalado automático basado en la densidad de píxeles del monitor.

* `1` - habilitado (valor por defecto).
* `0` - deshabilitado.

{% hint style="info" %}
Nota: En la versión 35 y anteriores esta variable se llamaba QT\_AUTO\_SCREEN\_SCALE\_FACTOR y aceptaba `true` o `false`.
{% endhint %}

#### QT\_SCALE\_FACTOR

Define un factor de escala global para toda la aplicación, incluyendo las fuentes.

Ejemplo: `QT_SCALE_FACTOR=0.8` para compensar un escalado del sistema del 125%.

#### QT\_SCREEN\_SCALE\_FACTORS

Especifica factores de escala individuales por pantalla, separados por el carácter <kbd>;</kbd>. Ejemplo:

```
QT_SCREEN_SCALE_FACTORS=1;2;2;1.5
QT_SCREEN_SCALE_FACTORS=pantalla1=1;pantalla2=2;pantalla3=1.5
```

#### QT\_SCALE\_FACTOR\_ROUNDING\_POLICY

Controla cómo se redondea el factor de escala calculado.

* `Round` - redondea al entero más cercano.
* `PassThrough` - usa el valor exacto sin redondear (que es el comportamiento por defecto).

#### Configuración en Windows

Si se necesita deshabilitar el escalado del sistema en Windows, la opción recomendada es hacerlo en las propiedades de compatibilidad del propio ejecutable (vClient.exe, por ejemplo):

1. Click derecho en vClient.exe → Propiedades → pestaña "Compatibilidad".
2. Activar "Reemplazar comportamiento de escalado de PPP de alta resolución".
3. Seleccionar "Aplicación".
4. Aceptar y reiniciar el vClient.

Opción alternativa: configurar en el sistema operativo la variable de entorno `QT_ENABLE_HIGHDPI_SCALING=0`, cerrar sesión de Windows y volver a entrar para que surta efecto.

#### Configuración en Linux

Para Velneo vClient en Linux (X11), si el sistema no aplica correctamente el escalado, configurar manualmente:

```
QT_ENABLE_HIGHDPI_SCALING=0
QT_SCALE_FACTOR=<factor>
```

{% hint style="info" icon="triangle-exclamation" %}
En entornos *Wayland* (GNOME, KDE con Ubuntu 22.04+), QT\_ENABLE\_HIGHDPI\_SCALING no tiene efecto. El escalado lo gestiona el compositor del escritorio.
{% endhint %}

## Recomendaciones para dibujos

En los [dibujos](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/dibujo) o campos [objeto dibujo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/objeto-dibujo), en la propiedad **aspecto de dibujo** recomendamos usar siempre el valor **proporcionar** o **proporcionar sin ampliar**, para que estos se vean correctamente. Evitar la propiedad **tamaño original**.

Asimismo, recomendamos usar imágenes del doble del tamaño del sitio donde vayan a ir para soportar HighDPI con ratio 2, o más para ratios mayores. Aplicable tanto a Velneo como a [QML](/velneo-vdevelop/scripts/lenguajes/qml).


# Carpetas de trabajo de los componentes de Velneo

## Windows

### Carpeta de trabajo del usuario

Unidad:\Usuarios\Usuario\Velneo

Ejemplo:

```
c:\Usuarios\usuario\Velneo
```

### Carpeta de trabajo del servidor

En el caso de un servicio, por defecto:

Unidad:\Windows\system32\config\systemprofile\Velneo

Ejemplo:

```
C:\Windows\System32\config\systemprofile\Velneo
```

Si configuramos un usuario para el servicio, usará la carpeta del usuario.

## Linux

### Carpeta de trabajo del usuario

/home/Usuario/Velneo

Ejemplo:

```
/home/usuario/Velneo
```

### Carpeta de trabajo del servidor

/home/Usuario/Velneo

Ejemplo:

```
/home/usuario/Velneo
```

## macOS

### Carpeta de trabajo del usuario

/users/Usuario/Velneo

Ejemplo:

```
/users/usuario/Velneo
```

## Android

### Carpeta de trabajo del usuario

/carpeta de datos de aplicación/com.velneo.vclient.v7/files/Velneo

Ejemplo:

```
/data/data/com.velneo.vclient.v7/files/Velneo
```

## iOS

### Carpeta de trabajo del usuario

/private/var/mobile/containers/Data/Application/ID\_UNICO/Library/Caches/Velneo

Ejemplo:

```
/private/var/mobile/containers/Data/Application/A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6/Library/Caches/Velneo
```


# Numeración de versiones de Velneo

Un número de versión de Velneo tiene el formato siguiente:

**XX.xx.yy.zzzzz**

Veremos a continuación lo qué quiere decir cada parte del mismo.

**XX**: es la versión mayor. Los componentes de esta versión no serán compatibles con los de versiones anteriores, a excepción de Velneo vClient y vDataClient. Ejemplos:

* Un Velneo vDevelop de la versión 20.0 no podrá conectarse con un servidor de la versión 21.0.&#x20;
* Un Velneo vDevelop de la versión 21.0 no podrá conectarse con un servidor de la versión 20.0.&#x20;
* Un Velneo vClient de la versión 20.0 no podrá conectarse con un servidor de la versión 21.0.&#x20;
* Un Velneo vClient de la versión 21.0 podrá conectarse con un servidor de la versión 20.0.
* Un Velneo vServer de la versión 20.0 no podrán servir una solución editadas con la versión 21.0.

Los proyectos que se editen con una versión mayor y que vengan de versiones anteriores, serán migrados a esa versión mayor. Es decir, que si editamos un proyecto de la versión 20.0 con Velneo vDevelop 21.0, al guardar el proyecto éste será migrado a la versión 21.0, ya no siendo posible su edición con la versión 20.0.

**xx**: es la versión menor. Los componentes de esta versión serán compatibles con los de otras versiones mayores de la misma versión mayor. Ejemplo:

Todos los componentes de la versión 20.0 y los de la versión 20.1 son compatibles entre sí.

**Concretan la versión, pero son de uso interno:**

**yy**: versión de publicación.

**zzzzz**: número de build.

Ejemplo de número de versión: 20.1.3.1482

## Obtener versión por línea de comandos

Si queremos conocer la versión de un componente de Velneo por línea de comandos podemos obtenerlo con el parámetro **/v** o **/version**. El Windows, excepto en el caso de Velneo vServer, requiere redirigir su salida. Ejemplos:

Windows:

`vClient.exe /version > c:\temp\ver.txt`

`vClient.exe /v > c:\temp\ver.txt`

`vServer.exe /v`

Linux:

`vAdmin.sh /v`

`vAdmin.sh /version`

`vServer.sh /v`

En el caso de Velneo vModApache, [se reserva una petición](/velneo-vmodapache/nomenclatura-de-objetos-en-urls#peticion-velneo_version) para devolver el número de versión.


# Certificado de firma digital para componentes de Windows

Las instalaciones de todos los componentes de Velneo para Windows llevan un certificado digital de código de Velneo.

La firma realizada con este certificado indica y garantiza la procedencia del instalador descargado y de los ficheros ejecutables que se incluyen.

Gracias a este certificado el usuario puede confiar en que los ficheros de instalación descargados provienen de Velneo y no han sido alterados.

{% hint style="warning" %}
**IMPORTANTE**: la firma tiene un periodo de validez y, fuera de ese periodo de validez, los componentes pueden no funcionar, por lo que se recomienda siempre actualizar a la última versión y en el caso de instalar alguna versión antigua, comprobar el periodo de validez de la firma antes de hacerlo.
{% endhint %}


# Creación de claves beta

Una clave beta es una clave que se configuran en el ámbito de un componente de Velneo y que permite activar o desactivar determinada funcionalidad.

Las claves beta son entradas en la rama **beta** de Velneo del registro del sistema operativo. Se recomienda generarlas desde un proceso con el comando de instrucción de proceso [Configuración del sistema: escribir cadena texto ](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/sistema/configuracion#configuracion-del-sistema-escribir-cadena-texto)para establecerlos, ejecutándolo en 1º y 3º plano según corresponda. Los parámetros se resolverán como indicamos a continuación:

`Configuración de sistema: Escribir cadena de texto ( "Velneo", "beta", "clave", "valor" )`

El procedimiento sería:

Ejecutar la aplicación, lanzar el proceso en primero y/o tercer plano, según corresponda.

En el ámbito del cliente, las claves serán operativas en siguientes sesiones que se lancen del mismo.

En el ámbito del servidor, las claves serán operativas en cuanto se reinicie.

En el caso de vModApache se configurará en el fichero donde tengamos configurados los location. Se aplicará a nivel general, no en el ámbito de cada location.&#x20;

Para ello usaremos una directiva propia llamada **VelneoBetaKey**. Deber tener la siguiente sintaxis:

`VelneoBetaKey clave=valor`

Las claves beta se leen en el arranque del componente donde se apliquen.&#x20;

En el caso de Velneo vServer se informará mediante mensajes en el [panel de mensajes](/velneo-vadmin/monitorizacion#mensajessiste) Velneo vAdmin en el arranque.

En vClient: se puede ver en consola. En el caso de Windows podremos comprobarlo ejecutando Velneo vClient desde la ventana de comandos del sistema (CMD) redirigiendo la salida a un fichero de texto.&#x20;

Ejemplo: `vClient.exe > c:\log\logvClient.exe`

En vServer: en consola y también se verá en el panel de [mensajes del sistema de Velneo vAdmin](/velneo-vadmin/monitorizacion#mensajessiste) al arrancar el servicio.

En el caso de Velneo vModApache, tras arrancar el servicio de Apache debería aparecer un mensaje similiar al siguiente en el fichero error.log de Apache: "Activando la clave beta NombreDeClave."

Para los objetos&#x20;


# Conceptos básicos de Velneo

En esta sección veremos una serie de conceptos básicos de la plataforma. Con ellos, se espera que los desarrolladores puedan aprovechar mejor las capacidades de Velneo para crear aplicaciones robustas, eficientes, y escalables.


# Ficha o registro

Una ficha, también conocida como registro, es una de las unidades básicas de datos en Velneo, similar a una fila en una tabla de base de datos.

Cada ficha representa una instancia individual de un conjunto de datos, almacenando información en diferentes [campos](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/campo) que pueden incluir texto, números, fechas, y más.&#x20;

Las fichas son fundamentales para la estructura de cualquier aplicación, ya que contienen la información real que los usuarios necesitan gestionar o analizar.


# Lista de Fichas o registros

Una lista es una colección de [fichas](/velneo/conceptos-basicos-de-velneo/ficha-o-registro) que han sido recuperadas y organizadas para ser mostradas o procesadas.&#x20;

Las listas permiten a los desarrolladores trabajar con múltiples registros de manera eficiente, al proporcionar herramientas para [ordenar](/velneo-vclient/funcionalidades-especificas/ordenacion-de-listas), [filtrar](/velneo-vclient/funcionalidades-especificas/rejillas-vclient/submenu-de-filtros), y manipular conjuntos de datos.&#x20;

En el contexto de Velneo, trabajar con listas es esencial para gestionar grandes volúmenes de datos y realizar operaciones masivas.

## Envío de Listas entre objetos y vistas de datos

Cuando se envía una lista entre [objetos](/velneo-vdevelop/proyectos-objetos-y-editores/objeto) o vistas de datos ([rejillas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla), [rejillas avanzadas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada), etc.) en Velneo, lo que realmente se transfiere es una referencia a esa colección de fichas, no los datos en sí mismos. Esto significa que las operaciones sobre estas listas son eficientes en términos de recursos, ya que se evita duplicar grandes volúmenes de datos en la memoria. De esta manera, los desarrolladores pueden pasar listas entre diferentes partes de la aplicación sin preocuparse por el rendimiento o por el consumo excesivo de memoria.

## Optimización a partir de la Versión 36

Con la llegada de la versión 36, Velneo ha optimizado el proceso de envío de listas entre distintos componentes del sistema.&#x20;

Esta optimización mejora significativamente el rendimiento de las aplicaciones, reduciendo los tiempos de respuesta y el uso de recursos al trabajar con listas grandes o complejas. No obstante, esta nueva versión garantiza la compatibilidad e interoperabilidad con las versiones anteriores de Velneo. Esto significa que los desarrolladores pueden actualizar a la última versión sin preocuparse por posibles problemas de compatibilidad con aplicaciones que usan versiones anteriores del entorno de desarrollo.


# Vista de datos

En Velneo, una vista de datos es un objeto que permite mostrar información en una interfaz gráfica. Las vistas de datos son componentes clave en la creación de aplicaciones, ya que permiten presentar y gestionar la información de manera visual y accesible para el usuario final.

Las vistas de datos en Velneo pueden ser de varios tipos, como [formularios](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario), [rejillas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla), [informes](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/informe), etc., y se utilizan para interactuar con los datos de las tablas de la base de datos. Estas vistas se configuran para mostrar [campos](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/campo) específicos, aplicar [filtros](/velneo-vclient/funcionalidades-especificas/rejillas-vclient/submenu-de-filtros), [ordenar](/velneo-vclient/funcionalidades-especificas/ordenacion-de-listas) datos y definir cómo se presentarán visualmente.

Además, las vistas de datos en Velneo se integran en el flujo de la aplicación, lo que significa que pueden ser alimentadas por [acciones](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion) o [procesos](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso) que determinan qué datos se deben mostrar y cómo deben ser manipulados. Esto permite una gran flexibilidad y personalización en la forma en que se presentan y gestionan los datos dentro de una aplicación desarrollada en Velneo.


# Flujo

En Velneo, el concepto de "flujo" se refiere a la secuencia y gestión del movimiento de datos y acciones dentro de una aplicación.&#x20;

Es un término que se utiliza para describir cómo la información se transfiere y transforma a través de distintos [procesos](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso) y [objetos](/velneo-vdevelop/proyectos-objetos-y-editores/objeto) dentro del entorno de desarrollo de Velneo.&#x20;

A continuación explicamos cómo se aplica el concepto de flujo en Velneo:

## Flujo de datos

En las aplicaciones, los flujos de datos describen cómo los datos se mueven de un lugar a otro. Esto puede incluir el traslado de datos desde una base de datos a una interfaz de usuario, o entre diferentes componentes de una aplicación. Velneo facilita la gestión de estos flujos con herramientas integradas para manejar conexiones entre [tablas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla), [vistas de datos](/velneo/conceptos-basicos-de-velneo/vista-de-datos), [formularios](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario) y más.

En Velneo, el concepto de "flujo de datos" está intrínsecamente relacionado con los orígenes y destinos de [procesos](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso), así como con las vistas de datos como [rejillas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla),  [multivistas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/multivista), etc. Estos elementos son fundamentales para comprender cómo se maneja y visualiza la información dentro de una aplicación desarrollada en este entorno. A continuación explicamos más al respecto:

### Orígenes y Destinos de procesos

* **Orígenes de Datos**: estos especifican de dónde provienen los datos que un [proceso](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso) va a utilizar. En Velneo, un proceso puede tener como origen una [tabla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla) de datos, una [lista](/velneo/conceptos-basicos-de-velneo/lista-de-fichas-o-registros) específica o incluso el resultado de otro proceso. Esto define cuál es la fuente inicial de datos que se va a manipular.
* **Destinos de Datos**: al ejecutar un proceso, los datos resultantes pueden enviarse a un destino, que podría ser otra tabla, una variable o una [vista de datos](/velneo/conceptos-basicos-de-velneo/vista-de-datos) dentro de la aplicación. El destino es el lugar en el que se espera que los datos procesados sean utilizados o almacenados después de concluir el proceso.

#### Interacción entre Procesos y Vistas de Datos

Los procesos en Velneo pueden filtrar, ordenar, modificar o combinar datos antes de enviarlos a una [vista](/velneo/conceptos-basicos-de-velneo/vista-de-datos) como una [rejilla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla) o [formulario](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario). Esto permite que los datos presentados al usuario final estén organizados de manera que sean significativos y útiles.

El flujo de datos entre estos elementos es esencial para crear aplicaciones dinámicas. Por ejemplo, un proceso puede recoger datos de una [tabla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla) (origen), procesarlos para calcular un resultado, y luego pasar esos datos a una [rejilla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla) (destino) para su visualización.

En resumen, el flujo de datos en Velneo conecta los orígenes y destinos de los procesos con las vistas de datos, proporcionando un marco flexible y potente para gestionar cómo los datos se mueven y se presentan dentro de una aplicación. Esto no solo optimiza las operaciones internas de la aplicación, sino que también mejora la experiencia del usuario al mostrar la información de manera clara y accesible.


# Solución

En Velneo, una **solución** es el contenedor principal que permite organizar y gestionar los diferentes componentes de una aplicación desarrollada en Velneo.

Una solución puede contener uno o varios **proyectos**, que pueden ser de **datos** y de **aplicación**.

En un **proyecto de datos** se define toda la estructura de datos de la aplicación, esto es, las tablas y sus relaciones.

En un **proyecto de aplicación** se define la interfaz de la aplicación.

Una solución se corresponde con una carpeta física en el servidor donde se almacenan los proyectos que la compongan.


# Tipos de archivo generados por Velneo

En este capítulo vamos a ver los distintos tipos de archivo que genera Velneo y su función.

| Extensión | Información                                                                                                                                                                                                                                                                                             |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| bak       | Fichero de [copia de seguridad automática de proyecto](https://doc.velneo.com/velneo/pages/-M7D76meFQjOGjeGmRbC#copia-de-seguridad-automática-de-proyectos).                                                                                                                                            |
| cfc       | Fichero temporal que se genera cuando se ordena la [compactación de un contenedor](/velneo-vdataclient/utilidades#compactar-contenedor-cnd-cni).                                                                                                                                                        |
| cfd       | Fichero temporal que se genera cuando se ordena la [compactación de una tabla](/velneo-vdataclient/utilidades#compactar-contenedor-cnd-cni).                                                                                                                                                            |
| cnd       | Fichero de datos de contenedor. Fichero donde se guarda el contenido de los [campos de tipo objeto](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos#objeto) de una tabla.                                                                                           |
| cni       | Fichero de índices de contenedor. Fichero donde se indexa el contenido de un contenedor de una tabla. El contenedor es el fichero donde se guarda el contenido de los [campos de tipo objeto](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos#objeto) de una tabla. |
| cnv       | Copia del fichero contenedor (cnd) que se hace al usar la opción [vaciar tabla](/velneo-vdataclient/utilidades#vaciar-tabla) de Velneo vDataClient.                                                                                                                                                     |
| dat       | Fichero de datos de una [tabla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla).                                                                                                                                                                                                 |
| dav       | Copia del fichero de datos (dat) que se hace al usar la opción [vaciar tabla](/velneo-vdataclient/utilidades#vaciar-tabla) de Velneo vDataClient.                                                                                                                                                       |
| idc       | Fichero de [índices complejos](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/indice-complejo) de una tabla.                                                                                                                                                                           |
| idx       | Fichero de [índices](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice) de una tabla.                                                                                                                                                                                        |
| js        | Fichero script de [JavaScript](/velneo-vdevelop/scripts/lenguajes/javascript) que se guarda en caché.                                                                                                                                                                                                   |
| jsc       | Versión compilada y mapeada en memoria de un fichero JavaScript que se guarda en caché.                                                                                                                                                                                                                 |
| ltg       | Fichero donde se [guarda la configuración de las rejillas avanzadas](https://doc.velneo.com/velneo/pages/-M7D76tIvtjljTqWZuYX#guardar-configuración) que se guarda en caché.                                                                                                                            |
| log       | Fichero de [log de procesos](/velneo-vserver/instalacion-y-configuracion/parametros-configurables-de-velneo-vserver#verboselevel).                                                                                                                                                                      |
| old       | Fichero generado durante una [reconstrucción de datos](https://doc.velneo.com/velneo/pages/-M7D76tibEKM4TbubUKT#control-de-reconstrucción-de-tablas-incompleta) por cambio de estructura con la estructura anterior de la tabla.                                                                        |
| qml       | Fichero script de [QML](/velneo-vdevelop/scripts/lenguajes/qml) que se guarda en caché.                                                                                                                                                                                                                 |
| qmlc      | Versión compilada y mapeada en memoria de un fichero QML que se guarda en caché.                                                                                                                                                                                                                        |
| trn       | Fichero de [transacciones](/velneo-vserver/funcionalidades/sistema-transaccional).                                                                                                                                                                                                                      |
| txt       | Es la extensión de los ficheros de [mensajes de Velneo vServer](/velneo-vadmin/monitorizacion#mensajessiste).                                                                                                                                                                                           |
| var       | Fichero de [variables](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/variable) de una [instancia de datos](/velneo-vadmin/gestion-de-aplicaciones/instancias).                                                                                                                        |
| vca       | [Proyecto](/velneo-vdevelop/proyectos-objetos-y-editores) de aplicación.                                                                                                                                                                                                                                |
| vcd       | [Proyecto](/velneo-vdevelop/proyectos-objetos-y-editores) de datos.                                                                                                                                                                                                                                     |
| vcs       | Fichero de [copia de seguridad](/velneo-vadmin/tareas#copias-de-seguridad) de Velneo.                                                                                                                                                                                                                   |
| vha       | [Proyecto](/velneo-vdevelop/proyectos-objetos-y-editores) de aplicación en formato comprimido, no editable.                                                                                                                                                                                             |
| vhd       | [Proyecto](/velneo-vdevelop/proyectos-objetos-y-editores) de datos en formato comprimido, no editable.                                                                                                                                                                                                  |
| vii       | [Fichero de configuración de una instalación](/velneo-vinstallbuilder/configurar-una-instalacion) de Velneo generado con [Velneo vInstallBuilder](/velneo-vinstallbuilder/que-es-velneo-vinstall-builder).                                                                                              |
| vil       | Fichero de [conexión de impresoras lógicas a físicas](/velneo-vclient/funcionalidades-especificas/asignar-impresoras-logicas).                                                                                                                                                                          |
| vin       | [Fichero de instalación](/velneo-vinstallbuilder/crear-el-instalable) de una solución de Velneo generado con [Velneo vInstallBuilder](/velneo-vinstallbuilder/que-es-velneo-vinstall-builder).                                                                                                          |
| vsi       | Fichero de configuración de [Velneo vServer](/velneo-vserver/que-es-velneo-vserver).                                                                                                                                                                                                                    |
| vob       | Ficheros de objetos [exportados](/velneo-vtranslator/importacion-y-exportacion-basada-en-xliff).                                                                                                                                                                                                        |


# Velneo Web

Se trata de la versión web de los componentes cliente de la plataforma Velneo. Esto facilita la ejecución de los componentes cliente de Velneo sin tener que instalarlos en los equipos locales.

En esta versión están disponibles para su acceso vía web los siguientes componentes:

* [Velneo vAdmin](/velneo-vadmin/velneo-vadmin-web).
* [Velneo vDataClient](/velneo-vdataclient/velneo-vdataclient-web).
* [Velneo vClient](/velneo-vclient-web).

Los componentes Velneo se han compilado y adaptado a la tecnología [Web assembly](https://developer.mozilla.org/es/docs/WebAssembly), lo que permite ejecutar los componentes de Velneo directamente en un navegador web sin tener que instalar ninguna aplicación, lo que nos facilitará enormemente, por un lado, el poder programar desde cualquier [máquina y navegador compatibles](/velneo/velneo-web/plataformas-y-navegadores-compatibles) y, por el otro, el despliegue de nuestras aplicaciones a clientes finales.

El diseño de su interfaz está adaptada a web y es distinto al de la versión de escritorio.

Al tratarse de la versión web, hay funcionalidades que no existen o que funcionan de forma diferente que en la versión de escritorio. Estas diferencias se detallan en la documentación de cada componente.

## Conexión con Velneo vServer Web

Existen dos forma de conectarse vía web a un servidor:

1. Conexión directa a virtualhost del [servicio HTTPS](/velneo-vserver/servicio-https) de Velneo vServer.
2. Vía URL externa.

### Conexión directa a virtualhost del [servicio HTTPS](/velneo-vserver/servicio-https) de Velneo vServer

Podemos acceder a [Velneo vAdmin Web](/velneo-vadmin/velneo-vadmin-web) y a [Velneo vDataClient Web](/velneo-vdataclient/velneo-vdataclient-web) directamente a través del *virtualhost* que se crea por defecto en el servidor para el [servicio HTTPS](/velneo-vserver/servicio-https). La URL será:

`https://dominio_del_servidor[:puerto]/login`

En el caso de un servidor cloud, el dominio y puerto del servidor serán los que se indiquen en la sección [Apache](/velneo-cloud/panel-de-control-vserver-cloud/apache) del panel de control cloud.&#x20;

{% hint style="warning" %}
En **Velneo Cloud**, para que este servicio sea funcional es necesario añadir en el fichero de configuración de Apache (`/apache2/001-default-ssl.conf`) la siguiente línea:

`#HTTPSERVER`

Ejemplo:

```
# Definimos la salida de los logs al directorio HOME para permitir consultarlos vía SFTP
#HTTPSERVER
CustomLog /home/${USERNAME}/apache2/logs/access.log combined
ErrorLog /home/${USERNAME}/apache2/logs/error.log

<VirtualHost *:443>
```

{% endhint %}

**En el caso de que el servidor no tenga activado el servicio de vModApache**, el puerto será el puerto del servidor + 2. Es decir, que si el puerto del servidor es el 6900, el de login https será el 6902.

En el caso de un servidor local, será el dominio configurado en el virtualhost por defecto (cuyo puerto es el estándar, el 443).

### Conexión vía URL externa

Para conectarnos con un Velneo vServer cloud usaremos la url siguiente:

[https://web.velneo.com](https://web.velneo.com/)

En ella, debemos especificar los siguientes datos:

#### Servidor

VRL de tu servidor cloud. La encontrarás en tu [panel de control cloud](/velneo-cloud/panel-de-control-vserver-cloud). Ejemplo:

\[vatps\://]c3.velneo.com:37280

En el caso de que tengas contratado el servicio de [Velneo vModApache en cloud](/velneo-cloud/velneo-vmodapache-en-cloud), especificarás tu subdominio. Ejemplo:

\[vatps\://]misubdominio.velneo.net

O el dominio que tengas redirigido a éste.

El esquema (vatps\://) es opcional.

#### Usuario

Nombre de un usuario de tu Velneo vServer.

#### Contraseña

Contraseña del usuario declarado en el parámetro anterior.

{% hint style="warning" %}
Por este método también podremos conectarnos a servidores locales, pero será requisito indispensable que tengan configurado un certificado SSL válido. No podremos conectarnos si usamos los certificados de pruebas que Velneo incluye por defecto para servidores locales.
{% endhint %}

Y tendemos que seleccionar una de las acciones siguientes:

#### Administrar

Si pulsamos este botón se lanzará [Velneo vAdmin Web](/velneo-vadmin/velneo-vadmin-web).

#### Gestionar BBDD

Si pulsamos este botón se lanzará [Velneo vDataClient Web](/velneo-vdataclient/velneo-vdataclient-web).

{% hint style="info" %}
En la página de conexión, en función de la vrl introducida se habilitarán los botones de editar y/o administrar automáticamente, teniendo en cuenta si el Velneo vServer al que nos vamos a conectar soporta dicha función.
{% endhint %}

Via URL externa también podemos **ejecutar aplicaciones en Web**. Ver el punto [Velneo vClient Web](/velneo-vclient-web).


# Plataformas y navegador compatibles

La tecnología en la que se basan los clientes web de Velneo está disponible en múltiples sistemas operativos y navegadores, pero la implementanción no es igual en cada uno de ellos, con lo cual aquí recogemos solamente los recomendados.

## Sistemas operativos de escritorio

Windows.

Linux.

macOS.

{% hint style="info" %}
En dispositivos móviles o tabletas, los clientes web pueden no funcionar correctamente debido a las limitaciones de memoria y/o procesamiento de los dispositivos.
{% endhint %}

## Navegador

Google Chrome 128 64 bits y superiores.

{% hint style="warning" %}
El navegador web debe soportar el estándar [WebGL](https://es.wikipedia.org/wiki/WebGL) y debe tener habilitada la opción de "Aceleración gráfica".
{% endhint %}


# Acceso a recursos del sistema

Los componentes de Velneo en web se ejecutan dentro del navegador, con lo que el acceso a los recursos del sistema está limitado por los propios navegadores. Esto implica acceso a impresoras, disco, protocolo TCP/IP, puerto serie, geoposición, , cámara, registro del sistema operativo y audio.

Esto puede ocasionar un funcionamiento diferente entre el componente Web y el de escritorio de Velneo.

## Impresoras

Todas las impresiones de las herramientas de Velneo en web se generan automáticamente en PDF, permitiendo luego imprimir, reenviar, o reutilizar el pdf para cualquier fin.&#x20;

Este pdf se genera al vuelo y se presenta en una nueva pestaña del navegador.

## Protocolo TCP/IP

El acceso a recursos TCP, tanto de la máquina como externos, no está disponible. Las comunicaciones dentro del navegador están restringidas a websockets únicamente.

## Puerto serie

El acceso a puerto serie no está disponible.&#x20;

## Geoposición

No se tendrá acceso a los datos de geoposición.

## Cámara

No se tendrá acceso a la cámara del sistema.

## Audio

No se tendrá acceso a los dispositivos de audio del sistema.

## Registro del sistema operativo

No es posible acceder al registro del sistema operativo.


# Entorno seguro en WebAssemby

Las herramientas de Velneo web **funcionan exclusivamente en conexiones HTTPS**.

Todo el desarrollo se ha orientado a ofrecer la máxima seguridad en la información.

Tanto la descarga de componentes como el flujo de datos de las aplicaciones viajan encriptadas.

Hemos habilitado que no puedan funcionar sin una configuración adecuados de certificados HTTPS, con lo que evitamos que por error de configuración las conexiones puedan no ser seguras.

{% hint style="warning" %}
La mayoría de los errores de acceso que te pueda dar posiblemente vengan derivados de una incorrecta configuración del certificado en tu Velneo vServer.
{% endhint %}

## Entorno seguro y multihilo en WebAssembly

Con el objetivo de habilitar el soporte de Multihilo (*Multithreading*) en la aplicación de Velneo en Webassembly se requiere el uso de una característica del navegador denominada `SharedArrayBuffer` para garantizar un rendimiento nativo y una interfaz fluida.

### Configuración de Seguridad Requerida&#x20;

Para cumplir con los estándares modernos de navegadores y habilitar la memoria compartida, el servidor debe enviar obligatoriamente las siguientes cabeceras HTTP en el documento principal:

* `Cross-Origin-Opener-Policy: same-origin` (COOP):
  * **Función**: aísla el contexto de navegación de nuestra aplicación.
  * **Efecto**: rompe la asociación con otras ventanas (popups o la página que abrió nuestra app), forzando al navegador a colocar nuestra aplicación en un proceso de memoria separado a nivel de sistema operativo.
* `Cross-Origin-Embedder-Policy: require-corp` (COEP):
  * **Función**: establece una política de carga estricta para recursos incrustados.
  * **Efecto**: impide la carga de cualquier recurso (imágenes, scripts, iframes) que no provenga del mismo origen o que no esté explícitamente marcado como "público" por su servidor de origen.

### Beneficios de Rendimiento

* **Procesamiento Paralelo**: habilita el uso de múltiples núcleos de CPU simultáneamente.
* **Experiencia de Usuario**: permite a Velneo delegar tareas pesadas a hilos secundarios, evitando que la interfaz de usuario se congele ("Main Thread Blocking") durante cálculos complejos o carga de datos.

### Seguridad y Protección de Datos (Mitigación Spectre/Meltdown)

La configuración aplicada protege la integridad de la memoria de la aplicación WebAssembly frente a vulnerabilidades críticas de hardware:

* **Defensa contra Spectre y Meltdown**: estas vulnerabilidades permiten a procesos maliciosos leer la memoria de otros procesos mediante ataques de canal lateral (midiendo tiempos de respuesta de la CPU).
* **Mecanismo de Protección**: al forzar el aislamiento del proceso con COOP, garantizamos que nuestra memoria no sea accesible físicamente por otras pestañas o scripts maliciosos que se ejecuten en el mismo navegador. Esto blinda los datos sensibles procesados en el cliente.

### Requisitos para Integración de Terceros (Efectos Colaterales)

Debido a la política `require-corp`, cualquier recurso externo que deseemos cargar (CDN, APIs de mapas, imágenes externas) será bloqueado por defecto. Para permitirlos, el servidor externo debe configurarse para enviar una de las siguientes cabeceras:

* **Opción A (Estándar)**: `Access-Control-Allow-Origin` (CORS).
* **Opción B (Política de Recursos)**: `Cross-Origin-Resource-Policy: cross-origin` (CORP).

Si el proveedor del recurso externo no implementa estas cabeceras, dicho recurso no podrá visualizarse dentro de nuestra aplicación.

{% hint style="warning" %}
Debemos asegurarnos de la seguridad de los recursos a los que accedamos, ya que esos si serán capaces de acceder al entorno de ejecución.
{% endhint %}


# Funcionamiento de VATPS por websocket

Uno de los puntos más importantes de las aplicaciones Velneo web es que usan una versión del [protocolo VATPS](/velneo-vserver/funcionalidades/protocolo-vatps) basada en [WebSocket](https://es.wikipedia.org/wiki/WebSocket).&#x20;

En las versiones de escritorio todo el tráfico de comunicación entre los clientes y el servidor viajan por TCP.&#x20;

{% hint style="warning" %}
A la hora de configurar servidores locales, debemos tener en cuenta que además de tener abierto el puerto del servidor (el 690 por defecto, o el que se haya [configurado](/velneo-vserver/instalacion-y-configuracion/parametros-configurables-de-velneo-vserver#configurar-puerto-de-escucha-port)) sino que tenemos que tener abierto también el puerto de WebSocket.\
\
Si el puerto de escucha del servidor es el puerto por defecto (690), el puerto de WebSocket es el 443.

Si el puerto de escucha es diferente, será el puerto de servidor, pero sumándole un 2. Es decir, que si el puerto de escucha del servidor es el 6900, en el router tendríamos que abrir el 6902 también. Si el puerto del servidor es el 6905, tendremos que abrir el puerto 6907.
{% endhint %}


# Interfaz

Cuando se ejecutan aplicaciones web, los **diálogos** y **ventanas** se ajustan para integrarse mejor con el entorno web. Esto se logra mediante los siguientes cambios:

**Eliminación de iconos**:

* Se quita el icono de la ventana.
* Se elimina el icono de maximizar.

**Tipografía del sistema**: el texto se muestra utilizando la tipografía predeterminada del sistema operativo, lo que ayuda a que la aplicación se vea más coherente con otras aplicaciones web.

**Color de la barra de título**: el color de la barra de título se ajusta automáticamente para coincidir con el tema claro u oscuro del sistema, utilizando el esquema de colores "fusion".

**Sin bordes**: las ventanas no tendrán bordes, lo que contribuye a un aspecto más limpio y similar al de los diálogos web estándar.

Todo lo anterior no podrá ser personalizado por css.


# CORS para llamadas XmlHttpRequest vía API o mediante el objeto Consumo servicio Web

Velneo web se ejecuta dentro de los navegadores, dentro de su motor JavaScript, un [*sandboxing*](https://es.wikipedia.org/wiki/Sandbox) que mejora la estabilidad de las aplicaciones y asegura una máxima seguridad. Al mismo tiempo implica una serie de restricciones a las aplicaciones para su correcto funcionamiento.

En las aplicaciones desplegadas en web se sigue pudiendo usar las instrucciones de descarga por [XMLHttpRequest](https://es.wikipedia.org/wiki/XMLHttpRequest) o mediante el objeto [Consumo servicio Web](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/consumo-servicio-web), pero en determinadas circunstancias pueden no estar permitidas al no tener una configuración [CORS](https://es.wikipedia.org/wiki/Intercambio_de_recursos_de_origen_cruzado) adecuada en el elemento al que hacemos referencia. En ese caso la ejecución de los procesos en el servidor ([3er plano](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso#id-3o-plano)) podría ser la solución.


# Aplicación vLanzadera y login social

Documentación y guía de instalación

## Qué es vLanzadera

Es una aplicación de Velneo que permite configurar una lanzadera de aplicaciones para navegador. La lanzadera permite utilizar un formulario web para identificar usuarios a través de nombre de usuario y contraseña usados tradicionalmente en Velneo, pero también añade la posibilidad de hacer *login* mediante [oauth](https://es.wikipedia.org/wiki/OAuth) con diferentes proveedores, lo que se conoce como **Login Social**.

Así mismo, en vLanzadera, en función de los privilegios que tenga el [grupo](/velneo-vadmin/gestion-de-usuarios#grupos) al que pertenezca el [usuario](/velneo-vadmin/gestion-de-usuarios#usuarios), se incluirán enlaces para abrir el [Administrador Web](/velneo-vadmin/velneo-vadmin-web) del servidor o el [Gestor de bases de datos](/velneo-vdataclient/velneo-vdataclient-web).

[Contacta con Velneo](https://www.velneo.com/contacto) para informarte sobre cómo puedes conseguirla.

## Requisitos necesarios

vLanzadera funciona tanto en [Velneo Cloud](/velneo-cloud/que-es-velneo-cloud) como en servidores propietarios y los servidores deben cumplir los siguientes requisitos:

* Tener instalaodo el componente [Velneo vModApache](/velneo-vmodapache/que-es-velneo-vmodapache).
* Servidor Web de Aapche 2.4 con SSL.
* Licencia para [ejecución web](/velneo/velneo-web) y login social (si se desea ejecutar las aplicaciones en un navegador Web).
* Certificado ssl propio para Apache y para Velneo vServer.
* Disponer de la aplicación vLanzadera.
* Apache, vModApche y vServer donde se use vLanzadera deben estar en la misma máquina, no pueden estar en máquinas diferentes.

En el caso de querer login social, es necesario configurar las credenciales de *oauth* con el proveedor de identidades que se desee utilizar (Google, facebook, etc.).

## Instalación de vLanzadera

[Instala vLanzadera en tu servidor con Velneo vAdmin](/velneo-vadmin/gestion-de-aplicaciones/soluciones#instalar-soluciones), crea una instancia y ejecútala con [Velneo vClient](/velneo-vclient/que-es-velneo-vclient).&#x20;

{% hint style="danger" %}
Si no tienes licencia de vLanzadera, el sistema no te dejará instanciarla.

En el caso de tener la licencia de vLanzadera y haberla cancelado, ya no podrá ser ejecutada.
{% endhint %}

{% hint style="warning" %}
vLanzadera solo se puede abrir con un [usuario](/velneo-vadmin/gestion-de-usuarios#usuarios) supervisor Al abrir la aplicación, se abre el formulario principal que muestra, en caso de que los haya, una lista de errores a solucionar.
{% endhint %}

## **Configuración**

Una vez instalada, el siguiente paso será configurar Apache:

* [Configuración vLanzadera en Apache en el Cloud de Velneo](/aplicacion-vlanzadera-y-login-social/configuracion-de-vlanzadera-en-apache-en-el-cloud-de-velneo).
* [Configuración de vLanzadera en Apache en servidores propietarios](/aplicacion-vlanzadera-y-login-social/configuracion-de-vlanzadera-en-apache-en-servidores-propietarios).

## Aplicación vLanzadera y personalización

Cuenta con las siguientes pantallas, que iremos detallando en los puntos siguientes:

* [Principal](#undefined).
* [Parámetros](#parametros).
* [Instancias](#instancias).
* [Proveedores](#proveedores).
* [Estáticos](#estaticos).
* [Modos de acceso](#modos-de-ejecucion).

## Principal

En esta pantalla se pueden ver mensajes de información y alerta.

### Tipos de errores

A continuación listamos los mensajes de errores que pueden generarse y las acciones que recomendamos llevar a cabo.

| Mensaje de error                                                                                                         | Acción                                                                                         |
| ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------- |
| Error de descarga de fichero                                                                                             | Contactar con soporte de Velneo (incluir la salida del log de errores).                        |
| Error de creación de fichero                                                                                             | Contactar con soporte de Velneo (incluir la salida del log de errores).                        |
| Para usar Login Social con la aplicación vLanzadera es necesario que esté definida una clave. Consulta la documentación. | Configurar la clave jwt como se indica en el apartado de [configuración de vServer](#vserver). |

## Parámetros

### Datos

Aquí se modifican los textos que aparecen en la lanzadera y otros parámetros necesarios para su correcto funcionamiento. Son:

* **Título de la web**: en este parámetro configuraremos el dato que aparecerá en el tag `</TITLE>` en la página de la lanzadera. Ejemplo: "Lanzadera de Velneo, S.A.".
* **Texto de bienvenida**: nos permite configurar el texto que se mostrará en la página a modo de bienvenida. Ejemplo: "Hola".
* **Subtítulo**: nos permite configurar otro texto a presentar debajo del de bienvenida. Ejemplo: "Por favor, introduce tus datos".
* **Etiqueta usuario**: etiqueta que se presentará junto al campo donde el usuario deberá introducir su nombre/email. Ejemplo: "Usuario".
* **Etiqueta contraseña**: etiqueta que se presentará junto al campo donde el usuario deberá introducir su contraseña. Ejemplo: "Contraseña".
* **Texto enviar formulario**: texto que se presentará en el botón que enviará la información del formulario web. Ejemplo: "Iniciar sesión".
* **Nombre compañía**: nombre de la empresa. Por ejemplo: "Velneo, S.A."
* **Versión personalizada**: la lanzadera, por defecto, usará la misma versión de Velneo vClient Web que tenga el servidor al que nos hayamos conectado. Si por algún motivo queremos ejecutar las aplicaciones con una versión posterior (**nunca anterior**) de Velneo vClient Web, indicaremos el número de versión en este parámetro.
* **URL descarga personalizada**: lo dejaremos en blanco. Solamente será necesario rellenarlo si en algún momento el personal de Velneo te lo indica.
* **Dominio**: aquí especificaremos el dominio de nuestra lanzadera, que será el dominio para el cual se han generado los certificados SSL que hayamos configurado tanto en Apache como en Velneo vServer.
* **Descargar**: Este botón permite descargar e instalar automáticamente nuevas versiones de wasm sin necesidad de reiniciar la solución. Este proceso puede realizarse también de forma automática a través de una [tarea programada](/velneo-vadmin/tareas) (el proceso está en el proyecto de datos de la solución).
* **Puerto VATPS**: puerto de escucha para vatps de nuestro servidor. Esta dato no debería modificarse ya que se calcula automáticamente la primera vez que se ejecuta. Si el campo tiene algún valor y posteriormente modificamos el puerto de escucha de nuestra licencia, tendremos que ejecutar la lanzadera y actualizarlo.
* **Puerto WSS:** aquí configuraremos el puerto de esucha para Websockets (Velneo Web). Por defecto será el puerto del servidor + 9. Por ejemplo, si el puerto de escucha de nuestro servidor es el 690, el puerto WSS será el 699. Podríamos configura el puerto estándar 443.
* **Puerto HTTPS**: aquí configuraremos el puerto de escucha para https que hayamos configurado en Apache. En la configuración de Apache Haus, que es la que hemos tomado de ejemplo para generar esta documentación, el puerto por defecto es el 443.&#x20;
* **Abrir instancias en nueva pestaña**: si este parámetro está desactivado, cuando en la página de la lanzadera seleccionemos una instancia, se abrirá en la misma pestaña. Si lo activamos, se abrirá en una nueva pestaña.

{% hint style="warning" %}
Si se activa esta opción, tiene prioridad sobre la configuración de "[abrir en nueva pestaña" del apartado de instancia](#instancias)s, y todas las instancias se abrirán en una nueva pestaña independientemente de lo que haya ahí configurado.
{% endhint %}

* **Abrir administrador en nueva pestaña:** cuando el usuario que se conecte a la lanzadera es [supervisor](/velneo-vadmin/gestion-de-usuarios#supervisor), en la página de vLanzadera se incluirá una opción para poder conectarse con el [Administrador Web](/velneo-vadmin/velneo-vadmin-web). Si activamos esta opción, el administrador se abrirá en una nueva pestaña, si no, se abrirá en la misma pestaña en la que se ha cargado vLanzadera.
* **Abrir gestor de bbdd en nueva pestaña:** cuando el [grupo](/velneo-vadmin/gestion-de-usuarios#grupos) al que pertenece el [usuario](/velneo-vadmin/gestion-de-usuarios#usuarios) que se conecte a la lanzadera tiene privilegios para [navegar por la bbdd](/velneo-vadmin/gestion-de-usuarios#puede-ejecutar-proyectos-de-datos-con-vdataclient), en la página de vLanzadera se incluirá una opción para poder conectarse con el gestor de bbdd. Si activamos esta opción, el gestor de bbdd se abrirá en una nueva pestaña, si no, se abrirá en la misma pestaña en la que se ha cargado vLanzadera.
* **Modo depuración**: este parámetro activa diversos logs en el panel de desarrollador (F12 en Chrome) en la web de la lanzadera.
* **Logs de acceso en vAdmin**: si activamos esta opción se mostrarán los nombres de usuario y su longitud de los usuarios que intentan hacer login. Muy útil para poder detectar intentos de acceso no autorizados.
* **Google Analytics**: si activamos esta opción podemos registrar los accesos de los clientes en Google Analytics.
* **ID de Google Analytics**: en este parámetro tendremos que introducir nuestro ID de Google Analytics en el caso de que hayamos activado la opción anterior.

### Iconos

Aquí se pueden cambiar los iconos que se utilizan en la lanzadera.

## Instancias

Aquí se define una lista blanca de las aplicaciones ([instancias](/velneo-vadmin/gestion-de-aplicaciones/instancias)) y/o enlaces externos (una web externa o la url de la lanzadera de otro servidor) que van a aparecer en la lanzadera.&#x20;

Para añadir una instancia o un enlace externo en vLanzadera, hay que crear un registro desde el menú de instancias.&#x20;

En el parámetro **tipo de instancia**, debemos indicar si se trata de una aplicación o de un enlace.

Si seleccionamos **enlace**, no tendremos más que indicar su URL. Por ejemplo: `https://www.velneo.com/`

Si seleccionamos **instancia**, debemos especificar cuál. Para que una instancia le aparezca al usuario que se identifica en la lanzadera, tiene que cumplir dos requisitos:&#x20;

1. Que la instancia esté dada de alta en la vLanzadera en este menú.
2. Que en el vAdmin el usuario tenga permisos para ejecutar la instancia.

Hay que rellenar el campo código de instancia en el combobox.&#x20;

Una instancia, por defecto, se ejecuta en el explorador Web. Si queremos que sea ejecutada por un Velneo vClient de escritorio, activaremos la propiedad **Ejecutar en escritorio**. Ver el punto [lanzar vClient de escritorio](#lanzar-vclient-de-escritorio-desde-vlanzadera) para ver los requisitos previos.

{% hint style="warning" %}
La funcionalidad de ejecutar en escritorio solamente es funcional en sistemas operativos de escritorio.
{% endhint %}

La opción **abrir en nueva pestaña,** cuando ejecutamos en un explorador Web, hace que la aplicación se abra en una nueva pestaña del explorador, quedando en la anterior la página de la lanzadera. Si está desactivada, la aplicación se abrirá en la misma pestaña en la que estuviese cargada la lanzadera.

En el combobox aparecen las instancias a las que el usuario que está ejecutando vLanzadera tiene acceso.

Cuando ejecutemos una  instancia en el explorador web, en el título de éste se mostrará el nombre que ésta tenga definida en Velneo vAdmin:

![](/files/YKr5Ht1LiEd8xnhSQUGK)

**Ocultar barra de progreso**: por defecto, mientras se carga una aplicación en un explorador web se muestra una barra de progreso. Si activamos esta opción podemos hacer que no se muestre barra de progreso alguna o que se muestre una personalizada.

**JavaScript barra de progreso personalizada**: esta opción solo estará disponible si hemos activado la opción anterior. Si lo dejamos vacío, no se mostrará la barra de progreso durante la carga de la aplicación en el explorador Web. Si tiene contenido, este script se ejecuta 2 veces. La primera vez para mostrar la barra de progreso y la segunda vez para ocultarla. Disponemos de la variable **bShow** que nos indica si se está ejecutando la pirmera vez (bShow = true) o si es la segunda (bShow = false).

En este JavaScript podemos hacer las operaciones en el DOM para insertar, mostrar u ocultar contenido html. Ejemplo:

```javascript
let progressBar = document.querySelector("#pb");
if(!progressBar){
    // agregar un elemento al body forzando que se vea arriba del todo
    let body = document.querySelector("body");
    progressBar = document.createElement("div");
    progressBar.id = "pb";
    progressBar.style.position = "fixed";
    progressBar.style.top = "0";
    progressBar.style.left = "0";
    progressBar.style.width = "100%";
    progressBar.style.height = "100%";
    progressBar.style.background = "rgba(0,0,0,0.5)";
    progressBar.style.display = "block";
    progressBar.style.zIndex = "9999";
    body.appendChild(progressBar);
    // Insertamos un h1 con el texto cargando...
    let titulo = document.createElement("h1");
    titulo.innerText = "Cargando...";
    progressBar.appendChild(titulo);
    console.log(titulo);
}
if (bShow){
    console.log('mostrando')
    progressBar.style.display = "block";
} else {
    console.log('ocultando')
    progressBar.style.display = "none";
}
```

## Proveedores

{% hint style="danger" %}
Para que funcione el Login Social, el email asociado al usuario debe estar definido en el campo [Email](/velneo-vadmin/gestion-de-usuarios#email) de dicho [usuario](/velneo-vadmin/gestion-de-usuarios#usuarios) en [Velneo vAdmin](/velneo-vadmin/que-es-velneo-vadmin). Si la validación oAuth se hace contra Google y se usa Google Workspace (Google Apps) con varios dominios, el dominio a indicar es el principal de ese Google Workspace.
{% endhint %}

Aquí se pueden configurar métodos de autenticación adicionales. Con vLanzadera viene por defecto la opción de Google deshabilitada.

Al crear un proveedor aparece un botón nuevo en la lanzadera. En vLanzadera se puede configurar el texto del botón, el icono, los colores y definir un javascript onClick a ejecutar tras pulsar el botón.

En la pestaña de variables de proveedor se pueden declarar variables. Al hacer click en el botón del proveedor, se sustituyen las variables por su valor en el javascript onClick. El proveedor de Google ya está preparado para rellenar el ID de cliente, el secreto de cliente y el *Redirect URI* mencionados anteriormente en el apartado de configuración.

### Google (opcional)

La aplicación ya viene con la programación para utilizar el login con Google, pero hace falta realizar unos pasos en [Google cloud console](https://console.cloud.google.com/freetrial?hl=es-419) y añadir varios parámetros en vLanzadera.

Los pasos a realizar en la consola de Google son:

1. Crear un proyecto (Si no lo has hecho antes, tendrás que configurar la pantalla de consentimiento de OAuth).
2. En API y servicios → credenciales → crear credenciales → ID de cliente de OAuth.
3. Seleccionar tipo de aplicación web.
4. En la sección de URI de redireccionamiento autorizados, agregar una URI. Poner la URI donde se sirve tu Apache de Velneo Cloud (la URL que se informa en la sección [Apache](/velneo-cloud/panel-de-control-vserver-cloud/apache) del [panel de control cloud](/velneo-cloud/panel-de-control-vserver-cloud).
5. En las credenciales se puede ver un ID de cliente y un secreto de cliente. En el apartado "Variables de proveedor" de la ficha del proveedor de Google en la lanzadera utilizaremos estos valores.
6. Por último,  en la ficha del proveedor de Google en la lanzadera activar el proveedor (inactivar el check **Desactivar**).

### Microsoft Entra ID (opcional)

La aplicación ya viene programada para utilizar el servicio de administración de identidades y acceso de Microsoft.

Su uso requiere tanto dar de alta y configurar la aplicación en el Centro de Administración Microsoft Entra como en la propia vLanzadera.

#### **Creación de la aplicación registrada en el panel de Entra ID**

{% hint style="warning" %}
Las indicaciones de navegación en el panel de configuración de Microsoft quedamos a continuación pueden no ser exactas, ya que Microsoft puede realizar cambios.
{% endhint %}

**Registrar una aplicación**

Acceder al panel de [Microsoft Entra ID](https://entra.microsoft.com/#home) con un usuario administrador

En el menú lateral, acceder a Aplicaciones > Registro de aplicaciones > Hacer clic en el botón "Nuevo registro" de la barra de herramientas.

Elegir la opción que nos interese:

* **Solo cuentas de este directorio organizativo (solo de Directorio predeterminado: inquilino único)**: Microsoft Entra ID solo autorizará a usuarios que pertenecen al mismo directorio organizativo que el administrador.
* **Cuentas en cualquier directorio organizativo (cualquier inquilino de id. de Microsoft Entra - multiinquilino)**: esta opción admite la autorización de usuarios que pertenecen a otros directorios organizativos. Nota: De momento la lanzadera solo admite inquilino único (interno o externo), pero para autorizar a usuarios externos es necesario elegir esta opción.
* **Cuentas en cualquier directorio organizacional (cualquier inquilino del id. de Microsoft Entra - multiinquilino) y cuentas personales de Microsoft (por ejemplo, Skype, Xbox)**: esta opción da acceso sin restricción a cuentas personales. Si se desea controlar los usuarios que pueden acceder, hay que desactivar el ALTA\_AUTOMÁTICA\_USUARIOS (variable de proveedor de vLanzadera) y dar de alta manualmente a los usuarios que se quiere dar acceso en vAdmin.
* **Solo cuentas personales de Microsoft**: esta opción da acceso sin restricción a cuentas personales. Si se desea controlar los usuarios que pueden acceder, hay que desactivar el ALTA\_AUTOMÁTICA\_USUARIOS (variable de proveedor de vLanzadera) y dar de alta manualmente a los usuarios que se quiere dar acceso en vAdmin.

#### Configurar Web URI de redirección

Al registrar la aplicación hay que ir a la opción de Autenticación y añadir las web uri de redirección que necesitemos (url de la vLanzadera). La URI de redirección tiene que ser de tipo web.

Se puede configurar al registrar la aplicación o modificar/añadir nuevas después. Para ello hay que navegar a Aplicaciones > Registro de aplicaciones > Tu aplicación registrada > Autenticación > Aquí aparece una sección **Web URI de redirección**.

**Configurar la pantalla de consentimiento**

Comprobar que los permisos que se van a solicitar son los siguientes:

* Microsoft Graph
  * User.read

Para comprobarlo acceder a Aplicaciones > Registro de aplicaciones > Tu aplicación registrada > Permisos de api.

**Crear un secreto de cliente**

En Aplicaciones > Registro de aplicaciones > Tu aplicación registrada > Certificados y secretos > Secretos de cliente.

Crear un nuevo secreto de cliente y copiar el valor y asignarlo en variables de la ficha del proveedor Microsoft Entra ID en vLanzadera. Hay que copiarlo nada más crearlo, luego ya no se permite, lo que obligaría a crear un secreto nuevo si no se hubiese copiado. El secreto de cliente tiene fecha de expiración, por lo que hay que estar pendiente de renovarlo si caduca.

**Gestionar autorización a través de Entra ID**

Por defecto, todos los usuarios del directorio organizativo autorizado tendrán acceso a la vLanzadera.

Si deseas tener control sobre qué usuarios específicos del directorio organizativo (o cuentas personales según el tipo de aplicación registrada), hay que hacer los pasos detallados a continuación.

Navega a Aplicaciones > Aplicaciones empresariales > Tu aplicación registrada > Usuarios y grupos:

* Hacer clic en la opción “Agregar usuario o grupo” de la barra de herramientas.
* Hacer clic en “Ninguna seleccionada” para que aparezca la lista de usuarios a la que puedes dar acceso.

Si el usuario al que se le quiere dar acceso no está en la lista, hay que crearlo o invitarlo. Para ello accede al panel.

La opción "Asignación requerida" =  "Sí" cambia este comportamiento. Una vez puesto en "S"”, para dar acceso a los usuarios navegar al siguiente panel Usuarios > Todos los usuarios. En la barra de herramientas  seleccionar "Nuevo usuario".

Seleccionar "Crear un usuario nuevo" o "invitar usuario externo" según lo que nos interese.

**Dar acceso a directorio organizativo externo**

Para dar acceso a un directorio organizativo externo, hay que invitar al administrador del otro directorio organizativo y darle autorización. Para ello sigue los pasos del punto anterior "Gestionar autorización a través de Entra ID".

El administrador del directorio organizativo externo nos tiene que pasar el ID de inquilino de su directorio (tentant ID) y es el que debemos configurar en la lanzadera en el siguiente punto.

Una vez dado acceso, la gestión de usuarios con acceso a hacer *login* en vLanzadera queda del lado del directorio externo.

**Configuración de vLanzadera**

Acceder a Proveedores > Microsoft Entra ID e ir a la pestaña **Variables de proveedor**.

* **ALTA\_AUTOMÁTICA\_USUARIOS**: darle valor 1 para activarla. Al hacerlo, un usuario que acceda por este método de login, creará un usuario de vAdmin aunque no exista. Si está desactivado, hay que crear previamente el usuario en vAdmin con un email que coincida con el del usuario para que pueda acceder. Se recomienda activar solamente si se trabaja con Directorios organizativos. No se recomienda si creas una aplicación que permita cuentas personales.
* **CLIENT\_ID**: obtener del panel de la aplicación creada de Entra ID.
* **CLIENT\_SECRET**: obtener del panel de la aplicación creada de Entra ID.
* **GRUPO\_VADMIN**: en el caso de activar el alta automática, el nombre del grupo al que se va a agregar el usuario.
* **REDIRECT\_URI**: Url de la vLanzadera. Debe de coincidir exactamente con el que se ha configurado en el panel de la aplicación creada en Entra ID.
* **TENANT\_ID**: identificador del directorio organizativo (ID de inquilino). Si es para directorios organizativos externos (o externos + cuentas personales), deben de proporcionar este dato como se ha indicado en el apartado de “Dar acceso a directorio organizativo externo”. Si es exclusivamente para cuentas personales, poner el valor de “consumers”.

### Creación de nuevo proveedor&#x20;

Esta parte es opcional. Solo será necesaria si queremos añadir algún nuevo proveedor oAuth o crear nuestro propio sistema de login.&#x20;

La creación de un nuevo proveedor de autenticación requiere añadir programación.&#x20;

Un nuevo proveedor implica que aparezca un botón nuevo para autenticarse en vLanzadera.&#x20;

Desde el registro de proveedor nuevo, puedes añadir código JavaScript para el "onClick" del botón y código para gestionar el comportamiento de Velneo vServer en el "script backend".

#### Script on click

En este campo se escribe código JavaScript que se va a ejecutar en el navegador. La librería de jquery ya está cargada, por lo que se puede usar en este script.

Antes de ejecutar el script, se busca texto que coincida con los nombres de las variables de proveedor y se sustituye por el valor. Se recomienda utilizar la nomenclatura `%%NOMBRE_VARIABLE%%`.

Es importante que, tras hacer todo lo que se desee, el flujo termine en una redirección al host de la vLanzadera con el parámetro `state={"prov": “nombreDeProveedor”}`

En el caso de un proveedor de tipo Oauth, la redirección se debe hacer a la pantalla de login del proveedor. Es importante pasarle el parámetro *state* con el nombre del proveedor y otro parámetro *redirect\_uri* que sea el host de vLanzadera. El proveedor de Oauth, tras el login con éxito del usuario, hará una redirección a la *redirect\_uri* conservando el *state* que le pasamos al principio.&#x20;

#### Script backend&#x20;

En este campo se escribe código JavaScript que se va a ejecutar en Velneo vServer, por lo que no hay acceso al DOM ni a Jquery, pero se tiene acceso a la API de Velneo para JavaScript.

Cualquier petición *get* con el parámetro `state={“prov”, “nombreDeProveedor”}`, buscará un proveedor con el nombre "nombreDeProveedor" y ejecutará el script definido en ese registro.

Si se han declarado variables `%%NOMBRE_VARIABLE%%`, en el ámbito de este JavaScript están ya declaradas las variables `NOMBRE_VARIABLE` (Quitando los %).

Tras la ejecución del script, vLanzadera espera que se haya declarado una variable resultado de tipo objeto. Este objeto debe tener las siguientes claves:

* Obligatorios:
  * exitoLogin: booleano. Si vale true, permite el acceso a la lanzadera.
  * email: cadena. En caso de que haya habido éxito en el login, la lanzadera buscará al usuario con este email para loguearle.
* Opcionales:
  * access\_token: cadena. Si el proveedor es de tipo Oauth, se guardará para la sesión del usuario este valor.
  * refresh\_token: cadena. Si el proveedor es de tipo Oauth, se guardará para la sesión del usuario este valor.
  * state: aquí se puede guardar toda la información adicional que se desee para la sesión del usuario.&#x20;
  * Error message: cadena. Mensaje que aparecerá en la vLanzadera para darle información al usuario.&#x20;
  * Error code: Numérico. Código de error que aparecerá en el mensaje. Se recomienda usar un código superior a -1000.

#### Script comprobar sesión

En este campo se escribe el código JavaScript que se va a ejecutar en Velneo vServer una vez que ya hay una sesión válida activa. Se ejecuta cada vez antes de dar como respuesta páginas que requieren estar autenticado.

Al igual que en los scripts anteriores, hay un objeto previamente declarado y accesible desde el contexto del script llamado "resultado".

* resultado.exitoLogin: Booleano que indica si la sesión sigue siendo válida. Es responsabilidad de este script hacer todas las comprobaciones requeridas antes de poner esta variable a true.
* resultado.errorMessage: En caso de que el login no tenga éxito, el texto del error.
* resultado.errorCode: En caso de que el login no tenga éxito, el código del error para facilitar las tareas de depuración futuras.
* resultado.logs: Array donde se pueden insertar strings. Si la lanzadera tiene el modo depuración activado, estos logs aparecerán por consola.

Al igual que en el script backend, las variables de proveedor declaradas entre doble '%', también estarán disponibles en el contexto sin las doble '%'.

#### Restaurar configuración inicial

Es posible o bien restaurar la configuración inicial de un único proveedor, o restaurar la configuración inicial de proveedores de la aplicación. Para lo primero, editaremos el proveedor y pulsaremos el botón **Restaurar**. Para lo segundo, pulsaremos el botón![](/files/UZ8ZnsywgNWlVvkLdd7H)de la barra de herramientas del menú de proveedores.

## Estáticos

Aquí están definidos el html y css de la lanzadera de modo que se puedan editar y personalizar.

{% hint style="warning" %}
vLanzadera, por limitaciones de seguridad, no puede mostrar elementos de otro dominio.
{% endhint %}

### Restaurar configuración inicial

Es posible o bien restaurar la configuración inicial de un único registro de estáticos, o restaurar la configuración inicial de todos los estáticos de la aplicación. Para lo primero, editaremos el registro y pulsaremos el botón **Restaurar** del formulario. Para lo segundo, pulsaremos el botón![](/files/UZ8ZnsywgNWlVvkLdd7H)de la barra de herramientas del menú de estáticos.

## Modos de acceso

En esta pantalla se pueden configurar urls que cambian cómo el usuario accede a la aplicación, posibilitando acceder sin login o acceder a una aplicación directamente sin seleccionarla desde la lanzadera.

Cada registro, al configurarlo genera una url de modo. Los parámetros disponibles son:

* **Nombre**: Para facilitar la identificación del modo al administrador de la vLanzadera
* **Modo de acceso**:
  * Modo 1 - Usuario e instancia fijos: Acceso anónimo a una aplicación.
  * Modo 2 - Usuario fijo: Acceso anónimo a la lanzadera de aplicaciones.
  * Modo 3 - Instancia fija: Acceso con *login* a una aplicación.
* **Instancia**: Configurable en los modos 1 y 3. Selecciona la aplicación que se ejecutará al abrir la url.
* **Nombre de usuario**: Configurable en modos 1 y 2. Usuario que internamente la lanzadera utilizará para ejecutar la aplicación.
* **Contraseña de usuario**: Configurable en modos 1 y 2. Contraseña del usuario.
* **Location/virtual host**: puede ir en blanco en caso de que se haya configurado el **rewriterule** para servir la lanzadera en la raíz del host. En caso contrario estableceremos **auth**.
* **Url de modo**: URL para ejecutar el modo en un navegador. Se genera automáticamente tras configurar el modo. La URL cambia si se hacen cambios en la configuración.
* **Url de retorno**: Configurable en modos 1 y 3. Al no haber lanzadera de aplicaciones a la que redirigir, en esta opción se permite configurar una url a la que se desea redireccionar al usuario si este lanzara una acción "Archivo: Salir".

## Conectarse a la lanzadera vía web

Para acceder vía web a la lanzadera usaremos la url que se indica en la sección [Apache](/velneo-cloud/panel-de-control-vserver-cloud/apache) en el [panel de control cloud](/velneo-cloud/panel-de-control-vserver-cloud) del servidor.

Cuando desde la lanzadera lancemos una aplicación en Web o una URL externa, ésta será abierta en una nueva pestaña del navegador, de este modo dejaremos libre la lanzadera para seguir abriendo otras aplicaciones.

## Lanzar vClient de escritorio desde vLanzadera

### Windows

Requisitos previos:

* Descargar [Velneo vClient](/velneo-vclient/que-es-velneo-vclient).
* Instalar Velneo vClient.

### Linux

Requisitos previos:

* Decargar Velneo vClient.
* Ejecutar vClient.sh descargado al menos una vez (con que salga la ventana de conexión es suficiente).

En *Chrome* escribir una ruta válida del tipo:

`velneo-run://vatps://usuario:pass@host:puerto/instancia`

{% hint style="warning" %}
Si escribimos la url y pulsamos la tecla intro, hará la búsqueda. Se debe hacer clic en la segunda opción del combo que aparece:

![](/files/ynkU3YfR8qf5SuRBGPdt)
{% endhint %}

### macOS

Requisitos previos:

* Decargar Velneo vClient.
* Ejecutarlo al menos una vez (con que salga la ventana de conexión es suficiente).

En *Chrome* escribir una ruta válida del tipo:

`velneo-run://vatps://usuario:pass@host:puerto/instancia`

{% hint style="warning" %}
Si escribimos la url y pulsamos la tecla intro, hará la búsqueda. Se debe hacer clic en la segunda opción del combo que aparece:

![](/files/ynkU3YfR8qf5SuRBGPdt)
{% endhint %}

## Nota importante

Pueden ocurrir problemas de *cross-origin* en procesos ejecutables en Web cuando tenemos la Lanzadera configurada.

Cuando se tiene una instalación de vModApache con la vLanzadera, otros *location*/*virtualhost* pueden dar error de *cross-origin* al intentar acceder a recursos de otros dominios. Esto se debe a que hay una cabecera (`Cross-Origin-Embedder-Policy="require-corp"`) de Apache que es necesaria para el funcionamiento de vLanzadera que impide el uso de recursos externos.

Con la directiva ***Rewriterule*** se puede declarar un patrón de urls a las que le quieres cambiar la cabecera de Apache. Por ejemplo, si en el location apih, instancia verp\_app\_app, queremos ejecutar en Web el proceso mi\_proceso.pro podemos poner lo siguiente:

```
RewriteEngine On
RewriteCond %{THE_REQUEST} \s/apih/verp_app_app/mi_proceso.pro?[\s?] [NC]
RewriteRule ^ - [E=MYENV1:1]
Header set Cross-Origin-Embedder-Policiy "unsafe-none" env=MYENV1
```


# Configuración de vLanzadera en Apache en el Cloud de Velneo

## Apache

La configuración se establece en el fichero /apache2/001-default-ssl.conf del servidor cloud.&#x20;

Podremos editarlo conectándonos con el servidor cloud vía [sftp](/velneo-cloud/explorador-de-archivos-cloud-sftp).

Lo primero que tenemos que asegurarnos es que la línea:

&#x20;`Include /etc/apache2/conf-available/vlanzadera.conf`&#x20;

esté presente al final de nuestro fichero de configuración de Apache. Si no lo está, añadirlo antes de la etiqueta \</VIRTUALHOST>.

Debe quedar algo como sigue:

{% code lineNumbers="true" %}

```apacheconf
Include /etc/apache2/conf-available/vlanzadera.conf
</VirtualHost>
```

{% endcode %}

Ahora tenemos que crear el *location* para la aplicación que hemos instalado en el punto anterior. Dentro de la sección *VirtualHost*, debemos tener algo similar a esto:

{% code lineNumbers="true" %}

```apacheconf
<Location /auth>
setHandler velneo
#VelneoMode SERVER
Vrl vatps://user:pass@localhost:6900/VLANZADERA_APP
</Location>
```

{% endcode %}

### A tener en cuenta en la configuración de la instancia en Apache

El location tiene que llamarse obligatoriamente /auth.

Si tenemos más de un location declarado en Apache, el de la lanzadera debe ser el último.

El nombre de la aplicación debe ser el identificador de la instancia del proyecto de aplicación de vLanzadera:

![](/files/AJAbjBhNWEzbrcZ5pBrX)

El puerto a usar puede ser el indicado u otro, en función de los servicios contratados. Si tienes dudas puedes consultarlo con el personal de soporte de Velneo.&#x20;

La línea *VelneoMode* está comentada intencionadamente, porque esta aplicación **NO FUNCIONA** en ese modo.

El usuario debe ser un [usuario](/velneo-vadmin/gestion-de-usuarios#usuarios) declarado en ese servidor y que tenga privilegios de [supervisor](/velneo-vadmin/gestion-de-usuarios#supervisor).

Puedes añadir dentro de la directiva *Directory* del *Virtual host* una redirección para que la vLanzadera se sirva desde la raíz de nuestro sitio. Debería quedar algo similar a esto:

{% code lineNumbers="true" %}

```apacheconf
<Directory /home/${USERNAME}/apache2/html/>
        Options FollowSymLinks
        AllowOverride All
        Require all granted

        # Para la redirección de la lanzadera de /* a /auth/*
        RewriteEngine On
        RewriteRule ^/?$ /auth?%{QUERY_STRING} [NC,L]
</Directory>
```

{% endcode %}

{% hint style="success" %}
Si en el servidor se reinicia alguna solución que está configurada en el fichero de configuración de Apache, debemos reiniciar Apache después.
{% endhint %}

Una vez realizados dichos cambios, reinicia el servicio de Apache desde tu [panel de Velneo Cloud](/velneo-cloud/panel-de-control-vserver-cloud).

## vServer

La lanzadera utiliza [JWT](https://jwt.io/introduction) para intercambiar información con el servidor. Para garantizar y securizar el intercambio de información entre la lanzadera y Velneo vServer, es necesario especificar una clave JWT en el registro de Velneo vServer.

Para ello, en Velneo Cloud es tan sencillo como conectarse por [sftp](/velneo-cloud/explorador-de-archivos-cloud-sftp) y editar el fichero `.config/Velneo/vServer.conf`.&#x20;

Si no la tenemos ya, añadir una línea que contenga la propiedad:

`jwtKey=TU_CLAVE_JWT_DE_32`

La clave JWT debe tener una longitud mínima de 32 caracteres.

De forma opcional, se puede configurar un parámetro de tiempo de validez del token.&#x20;

`jwtExpiredSeconds=NUMERICO_SEGUNDOS`

Por seguridad el servidor solo aceptará el token generado por la lanzadera durante los siguientes jwtExpiredSeconds segundos más 60 segundos de cortesía por si hay desviación de la hora entre el cliente y el servidor.

Si no se configura el parámetro tendrá un valor por defecto de 60 segundos.

{% hint style="danger" %}
Por temas de seguridad, la clave JWT solo debe ser conocida por el administrador.
{% endhint %}


# Configuración de vLanzadera en Apache en servidores propietarios

En esta guía se detallan los pasos para configurar [Velneo vModApache](/velneo-vmodapache/que-es-velneo-vmodapache) y la [vLanzadera](/aplicacion-vlanzadera-y-login-social) para que funcione en servidores propietarios en plataformas Windows o Linux.

## Paso 1 - Instalación de Apache

{% hint style="warning" %}
Es requisito obligatorio instalar Apache en la misma máquina donde tengamos instalado Velneo vServer.
{% endhint %}

### Windows

Recomendamos el uso de[ Apache Haus](https://www.apachehaus.com/) para seguir esta documentación, ya que las sendas y cambios que se indican en esta documentación son para esta distribución de Apache Haus. Si usas Apache de otra manera, tendrás que adaptar las indicaciones de la documentación a la distribución que utilices.

Consulta con un experto en despliegue Web para problemas que puedas encontrar en la instalación y despliegue de Apache.

En la[ página de descargas](https://www.apachehaus.com/cgi-bin/download.plx) descargar la versión con OpenSSL1.1.1 e importante, la versión x64.

Al descomprimir el zip, obtenemos un directorio que tiene un readme\_first.html con la documentación de Apache Haus (recomendamos leerlo) y un directorio de Apache24.

Para facilitar la configuración, recomendamos renombrar el directorio de "Apache24" a "apache2" y moverlo al *homepath* del usuario del servicio vatp que, si está asociado a la cuenta de sistema local, está ubicado en:

`C:\Windows\System32\config\systemprofile`

Editar el fichero:

`C:\Windows\System32\config\systemprofile\apache2\conf\httpd.conf`

Buscar la línea con el siguiente código:

`Define SRVROOT "Apache24"`

Y sustituirlo por:

`Define SRVROOT "C:/Windows/System32/config/systemprofile/apache2"`

Abrir en una terminal cmd o powershell como administrador (click derecho sobre cmd o powershell y ejecutar como administrador) y poner los siguientes comandos:

```
cd C://Windows/System32/config/systemprofile/apache2/bin

.\httpd.exe -k install
```

Ahora ya tenemos Apache como servicio.

Abrimos el panel de servicios en Windows y debería haber un servicio llamado Apache2.X. Iniciamos el servicio.

En este punto habría que [obtener y configurar un certificado ssl para el dominio que se vaya a usar en el servidor](/velneo-vserver/instalacion-y-configuracion/parametros-configurables-de-velneo-vserver#incluir-un-certificado-tls-ssl-propio). A lo largo de esta documentación hacemos referencia a **mi-dominio**.

Para ello debemos hacer lo siguiente:

Alojar los ficheros del certificado en la carpeta:

`C:\Windows\System32\config\systemprofile\apache2\conf\ssl`

Editamos el fichero httpd-ahssl.conf dentro del directorio `C:\Windows\System32\config\systemprofile\apache2\conf\extra` y comprobamos que estén descomentadas las siguientes líneas:

```apacheconf
SSLCertificateFile "${SRVROOT}/conf/ssl/mi-dominio.crt"
SSLCertificateKeyFile "${SRVROOT}/conf/ssl/mi-dominioi.key"
```

En el que sustituiremos "mi-dominio.crt" y "mi-dominioi.key" por los nombres de ficheros de certificado y clave de nuestro propio certificado.

También debemos editar la línea:

```apacheconf
ServerName localhost:443
```

Y reemplazarla por:

```apacheconf
ServerName mi-dominio:443
```

Reinicia el servicio de Apache.

Para probar que hasta este punto está todo correcto, probar a cargar **<https://mi-dominio>** (es importante que sea https). Si hasta este punto está todo correcto te debería de cargar la página de bienvenida de Apache.&#x20;

{% hint style="warning" %}
Recomendamos no continuar con los siguientes pasos hasta que no se cumpla esta validación.
{% endhint %}

Eliminamos el siguiente directorio:

`C:\Windows\System32\config\systemprofile\apache2\htdocs`

Creamos el siguiente directorio:

`C:\Windows\System32\config\systemprofile\apache2\html`

Dentro creamos un fichero llamado **index.html** y le agregamos un contenido cualquiera. Por ejemplo: "Hola mundo".

Editamos el fichero:

`C:\Windows\System32\config\systemprofile\apache2\conf\httpd.conf`&#x20;

Y hacemos la siguiente modificación:

Sustituir:

```apacheconf
DocumentRoot "${SRVROOT}/htdocs"
<Directory "${SRVROOT}/htdocs">
```

Por:

```apacheconf
DocumentRoot "C:/Windows/System32/config/systemprofile/apache2/html"
<Directory "C:/Windows/System32/config/systemprofile/apache2/html">
```

Editamos el fichero:

`C:\Windows\System32\config\systemprofile\apache2\conf\extra\httpd-ahssl.conf`&#x20;

Y hacer la siguiente modificación:

Sustituir:

```apacheconf
DocumentRoot "${SRVROOT}/htdocs"
```

Por:

```apacheconf
DocumentRoot "C:/Windows/System32/config/systemprofile/apache2/html"
```

Sustituir:

```apacheconf
<Directory "${SRVROOT}/htdocs">
```

Por:

```apacheconf
<Directory "C:/Windows/System32/config/systemprofile/apache2/html">
```

Reiniciar el servicio de Apache2 y acceder a **<https://mi-dominio>**.

{% hint style="info" %}
Ahora en vez de mostrar la página de bienvenida de Apache, debe mostrar el contenido que has puesto en el fichero de index.html. Si es así, puedes continuar con el siguiente paso.<br>
{% endhint %}

### Linux

Esta documentación ha sido elaborada tomando como base la distribución de Ubuntu 20. Si usas otro distribución operativo tendrás que adaptar la configuración en caso de que la estructura de directorios no sea la misma.

En primer lugar abrir una terminal y actualizar el repositorio de aplicaciones ejecutando el comando:

`$sudo apt update`

A continuación instalar Apache2 con el comando:

```
$sudo apt install apache2
$sudo a2dismod mpm_event
$sudo a2enmod mpm_worker
$systemctl restart apache2
```

Comprobar que se ha creado el siguiente directorio:

`/etc/apache2`

A continuación vamos a activar el SSL que es obligatorio para ejecutar Lanzadera y que funcione la ejecución Web.

```
$sudo a2dissite 000-default.conf
$sudo a2ensite default-ssl.conf
$sudo a2enmod ssl
$sudo service apache2 restart
```

En este punto habría que [configurar previamente un certificado ssl para el dominio que se va a usar](/velneo-vserver/instalacion-y-configuracion/parametros-configurables-de-velneo-vserver#incluir-un-certificado-tls-ssl-propio). En [el paso 1](#paso-1-instalacion-de-apache) hay indicaciones de como incluir los certificados en Apache. Según hemos indicado antes, en esta documentación suponemos que tenemos un certificado para un dominio llamado "mi-dominio".

Accede a **<https://mi-dominio>** (es importante que sea https) Si hasta este punto está todo correcto te debería de cargar la página de bienvenida de Apache.

A continuación, para el correcto funcionamiento de la vLanzadera en futuros pasos, hay que cambiar el **DocumentRoot** que por defecto viene en /var/www/html

Ejecutar el siguiente comando para editar la configuración:

`$sudo nano /etc/apache2/sites-enabled/default-ssl.conf`

Se abrirá un editor de texto. Buscar la línea que pone:

```apacheconf
DocumentRoot /var/www/html
```

Y sustituirla por:

```apacheconf
# Si se va a usar vServer con el usuario de linux velneo:
DocumentRoot /home/velneo/apache2/html

#Si se va a usar vServer con el usuario de linux root:
DocumentRoot /root/apache2/html
```

{% hint style="info" %}
En este paso, suponemos y recomendamos para seguir la documentación que el usuario de Linux que va a ejecutar el vServer es velneo. Si no es así, en la senda cambiar "velneo" por el nombre de usuario que corresponda. Para el usuario **root**, las rutas cambian como indicamos.
{% endhint %}

Editar el fichero de apache2.conf:

`$sudo nano /etc/apache2/apache2.conf`

Buscar la línea con lo siguiente:

```apacheconf
<Directory /var/www/>
```

Y cambiarla por:

```apacheconf
# Si usas el usuario velneo
<Directory /home/velneo/apache2/html>

# Si usas el usuario root
<Directory /root/apache2/html>
```

A continuación, hay que crear esa senda y crear un fichero html en ella:

```
# Si usas el usuario velneo
$sudo mkdir -p /home/velneo/apache2/html
$sudo touch /home/velneo/apache2/html/index.html

# Si usas el usuario root
$sudo mkdir -p /root/apache2/html
$sudo touch /root/apache2/html/index.html
```

Añadirle permisos de ejecución a la senda para que apache pueda acceder:

```
# Si usas el usuario velneo
$sudo chmod +x /home
$sudo chmod +x /home/velneo
$sudo chmod -R +x /home/velneo/apache2

# Si usas el usuario root
$sudo chmod +x /root
$sudo chmod -R +x /root/apache2
```

Editar el fichero de index:

```
# Si usas el usuario velneo
$sudo nano /home/velneo/apache2/html/index.html

# Si usas el usuario root
$sudo nano /root/apache2/html/index.html
```

Y escribir cualquier contenido, por ejemplo "Hola Mundo".

Reinicia Apache y vuelve a acceder a **<https://mi-dominio>**.

{% hint style="info" %}
Ahora en vez de mostrar la página de bienvenida de Apache, debe mostrar el contenido que has puesto en el fichero de index.html. Si es así, puedes continuar con el siguiente paso.
{% endhint %}

## Paso 2 - Instalación de vServer (servicio vatp)

### Windows

Revisar los [requerimientos de la versión](/velneo/requerimientos-de-velneo).

Sigue los pasos indicados en la documentación para [instalar vServer en Windows](/velneo-vserver/instalacion-y-configuracion#instalacion-en-windows).

Sigue los pasos de la documentación para [incluir un certificado ssl propio](/velneo-vserver/instalacion-y-configuracion/parametros-configurables-de-velneo-vserver#incluir-un-certificado-tls-ssl-propio) (recuerda que en este punto ya has puesto en marcha los certificados en Apache así que será configurar la misma senda de ambos ficheros en el servidor).

{% hint style="warning" %}
Es importante que tanto el vServer como el Apache respondan a través del mismo dominio (mi-dominio.com)
{% endhint %}

Una vez instalado Velneo vServer, hacer las siguientes comprobaciones:

* Al arrancar el servicio, comprueba desde el vAdmin los siguientes [mensajes](/velneo-vadmin/monitorizacion#mensajessiste):
  * Que el servicio vatp se ha arrancado correctamente con la licencia: busca en el log el mensaje de inicio similar a este: *"Servidor vatp de 64 bits iniciado con licencia \[....]. Versión: XX.X.X.XXXXX , Puerto: 690, Puestos de edición: X, Puestos de ejecución: X, Código de licencia: xxx-xxxx-xxx"*.
  * Comprueba el puerto vatp, lo necesitamos más adelante.
  * Busca en los mensajes de Velneo vAdim una entrada de inicio similar a la siguiente: *"Cifrado de VATPS activado, certificado ssl: xxxx. Válido hasta el xxxx"*.
  * Localiza el mensaje de *"Servidor websockets iniciado en puerto xxx"* Necesitamos el puerto más adelante.

### Linux

{% hint style="warning" %}
Para no tener problemas siguiendo la guía, recomendamos ejecutar Velneo vServer como servicio con un usuario llamado velneo en un puerto superior al 1024. Si lo ejecutas con otro usuario, deberás adaptar algunas instrucciones. Si decides ejecutar el vServer con root ten en cuenta que debes seguir las instrucciones para root y no para el usuario velneo.
{% endhint %}

Revisar los [requerimientos de la versión actual](/velneo/requerimientos-de-velneo). Realizar las configuraciones en la máquina e instalar librerías que falten.

Sigue los pasos de la documentación para [instalar vServer en Linux](/velneo-vserver/instalacion-y-configuracion#instalacion-en-linux).&#x20;

Sigue los pasos de la documentación para [incluir un certificado ssl propio](/velneo-vserver/instalacion-y-configuracion/parametros-configurables-de-velneo-vserver#incluir-un-certificado-tls-ssl-propio)&#x20;

Una vez instalado Velneo vServer, hacer las siguientes comprobaciones.

Una vez instalado Velneo vServer, hacer las siguientes comprobaciones:

* Al arrancar el servicio, comprueba desde el vAdmin los siguientes [mensajes](/velneo-vadmin/monitorizacion#mensajessiste):
  * Que el servicio vatp se ha arrancado correctamente con la licencia: busca en el log el mensaje de inicio similar a este: *"Servidor vatp de 64 bits iniciado con licencia \[....]. Versión: XX.X.X.XXXXX , Puerto: 690, Puestos de edición: X, Puestos de ejecución: X, Código de licencia: xxx-xxxx-xxx"*.
  * Comprueba el puerto vatp, lo necesitamos más adelante.
  * Busca en los mensajes de Velneo vAdim una entrada de inicio similar a la siguiente: *"Cifrado de VATPS activado, certificado ssl: xxxx. Válido hasta el xxxx"*.
  * Localiza el mensaje de *"Servidor websockets iniciado en puerto xxx"* Necesitamos el puerto más adelante.

## Paso 3 - Configuración de firewall y puertos

Para que el servidor funcione correctamente, es fundamental que los puertos utilizados estén habilitados en el sistema, especialmente si hay un firewall activo.

En concreto, deben estar abiertos:

* El **puerto principal de escucha del servidor**.
* El **puerto de WebSockets**, que es utilizado por Velneo Web.

Por norma, el puerto de Velneo Web se calcula tomando el puerto del servidor y **añadiendo un 9 al final**.\
Por ejemplo, si el servidor utiliza el puerto **690**, el puerto para Velneo Web será **699**.

Asegúrate, por tanto de que **ambos puertos estén abiertos** en la máquina donde se instala el servidor, para que este pueda iniciar todos sus servicios correctamente.

## Paso 4 - Instalación de vLanzadera

Ver el punto [Aplicación vLanzadera y login social](/aplicacion-vlanzadera-y-login-social#instalacion-de-vlanzadera).

Una vez instalada, al ejecutar la aplicación se abre el formulario principal que muestra, en caso de que los haya, una lista de errores a solucionar.

### Creación de clave para login con jwt

La lanzadera utiliza [JWT](https://jwt.io/introduction) para intercambiar información con el servidor. Para garantizar y securizar el intercambio de información entre la lanzadera y Velneo vServer, es necesario especificar una clave JWT en el registro de Velneo vServer.

En **Windows**, debemos crear dentro de la clave HKEY\_USERS.DEFAULT\Software\Velneo\vServer una entrada de tipo cadena llamada **jwtKey** y establecer la clave que queramos usar.

En **Linux**, debemos editar el fichero vServer.conf y, si no la tenemos ya, añadir una línea que contenga la propiedad:

`jwtKey=TU_CLAVE_JWT_DE_32`

{% hint style="warning" %}
La clave JWT debe tener una longitud mínima de 32 caracteres.
{% endhint %}

De forma opcional, se puede configurar un parámetro de tiempo de validez del token.&#x20;

`jwtExpiredSeconds=NUMERICO_SEGUNDOS`

Por seguridad el servidor solo aceptará el token generado por la lanzadera durante los siguientes jwtExpiredSeconds segundos más 60 segundos de cortesía por si hay desviación de la hora entre el cliente y el servidor.

Si no se configura el parámetro tendrá un valor por defecto de 60 segundos.

{% hint style="danger" %}
Por temas de seguridad, la clave JWT solo debe ser conocida por el administrador.
{% endhint %}

Asegúrate de reinciar Velneo vServer tras la configuración. Si la configuración no se hace correctamente, aparece un error en el formulario de inicio de vLanzadera con el siguiente mensaje:

> Para hacer login con la vLanzadera es necesario que esté definida una clave jwt. Consulta la documentación. La vLanzadera devolverá un error -1 si se intenta utilizar en este estado.

#### Posibles errores

> Error al crear directorio /senda/directorio

Si al abrir vLanzadera hay un error "Error al crear directorio /senda/directorio", quiere decir que en el paso 1 no hemos creado correctamente los directorios, o que estos no tienen los permisos necesarios y vServer no puede acceder. Verifica que todas las instrucciones del paso 1 se han seguido correctamente.

> Error descarga: senda/fichero

Si al abrir vLanzadera hay un error de “Error descarga: senda/fichero” quiere decir que en el paso 1 no hemos creado correctamente los directorios, o que estos no tienen los permisos necesarios y vServer no puede acceder. Verifica que todas las instrucciones del paso 1 se han seguido correctamente. Continúa con el siguiente paso cuando la vLanzadera no muestre errores en el formulario de inicio.

## Paso 5 - Instalación y configuración de vModApache

Sigue los [pasos de la documentación de vModApache para instalarlo y configurarlo](/velneo-vmodapache/instalacion-y-configuracion-vmodapache).

[Configura una directiva location ](/velneo-vmodapache/instalacion-y-configuracion-vmodapache#declaracion-de-una-directiva-location)para cargar vLanzadera, donde la "senda\_base” indicada en la documentación debe ser "/auth" y apuntar a la instancia de vLanzadera creada en [el paso 3](#paso-3-instalacion-de-vlanzadera).

### Windows

En C:\Windows\System32\config\systemprofile\apache2\conf\extra\httpd-ahssl.conf, dentro del bloque **Virtualhost** y antes del cierre de etiqueta de virtualhost:

```apacheconf
<Location /auth>
		SetHandler velneo
		#VelneoMode SERVER
		Vrl vatps://usuario:contraseña@servidor[:num_puerto]/id_instancia
	</Location>
</Virtualhost>
```

### Linux

En /etc/apache2/sites-enabled/default-ssl.conf, dentro del bloque Virtualhost y antes del cierre de etiqueta de virtualhost:

```apacheconf
	<Location /auth>
		SetHandler velneo
		#VelneoMode SERVER
		Vrl vatps://usuario:contraseña@servidor[:num_puerto]/id_instancia
	</Location>
</Virtualhost>
```

{% hint style="info" %}
Continúa con el siguiente paso cuando al arrancar apache2, puedas ver un enganche que pertenece a vModApache a la instancia de vLanzadera. Al desconectar el servicio debería de desconectarse el enganche.
{% endhint %}

## Paso 6 - Configuración adicional de apache para la vLanzadera

Crear un fichero vLanzadera.conf en la siguiente ruta:

```
# Windows
C:/Windows/System32/config/systemprofile/apache2/conf/extra

# Linux
/etc/apache/conf-available
```

Añadir el siguiente contenido al fichero:

```apacheconf
Header add Cross-Origin-Embedder-Policy: require-corp
Header add Cross-Origin-Opener-Policy: same-origin
Header set Cache-Control: "max-age=1800"

AddType application/wasm wasm

<IfModule mod_headers.c>
        RewriteEngine On
        #LogLevel alert rewrite:trace6
        # Serve gzip compressed CSS and JS files if they exist
        # and the client accepts gzip.
        RewriteCond "%{HTTP:Accept-encoding}" "gzip"
        RewriteCond "%{DOCUMENT_ROOT}/%{REQUEST_FILENAME}\.gz" -s
        RewriteRule "^(.*)\.(css|js)"         "$1\.$2\.gz" [QSA]


        # Serve correct content types, and prevent mod_deflate double gzip.
        RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1]
        RewriteRule "\.js\.gz$"  "-" [T=text/javascript,E=no-gzip:1]

        <FilesMatch "(\.js\.gz|\.css\.gz)$">
                # Serve correct encoding type.
                Header append Content-Encoding gzip


                # Force proxies to cache gzipped &
                # non-gzipped css/js files separately.
                Header append Vary Accept-Encoding
        </FilesMatch>
        
        # Serve brotli compressed wasm files if they exist
        # and the client accepts brotli.
        RewriteCond "%{HTTP:Accept-encoding}" "br"
        RewriteCond "%{DOCUMENT_ROOT}/%{REQUEST_FILENAME}\.br" -s
        RewriteRule "^(.*)\.(wasm)"         "$1\.$2\.br" [QSA]

        # Serve correct content types, and prevent mod_deflate double gzip.
        RewriteRule "\.wasm\.br$"  "-" [T=application/wasm,E=no-gzip:1]

        <FilesMatch "(\.wasm\.br)$">
                # Serve correct encoding type.
                Header append Content-Encoding br
                Header append Vary Accept-Encoding
        </FilesMatch>
</IfModule>
```

### En windows

Editar `C:\Windows\System32\config\systemprofile\apache2\conf\httpd.conf`

Localiza y descomenta las siguientes líneas:

```apacheconf
#LoadModule headers_module modules/mod_headers.so
```

```apacheconf
#LoadModule rewrite_module modules/mod_rewrite.so
```

Modifica el fichero `C:\Windows\System32\config\systemprofile\apache2\conf\extra\httpd-ahssl.conf`, y al final, antes de la directiva añade un **include** al fichero vLanzadera.conf quedando de la siguiente manera:

```apacheconf
...
	Include "C:/Windows/System32/config/systemprofile/apache2/conf/extra/vLanzadera.conf"
</VirtualHost>
```

Reinicia el servicio de apache2.

A continuación hay que añadir un ***RewriteRule*** para que el sitio raíz (el que devuelve el index.html del “Hola mundo”) responda con vLanzadera. Para ello editamos el fichero `C:\Windows\System32\config\systemprofile\apache2\conf\extra\httpd-ahssl.conf` y buscamos el siguiente bloque:

```apacheconf
<Directory "C:/Windows/System32/config/systemprofile/apache2/html">
	Options Indexes Includes FollowSymLinks
	AllowOverride AuthConfig Limit FileInfo
  Require all granted
</Directory>
```

Y le añadimos el ***rewrite rule*** para que quede de la siguiente manera:

```apacheconf
<Directory "C:/Windows/System32/config/systemprofile/apache2/html">
	Options Indexes Includes FollowSymLinks
	AllowOverride AuthConfig Limit FileInfo
  	Require all granted
  	# Para la redirección de la lanzadera de /* a /auth/*
  	RewriteEngine On
  	RewriteRule ^/?$ /auth?%{QUERY_STRING} [NC,L]	
</Directory>
```

{% hint style="warning" %}
Para comprobar que de momento tenemos todo correcto, debemos reiniciar Apache y luego verificar que, **<https://mi-dominio>** ahora debe devolver lo mismo que **<https://mi-dominio/auth>**.
{% endhint %}

### En linux

Ejecutar los siguientes comandos:

```
$sudo a2enmod rewrite
$sudo a2enmod headers
```

Edita el fichero `/etc/apache2/sites-enabled/default-ssl.conf` e inserta lo siguiente al final del documento antes de la etiqueta de cierre de \</VirtualHost> de modo que quede así:

```apacheconf
...
	Include /etc/apache2/conf-available/vLanzadera.conf
</VirtualHost>
...
```

Reinicia el servicio de Apache:

`$sudo service apache2 restart`

{% hint style="warning" %}
En este punto, al cargar **<https://mi-dominio/auth>**, debería aparecerte una página en blanco, pero la pestaña debería tener el título de "Lanzadera".
{% endhint %}

A continuación hay que añadir un RewriteRule para que el sitio raíz (el que devuelve el index.html del "Hola mundo") responda con vLanzadera. Para ello:

Editamos el fichero `/etc/apache2/apache2.conf` y buscamos el siguiente bloque:

```apacheconf
<Directory /home/velneo/apache2/html>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
```

Y le añadimos el RewriteRule quedando así:

```apacheconf
<Directory /home/velneo/apache2/html>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted

        # Para la redirección de la lanzadera de /* a /auth/*
        RewriteEngine On
        RewriteRule ^/?$ /auth?%{QUERY_STRING} [NC,L]
</Directory>
```

{% hint style="info" %}
Para comprobar que tenemos todo correcto, reiniciar Apache y entonces **<https://mi-dominio>** ahora debe devolver lo mismo que **<https://mi-dominio/auth>**.
{% endhint %}

En este punto, vLanzadera ya debería funcionar correctamente y ser capaz de ejecutar las aplicaciones en web. Si hay algún fallo, asegúrate de que no se ha cacheado una configuración incorrecta a lo largo del proceso limpiando la caché del navegador o probando con el modo incógnito.

## Configuración adicional para intranets

En intranets en las que no se vaya a hacer uso de Internet se han de descargar los recursos de Velneo Web desde [nuestra página de descargas](https://velneo.es/mivelneo/descargas/).

Se trata de un fichero comprimido que contiene una serie de carpetas y ficheros.&#x20;

El ese fichero comprimido se incluye el vin de vLanzadera, que en este punto ya tendremos instalado y hecha la configuración inicial.

La configuración adicional que debemos hacer es la siguiente:

1. Copiar del zip todo el contenido de la carpeta `assets-wasm/vLanzadera/35.0/assets/`
   1. En disco, borrar el contenido de la carpeta `apache2/html/35.0/assets` .
   2. Pegar lo que hemos copiado del zip.
2. Copiar del zip todo el contenido de la carpeta `wasm-assets/vLanzadera/vLanzadera/35.0/assets`
   1. En el disco, borrar todo el contenido de la carpeta `apache2/html/vLanzadera/35.0/assets`
   2. &#x20;Pegar lo que hemos copiado del zip.
3. Copiar del zip todo el contenido de la carpeta `wasm-assets/vLanzadera/vLanzadera/assets`.
   1. En el disco, borrar todo el contenido de la carpeta `apache2/html/vLanzadera/assets`.
   2. &#x20;Pegar lo que hemos copiado del zip.
4. Ejecutar vLanzadera con Velneo vClient y en [estáticos](/aplicacion-vlanzadera-y-login-social#estaticos), editar los 3 registros, activar el check **personalizado** y reempalzar el código fuente de cada uno por el equivalente incluido en la carpeta `wasm-assets/vLanzadera/vLanzadera/estaticos`del zip.

## Proxy para redirigir el tráfico WSS al puerto 443

Por defecto, para *websockets* (necesarios para la ejecución web) se usa el puerto que tenga nuestro servidor + 9. Es decir, que si el puerto del servidor es el 690, para Websockets se usa el 699. En el caso de que queramos usar en su lugar el puerto estándar 443, será necesario realizar configuración adicional en Apache y en vLanzadera.

También será necesario [configurar el puerto 443 en el arranque del vServer](/velneo-vserver/instalacion-y-configuracion/parametros-configurables-de-velneo-vserver#configurar-puerto-de-escucha-para-velneo-web-wsport).&#x20;

Si usábamos un `RewriteRule` para usar la raíz del host para servir la lanzadera, hay que añadirle un RewriteCond: `RewriteCond %{HTTP:Upgrade} !=websocket [NC]` para que no aplique esa redirección a las peticiones wss. La directiva `<directory>` quedaría así  (se ha insertado la línea 8):

{% code lineNumbers="true" %}

```apacheconf
<Directory /home/${USERNAME}/apache2/html/>
        Options FollowSymLinks
        AllowOverride All
        Require all granted

        # Para la redirección de la lanzadera de /* a /auth/*
        RewriteEngine On
        RewriteCond %{HTTP:Upgrade} !=websocket [NC]
        RewriteRule ^/?$ /auth?%{QUERY_STRING} [NC,L]
</Directory>
```

{% endcode %}

Fuera de la directiva `<directory>` hay que declarar otro RewriteRule para redirigir las peticiones wss que llegan del puerto 443 al puerto vatp + 9 (699 en el ejemplo) y configurar el proxy inverso (se añaden las líneas 12 a 19) :

{% code lineNumbers="true" %}

```apacheconf
<Directory /home/${USERNAME}/apache2/html/>
        Options FollowSymLinks
        AllowOverride All
        Require all granted

        # Para la redirección de la lanzadera de /* a /auth/*
        RewriteEngine On
        RewriteCond %{HTTP:Upgrade} !=websocket [NC]
        RewriteRule ^/?$ /auth?%{QUERY_STRING} [NC,L]
</Directory>

RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/$ wss://localhost:699/$1 [P,L]

# Proxy inverso para manejar conexiones WSS
ProxyPreserveHost On
ProxyPass ^/$ wss://localhost:699/
ProxyPassReverse ^/$ wss://localhost:699/
```

{% endcode %}

Además, será necesario habilitar una serie de módulos adicionales en Apache.

En Windows se suelen configurarse en el fichero httpd.conf:

```apacheconf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
```

Para activarlos en Linux, en distribuciones como Ubuntu o Debian, podemos usar el comando `a2enmod`, que está diseñado para habilitar módulos de Apache:

```bash
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel
```


# ¿Qué es Velneo vDevelop?

Es un editor integrado. Es la herramienta de trabajo principal de Velneo.

Es el módulo de Velneo en el cual podremos programar las aplicaciones, mediante la creación, de forma independiente, de las estructuras de datos ([proyectos de datos](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos)) y de los objetos visuales ([proyectos de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion)).

Un único desarrollo será ejecutable en cliente-servidor, y además será multi-usuario, multi-tarea, multi-idioma y multi-plataforma.

Para saber cómo conectarnos a un servidor de Velneo con este componente consultar el capítulo [conexión con Velneo vServer](/velneo/funcionalidades-comunes/conexion-con-velneo-vserver).


# Identificación de usuario

La primera vez que ejecutemos Velneo vDevelop nos pedirá que nos identifiquemos; para ello debemos usar una cuenta de correo.

Recomendamos usar la cuenta de correo con la que estamos registrados en velneo.es y que esté asociada a nuestro nivel de suscripción ya que, una vez identificados, podremos acceder a las [extensiones](/velneo-vdevelop/extensiones-de-velneo-vdevelop) correspondientes a nuestro nivel de suscripción.

Una vez introducida la cuenta de correo, al aceptar nos pedirá que introduzcamos un código de confirmación, ese código lo recibiremos en nuestro buzón de correo. Recomendamos añadir la cuenta <velneo@velneo.com> en nuestra libreta de direcciones. Si pasado un tiempo no vemos el correo en nuestra bandeja de entrada, recomendamos revisar la lista de correo *spam* o sin registrar.

En la ventana donde se pide el código nos dará opción a cambiar de cuenta de correo por si nos hemos equivocado al introducirla en el paso anterior.

Una vez introducido el código, pulsamos el botón "Validar". Si el código es incorrecto el sistema nos avisará y nos permitirá introducirlo nuevamente. Si es correcto, el sistema avisará que ya estamos identificados y podremos empezar a trabajar con Velneo vDevelop. **Es necesario disponer de conexión a Internet para hacer la validación**.

Una vez identificado, Velneo vDevelop nos recordará en esa máquina y no será necesario que nos volvamos a identificar.

Si en algún momento queremos cancelar la identificación en esa máquina, no tendremos más que ejecutar la opción **Desconectar cuenta** del menú [Soluciones](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-soluciones) de Velneo vDevelop.


# Interfaz de Velneo vDevelop

En este capítulo explicaremos cuál es la función de cada uno de los paneles que componen el interfaz de Velneo vDevelop.&#x20;

Velneo vDevelop inicialmente se abre tal y como se muestra en la imagen siguiente:

![](/files/ijxhdL01nMKBSH8WaGh6)

A continuación pasamos a explicar cada uno de estos paneles.

## **1. Panel central**

En este panel es donde se irán abriendo una nueva pestaña por cada nuevo objeto que editemos que disponga de editor (formulario, rejilla, etc.). En el caso de que el objeto no tenga editor, se abrirá una vista en la que se mostrará el icono del objeto y su identificador.

Velneo vDevelop recuerda el flujo de edición, por lo tanto, cuando cerremos una ventana en el panel central éste volverá a la que se hubiese abierto en último lugar.

Cuando editamos un objeto se abre una pestaña en el panel central. Cuando en el panel central tenemos abiertas varias pestañas, al hacer clic en una se posicionará sobre el objeto en el dock de objetos del proyecto de [explorador de proyectos](#id-2.-explorador-de-proyectos).

Al arrancar Velneo vDevelop se muestra en él **la página de inicio**. Esta contiene una serie de secciones que pasamos a explicar a continuación.

### Crear

Contiene los siguientes accesos directos:

#### **Nueva solución...**

Nos permite crear una nueva [solución](/velneo-vdevelop/soluciones-y-proyectos).

#### Importador SQL

Lanza el [importador SQL](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-soluciones#importador-sql) de Velneo vDevelop.

### Aprender

Encontraremos enlaces relativos a formación.

#### **Novedades de la versión**

Abre la página de novedades de la versión de Velneo vDevelop que estamos usando.

#### Documentación

Abre la página inicial de la documentación de la versión de Velneo vDevelop que estamos usando.

#### Formación y seminarios

Abre la página de formación de Velneo.

#### Foros

Accede a los foros de Velneo.

En la sección inferior encontraremos, además las opciones y secciones siguientes:

#### Abrir solución...

Nos permitirá acceder a a la lista de soluciones del servidor para poder editar una. En el caso de que aún no os hayamos conectado con ningún servidor, el sistema nos pedirá las credenciales de acceso.

#### **Últimas soluciones abiertas**

Nos muestra una lista de las últimas soluciones que hemos abierto en Velneo vDevelop. Haciendo clic sobre una solución se cargará en Velneo vDevelop. Si aún no nos habíamos conectado al servidor, el sistema nos pedirá las credenciales de acceso.&#x20;

Si hemos [identificado nuestro usuario](/velneo-vdevelop/identificacion-de-usuario), esta lista la tendremos accesible desde cualquier máquina donde usemos Velneo vDevelop y estemos identificados.

Además, dispone de una opción de búsqueda que nos facilitará la localización de una solución en concreto cuando tenemos un gran número de soluciones en la lista.

Si queremos quitar una solución de la lista de últimas soluciones abiertas haremos clic en el enlace "Quitar" que se muestra a la derecha. Esta opción simplemente la quitará de la lista, no la borrará.

#### Mis servidores

Nos permitirá mantener una lista de los servidores con los que trabajemos habitualmente y darle un alias a cada uno de ellos.

Para crear un servidor no tenemos más que pulsa el botón + de la toolbar de la lista de servidores, podemos especificar:

* Alias que tendrá el servidor.
* Su VRL.
* El usuario con el que queramos conectarnos.

Una vez tengamos servidores en la lista, haciendo clic sobre la VRL de uno de ellos se procederá a la conexión con el servidor correspondiente.

Si queremos modificar un servidor de la lista (alias, VRL o usuario) no tendremos más que pulsar sobre la opción "Editar" que encontraremos a su derecha.

Si queremos quitar un servidor de la lista no tendremos más que pulsar sobre la opción "Quitar" que encontraremos a su derecha.

En la pestaña **últimas soluciones abiertas**, junto al nombre de la solución se muestra el alias del servidor a la que pertenece y su VRL. En el caso de que no lo tengamos añadido a esta lista, en lugar del alias se mostrará el texto "Añadir", haciendo clic sobre él no se permitrá agregar el servidor correspondiente a la lista.

Si hemos [identificado nuestro usuario](/velneo-vdevelop/identificacion-de-usuario), esta lista la tendremos accesible desde cualquier máquina donde usemos Velneo vDevelop y estemos identificados.

Además, dispone de una opción de búsqueda que nos facilitará la localización de un servidor en concreto cuando tenemos un gran número de servidores en la lista.

Esta información es guardada localmente para que, en el caso de que no tengamos conexión a Internet, podamos seguir disponiendo de ella. En ese caso el sistema no permitirá ni modificar ni editar la lista de mis servidores.

En título de la ventana de Velneo vDevelop se mostrará el nombre de la solución que estamos editando y el servidor al que estamos conectados.

## **2. Explorador de proyectos**

En este panel obtendremos los proyectos de la [solución](/velneo-vdevelop/soluciones-y-proyectos) con la que nos hayamos conectado, cargar/abrir uno y editar su contenido.

Incluye una toolbar desde la que podremos: editar las propiedades de la solución, crear nuevos proyectos (de datos y de aplicación), mover con el puntero del ratón los proyectos, establecer relaciones de herencia de modo visual, filtrar la herencia redundante (si un proyecto de forma directa hereda otro proyecto que es heredado de forma indirecta, mostrará solamente una de las relaciones, no ambas), imprimir el esquema de proyectos o enviarlo a un archivo pdf.

* En la pestaña Solución xxxxx se muestra un esquema de proyectos de la solución con la que nos hemos conectado y las relaciones entre ellos.
* En la pestaña Proyectos cargados se mostrarán los proyectos de la solución con la que nos hemos conectado pero en modo lista.

Si situamos el puntero del ratón sobre un proyecto y pulsamos el botón derecho del ratón para obtener su menú de contexto, éste contendrá las siguientes opciones: propiedades del proyecto, guardar proyecto, guardar y proteger proyecto y deshacer desprotección del proyecto.

Hacer doble clic sobre el proyecto que se desee editar.

Al editar un proyecto, se abrirá en esa misma vista un *dock* con los objetos del proyecto:

<figure><img src="/files/DFoI8CpMVFC5iLr5kTjF" alt=""><figcaption></figcaption></figure>

## 3. Inspectores

Se trata de una serie de utilidades que nos ayudarán a localizar objetos y errores de nuestros [proyectos](/velneo-vdevelop/proyectos-objetos-y-editores). Pincha [aquí ](/velneo-vdevelop/inspectores)para ampliar información sobre los mismos.

## 4. Panel de propiedades

Todas las propiedades de todos los objetos serán establecidas en este panel. Cuando se selecciona un objeto en el explorador de proyectos o se selecciona un sub-objeto en el panel central, en este panel de propiedades se mostrarán las propiedades específicas del mismo. El contenido de este panel, por tanto, es dinámico pues las propiedades disponibles dependerán del tipo de objeto que hayamos seleccionado.

Si pulsamos el botón derecho del ratón sobre el menú de propiedades, se presentará un menú de contexto con las opciones siguientes:

* **Anterior objeto editado**: nos permite navegar al objeto que haya sido editado con anterioridad. Si hacemos clic en el botón de la flecha situado junto a este icono, se desplegará una lista con todos los objetos editamos con anterioridad. Seleccionando uno, accederemos a él.
* **Siguiente objeto editado**: nos permite navegar al objeto que haya sido editado con posterioridad al objeto actual. Si hacemos clic en el botón de la flecha situado junto a este icono, se desplegará una lista con todos los objetos editamos posteriormente. Seleccionando uno, accederemos a él.
* **Editar el objeto de la propiedad**: esta opción se activará solamente si estamos situados sobre una propiedad que es resuelta por un objeto. Nos permitirá editar las propiedades de dicho objeto. Por ejemplo, si obtenemos este menú de contexto en el panel de propiedades de un formulario sobre la propiedad tabla enlazada, podremos editar las propiedades de la misma.

En el editor de informes y el de formularios podremos asignar una propiedad especifica para todos los controles que seleccionemos.

## 5. Panel de subobjetos

En este panel se muestran todos los subobjetos del objeto activo, agrupados por tipo.

Desde él podremos:

![](/files/-M7D787p9vIm-9KpkdV7) **añadir** un nuevo subobjeto. En el caso de que el objeto pueda contener varios tipos de subobjetos, este comando presentará un menú para que seleccionemos el tipo de subobjeto que queramos crear.

![](/files/-M7D787r_buqPxD__4ao)![](/files/-M7D787sht-c5NuBFMFp) **cambiar el orden** del subobjeto seleccionado en el panel.

![](/files/-M7D787tu4HMVJcDkAKv) **eliminar** el/los subobjeto/s seleccionados en el panel. También podemos borrarlos con la tecla `Supr`, pero sólo en el caso de que el objeto en el que estamos se encuentre abierto en su editor.

&#x20;![](/files/-MTKODFDmZZUloFHaHoi)**no usados**: esta opción selecciona los sub-objetos no usados, por ejemplo [variables locales](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/variable-local), [manejadores de evento](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/manejador-de-evento), etc. en el objeto en curso para que podamos borrarlos, si procede.

Además, haciendo doble clic sobre un subobjeto de este panel, editaremos sus propiedades en el [panel de propiedades](/velneo-vdevelop/interfaz-de-velneo-vdevelop#3-panel-de-propiedades).

Desde este panel podremos copiar, cortar y pegar sub-objetos.

Y esta interfaz es suficiente para poder trabajar con él: crear o abrir soluciones, editarlas, y etc. Pero también se pueden activar otros paneles, que explicaremos a continuación.

Podemos modificar tanto la disposición de los paneles como sus dimensiones y estos cambios serán “recordados” por Velneo vDevelop en las siguientes ejecuciones.

En el panel central, donde se carga la página de inicio, se anidarán diversos paneles:

**Panel del proyecto**: en él se presentarán todos los objetos del proyecto editado; objetos que podremos organizar en carpetas.

Es posible ordenar el contenido de una carpeta, para ello debemos seleccionarla y abrir el menú de contexto encontraremos las siguientes opciones:

Ordenar carpeta: ordena la carpeta en la que estamos posicionados, en orden alfabético de identificadores.

Ordenar carpeta con subcarpetas primero: ordena poniendo en primer lugar las subcarpetas que contenga la carpeta en curso.

Además, para aquellos objetos que incorporen editores (como por ejemplo rejillas, formularios, informes, procesos, etc.) en este panel central es donde se abrirán los mismos.

Es posible cambiar el color del texto de un objeto, para ello situar el puntero del ratón sobre el objeto, pulsar el botón derecho del ratón y seleccionar la opción **cambiar color**.

Si cambiamos un objeto de ubicación, se le quitará el color que tuviese asignado.

Si situamos el puntero del ratón sobre una pestaña y pulsamos el botón derecho del ratón, en el menú de contexto que se presenta encontraremos una opción que nos permitirá cerrar la pestaña actual y otro que nos permitirá cerrar todas las pestañas del panel central excepto la actual.

[Velneo vDevelop](/velneo-vdevelop/introduccion) además incluye los menús siguientes:

[Soluciones](/velneo-vadmin/gestion-de-aplicaciones/soluciones).

[Proyectos](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-proyectos).

[Objetos](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-objetos).

[Scripts](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-scripts).

[Edición](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-edicion).

[Ver](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-ver).

[Componentes](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-componentes).

[Ayuda](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-ayuda).


# Dock de proyecto

Cuando editamos un proyecto, se abre un *dock* que contiene todos los objetos del mismo:

<figure><img src="/files/vTrnEAzU6HEeLOF57CJW" alt=""><figcaption></figcaption></figure>

Los objetos podremos agruparlos en [carpetas](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-objetos#nueva-carpeta).

Si tenemos seleccionada una carpeta y pulsamos la tecla \*, se desplegará.&#x20;

Si pulsamos dos veces la tecla \*, se desplegará la carpeta y todas sus sucarpetas.

Podemos cambiar la ubicación de uno o varios objetos dentro del dock. Para seleccionar un único objeto haremos clic sobre él.&#x20;

Si queremos seleccionar un grupo de objetos seguidos, haremos clic en el primero y luego shift+clic sobre el último.

Si queremos seleccionar un grupo de objetos que no están seguidos lo haremos pulsando control + clic.

Una vez seleccionado/s el/los objetos, los arrastraremos hasta su nueva ubicación, éstos serán reubicados respetando el orden de selección.

Se trata de un *dock*, así que podemos desanclarlo de su ubicación para hacerlo flotante y moverlo a otra ubicación. Muy útil, por ejemplo, si trabajamos con dos pantallas para poder tener abierto el dock en una pantalla y el resto de Velneo vDevelop en otra.

En el caso de que queramos que los objetos del proyecto no se carguen en el *dock* y se muestren en el área centra de Velneo vDevelop, no tenemos más que cerrar el *dock* y ejecutar la opción Proyecto del menú Ver:

<figure><img src="/files/7wP0I2qUPCCQWwlH5Xl2" alt=""><figcaption></figcaption></figure>

Una ventaja de usar el *dock* de proyecto es que siempre tenemos a la vista la lista de objetos del mismo; si lo tenemos abierto en el panel central y editamos un objeto, se abrirá una pestaña encima, por lo que tendremos que volver a la anterior si queremos volver al contenido del proyecto para buscar otro objeto, por ejemplo.

El *dock* del proyecto incluye un buscador que nos permitirá localizar un objeto en base a la cadena que escribamos. El sistema buscará el dato escrito en las propiedades identificador y nombre de los objetos así como en el tipo de objeto. Por ejemplo, si escribimos la cadena "formul" nos devolverá todos los objetos de tipo formulario, formulario QML y además todos los que contengan l a cadena "formul" en su identificador o en su nombre, siendo posible combinar textos de los 3 datos.&#x20;

Debemos escribir el texto a buscar y pulsar la tecla intro o el botón para lanzar la búsqueda.

Los objetos encontrados se mostrarán de forma arbolada en su carpeta, incluyendo en el árbol todas las carpetas padre hasta llegar al nivel raíz.

Se expanden los 10 primeros objetos que encuentra y se posiciona en el primero de ellos.

El texto de la búsqueda ha de ser una [expresión regular](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/funciones-estandar/funciones-de-cadenas/expresiones-regulares) que buscará en todas las columnas.&#x20;

Podemos hacer búsquedas *or*, ejemplo `proceso|formulario` (devolverá todos los procesos y formularios) o *and*, ejemplo: `VTA.*proceso` (devolverá todos los procesos que tengan la cadena VTA en el identificador o en el nombre).

Cuando antes decíamos que busca "en todas las columnas" se refiere a que compone una única cadena con el contenido de todas las columnas y la búsqueda la hace sobre esa cadena. Ejemplo:

<figure><img src="/files/YIy4N2GTs8MfJnXd2PFG" alt=""><figcaption></figcaption></figure>

Lo que busquemos lo buscará en esta cadena: "ENT\_M\_ALT\_CMRNuevo comercialFormulario".

Por lo que es muy importante el orden en el que establezcamos los criterios de búsqueda. Si queremos buscar todos los formularios que tengan en el identificador la cadena "ENT\_M" la expresión a usar será: `ENT_M.*Formulario`  ya que buscará en cada ítem primero "ENT\_M" y luego "Formulario", con lo cual encontrará el ítem anterior: "**ENT\_M**\_ALT\_CMRNuevo comercial**Formulario**", pero si la establecemos a la inversa no encontrará nada.

Ejemplos:

`ENT_M .*formulario` devolverá todos los objetos cuyo identifcador contenga ENT\_M, sean de tipo formulario.

`[4]` devolverá todos los objetos que tengan un 4 en su identificador o nombre.

`ENT_M.*(formulario|rejilla)` Devolverá todos los objetos de tipo formulario o rejilla cuyo identificador contenga la cadena ENT\_M.

Velneo vDevelop recuerda las últimas búsquedas usadas así que, si queremos volver a usar una, no tendremos más que desplegar el combo del texto de búsqueda y seleccionarla.

{% hint style="warning" %}
Debemos tener en cuenta que en el panel se mostrará/n el/los objeto/s encontrados dentro de su carpeta por lo que, si borramos la carpeta borraremos todo su contenido, aunque no esté visible al mostrar el resultado de la búsqueda.
{% endhint %}


# Menú Soluciones

Este menú de Velneo vDevelop contiene las opciones siguientes:

## Conectar con servidor

(Control + O)

Permite conectarse con un [Velneo vServer](/velneo-vserver/que-es-velneo-vserver).

## Modificar contraseña

Permite cambiar la contraseña del usuario en el Velneo vServer con el que se ha conectado. Al ejecutarlo se presentará una ventana en la que tendremos que escribir la contraseña actual y la contraseña nueva con confirmación.

## Nueva solución…

(Control + Alt + K)

Para crear una nueva solución en el Velneo vServer con el que se está conectado. En el capítulo dedicado a las soluciones encontrarás información ampliada al respecto.

## Abrir solución…

Para abrir una solución del servidor con el que se está conectado. En el caso de que no estemos conectados con ningún servidor, el sistema lanzará la ventana de conexión con un Velneo vServer.

## Eliminar solución…

Permite borrar una solución del servidor con el que se está conectado. En el capítulo dedicado a las soluciones encontrarás información ampliada al respecto.

## Importar soluciones compartidas

Se trata de una opción que nos permite importar soluciones de servidores remotos. Antes de ejecutarla tendremos que conectarnos con Velneo vServer donde vamos a importar las soluciones. En el capítulo dedicado a las soluciones encontrarás información ampliada al respecto.

## Importador SQL

Se trata de una opción que está disponible en el menú **Soluciones** de Velneo vDevelop.

Esta opción dispara un asistente que permite replicar la estructura de una base de datos a la que accedemos a través de su driver ODBC. Se ha probado con los siguientes drivers:

Microsoft SQL Server (Win) (Cadena de conexión).\
Microsoft Access Driver (\*.mdb, \*.accdb) (Win) (DSN y cadena de conexión).\
Visual FoxPro (Win) con ficheros dbf (DSN).\
Microsoft dBase Driver (Win) (DSN).\
FileMaker (Win) (DSN y cadena de conexión).

MySQL Windows:\
MySQL ODBC 5.3 Ansi Driver (DSN y cadena de conexión).\
MySQL ODBC 5.3 Unicode Driver (DSN y cadena de conexión).\
MySQL 5.3 Driver Nativo.

MySQL Linux:\
MySQL ODBC 5.3 Ansi Driver (DSN).\
MySQL ODBC 5.3 Unicode Driver (DSN).\
MySQL 5.3 Driver Nativo.

MySQL Mac:\
MySQL ODBC 3.51 (Cadena de conexión).

No es funcional con los siguientes drivers:

Excel (no soportado en esta versión ya que requiere configuración adicional).

MySQL Mac:\
MySQL ODBC 5.3 Ansi Driver (no funciona correctamente, ya que retorna unicode erróneamente).\
MySQL ODBC 5.3 Unicode Driver (no carga la librería por problemas del driver).\
Easy Driver for Access (no funciona correctamente debido a que el driver es muy básico).

Desde nuestras aplicaciones de Velneo también podemos comunicarnos con bases de datos externas. Consultar los siguientes capítulos del manual para ampliar información al respecto: [Bases de datos externas](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/base-de-datos/bases-de-datos-externas) y [VSqlDataBase](/velneo-vdevelop/scripts/lenguajes/javascript/clases/vsqldatabase).

## Propiedades solución…

Permite editar las propiedades de la solución actual.

Los datos susceptibles de ser modificados serán el número de versión y la propiedad de compartida o no. Una solución compartida permitirá que sus proyectos puedan ser heredados por proyectos de otras soluciones.

Vista solución actual: esta opción abrirá el editor de soluciones en el panel central de Velneo vDevelop. En el capítulo dedicado a las soluciones encontrarás información ampliada al respecto.

## Vista de la solución actual

Esta opción abrirá en el panel central de Velneo vDevelop el editor de soluciones la solución actual. Ahí podremos ver los [proyectos](/velneo-vdevelop/proyectos-objetos-y-editores) que la componen y su [herencia](/velneo-vdevelop/herencia).

## Ejecutar la solución actual (F5)

Esta opción permite ejecutar la solución en curso. Para que ésta pueda ser ejecutada tendrán que cumplirse los siguientes requisitos:

* Debe estar instanciada. Si la solución que estamos editando no está instanciada, al ejecutar esta opción el sistema nos preguntará si queremos instanciarla, si respondemos afirmativamente, se iniciará el [asistente](https://doc.velneo.com/velneo-vdevelop/interfaz-de-velneo-vdevelop/pages/-M7D76t251TEvIC5C4BY#instanciación-de-aplicaciones) para su instanciación. Una vez cumplimentados todos los pasos, se procederá a su ejecución.
* La instancia debe tener asignado un identificador.
* El usuario con el que editemos deberá tener definidos permisos de acceso a la/s instancia/s correspondientes.

El comportamiento de esta opción depende de la configuración que establezcamos en la sub-opción [Configurar y ejecutar](#configurar-y-ejecutar-shift--f5), que explicamos a continuación.

Si no hemos guardado cambios nos preguntará si queremos guardarlos antes de ejecutarla.

### Configurar y ejecutar (Shift + F5)

Esta sub-opción nos permite configurar cómo se comportará el sistema cuando ejecutemos la solución que estamos editando en vDevelop.&#x20;

Al dispararla se presenta un diálogo con las opciones siguientes:

#### Lanzar el ejecutor

Nos permite configurar el modo de ejecución de la instancia de la solución. En el caso de que la solución contenga más de un proyecto instanciado o alguno de sus proyectos esté instanciado más de una vez, el sistema nos pedirá que seleccionemos la instancia que deseamos ejecutar. Los valores posibles son:

* **En escritorio**: es el valor por defecto. Ejecuta la instancia de la solución en curso con [Velneo vClient](/velneo-vclient/que-es-velneo-vclient) de escritorio.&#x20;

  Para que esto sea posible Velneo vDevelop necesita conocer la ubicación de Velneo vClient y para ello se guarda la senda del mismo en una clave del registro del sistema de Velneo vDevelop:

  * En **Windows** se guarda en la siguiente clave del registro:

    `HKEY_CURRENT_USER/Software/Velneo/vDevelop`, en el parámetro `vClientPath`.

    * En **Linux** se guarda en:

      `$HOME/USUARIO/.config/Velneo/vDevelop.conf`, en el parámetro `vClientPath`.
    * En **Mac** se guarda en:

      `/users/USUARIO/Library/Preferences/com.Velneo.vDevelop.plist`, en el parámetro `vClientPath`.
* **En Web**: ejecuta la instancia de la solución en curso con [Velneo vClient Web](/velneo-vclient-web).
* **No**: no ejecuta la instancia de la solución.
* **Modo debug**: esta sección estará activa solamente cuando tengamos configurada la ejecución con el vClient de escritorio. Los valores posibles son:
  * ***Sí***: la instancia se ejecutará en modo [depuración](/velneo-vdevelop/depuracion).
  * ***No***: es el valor por defecto. La instancia no se ejecutará en modo [depuración](/velneo-vdevelop/depuracion).

#### Reiniciar

Nos permite configurar si queremos reiniciar o no las instancias antes de ejecutarlas. Los valores posibles son:

* **Con herencia**: es el valor por defecto. Reinicia la solución y todas sus dependencias.
* **Sin herencia**: reinicia solo la solución actual.
* **No reiniciar**: ejecuta directamente sin reiniciar nada.

#### Expulsar enganches

En esta sección configuraremos cómo queremos que se comporte el sistema cuando la solución a ejecutar está siendo ejecutada por otros usuarios.

No estará disponible sin en el bloque anterior hemos seleccionado la opción **no reiniciar**.

&#x20;Los valores posibles son:

* **Solo los míos**: es el valor por defecto. Desconecta solo los enganches del usuario que está conectado a vDevelop.
* **Todos**: Desconecta los enganches de todos los usuarios que estén ejecutando la instancia.
* **Ninguno**: no desconecta ningún enganche.

## **Depurar la solución actual**

Esta opción permite ejecutar un proyecto de la solución anterior en modo [depuración](/velneo-vdevelop/depuracion). Para que el proyecto pueda ser ejecutado en modo depuración tendrán que cumplirse los siguientes requisitos:

El proyecto debe estar instanciado; en el caso de no estarlo el sistema nos permitirá instanciarlo desde Velneo vDevelop.

* La instancia debe tener asignado un identificador.
* El usuario con el que editemos deberá tener definidos permisos de acceso a la/s instancia/s correspondientes.
* No puede haber otros usuarios ejecutando la misma solución.
* El modo en el que ejecutemos la aplicación debe estar configurado como [Lanzar ejecutor en escritorio](#lanzar-el-ejecutor).

## **Otras soluciones abiertas**

Permite cambiar la solución actual por cualquiera de las otras soluciones que hayamos abierto previamente en la sesión actual de Velneo vDevelop.

## **Vista de todas las abiertas**

Esta opción abrirá en el panel central de Velneo vDevelop el editor de soluciones con todas las soluciones abiertas en la sesión actual de Velneo vDevelop. En el capítulo dedicado a las soluciones encontrarás información ampliada al respecto.

## **Últimas soluciones abiertas**

Despliega una lista de las últimas abiertas en Velneo vDevelop tanto en la sesión actual como en sesiones anteriores. Para cargar una bastará con seleccionarla en la lista.

## Desconectar cuenta

Permite desconectar la cuenta con la que nos hemos identificado previamente en el equipo donde tenemos instalado Velneo vDevelop.

Al ejecutar esta opción e vuelve a mostrar el cuadro de diálogo de identificación, en el caso de que no nos identifiquemos y cerremos Velneo vDevelop, si tenemos cambios pendientes de guardar en alguna solución, el sistema nos avisará y nos preguntará si queremos guardar los cambios.

## Salir de vDevelop

Cierra Velneo vDevelop.


# Menú Proyectos

Este menú de Velneo vDevelop contiene las opciones siguientes:

## **Nuevo proyecto de datos**

(Control + Alt + L)

Inicia el [asistente para la creación de un nuevo proyecto de datos.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos)

## **Nuevo proyecto de aplicación**

(Control + Alt + M)

Inicia el [asistente para la creación de un nuevo proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion).

## Abrir en edición todos los proyectos cargados

Esta opción abre en edición todos los proyectos que tenemos cargados en Velneo vDevelop.&#x20;

Cuando Velneo vDevelop tenemos cargadas montón de soluciones y proyectos y queremos hacer cambios en objetos de cualquiera de ellos, cuando buscamos a través de los inspectores, por ejemplo, al hacer clic en un objeto de otro proyecto no podemos editarlo si el proyecto ha sido abierto previamente.

Con esa opción evitamos, una vez cargados los proyectos, el tener que ir uno a uno abriéndolos manualmente cuando necesitemos modificar algún objeto.

Esta opción se adapta al modo claro u oscuro que se tenga configurado en el sistema.

## Propiedades del proyecto

(Control + Alt + M)

Edita las propiedades del proyecto actual.

## **Guardar proyecto**

(Control + S)

Guarda los cambios realizados en el proyecto y lo mantiene desprotegido para su edición para que podamos seguir trabajando con él. Es la opción de guardado por defecto disparable en la barra de herramientas de Velneo vDevelop.

{% hint style="warning" %}
Este comando no guarda el proyecto en [vVersion](/velneo-vversion/que-es-velneo-vversion).
{% endhint %}

## **Guardar todos**

(Control + Mayúsculas + S)

Guarda los cambios realizados en todos los proyectos editados de la solución actual los mantiene desprotegidos para su edición para que podamos seguir trabajando con ellos.&#x20;

{% hint style="warning" %}
Este comando no guarda los proyectos en [vVersion](/velneo-vversion/que-es-velneo-vversion).
{% endhint %}

{% hint style="info" %}
Cuando guardamos un proyecto, Velneo guarda en el directorio de la solución una copia del estado previo del mismo con extensión bak (ejemplo: 63ffjad23.vca.bak). Si por algún motivo, el fichero del proyecto se corrompe, por ejemplo, por un problema de disco, podremos recuperar la última versión guardada del mismo simplemente borrando el fichero y quitando la extensión .bak a la copia. Esto tendremos que hacerlo con el servicio vatp detenido.
{% endhint %}

## Guardar versión de la solución

Guarda los cambios realizados en todos los proyectos editados de la solución actual los mantiene desprotegidos para su edición para que podamos seguir trabajando con ellos y guarda la versión en [vVersion](/velneo-vversion/que-es-velneo-vversion).

{% hint style="info" %}
Cuando guardamos un proyecto, Velneo guarda en el directorio de la solución una copia del estado previo del mismo con extensión bak (ejemplo: 63ffjad23.vca.bak). Si por algún motivo, el fichero del proyecto se corrompe, por ejemplo, por un problema de disco, podremos recuperar la última versión guardada del mismo simplemente borrando el fichero y quitando la extensión .bak a la copia. Esto tendremos que hacerlo con el servicio vatp detenido.
{% endhint %}

## Deshacer desprotección del proyecto

(Control + Mayúsculas + Z)

Libera el proyecto para que pueda ser editado por otro usuario.

## Eliminar todos los puntos de interrupción

Los puntos de interrupción se crean en los procesos o en los manejadores de evento (tanto de como JavaScript) para su depuración. Esta opción lo que hace es eliminar todos los puntos de interrupción de todos los procesos y manejadores de evento de y de JavaScript del proyecto actual. Ver el capítulo [depuración ](/velneo-vdevelop/depuracion)del manual para ampliar información al respecto.

## Aplicar color de texto por defecto a rejillas

Funcional tanto en [rejillas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla) como en [rejillas avanzadas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada). Para poder cambiar por CSS el color de la fuente de cabeceras y detalles de rejillas, es requisito indispensable que el color usado sea el del valor por defecto. Si usamos un color personalizado, la CSS no se aplicará.

En el caso de que queramos poder cambiar por CSS estos colores, esta opción nos será de gran ayuda ya que cambia automáticamente el valor por defecto en todas las columnas de todas las rejillas del proyecto que estamos editando.

Al terminar nos informará sobre el número de rejillas y columnas modificadas.

## Inspector de ejecución web

Se trata de un inspector que nos devuelve aquellos elementos que no son no son funcionales en la interfaz cuando ejecutamos aplicaciones en [Velneo Web](/velneo/velneo-web). Será de gran ayuda para poder adaptar nuestras soluciones para que sean ejecutables en Web. Solamente es válido para usar el proyectos de aplicación.

Al lanzar esta opción pulsaremos el botón ![](/files/nltgki50tPgnUG6XwOtM) para iniciar la comprobación y nos presentará la lista de elementos que no son funcionales en Velneo web en modo árbol, agrupados por tipo. Haciendo doble clic sobre uno, nos llevará directamente a la edición del mismo.

Además, mostrará un mensaje explicativo de por qué ese elemento en concreto no es funcional en Velneo Web.

El botón ![](/files/LWzk3o1k9xEsY88eRrUx) nos permite conocer información importante relativa a la ejecución de aplicaciones en en Velneo Web. Presentar una vista con dos grupos de información distintos:

* **Incidencias**: con información relevante sobre los elementos no funcionales en Velneo Web.
* **Novedades de la versión**: con información sobre las novedades de la versión relativas a Velneo Web.

Esta opción se adapta al modo claro u oscuro que se tenga configurado en el sistema.

## Recalcular errores

(Control + Mayúsculas + R)

Fuerza la comprobación de errores en el proyecto actual. Estos errores serán presentados en el [inspector de errores](/velneo-vdevelop/inspectores#inspector-de-errores).


# Menú Objetos

Este menú de Velneo vDevelop contiene las opciones siguientes:

## Generador IA de aplicaciones

Se trata de un generador de [soluciones](/velneo/conceptos-basicos-de-velneo/solucion) completas basado en IA.&#x20;

Si eres suscriptor, te recomendamos hacer uso la cuenta que tengas asociada a tu suscripción ya que, inicialmente, se puede usa a modo de pruebas de forma gratuita y el número de tablas que se pueden generar varía en función de si la cuenta es de nivel 1 o de un nivel superior.&#x20;

A continuación tienes un gráfico que muestra el nº medio de tablas que se pueden generar con el plan gratuito según nivel. Los datos son aproximados, ya que el consumo realmente depende de varios factores (nº de tablas, nº de campos, generación de datos sintéticos...):

| Período de prueba (equivale a modelo Pro) | Hasta n tablas |
| ----------------------------------------- | -------------- |
| Nivel 1                                   | 100            |
| Nivel 2                                   | 200            |
| Nivel 3                                   | 200            |
| Nivel 4                                   | 200            |

La primera vez que lo ejecutemos nos preguntará si queremos iniciar el plan de prueba:

<figure><img src="/files/2ZY1xjWrhuLSTKk26y3L" alt=""><figcaption></figcaption></figure>

Si aceptamos, tendremos un mes para probarlo desde el momento de su activación.

Una vez terminado el período del plan de pruebas, puedes contactar con tu consultor comercial para que te informe sobre los distintos modelos de suscripción disponibles.

En todo momento, tendrás a la vista tanto el consumo realizado como el plan que estás usando:

<figure><img src="/files/iS8qaqe42jNCBt4xSfRt" alt=""><figcaption></figcaption></figure>

Una vez activado el plan, para usar el generador, se seguirán los pasos siguientes:

### 1. Describe tu aplicación

Inicialmente debemos describir la aplicación que queremos generar, es decir, establecer el *prompt* que ha de analizar la IA para generar la aplicación. Ejemplo: *"Necesito una aplicación para generar facturas, clientes y artículos"*.&#x20;

Una vez establecido el *prompt* pulsaremos el botón "Analizar petición" para proceder con la creación de la aplicación.

### 2. Revisa y ajusta las funcionalidades propuestas

En base al *prompt* inicial el sistema desarrollará un nuevo *prompt* avanzado donde detallará las funcionalidades que tendrá la aplicación. Lo rebvisaremos y podremos modificarlo si es necesario.

### Configurar la solución, el color de los iconos y datos a generar

En este paso podremos configurar lo siguiente:

* **Nombre de la solución**: nombre que tendrá la solución que se va a generar.
* **Color de iconos**: color que se usará para generar los diferentes iconos de la aplicación.
* **Generar datos sintéticos**: mediante un deslizador podremos ajustar si queremos o no crear datos de pruebas para las tablas y su número.
* **Generar interfaz**: si activamos esta opción, generará también la interfaz de la aplicación.
* **Ejecutar aplicación**: si activamos esta opción, se ejecutará la aplicación tras su creación.

### Paso final

Una vez configurado todo pulsando el botón "Generar tablas" se generará la solución y toda la estructura de datos (el proyecto de datos) de la aplicación.

Si al ejecutar el asistente no estabamos aún conectados a ningún servidor, el sistema nos pedirá los datos para la conexión. Una vez establecida la conexión con el servidor, comenzará la creación de la solución, los proyectos y los objetos del proyecto de datos.

El tiempo que tarde en generar los objetos dependerá directamente de la complejidad de la estructura de datos a generar.

Cuando el sistema termine con la creación del proyecto de datos mostrará una ventana preguntando si deseamos continuar con la creación automática de los objetos visuales (proyecto de aplicación). Si respondemos "Sí", procederá a crearlos.

Una vez confirmadas las tablas de las que queremos generar los objetos y una vez ha finalizado la creación de los mismos, el sistema nos preguntará si queremos ejecurtar la aplicación, si respondemos "Sí" entonces iniciará el asistente para la generación de una nueva instancia y finalmente, la ejecutará.&#x20;

El botón "crear nueva aplicación" del asistente iniciará nuevamente el asistente de IA para generar una nueva aplicación.

## Generar interfaz (Control + G)

Velneo incorpora una potentísima herramienta que genera la interfaz de una aplicación en muy pocos segundos.

Una vez creadas las tablas del proyecto, si ejecutamos esta opción desde el proyecto de aplicación, se abrirá una ventana donde podremos configurar lo siguiente:

#### Nueva aplicación

Esta opción la activaremos cuando queramos generar los objetos para una nueva aplicación. Si la aplicación ya había sido creada y queremos usarlo para añadir, por ejemplo, objetos para nuevas tablas que hemos creado, esta opción la desactivaremos.

#### Compatible Velneo vERP

Esta opción se activará automáticamente si lo que estamos editando es la plantilla [Velneo vERP](https://velneo.es/verp/) o una solución que la herede y nos permitirá añadir los objetos de interfaz manteniendo la compatibilidad con la plantilla, lo que implica:

* Ajustar los siguientes elementos aplicando la misma configuración que tienen en vERP:
  * Alturas de cabecera, detalle y pie de [rejillas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla).
  * Márgenes de [layouts](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/layout) igual que está en vERP.
  * Refactorización de la generación de formularios de menú con compatibilidad vERP.
  * Seleccionar tema: claro, oscuro o los dos y aplicar la CSS seleccionada como *default.css.*
  * Selección de tema: basado en las CSS y temas de vERP.
  * Para la edición de campos booleanos usará el control [switch](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-entrada/switch) en lugar del [botón de check](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-entrada/boton-de-check).
  * Aplicar estilo claro/oscuro para la barra de título de ventanas.
  * Añadir control de permisos en el [evento](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/conexion-de-evento) de [pre inicializado](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/conexion-de-evento#pre-inicializacion) de formulario principal.
  * Añadir personalización en [pos\_ini](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/conexion-de-evento#post-inicializacion) de formulario principal.
  * Añadir control de validación dinámica programado en vERP (requiere [conexión de evento](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/conexion-de-evento) y [manejador](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/manejador-de-evento) previo al botón aceptar).

Esta opción podemos activarla en otra solución, pero debemos tener en cuenta que hará uso de objetos que son de vERP y que no existirán en nuestra solución.

#### Checkbox para booleanos

Si activamos esta opción, para la edición de campos booleanos en formulario usará controles de tipo [botón de check](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-entrada/boton-de-check) en lugar de controles de tipo [switch](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-entrada/switch).

#### Añadir importaciones

Si hemos usado el [importador de tablas](#importador-de-tablas) en el proyecto de datos, activando esta opción se añadirán las opciones para importar registros que el sistema haya programado.

#### Columnas en rejillas

En este parámetro podemos configurar cuántas columnas, como máximo se generarán para las rejillas. El valor por defecto es 5. Si establecemos el valor 0, generará tantas columnas como campos tenga cada tabla.

#### Botones de menú

Permite configurar la posición de los [botones incrustados](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-alfabetica#boton-izquierda) en controles de edición de formularios.

#### Modos toolbars en menú

Permite configurar el aspecto que tendrán las [toolbars](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/toolbar) en los menús. Los valores posibles son:

* **Icono y texto debajo**: en el botón de la toolbar se mostrará el icono configurado la [acción](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion) y debajo el texto configurado en la misma.
* **Icono y texto al lado**: en el botón de la toolbar se mostrará el icono configurado la [acción](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion) y al lado el texto configurado en la misma.
* **Icono**: en el botón de la toolbar se mostrará solo el icono configurado la [acción](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion).
* **Texto**: en el botón de la toolbar se mostrará solamente el texto configurado en la [acción](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion).

#### Posición toolbars

Permite configurar dónde estarán posicionadas las toolbars en las rejillas de los formularios que se generan como menú para cada tabla. Los valores posibles son:

* **Arriba**: las toolbars estarán en la parte inferior de las rejillas.
* **Abajo**: las toolbars estarán en la parte superior de las rejillas.

#### Tema CSS

Nos permite configurar un tema para la CSS que se generará en la aplicación. Son temas basados en los temas de vERP. Si hacemos clic en el botón ![](/files/7qsApDbkdLj3lnhLLP60)se mostrará una imagen de una interfaz con el tema aplicado.

#### Tablas

Se mostrará una lista de tablas de los proyectos de datos heredados.

En la lista podemos seleccionar, o bien todas las tablas (marcando en la casilla de verificación del encabezado de la lista) o bien seleccionar algunas tablas concretas para las que queremos que se geren los objetos.

Una vez configurado todo a nuestro gusto, pulsaremos el botón "Generar interfaz". Una vez haya terminado, se mostrará un mensaje informativo de los objetos creados en el pie de la ventana:

![](/files/-MLggUCjvk251UTZ0AEG)

Esta ventana se adapta al modo claro u oscuro que se tenga configurado en el sistema.

## Generar objetos para ChatGpt

Esta opción es una herramienta para generar los objetos en nuestro proyecto de Velneo que son necesarios para poder crear un GPT de [ChatGpt](https://es.wikipedia.org/wiki/ChatGPT#:~:text=ChatGPT%20\(marca%20generalizada%20a%20partir,se%20especializa%20en%20el%20di%C3%A1logo.) que conecte el chat con las instancias de nuestra solución.

Si queremos tener acceso a GTP ChatGPT debemos dirigirnos a la pagina del proveedor y documentarnos al respecto: <https://platform.openai.com/docs/actions/introduction>.

La extensión creará un [proceso JavaScript](/velneo-vdevelop/scripts/lenguajes/javascript/procesos-javascript) junto con su script del proyecto. Dicho proceso es para generar dinámicamente la información que ChatGpt necesita a partir de los procesos que expongamos en la [Api REST](/velneo-verp/documentacion-del-apirest).

Este proceso es el que, con ayuda de la [Api REST](/velneo-verp/documentacion-del-apirest) nos genera un punto de enlace para empezar a desarrollar los procesos que se encargarán de comunicarse con ChatGpt.

Para su correcto funcionamiento, es necesario tener cargada una solución que tenga los objetos de la [Api REST](/velneo-verp/documentacion-del-apirest) y tener abierto el proyecto en el que se quiere que se generen los objetos.

Al abrirlo, se abre una pestaña con un formulario, un botón para generar objetos y un botón de ayuda en la parte superior derecha.

El botón de ayuda tiene enlaces a esta documentación y un vídeo explicativo de la extensión.

En el formulario hay que rellenar los siguientes campos:

* **Senda del script API\_REST\_FUNCIONES\_V2 para el include**: el código JavaScript del segundo proceso necesita un [*include*](/velneo-vdevelop/scripts#incluir-script) del script **api\_rest\_funciones\_v2.js** de la API REST. Si tenemos la solución con la Api REST cargada, se calcula automáticamente. Si no, hay que escribirla manualmente.
* **Nombre del proyecto proceso V2**: nombre del proyecto que contiene el proceso V2 de la Api REST. Necesita un \_app o un \_dat al final (aunque el propio nombre del proyecto ya lo incluya) para indicar el tipo de proyecto. Si tenemos la solución con la Api REST cargada, se calcula automáticamente. Si no hay que escribirla manualmente.
* **Alias del proyecto tablas Api REST**: alias del proyecto donde están las tablas API\_KEY\_W y API\_SEG\_W de la Api REST. Si tenemos la solución con la Api REST cargada, se calcula automáticamente. Si no hay que escribirla manualmente.

Al rellenar la información y hacer click en el botón de "Generar objetos", se generarán:

* En objetos del proyecto:
  * Carpeta ChatGPT:
    * Proceso OPENAPI\_CHATGPT\_OPENAPI
* En scripts del proyecto:
  * Carpeta ChatGPT:
    * Script openapi\_chatgpt.js

Es posible cambiar la información del formulario y volver a generar los objetos si se necesita modificar  algún dato.

El flujo a seguir para completar un proceso de generación de un plugin completo es:

1. Desarrollar el o los procesos Velneo que se encargaran de recibir parámetros a través de variables y devolverán el resultado deseado según se requiera.
2. Ejecutar nuestra solución, y crear una API KEY, con las siguientes características:
   * Puede ser con tipo de autentificación API KEY, Bearer por usuario o OAUTH 2.&#x20;
   * Debe tener habilitado como mínimo el método GET.
   * Se deben seleccionar el o los procesos creados en el paso 1.
   * Si el proceso está asociado a una tabla, entonces se deben seleccionar los campos de la tabla que están permitidos.
   * Una vez creada la API, debemos ir al usuario deseado y editar su ficha para que, en la pestaña de API’s, seleccionemos cuál será el registro habilitado y esto nos generará el respectivo *token bearer*.&#x20;
   * En este paso, es importante quedarnos con el valor puesto en el Identificador de la ApiKey creada o el token generado en el usuario si es de tipo Bearer por usuario (si es OAUTH 2, se genera dinámicamente).

Una vez hecho lo anterior, podemos ejecutar la URL y consultar si el retorno es el esperado.&#x20;

<https://midominio.com/vERP\\_2\\_app\\_app/OPENAPI\\_CHATGPT\\_OPENAPI\\[.pro>]

Si todo ha ido bien, deberías ver una respuesta en formato JSON.

### Notas importantes

Se debe utilizar la propiedad [**comentarios**](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso#comentarios) de los objeto [proceso](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso), para documentar de forma concreta la funcionalidad del proceso. Debemos tener en cuenta que para ChatGPT esta descripción no puede exceder los 300 caracteres. El mismo límite de 300 caracteres, aplica para la propiedad comentarios de cada variable del proceso.&#x20;

Aquellas variables que no quieres que sean documentadas con la especificación OpenApi, debes marcarle el [estilo](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/variable-local#privado) "Privado".

## Historial de cambios de un objeto

Esta opción permite a los desarrolladores visualizar todos los cambios realizados en el objeto seleccionado a través de todas las versiones almacenadas en [vVersion](/velneo-vversion/que-es-velneo-vversion). Esta herramienta es esencial para el control de versiones y la gestión de cambios en proyectos de desarrollo.

### Requisitos previos

Descargar el componente [vVersion](/velneo-vversion/que-es-velneo-vversion) desde nuestra página de [descargas](https://velneo.es/mivelneo/descargas/) e [instalarlo](/velneo-vadmin/gestion-de-aplicaciones) en nuestro servidor de desarrollo.

Una vez instalado e instanciado, debemos configurar la instancia de la solución en el [servidor HTTPS](/velneo-vadmin/web) de Velneo vServer.

En la configuración de la instancia del *virtualhost* debemos indicar lo siguiente:

* **Ruta**: `/vversion_dat`&#x20;
* **Instancia**: `VVERSION_APP_VVERSION_DAT` (la instancia de datos de vVersion).

Si modificamos los identificadores de las instancias en el servidor, debemos actualizarlos también en la configuración.

#### Ejemplo de configuración en un servidor local

<figure><img src="/files/PHGRfOn44YMk9LZicthJ" alt=""><figcaption></figcaption></figure>

Si necesitamos usar un puerto distinto al 443 (puerto por defecto), debemos configurarlo en el fichero de configuración del servidor HTTPS del vServer. Ejemplo:

<figure><img src="/files/ffiRq84WooLa73J4qugu" alt=""><figcaption></figcaption></figure>

#### Ejemplo de configuración en un servidor cloud de desarrollo

El puerto debe ser el que se especifique en la sección [Apache](/velneo-cloud/panel-de-control-vserver-cloud/apache) del [panel de control cloud](/velneo-cloud/panel-de-control-vserver-cloud) del servidor:

<figure><img src="/files/nz3HLAQ3MO0UkAUNJY7E" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/877RYPCHXi1rPhuRj8uc" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Es importante que las rutas tengan los nombres indicados anteriormente y que se también se muestran en las capturas de pantalla.
{% endhint %}

{% hint style="info" %}
Si nos conectamos a un servidor de Velneo Cloud de producción (que por defecto usa el puerto 443), es recomendable usar el mismo puerto 443 en servidores locales. Esto facilita el uso de la extensión sin necesidad de configurar el puerto manualmente, ya que por el momento no se gestiona guardar en el registro la dupla dominio-puerto.
{% endhint %}

Para confirmar que vVersion está correctamente instalado y que el acceso web está disponible, utiliza la siguiente URL:

`https://dominio:puerto/vversion_dat/version.pro`

* Donde tendrás que sustituir el `dominio` y el `puerto` por los de tu servidor HTTPS.
* `vversion_dat` es la ruta que hemos configurado en la instancia del proyecto de datos de vVersion en el servidor HTTPS.
* `version.pro`  es un proceso programado en dicho proyecto de datos que devuelve la versión y la fecha y hora actuales.

### Configuración de la conexión

Con el botón de configuración <img src="/files/aKug79zscxmzFVkbKaat" alt="" data-size="line"> podremos establecer la conexión con la instancia de vVersion en el servidor al que estemos conectado. Siguiendo los ejemplos puestos en las capturas de pantalla anteriores, los valores a configurar serán:

#### En el servidor local usando el puerto por defecto (443)

* **Dominio del servidor**: si tiene subdominio propio, especificaremos este; en caso contrario, su IP. Ejemplos: `midominio.com`, `127.0.0.1`.
* **Usar HTTPS**: verdadero, ya que el host está configurado como https.
* **Puerto**: `443`.

<figure><img src="/files/obFH7vRmxJlltxQGSeGS" alt=""><figcaption></figcaption></figure>

#### En el servidor local usando un puerto distinto al 443

Seguiremos el ejemplo que habíamos puesto antes.

* **Dominio del servidor**: si tiene subdominio propio, especificaremos este; en caso contrario, su IP. Ejemplos: `midominio.com`, `127.0.0.1`.
* **Usar HTTPS**: a falso, en este ejemplo.
* **Puerto**: `8080`.

<figure><img src="/files/YmSkWqGjprNdwTBCi0fD" alt=""><figcaption></figcaption></figure>

#### En un servidor cloud de desarrollo

Siguiendo el ejemplo que habíamos puesto antes:

* **Dominio del servidor**: el host del servidor. Ejemplo: `c5.velneo.com`.
* **Usar HTTPS**: verdadero.
* **Puerto**: `XXXXX`.(reemplazar por el puerto de Apache del servidor cloud)

<figure><img src="/files/EYs3pY7H52iWiZSFEhjG" alt=""><figcaption></figcaption></figure>

Si  hay algún error en la configuración, éste se mostrará en la parte inferior de la ventana.

### Funcionamiento

Al seleccionar un objeto en vDevelop, la opción **Histórico de cambios** se conecta automáticamente con [vVersion](/velneo-vversion/que-es-velneo-vversion) en el servidor conectado para obtener y mostrar la lista de cambios del objeto.

Si cambiamos de objeto en el árbol de objetos del proyecto, podemos usar el botón **Refrescar** ![](/files/mQgWVs1H8tVn6pRl752n) para actualizar la lista de cambios del nuevo objeto seleccionado.

Al seleccionar un objeto en vDevelop, la opción "Histórico de Cambios" se conecta automáticamente con vVersion en el servidor conectado para obtener y mostrar la lista de cambios del objeto.

Los cambios se presentan en forma de **tarjetas**, donde cada una representa una versión en la que el objeto fue modificado.

Al hacer **doble clic** sobre un cambio específico, vDevelop obtiene de vVersion el detalle del cambio y lo muestra en una ventana emergente.

#### Filtros

La funcionalidad permite filtrar los cambios por **texto de descripción** y por **usuario**, facilitando la localización de cualquier modificación específica en proyectos con un historial extenso.

#### Restaurar versión

Al pasar el ratón sobre una card del historial, se muestra el botón **Restaurar**. Al pulsarlo, se sobrescribe el objeto actual en el proyecto con el contenido que tenía en la versión seleccionada.

Tras restaurar, aparece un mensaje de confirmación con un botón **Editar** que permite abrir directamente el objeto restaurado en el editor de vDevelop.

Bastará volver a conectarnos de nuevo al servidor con Velneo vDevelop y solicitar de nuevo el proyecto para trabajar con la versión restaurada. Será muy útil la información que provee el número de historial y que podemos ver en las propiedades del proyecto para confirmar que estamos trabajando en la versión deseada.

#### Recuperar copia

Al pasar el ratón sobre una tarjeta del historial, se muestra también el botón **Recuperar como copia**. Al pulsarlo, se crea un nuevo objeto en el proyecto con el contenido de la versión seleccionada y un identificador nuevo. El nuevo objeto recibe el sufijo `_N`, donde "N" es el número de historia de la versión. Por ejemplo, si el objeto original se llama `MiObjeto` y recuperamos la versión del historial número 3, se creará un nuevo objeto llamado `MiObjeto_3`.

Tras recuperar la copia, aparece un mensaje de confirmación con un botón **Editar** que permite abrir directamente el nuevo objeto en el editor de vDevelop.

Las opciones de restaurar y recuperar como copia funcionan tanto con objetos visuales (formularios, rejillas, etc.) como con scripts.

## Galería de objetos

(F6)

Abre la [galería de objetos](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-objetos#galeria-de-objetos).

## Nuevo objeto

Permite añadir un nuevo objeto al proyecto actual. Esta opción desplegará un submenú con toda la lista de objetos disponibles, en la que seleccionaremos el objeto que se desea crear.

## Nuevo sub-objeto

Permite añadir un nuevo sub-objeto al objeto actual. Si el objeto actual puede contener sub-objetos, esta opción desplegará un submenú con toda la lista de sub-objetos disponibles para el objeto actual en la que seleccionaremos el que se desea crear.

## Importador de tablas

Opción específica para [proyectos de datos](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-organizacion/proyecto-de-datos-1-carpetas-esquemas-tablas-e-indices-complejos).

Nos permite, en edición, crear una tabla a partir de un origen de datos (o bien desde el portapapeles, o bien desde un fichero en disco) y, en ejecución, importar los datos de ese mismo origen de datos.

Al ejecutar esta opción debemos cumplimentar las opciones siguientes:

### Origen

Declaración del origen de datos a partir del cual se creará la tabla y se importarán los datos. Los tipos de origen permitidos son:

* Excel (portapeles): el contenido de una hoja de cálculo copiado en el portapapeles.
* Fichero csv: un fichero csv en disco.
* Fichero JSON: un fichero json en disco.

### Separador

Esta opción solamente estará disponible si el origen es Excel o fichero CSV.

Debemos especificar qué tipo de separador se usa en el origen de datos elegido. Debe ser uno de éstos:

* Tabulador.
* Coma (,).
* Punto y coma (;).
* *Pipe* (|).

En el caso de que el origen sea un fichero json, estas opciones no estarán disponibles.

### Nombre en 1ª fila

Esta opción solamente estará disponible si el origen es Excel o fichero CSV.

Activaremos esta opción si en el origen de datos en la primera fila se incluyen los nombres de los campos.

Si el origen de datos elegido es un texto en el portapapeles, se activará el botón **Pegar del portapapeles**, al pulsarlo pasaremos a la fase de [configuación de tabla y campos](#configuracion-de-campos).

Si el origen de datos elegido es un fichero csv en disco, se activará el botón **Seleccionar fichero**, al pulsarlo, el sistema nos pedirá que seleccionemos el fichero y, una vez seleccionado, pasaremos a la fase de [configuación de tabla y campos](#configuracion-de-campos).

### Seleccionar fichero

En el caso de que el origen sea un fichero CSV o un fichero JSON, este botón nos permitirá seleccionar el archivo a importar.

### Configuración de tabla y campos

En base al origen de datos y el separador especificado, el sistema nos propondrá un nombre de tabla en la propiedad **Nombre tabla,** nombre que podemos cambiar.

Si pulsamos el botón ![](/files/bJXGn1OYJBZEfPKXRnLR) que se encuentra junto al nombre de la tabla, podremos desplegar las opciones de configuración de la importación de la tabla, que son:

* **Campo primario**: si en el origen existe un campo primario (que identifica a cada registro de forma única y exclusiva), desplegando esta opción podremos indicar cuál es. En el caso de que en el origen haya una columna llamada "ID", "Código" o "Code" se asignará automáticamente si el origen es Excel o CSV. En el caso de que el origen sea JSON solamente hará la asignación automática si el JSON contiene un campo "ID". En la generación de la tabla se generará un índice de [clave única](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice#clave-unica) con el campo seleccionado.
* **Campo nombre**: si en el origen existe un campo que contiene el nombre del registro, desplegando esta opción podremos indicar cuál es. En el caso de que en el origen haya una columna llamada "Nombre" o "Name" lo asignará automáticamente si el origen es Excel o CSV. En el caso de que el origen sea JSON solamente hará la asignación automática si el JSON contiene un campo "NAME". En la generación de la tabla se generará los índices de tipo [acepta repetidas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice#acepta-repetidas), [palabras](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice#palabras) y [trozos de palabras](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice#trozos-de-palabras) del campo seleccionado.
* **Al importar, preguntar si se vacía la tabla**: si activamos esta opción, en el proceso de importación de datos que se generará, se le preguntará al usuario si quiere vaciar la tabla antes de importar los registros. Si no acepta, los registros importados serán añadidos a la tabla sin borrar los que ya hubiese.

En base al origen de datos y el separador indicados, el sistema nos mostrará, de forma automática la lista de campos detectados, indicando su nombre, tipo y longitud aunque puede requerir modificar la configuración según el tipo de campo para adecuarse a las necesidades.&#x20;

Para cambiar el tipo de un campo no tendremos más que hacer clic en el botón ![](/files/bJXGn1OYJBZEfPKXRnLR) para desplegar la lista de tipos de campo y seleccionar el adecuado.

{% hint style="info" %}
En el caso de que el fichero de origen sea un JSON y éste incluya campos de tipo [objeto dibujo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/campo#objeto) u [objeto binario](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/campo#objeto), éstos serán identificados como alfabéticos, así que tendremos que asignarle el tipo de campo adecuado.
{% endhint %}

Los formatos de fecha soportados son:

* dd-mm-yyyy, d-m-yyyy, dd-mm-yy (año 2000), d-m-yy (año 2000), yyyy-mm-dd
* dd/mm/yyyy, d/m/yyyy, dd/mm/yy (año 2000), d/m/yy (año 2000), yyyy/mm/dd
* dd.mm.yyyy, d.m.yyyy, dd.mm.yy (año 2000), d.m.yy (año 2000), yyyy.mm.dd

Los formatos numéricos soportados son:

* Enteros.
* Sin separadores de miles.
* Con separadores de miles:
  * 1000, 1,000, 1.000
* Con decimales:
  * 0.02, 0,02
* Combinación de separadores y decimales:
  * 1000.02, 1,000.02, 1.000,02

Así mismo, si un campo debe contemplar signo, debemos activar la casilla de verificación. correspondiente al signo.

Si pulsamos el botón ![](/files/bJXGn1OYJBZEfPKXRnLR) que se encuentra junto al nombre de cada campo, podremos desplegar las opciones de configuración de la importación de dicho, que son:

* **Tabla enlazada:** si la tabla a importar tiene un campo enlazado a una tabla maestra del proyecto o de algún proyecto heredado, la seleccionaremos en este parámetro. Al seleccionarlo se activará la opción **Indexar**, de este modo, al generar la tabla se creará el campo enlazado al maestro y el índice correspondiente.
* **Indexar**: creará un [índice](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice) de tipo [acepta repetidas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice#acepta-repetidas) de ese campo.
* **Trozos**: añadirá el campo al [índice PARTS](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice#trozos-de-palabras) de la tabla que se va a crear en la tabla.
* **Palabras**: añadirá el campo al [índice WORDS](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice#palabras) de la tabla que se va a crear en la tabla.

Podemos crear una nueva solución si no estamos conectados a ninguna, o crear la en el proyecto de datos que tengamos abierto.

Esta opción creará también un [proceso](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso) en primer plano para la obtención de los datos en ejecución, y otro en 3er plano para su importación.

En el caso de que el origen sea  un CSV (tanto en disco como en memoria), y éste contiene un campo ID, si el registro de origen ya existe en la tabla de destino, lo actualizará, si no existe, lo dará de alta.

Se pueden usar ya esos objetos, pero también se usar la opción de [Generar Interfaz](#generar-interfaz) para completar la interfaz, pues esta extensión crea un menú de importación en el que incorpora los procesos de importación generados por esta opción.

{% hint style="warning" %}
Cuando hay comillas en la hoja de cálculo a exportar, puede haber confusiones con las comillas (") ya que a través del portapapeles no se exporta de forma estandarizada, unas veces usa las comillas para indicar comillas y otras para indicar textos que contienen líneas de retorno o similar, creando un texto no importable de forma directa. Para esos casos, se ha de usar la exportación a csv para importar posteriormente, desde el archivo generado, lo que asegurará la correcta importación de textos con comillas.
{% endhint %}

## Importar dibujos

Permite hacer una importación masiva de dibujos en el proyecto actual. Ver el capítulo dedicado a los [dibujos ](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/dibujo)para ampliar información al respecto.

## Buscador (Control + B)

Esta opción nos permite encontrar objetos, subobjetos de nivel 1 y 2, incluso propiedades de forma muy sencilla, con múltiples opciones de filtrado: por tipo de objeto, por proyecto, por propiedad, etc.

Cuando lanzamos el buscador, este se abrirá en una pestaña en el panel central. Al buscar, lo hará en todos los proyectos de todas las soluciones cargadas en esa sesion de Velneo vDevelop.

![](/files/0iTKKlKbS1yT6sitcb1C)

Incluye un control donde escribir el texto a buscar. La búsqueda se irá haciendo a medida que vayamos escribiendo. Además disponemos de un botón "Buscar"

Una vez disparada la búsqueda, nos mostrará todos los objetos que coincidan con el criterio de la búsqueda. Si hacemos doble clic en alguno se editará directamente (no es necesario haber abierto antes el proyecto, porque ya al buscar lo abrirá).

Se puede elegir sobre qué proyectos queremos que realice la búsqueda, y sobre cuáles no, simplemente marcando o desmarcándolos.

{% hint style="info" %}
Solo buscará sobre aquellos proyectos que estén abiertos. En caso de no haber podido abrir un proyecto en edición, no devolverá resultados del mismo.
{% endhint %}

Podemos establecer filtros para refinar la búsqueda disparada. Para ello pulsaremos el botón ![](/files/9yJTwoQVKTeDIa6xSZq6). Podremos filtrar por:

* **Objetos**: permite seleccionar uno o varios tipos de objeto para .
* **Sub-objetos**: permite seleccionar uno o varios tipos de sub-objeto.
* **Sub-objetos 2**: permite seleccionar uno o varios tipos de sub-objeto de sub-objetos.
* **Valores**: permite filtrar por valores.

También pdemos aplicar un filtro desde el listado de objetos encontrados. Al pasar el cursor sobre un tipo de objeto/sub-objeto se activará el icono de filtro, si hacemos clic sobre él, se aplicará el filtro por el objeto, sub-objeto seleccionado:

![](/files/ZSflXtVAb5790j6N71KK)

El botón ![](/files/4umCGJoEUvlKF7CGeGUa)nos permite configurar las opciones siguientes:

* **Coincidir mayúsculas/minúsculas**: si queremos que la búsqueda se haga respetando mayúsculas y minúsculas.
* **Mostrar por defecto el panel de filtros**: si queremos que por defecto nos muestre el panel de filtros.

El botón "Limpiar filtros" nos permite limpiar todos los filtros que hayamos configurado.

### Opciones de búsqueda

Se establece la expresión `$OBJ` como reservada. Si la escribimos en el campo de búsqueda devolverá todos los objetos de todos los proyectos de todas las soluciones cargadas.

Podemos utilizar el carácter **|** para refinar búsquedas, o el carácter **&** para sumar resultados de búsqueda. Ejemplos:

`$OBJ | formulario&rejilla`  devolverá todos los objetos, luego sobre ese resultado, refinará la búsqueda para encontrar todo lo que sean formularios y rejillas, y esta sera lo que muestre en pantalla como resultado de búsqueda.

`$OBJ | rejilla | columna` devolverá todos los objetos, luego hará una búsqueda por todo lo que sea rejilla, y luego por todo lo que sea columna.

`$OBJ | rejilla | conexion&manejador` devolverá todos los objetos, luego hará una búsqueda por todo lo que sea rejilla, y luego por todo lo que sea conexión de evento o manejador de evento.

`Articulos | Formulario & rejilla | conexión` devolverá todo lo que coincida con el texto buscado "Articulos" para luego rebuscar todo lo que sean formularios o rejilla y por último volver a rebuscar por conexión.

Importante resaltar que se pueden utilizar tanto | o & como se quiera.

{% hint style="info" %}
Los filtros sólo muestras valores que tengan relación con la búsqueda obtenida, es decir, si tras buscar solo encuentra formularios y rejillas, en la sección de filtros -> objetos, solo tendrás disponible para filtrar por esos 2.&#x20;
{% endhint %}

{% hint style="info" %}
Los filtros no solo están en el panel izquierdo, sino que puedes aplicar filtros rápidos desde la misma lista de resultados. Haciendo clic en el enlace que aparece en la segunda fila de cada columna.
{% endhint %}

A continuación mostramos los nombres de objetos, sub-objetos y sub-sub-objetos que podemos usar.

#### Objetos

Tabla

Indice complejo

Variable global

Tabla estática

Dibujo

Rejilla

Árbol visor de tablas arboladas

Casillero

Formulario

Multivista

Impresora lógica

Informe

Búsqueda&#x20;

Lupa&#x20;

Localizador&#x20;

Cesta&#x20;

Proceso&#x20;

Función&#x20;

Librería externa&#x20;

Acción

Menú&#x20;

Toolbar&#x20;

Tubo de lista&#x20;

Tubo de ficha&#x20;

Protocolo TCP/IP&#x20;

Constante&#x20;

Marco&#x20;

Bloc de formularios&#x20;

Cola de procesos&#x20;

Esquema&#x20;

Puerto serie&#x20;

Fichero adjunto&#x20;

Imagen SVG&#x20;

Control SVG&#x20;

ViewFlow&#x20;

Alternador de lista&#x20;

ComboView&#x20;

ListView&#x20;

Lista QML&#x20;

Rejilla Avanzada&#x20;

Formulario QML&#x20;

Gráfico&#x20;

Reemplazo

#### Sub-objetos

Campo

Índice

Enlace plural

Actualizacion

Parte de índice complejo

Variable

Item de tabla estática

Trigger

Columna de rejilla

Control

Seccion de informe

Agrupamiento de informe

Calculo de informe

Componente de búsqueda

Indice del localizador

Conexion de evento

Manejador de evento

Instrucción de proceso

Lanzador de acción

Dock

Drop

Item de un esquema

Funcion de DLL Inserción

Intercomunicador TCP

Modelo auxiliar

Columna de rejilla avanzada

Banda de rejilla avanzada

Traspaso de campo

Ficha de extensión de formulario

Serie de un gráfico

Eje de un gráfico

#### Sub-sub-oobjetos

Componente de actualizacion

Subcontrol

Control de informe

Instrucción de proceso

Parametro de funcion de DLL

Subindexador

Condicion de estilo de rejilla

User role

{% hint style="info" %}
No podemos buscar textos de menos de tres caracteres.
{% endhint %}

## Cambiar altos de cabecera, detalle y pie en rejillas

Esta opción nos permite cambiar los altos de las secciones de cabecera, detalle y pie de [rejillas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla) y [rejillas avanzadas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada) de un proyecto.

Nos presentará una lista con todas las rejillas y rejillas avanzadas del proyecto.

Permite buscar rejillas y rejillas avanzadas usando expresiones regulares, y busca a medida que vamos escribiendo.

Permite hacer multiselección sobre los resultados obtenidos.

Una vez seleccionadas las rejillas que queramos modificar, podremos establecer los siguientes valores:

* **Alto cabecera**: nos permite configurar el alto que queramos que tengan las cabeceras de las rejillas seleccionadas. Si lo dejamos vacío, no se modificará dicha propiedad.
* **Alto detalle**: nos permite configurar el alto que queramos que tengan la sección de detalle de las rejillas seleccionadas. Si lo dejamos vacío, no se modificará dicha propiedad.
* **Alto pie/grupo**: nos permite configurar el alto que queramos que tengan la sección de pie de las rejillas seleccionadas y pies de grupo en las rejillas avanzadas seleccionadas. Si lo dejamos vacío, no se modificará dicha propiedad.

Tras seleccionar los valores, pulsaremos el botón "Aplicar" para hacer efectivos los cambios.

## Cambiar el modo de visualización de las opciones en las toolbars y menús

Permite unificar el modo de visualización de las opciones en [toolbars](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/toolbar) y [menús](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu) para mantener una experiencia coherente en toda la aplicación. Nos permite buscar este tipo de objetos por distintos criterios:

* **Texto a buscar**: buscará en identificadores y nombres de los objetos
* **Tipo de objeto**: en el que podemos seleccionar el tipo de objeto a buscar, que podrá ser:
  * ***Todos***: devolverá todas las toolbars y menús que cumplan con la búsqueda.
  * ***Toolbars***: devolverá solamente las toolbars que cumplan con la búsqueda.
  * ***Menús***: devolverá solamente los menús que cumplan con la búsqueda.
* **Modo**: nos permite configurar el modo de visualización que queremos aplicar a los objetos encontrados en la búsqueda. Los valores posibles son:
  * ***Icono y texto***: los objetos encontrados serán configurados para que cada ítem que contenga muestre el icono y el texto configurados en la [acción](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion).
  * ***Icono***: los objetos encontrados serán configurados para que cada ítem que contenga muestre únicamente el icono que tenga configurada la [acción](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion).
  * ***Texto***: los objetos encontrados serán configurados para que cada ítem que contenga muestre únicamente el texto que tenga configurado la [acción](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion).

## Cambiar márgenes en formularios

Esta opción nos permite cambiar los márgenes de [formularios](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario) de un proyecto.

Nos presentará una lista con todos los formularios del proyecto.

Permite buscar formularios usando expresiones regulares, y busca a medida que vamos escribiendo.

Permite hacer multiselección sobre los resultados obtenidos.

Una vez seleccionados los formularios que queramos modificar, podremos establecer los siguientes valores:

* **Espaciado**: espacio de separación en píxeles entre los layouts y controles que se distribuyen en el formulario.
* **Margen izq.**: espacio de separación en píxeles, en el margen izquierdo, de los controles incluidos en el formulario.
* **Margen der.**: espacio de separación en píxeles, en el margen derecho, de los controles incluidos en el formulario.
* **Margen sup.**: espacio de separación en píxeles, en el margen superior, de los controles incluidos en el formulario.
* **Margen inf.**: espacio de separación en píxeles, en el margen inferior, de los controles incluidos en el formulario.

Si dejamos algún valor vacío, no se aplicará a los formularios.

Tras seleccionar los valores, pulsaremos el botón "Aplicar" para hacer efectivos los cambios.

## Cambiar posición de las toolbars en alternadores y rejillas

Permiten aplicar de forma masiva cambios en la interfaz de un proyecto, ajustando la posición de la [toolbar](https://doc.velneo.com/v/37/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/toolbar) asociada a [alternadores de lista](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/alternador-de-lista) y [rejillas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla).

Permite hacer búsquedas por identificador y seleccionar, de los objetos encontrados, aquellos en los que queramos modificar la posición de la toolbar que podrá ser: **Arriba** o **Abajo**.

## Cambiar posición del botón de menú en controles de edición

Esta opción nos permite cambiar la posición del [menú de botón](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-alfabetica#menu-de-boton) en [controles de edición](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion) de formularios del proyecto.

Nos presentará una lista con todos los formularios del proyecto.

Permite buscar formularios usando expresiones regulares, y busca a medida que vamos escribiendo.

Permite hacer multiselección sobre los resultados obtenidos.

Una vez seleccionados los formularios que queramos modificar, en el desplegable cuyo título es **Tipo de menú de botón** seleccioanremos la nueva posición que queramos que tenga el botón menú de cada control de edición. Los valores posibles son:

* **Ninguno**: el control carecerá de menú de botón.
* **Botón izquierda**: el botón será incluido a la izquierda del control.
* **Botón derecha**: el botón será incluido a la derecha del control.
* **Botón oculto**: el botón no será visible pero podrán dispararse las [acciones](https://doc.velneo.com/36/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion) contenidas en el menú asociado al mismo usando las teclas aceleradoras definidas en las mismas.

Tras seleccionar el tipo de menú de botón, pulsaremos el botón "Aplicar" para hacer efectivos los cambios.

En el caso de que uno de los formularios seleccionados contenga un control que no tenga botón de menú, no le aplicará cambio alguno.&#x20;

{% hint style="danger" %}
Debemos tener en cuenta que si seleccionamos la opción "ninguno", limpia el valor de la propiedad "[menú de botón](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-alfabetica#menu-de-boton)", de todos los controles y no se podrá deshacer, tendríamos que volver a asignar a mano el menú que corresponda en cada control.
{% endhint %}

## Cambiar estilos de objetos de un tipo

Esta opción nos permite marcar o desmarcar un **estilo** a todos los objetos de un mismo tipo. Nos pedirá el tipo de objeto, el estilo y si queremos activarlo o desactivarlo. Ejemplo de uso: activar el [estilo personalizable](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario#estilos) a todos los formularios de un proyecto.

Es posible cambiar el estilo de un grupo de objetos usando el checkbox de selección de la primera columna o cambiar un objeto individual usando el interruptor de la columna de la derecha.

Esta opción se adapta al modo claro u oscuro que se tenga configurado en el sistema.

## Iconos material

Esta opción nos permite buscar y encontrar en español el icono que necesitas entre más de 5.000 iconos [estilo Material](https://es.wikipedia.org/wiki/Material_Design), darle el tamaño, color, nombre que deseas y crearlo directamente en tu proyecto como [dibujo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/dibujo-control) o como [imagen SVG](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/imagen-svg-control) o bien exportarlo a disco.

Esta ventana se adapta al modo claro u oscuro que se tenga configurado en el sistema.

## Editar informe personalizable

Permite Abrir el editor de [informes personalizables ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/informe-personalizable)para para poder editar un fichero XML con la definición del informe.

## Nueva carpeta

Las carpetas son objetos que nos permitirán organizar los objetos de un proyecto en el panel central de **Velneo vDevelop**. Esta opción añadirá una carpeta en el panel central del proyecto en mismo nivel que el objeto o la carpeta que estuviese seleccionada en el momento de su ejecución.

## Nueva carpeta hija

Esta opción añadirá una carpeta en el panel central del proyecto dentro de la carpeta seleccionada en el momento de su ejecución.

## Propiedades de carpeta

(Alt + Intro)

Permite modificar las propiedades de la carpeta seleccionada en el panel central de Velneo vDevelop. Podremos modificar su nombre, el color de la fuente y el icono de la carpeta.

## Localizar en proyecto

Esta opción localiza en el panel central de **Velneo vDevelop** el objeto que seleccionemos en el [Inspector de objetos](/velneo-vdevelop/inspectores#inspector-de-objetos).

## Inspector de modificación (Control + M)

Se trata de un inspector que nos permite buscar directamente dónde se modifican [campos](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/campo) o [variables](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/variable).&#x20;

Un campo o una variable puede usarse en multitud de sitios (en controles de formulario, rejillas, contenidos iniciales, fórmulas, procesos (en lectura o escritura), pues bien, esta extensión lo que nos permite es ver únicamente dónde se modifica un campo o una variable. Para ello, no tenemos más que seleccionar el campo o la variable y ejecutar esta opción.

Si la ventana del inspector ya está abierta y queremos ver dónde se modifica otro campo o variable, una vez seleccionado en vDevelop, pulsaremos el botón ![](/files/8BHu68P1nL2XHgyvgPq4) del inspector para forzar su refresco.

También podemos filtrar por valores, es decir, buscar dónde se modifica el campo o la variable con un valor determinado.

## Buscar en contenido de objetos

Esta opción permite buscar un texto en el contenido de objetos de la solución y de las soluciones heredadas, permite buscar tanto en propiedades de objetos como en fórmulas y en el nombre de los comandos de instrucción de proceso. La búsqueda incluye los campos fórmula de tipo Javascript.

Al ejecutarla se abrirá un panel en la parte inferior de Velneo vDevelop. En dicho panel podremos hacer búsquedas dentro del contenido de los [objetos](/velneo-vdevelop/proyectos-objetos-y-editores) tanto del proyecto en curso como en los heredados.

Incluye un control en el que podemos escribir la cadena a buscar. Para iniciar la búsqueda, una vez escrita la cadena, pulsaremos la tecla intro.

En la parte inferior del panel se mostrará la lista de todos los objetos que coincidan con el criterio de búsqueda y el primero de ellos será editado automáticamente.

Si desmarcamos la opción **coincidir mayúsculas y minúsculas**, no se tendrán en cuenta las mayúsculas y las minúsculas a la hora de buscar las coincidencias.

El sistema buscará tanto en propiedades de objetos como en [fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas) y en [procesos](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso) de Velneo. Así, por ejemplo, podremos buscar en qué fórmulas o propiedades se  usa un campo o  una cadena determinada, en qué procesos se usa un comando de instrucción de proceso concreto, etc.

## Objetos no usados directamente

Esta opción permite buscar objetos que no sean usados de forma directa por otros objetos de la aplicación. Debemos tener en cuenta que el que no se use un objeto directamente no quiere decir que no se use realmente, por ejemplo, si un proceso es usado solamente en un script, esta opción lo devolverá como no usado directamente por ningún objeto.

Si tenemos un proceso público y que es usado solamente para ser ejecutado a través de Internet por [Velneo vModApache](/velneo-vmodapache/que-es-velneo-vmodapache), también será devuelto por esta opción, objetos que hayamos creado para ser usados en soluciones que hereden nuestra solución, también serían devueltos al ejecutar esta opción. Por lo tanto, debemos ser cautelosos a la hora de borrar los objetos que retorne esta opción.

Esta opción se adapta al modo claro u oscuro que se tenga configurado en el sistema.

## Eliminar carpeta

Borra la carpeta seleccionada en el panel central de Velneo vDevelop. Debemos tener precaución pues no borrará solamente la carpeta seleccionada sino que borrará también todos los objetos y sub-carpetas que contenga.

## Eliminar

Elimina el objeto que seleccionemos tanto en el Inspector de objetos como en el panel central de Velneo vDevelop.

## Mover de proyecto

Permite mover el objeto actual a un [proyecto heredado](/velneo-vdevelop/herencia). Ver el capítulo [mover objeto](/velneo-vdevelop/proyectos-objetos-y-editores/objeto#mover-objeto) para ampliar información al respecto.

## Últimos modificados

Presenta la lista de los últimos objeto modificados en la sesión actual de Velneo vDevelop. Si seleccionamos uno, será editado.

## Navegante de objetos

Nos permite navegar entre propiedades y sus objetos. Contiene las opciones siguientes:

### Anterior objeto editado

Nos permite navegar al objeto que haya sido editado con anterioridad. Si hacemos clic en el botón de la flecha situado junto a este icono, se desplegará una lista con todos los objetos editamos con anterioridad. Seleccionando uno, accederemos a él.

### Siguiente objeto editado

Nos permite navegar al objeto que haya sido editado con posterioridad al objeto actual. Si hacemos clic en el botón de la flecha situado junto a este icono, se desplegará una lista con todos los objetos editamos posteriormente. Seleccionando uno, accederemos a él.

### Editar objeto de la propiedad

Si en una propiedad tenemos asignado un objeto, nos permite editarlo directamente. Por ejemplo, en las propiedades de una [acción](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion) que dispara una [búsqueda](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/busqueda), editar esta última.

### Editar objeto padre

Nos permite editar el objeto padre de un sub-objeto. Por ejemplo, estando en las propiedades de una [columna](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla/propiedades-de-columna) de rejilla, editar la [rejilla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla).

Crear objeto para la propiedad

Nos permite crear directamente un objeto desde una propiedad. Por ejemplo, desde una [conexión de evento](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/conexion-de-evento) nos permite crear el [manejador de evento](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/manejador-de-evento) a disparar.&#x20;

##


# Menú Scripts

Este menú de Velneo vDevelop contiene las opciones siguientes:

## Importar fichero script

Permite importar un archivo de script en el proyecto en curso. El archivo será importado al final de la carpeta donde estemos posicionados en el [inspector de scripts](/velneo-vdevelop/inspectores#inspector-de-scripts) en el momento de la importación.&#x20;

Si no estamos posicionados sobre ninguna carpeta lo añadirá al final del nodo principal del inspector de scripts.

## Importar directorio de scripts

Permite importar en el proyecto en curso todos los archivos de script que se encuentren en el directorio que seleccionemos. Una vez importados, podremos verlos en el [inspector de scripts](/velneo-vdevelop/inspectores#inspector-de-scripts).

## Exportar fichero script

Permite exportar a disco un archivo de script el [inspector de scripts](/velneo-vdevelop/inspectores#inspector-de-scripts) del proyecto en curso.

## Exportar directorio de scripts

Permite exportar a disco todos los archivos de script del proyecto en curso que se encuentren en la carpeta que seleccionemos del [inspector de scripts](/velneo-vdevelop/inspectores#inspector-de-scripts).

## Nueva carpeta

Permite añadir una nueva carpeta dentro del [inspector de scripts](/velneo-vdevelop/inspectores#inspector-de-scripts).

## Nuevo fichero

permite crear un nuevo fichero de script dentro del proyecto en curso. Podremos crear los siguientes tipos de archivo: QML, JavaScript, XML, CSS y SVG.&#x20;

Los de tipo qml podrán ser usados dentro de los objetos [lista QML](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/lista-qml) y [formulario QML](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario-qml)

Los de tipo JavaScript podrán ser ejecutados en [procesos JavaScript](/velneo-vdevelop/scripts/lenguajes/javascript/procesos-javascript) y también desde cualquier proceso Velneo con el comando de instrucción de proceso [ejecutar script (filescript)](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/basicos/ejecucion#ejecutar-script-filescript).

Los de tipo CSS podrá usarse en el comando de instrucción de proceso [Interfaz: establecer hoja de estilo filescript](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/interfaz/control#interfaz-establecer-hoja-de-estilo-css).

## Eliminar seleccionado

Permite eliminar el fichero de script que esté seleccionado en el [inspector de scripts](/velneo-vdevelop/inspectores#inspector-de-scripts).

## Buscar en script

(Control + F)

Permite realizar búsquedas dentro del fichero de script que tengamos abierto.

## Buscar en archivos script

Permite realizar búsquedas en todos los fichero de script del proyecto actual.

Al ejecutar esta opción se abrirá un panel en la parte inferior de Velneo vDevelop. En este panel podremos hacer búsquedas dentro del contenido de los ficheros de [scripts ](/velneo-vdevelop/scripts)creados en el proyecto, tanto en [procesos ](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso)como en [manejadores de evento](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/manejador-de-evento).

Incluye un control en el que podemos escribir la cadena a buscar. Para iniciar la búsqueda, una vez escrita la cadena, pulsaremos la tecla intro.

En la parte inferior del panel se mostrará la lista de todos los archivos que coincidan con el criterio de búsqueda y el primero de ellos será editado automáticamente en el panel central de Velneo vDevelop, con el texto de la búsqueda destacado.

Con los botones de flecha izquierda y flecha derecha, podremos buscar la coincidencia anterior/siguiente, dentro del mismo script.

Si desmarcamos la opción **coincidir mayúsculas y minúsculas**, no se tendrán en cuenta las mayúsculas y las minúsculas a la hora de buscar las coincidencias.

Una vez lanzada la búsqueda, si hay coincidencias, se activará la casilla reemplazar por, que nos permitirá especificar una cadena para reemplazar en los scripts toda las coincidencias encontradas.

{% hint style="info" %}
La búsqueda en scripts no incluye los campos fórmula de tipo JavaScript. Estos se incluyen en la búsqueda de contenidos de objetos.
{% endhint %}

## Localizar script

Permite localizar dentro del [inspector de scripts](/velneo-vdevelop/inspectores#inspector-de-scripts) un fichero que tengamos seleccionado en el panel de resultados de búsquedas en scripts.


# Menú Edición

Este menú de Velneo vDevelop contiene las siguientes opciones:

## Cortar

(Control + X)

Corta el objeto seleccionado y lo deja en el portapapeles.

## Copiar

(Control + C)

Copia el objeto seleccionado y lo deja en el portapapeles.

## Pegar

(Control + V)

Pega un objeto copiado o cortado previamente en la carpeta donde estemos situados en panel central de Velneo vDevelop.

## Pegar como...

(Control + Mayúsculas + V)

Permite pegar objetos copiados o cortados previamente y con resolución de orígenes. En el capítulo [copiado y pegado de objetos](/velneo-vdevelop/proyectos-objetos-y-editores/objeto#copiado-y-pegado-de-objetos) podremos ampliar información al respecto.

## Exportar

Permite exportar uno o varios objetos a disco para su posterior importación desde otro Velneo vDevelop.

Para exportar uno o varios objetos debemos seleccionarlos previamente en el [*dock* de proyecto](/velneo-vdevelop/interfaz-de-velneo-vdevelop/dock-de-proyecto).

Una vez seleccionados, al usar esta opción, el sistema nos pedirá la senda donde guardarlos.

Si son varios objetos y carpetas, el fichero que se genera en disco llevará el nombre del proyecto y la extensión .vob.

Si es un objeto individual, el formato del nombre de fichero en disco será (identificador + nombre singular del tipo de objeto + extensión vob).

Si seleccionamos varias carpetas, se exportarán todos los objetos contenidos en las mismas.

En el archivo se incluye la senda completa de carpetas de cada objeto, esto hará que quede ubicado en la misma posición que en el origen cuando se [importe](#importar) en un proyecto.

## Exportar objetos modificados

Esta opción nos permite exportar solamente los objetos que hayamos modificado en la sesión actual de Velneo vDevelop. El fichero que se generará tendrá la extensión .vob.

## Importar

Nos permite importar en un proyecto objetos exportados usando las opciones [Exportar](#exportar) o [Exportar objetos modificados](#exportar-objetos-modificados) del menú "Edición".&#x20;

Al seleccionar esta opción se solicitará que seleccionemos el fichero que contiene el objeto o los objetos importar, que tendrá extensión .vob.

Por defecto, los objetos que ya existan en el proyecto los sobrescribirá. Si no queremos que lo haga sino que los duplique, desactivaremos la opción "Sobreescribir objetos y  carpetas existentes" de la ventana de confirmación de la operación.

El botón "Ver todos los objetos" abrirá una vista con todos los objetos que van a ser importados.

Si pulsamos el botón "Aceptar" se procederá a la importación, si pulsamos el botón "Cancelar" no se se hará la importación.

Al importarlos se aplicará el algoritmo utilizado en la opción [pegar como](#pegar-como...) para mostrar al programador los objetos pendientes de resolución si no existen.

En el archivo se incluye la senda completa de carpetas de cada objeto, esto hará que el o los objetos importados queden ubicados en la misma posición que en el proyecto de origen.

## Deshacer

(Control + Z)

Deshace la última operación realizada.

Para imágenes hay un límite de 64 operaciones a deshacer (para evitar que ocupe mucha memoria). Para  el resto de elementos no hay límite.

## Rehacer

(Control + Y)

Rehace la última operación deshecha.


# Menú Ver

Este menú de Velneo vDevelop contiene las opciones siguientes:

## Herramientas

Permite ocultar/ver las barras de herramientas siguientes y paneles siguientes: Explorador de proyectos, Propiedades, Inspectores, Subobjetos, Principal, Nuevo objeto y Gestión de objetos.

## Personalizar

Permite personalizar tanto el estilo de visualización del interfaz como el idioma de trabajo.

Incluye las opciones:

### Estilos

Permite seleccionar el estilo visual a usar en Velneo vDevelop. Los estilos disponibles dependerán del sistema operativo donde ejecutemos Velneo vDevelop. El estilo que se usar por defecto y que recomendamos usar y que es común a todos los sistemas operativos es el estilo **fusión**, ya que es el que mejor se adapta al sistema donde ejecutamos Velneo vDevelop.

### Apecto

Solamente disponible en macOS. Nos permite configurar si queremos ejecutar Velneo vDevelop en modo claro u oscuro o hacer uso de la configuración del sistema.

### Idioma

En lo que al idioma respecta, Velneo vDevelop, en su versión actual, de forma nativa está traducida al Castellano y al Inglés, pero si en el directorio del ejecutable existe un fichero con extensión QM, en la lista de idiomas disponibles, además del Castellano y el Inglés, aparecerá el idioma correspondiente a ese fichero externo. Consultar con Velneo su disponibilidad.

## Pantalla completa

(F11)

Permite activar/desactivar el modo de visualización del editor a pantalla completa.

## Inicio

Abre la página de inicio de Velneo vDevelop en el panel central. En el caso de que ya se encuentre abierta, activará la pestaña que la contenga.

## Mensajes y alertas

Presenta el gestor de mensajes que permitirá al usuario enviar y recibir mensajes a/de otros usuarios. Ver el capítulo mensajería para ampliar información sobre su funcionamiento.

## Extensiones

Las extensiones nos permiten implementar nuevas funcionalidades en Velneo vDevelop de forma sencilla. Ver el capítulo dedicado a las [extensiones de Velneo vDevelop](/velneo-vdevelop/extensiones-de-velneo-vdevelop) para ampliar la información al respecto.

## Tabs inspectores

Nos permite configurar qué [inspectores](/velneo-vdevelop/inspectores) queremos ver u ocultar en el [panel de inspectores](/velneo-vdevelop/interfaz-de-velneo-vdevelop#inspectores) y si queremos ver en las pestañas sólo el icono o el icono y el texto.

## Proyecto

Abre el contenido del proyecto en el panel central de Velneo vDevelop.

## Dibujos del proyecto

Muestra en el panel central de Velneo vDevelop una vista en miniatura de todos los dibujos del proyecto.

## Dibujos del proyecto y heredados

Muestra en el panel central de Velneo vDevelop una vista en miniatura de todos los dibujos del proyecto y de todos los proyectos heredados. Esta es la opción que se incluye además en la toolbar de Velneo vDevelop.

## Abrir proyecto como estaba antes de cerrar

Esta opción por defecto está activada y lo que permite es que, cuando abramos un proyecto, se abra tal y como estaba en el momento de su última edición. Es decir, que si la última vez que se editó un proyecto estábamos editando un formulario, al volver a editarlo se abrirá en ese punto.

## Localizar objeto en proyecto automáticamente

Cuando editamos un objeto se abre una pestaña en el [panel central](https://doc.velneo.com/velneo-vdevelop/interfaz-de-velneo-vdevelop/pages/-M7D76mbSHJGb3vExDpa#id-1.-panel-central). Cuando en el panel central tenemos abiertas varias pestañas, al hacer clic en una se posicionará sobre el objeto en el dock de objetos del proyecto de [explorador de proyectos](https://doc.velneo.com/velneo-vdevelop/interfaz-de-velneo-vdevelop/pages/-M7D76mbSHJGb3vExDpa#id-2.-explorador-de-proyectos). Esta opción permite desactivar/activar esta funcionalidad.

## Restablecer configuración original

Restablece la configuración original de Velneo vDevelop (distribución de toolbars y paneles) y elimina el histórico de servidores con los que se ha establecido conexión.


# Menú Componentes

Desde este menú de Velneo vDevelop podremos lanzar los siguientes componentes de la plataforma: [Velneo vAdmin,](/velneo-vadmin/que-es-velneo-vadmin) [Velneo vDataclient](/velneo-vdataclient/que-es-velneo-vdataclient), [Velneo vDevelop,](/velneo-vdevelop/introduccion) [Velneo vInstall Builder ](/velneo-vinstallbuilder/que-es-velneo-vinstall-builder)y [Velneo vTranslator](/velneo-vtranslator/que-es-velneo-vtranslator).

Cuando ordenemos ejecutar un componente el sistema lo buscará en el directorio de Velneo vDevelop, si no lo encuentra, nos pedirá que le indiquemos la ruta en la que está instalado, una vez indicada será lanzado y se guardará esta información para evitar que el sistema nos pida la senda cada vez que vayamos a ejecutar ese componente.

Si el componente no está instalado, no podrá ser ejecutado.

## **Restablecer componentes**&#x20;

Esta opción elimina la información de las rutas donde los teníamos instalados. Esto hará que, la siguiente vez que se solicite ejecutar un componente, el sistema vaya a buscarlo al directorio de Velneo vDevelop.


# Menú Ayuda

Este menú de Velneo vDevelop contiene las opciones siguientes:

## Ayuda online (F1)

Carga en el panel central de **Velneo vDevelop** la documentación en línea del producto. Si no disponemos de conexión a internet la ayuda no podrá ser cargada.

## Acerca de Velneo vDevelop

Presenta una ventana con la información del sistema siguiente: Versión del producto, versión de Qt, sistema operativo, arquitectura de Velneo, memoria total del sistema y porcentaje de memoria ocupada.


# Lista de teclas aceleradoras de Velneo vDevelop

En este capítulo se listan todas las teclas aceleradoras que incluye el entorno desarrollo de Velneo (Velneo vDevelop), agrupadas por ámbito de actuación.

## Generales

**Conectar con servidor**: Ctrl + O

**Ayuda**: F1 (Windows y Linux), Ctrl+? (Mac OS)

[**Galería de objetos**](/velneo-vdevelop/proyectos-objetos-y-editores/objeto#galeria-de-objetos): F6

**Pantalla completa**: F11

[**Dock de proyecto**](/velneo-vdevelop/interfaz-de-velneo-vdevelop/dock-de-proyecto): Ctrl l+ 1

**Árbol de propiedades**: Ctrl + 2

**Dock de subobjetos**: Ctrl + 3

[**Inspector de objetos**](/velneo-vdevelop/inspectores): Ctrl + 4

**Explorador de proyectos**: Ctrl + 5

**Nueva solución**: Ctrl + Alt + K

**Nuevo proyecto de datos**: Ctrl + Alt + L

**Nuevo proyecto de aplicación**: Ctrl + Alt + M

**Nuevo subobjeto (desde panel central)**: Ctrl + N

**Editar objeto**: Intro

**Propiedades del proyecto**: Ctrl + Alt + N

**Propiedades de la carpeta**: Alt+Intro

**Guardar**: Ctrl + S

**Guardar y proteger**: Ctrl + Shift + S

**Deshacer desprotección**: Ctrl + Shit + Z

**Eliminar objeto**: Del (Windows), Del, Meta+D (Mac), Del, Ctrl+D (Linux)

**Eliminar carpeta**: Del (Windows), Del, Meta+D (Mac), Del, Ctrl+D (Linux)

**Mover objeto de proyecto**: Ctrl + Shift + M

**Últimos objetos modificados**: Ctrl + Shift + L

**Galería de objetos**: F6

**Buscador**: Control + B

**Llevar cursor al final de cualquier campo de edición (solo en Linux y macOS)**: Ctrl + E (también funcional en Velneo vClient en controles de edición de formularios).

## Panel central

**Anterior vista**: Ctrl + F5

**Siguiente vista**: Ctrl + F6

**Cerrar vista**: Ctrl + F4 (Windows), Ctrl + W (Linux), Cmd + W (Mac)

## Dock de propiedades

F4: según el tipo de propiedad, hace lo siguiente:

* En propiedades en las que se debe seleccionar un objeto, la tecla despliega la lista de objetos disponibles para su selección.
* En propiedades que disponen de asistente (fórmulas, color, fuente...) despliega el asistente correspondiente.

## Dock de subobjetos

**Nuevo subobjeto**: Ctrl + N

**Modificar subobjeto**: Intro

**Borrar subobjeto**: Del (Windows), Del, Meta+D (Mac), Del, Ctrl+D (Linux)

**Arriba en orden tab**: Ctrl + Cursor arriba

**Abajo en orden tab**: Ctrl + Cursor abajo

Si pulsamos Intro sobre un objeto que no tiene editor, se accederá al panel de propiedades. Para salir del panel de propiedades y volver al panel central pulsar Escape.

## Editor de rejillas

**Propiedades**: Alt+Intro

**Nueva columna**: Ctrl + N

**Eliminar columna**: Del (Windows), Del, Meta+D (Mac), Del, Ctrl+D (Linux)

**Insertar columna**: Insert

**Columna: Adaptar a ancho de título**: Alt + F7

**Columna: Adaptar a ancho de contenido**: Shift + F7

**Columna: Mover a la izquierda**: Alt + Cursor izquierda

**Columna: Mover a la derecha**: Alt + Cursor derecha

## Editor de dibujos

**Importar**: Ctrl + I

**Exportar**: Ctrl + E

**Zoom +**: Ctrl + +

**Zoom –**: Ctrl + –

**Deshacer**: Ctrl + Z, Alt + Backspace (Windows), Ctrl + Z (Mac y Linux)

**Rehacer**: Ctrl + Y, Shift + Ctrl + Z, Alt + Shift + Backspace (Windows), Ctrl+Shift+Z, Ctrl+Y (Mac OS), Ctrl + Shift + Z (Linux)

**Propiedades**: Alt+Intro

## Editor de formularios

**Mover control 1 pixel**: Teclas del cursor

**Mover control 10 pixeles**: Ctrl + Teclas del cursor

**Redimensionar control 1 pixel**: Shift + Teclas del cursor

**Redimensionar control 10 pixeles**: Ctrl + Shift + Teclas del cursor

**Ajustar tamaño control a contenido**: Shift + F7

**Aplicar layouts**: Ctrl + Intro

**Previsualizar**: Fin

**Desactivar layouts en edición**: Alt + Shift + L

## Editor de informes

**Mover control 1 pixel**: Teclas del cursor

**Mover control 10 pixeles**: Ctrl + Teclas del cursor

**Redimensionar control 1 pixel**: Shift + Teclas del cursor

**Redimensionar control 10 pixeles**: Ctrl + Shift + Teclas del cursor

**Ajustar tamaño control a contenido**: Shift + F7

## Editor de búsquedas

**Nuevo elemento**: Ctrl + N

**Eliminar elemento**: Del (Windows), Del, Meta+D (Mac), Del, Ctrl+D (Linux)

## Editor de procesos

**Añadir línea**: Ctrl + N, Ctrl + Enter

**Insertar línea**: Insert

**Modificar línea**: Intro

**Eliminar línea**: Del (Windows), Del, Meta+D (Mac), Del, Ctrl+D (Linux)

**Activar/Desactivar línea**: Shift + F6

**Seleccionar todo**: Ctrl + A

**Ventana de árbol de comandos**: Shift + F4

Ayuda de comando de instrucción de proceso Ctrl + F1

## Editor de menús/toolbars

**Añadir elemento**: Alt + Cursor derecha + Intro

**Quitar elemento**: Alt + Cursor izquierda + Del (Windows), Del, Meta+D (Mac), Del, Ctrl+D (Linux)

**Arriba en orden tab**: Ctrl + Cursor arriba

**Abajo en orden tab**: Ctrl + Cursor abajo

## Asistente de fórmulas

**Lista de funciones**: F4

**Lista de campos**: F5

**Lista de constantes**: F2

**Lista de variables globales**: F6

**Lista de variables locales**: F7

**Lista de variables de sistema**: F8

**Lista de funciones de proceso**: F10

**Lista de funciones de dll**: F11

**Nueva linea**: Intro

**Verificar fórmula**: F9

**Aceptar**: Ctrl + Intro

## Editor de esquemas

**Traer al frente**: Inicio

**Llevar al fondo**: Fin

**Eliminar ítem**: Del (Windows), Del, Meta+D (Mac), Del, Ctrl+D (Linux)

## Scripts

**Buscar en scripts**: Ctrl + F

## Navegante de edición

**Anterior objeto editado**: Alt + Shift + Cursor izquierda

**Siguiente objeto editado**: Alt + Shift + Cursor derecha

**Editar objeto padre**: Alt + Shift + P

**Editar objeto de la propiedad**: Alt + Shift + O


# Soluciones y proyectos

Desde [Velneo vDevelop](/velneo-vdevelop/introduccion) podremos tanto crear como abrir una [solución ](/velneo-vdevelop/soluciones-y-proyectos) declarada en un [Velneo vServer ](/velneo-vserver/que-es-velneo-vserver)y crear o modificar los [proyectos de datos](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-organizacion/proyecto-de-datos-1-carpetas-esquemas-tablas-e-indices-complejos) y [proyectos de aplicación ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion)contenidos en la misma y que conformarán nuestras aplicaciones. Antes de crear una solución es importante que nos conectemos con el servidor en el que vayamos a crearla (Menú "Soluciones", opción "conectar con servidor").

Una vez conectados con el servidor, se nos presentará una ventana desde la que podremos, o bien seleccionar una solución existente para editar, o bien crear una nueva.

Una vez realizada la conexión con el servidor, si posteriormente queremos crear una nueva solución, ejecutaremos la opción [nueva solución](https://doc.velneo.com/velneo-vdevelop/pages/-MJa6jhaUe0fgzV6EYmr#nueva-solucion...) del menú [soluciones](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-soluciones). Una vez hecho esto se presentará el asistente para la creación de soluciones.

En él tendremos que cumplimentar las propiedades siguientes:

**Nombre**: descriptor de la solución. Ejemplo: Plantillas.

**Compartido**: el concepto de solución compartida, es una característica de las soluciones, que permite que un [proyecto ](/velneo-vdevelop/proyectos-objetos-y-editores)pueda heredar múltiples proyectos ubicados en soluciones conocidas y con la característica de compartidas.

Por lo tanto, si una solución va a ser heredada por otras debemos activar esta propiedad.

Hay que tener en cuenta que nuestro editor Velneo vDevelop sólo nos permitirá trabajar a la vez con una solución, pero cuando desde un proyecto decidamos heredar otros proyectos en la lista de proyectos heredables se nos presentarán tanto los de la solución cargada como los de las soluciones compartidas.

{% hint style="warning" %}
Es importante saber que si tenemos una solución en un servidor y la actualizamos mediante [vAdmin](/velneo-vadmin/gestion-de-aplicaciones/soluciones#instalar-soluciones) o [importando soluciones compartidas](#importar-soluciones-compartidas) desde otro servidor, solamente actualizará los proyectos, por lo tanto, en el caso de que hayamos cambiado en el origen el valor de esta propiedad, al actualizarla en otros servidores este dato no se actualizará; debemos modificarlo directamente en el servidor de destino.
{% endhint %}

**Servidor**: nombre o IP del servidor donde se encuentra a la escucha el servicio de Velneo vServer. Debe ir precedido del esquema "vatp\[s]://". Estará especificado el servidor con el que nos hayamos conectado.

Ejemplos:

vatp\://velneo.com

vatps\://velneo.com

Pulsaremos el botón "siguiente" para pasar al siguiente paso del asistente.

En este paso seleccionaremos la plantilla a aplicar. Las plantillas disponibles son:

**Solución vacía**: se creará la solución en el servidor indicado en el primer paso del asistente, vacía.

**Un proyecto de datos**: se creará la solución en el servidor indicado en el primer paso del asistente y conteniendo un proyecto de datos dentro de ella.

**Un proyecto de aplicación**: se creará la solución en el servidor indicado en el primer paso del asistente y conteniendo un proyecto de aplicación dentro de ella.

**Un proyecto de datos y otro de aplicación**.

Si seleccionamos la plantilla **solución vacía**, el siguiente paso será finalizar el asistente y ésta será creada. Si seleccionamos cualquiera de las otras, el siguiente paso del asistente será la especificación del nombre del proyecto o proyectos a crear.

Una vez especificado el nombre del proyecto o proyectos a crear, pulsaremos el botón “siguiente” para ir al siguiente paso del asistente. Si en la sesión actual ya nos habíamos conectado previamente a un Velneo vServer, en el siguiente paso se mostrará la lista de proyectos alojados en el mismo susceptibles de ser [heredados](/velneo-vdevelop/herencia).

La lista de proyectos heredables dependerá del tipo de plantilla seleccionada. Si se desea heredar alguno, simplemente activar el checkbox situado a la izquierda del proyecto deseado.

Este paso será obviado si no nos hemos conectado previamente a ningún Velneo vServer.

El siguiente paso del asistente será la definición de los idiomas del proyecto o proyectos a crear.

Estos idiomas que se podrán seleccionar en ejecución para mostrar la información de los objetos. Debemos seleccionar un idioma y un país al que se aplica el idioma. Usando las opciones **subir** y **bajar** podremos ordenar los idiomas del proyecto. El primero de la lista será el idioma por defecto del proyecto. Los países se presentan en función del idioma seleccionado.

Los idiomas de los proyectos tienen un orden de carga en ejecución. Primero será el que coincida con la selección de Idioma y País. Si seleccionamos el valor **default** para **País**, el idioma será aplicable para cualquier selección de país. En el caso de que el país del sistema no esté representado y de que haya de un idioma varias opciones de país, se tomará primero el definido como **default**, si no, el primero del proyecto que coincida con el idioma. Si no existe el idioma del sistema se tomará el idioma por defecto del proyecto que es el primero que esté definido en el proyecto.

En cualquier caso, podemos dar opción al usuario para que seleccione de entre los idiomas del proyecto aquél que desee usar.

Una vez definidos los idiomas pulsaremos el botón “siguiente” para pasar a la ventana de finalización del asistente.

La solución que acabamos de crear será cargada directamente.

En el caso de que hayamos creado también algún proyecto, éste será cargado automáticamente. En el panel central de Velneo vDevelop se muestra el esquema de los proyectos de la solución cargada y las relaciones entre ellos:

![](/files/-M7D77YFnMGOLfW8KHdn)

Una vez creada la solución, ya podremos, o bien editar los proyectos creados mediante el asistente, o bien crear nuevos proyectos en la misma.

A los proyectos de aplicación creados durante el asistente, en la propiedad [alias](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion-1#alias) se le añadirá el sufijo \_app.

A los proyectos de datos creados durante el asistente, en la propiedad [alias](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos-1#alias) se le añadirá el sufijo \_dat.

Para crear un proyecto de datos ejecutaremos la opción **nuevo proyecto de datos** del menú **proyectos**.

Para crear un proyecto de aplicación ejecutaremos la opción **nuevo proyecto de datos** del menú **proyectos**.

Si lo que queremos es abrir una solución ya declarada en un Velneo vServer ejecutaremos la opción **abrir solución** del menú **soluciones**. Si no estamos conectados con ningún Velneo vServer el sistema nos pedirá los datos de conexión al mismo; una vez establecida la conexión con Velneo vServer, se presentará una ventana con la lista de soluciones de ese Velneo vServer.

Hacer doble clic sobre la solución que se desea cargar.

La descarga de los proyectos desde Velneo vServer está optimizada, ya que se envían comprimidos en un único envío.

También podremos descargar una solución ejecutando la opción **últimas soluciones abiertas** del menú **soluciones**, que aparece junto al botón de abrir solución, al ejecutarla se abrirá la lista de las últimas soluciones abiertas, seleccionaremos la solución que queramos abrir.

Si apareciese vacío querrá decir que, o bien no se han declarado soluciones en Velneo vServer, o bien no se nos ha dado permiso a ninguno.

Una vez seleccionada una solución, si contiene proyectos, éstos serán mostrados en el explorador de proyectos.

Para cargar un proyecto hacer doble clic sobre él. Cuando haya sido cargado, en la pestaña proyectos cargados del explorador de proyectos se mostrará tanto el proyecto solicitada como los proyectos que éste herede.

Para cargar los objetos de un proyecto hacer doble clic sobre él dentro de cualquiera de las pestañas del explorador de proyectos. Cuando hayan sido cargados se abrirá automáticamente el panel de proyecto en el panel centra de Velneo vDevelop.

En este punto ya podremos tanto modificar los objetos existentes como crearlos nuevos.

## Borrado de soluciones

Es posible borrar soluciones desde Velneo vDevelop, para ello debemos conectarnos con Velneo vServer y ejecutar la opción Eliminar solución del menú Soluciones. Al ejecutarla el sistema nos presentará una ventana con las soluciones del servidor a las que tenemos acceso, seleccionarnos la solución a borrar y pulsaremos el botón “aceptar”, una vez hecho esto, el sistema pedirá confirmación, si aceptamos, nos advertirá de que al borrar la solución serán borrados también los proyectos de la misma.

Si aceptamos, se procederá al borrado de la solución y de los proyectos contenidos en la misma.

Una vez eliminada la solución debemos cerrar Velneo vDevelop y volver a conectarnos para ver el resultado.

**Esta operación no puede ser deshecha**; debido a ello recomendamos hacer una copia de seguridad previa de todas las soluciones para que no eliminemos un proyecto que necesitemos por error. En cualquier caso únicamente se borran los proyectos que contiene la solución en curso.

Si heredamos proyectos que se encuentran en otras soluciones éstos no serán borrados.

Si alguno de los proyectos de la solución está siendo editado por un programador, nos mostrará un error y solicitará que previamente finalicemos la edición del mismo.

Si alguno de los proyectos de la solución está [instanciado,](/velneo-vadmin/gestion-de-aplicaciones) la solución no será eliminada. El sistema no presentará ninguna ventana advirtiéndolo, pero si cerramos Velneo vDevelop y volvemos a conectarnos con el servidor, comprobaremos que la solución permanece en la lista de soluciones.

## Importar soluciones compartidas

Se trata de una opción que nos permite importar soluciones de servidores remotos. Antes de ejecutarla tendremos que conectarnos con Velneo vServer donde vamos a importar las soluciones.

La opción **importar componentes** está incluida dentro del menú **soluciones**. Al ejecutarla el sistema solicitará los datos de conexión con Velneo vServer cuyas soluciones queremos importar.

Si la conexión es satisfactoria, se abrirá una ventana en la que se mostrarán todas las soluciones y proyectos declarados en el servidor remoto.

Por defecto, todas las soluciones estarán marcadas para su importación.![](https://s3-eu-west-1.amazonaws.com/dl.velneo.com/es/productos/v7/ayuda/20/velneo_vdevelop/img/res_1700.jpg). Por tanto, tendremos que desmarcar aquellas que no queremos importar, para ello haremos clic sobre el botón correspondiente a la misma. El icono![](https://s3-eu-west-1.amazonaws.com/dl.velneo.com/es/productos/v7/ayuda/20/velneo_vdevelop/img/res_1701.jpg)indica que la solución no será importada.

Una vez seleccionadas las soluciones a importar, pulsaremos el botón “aceptar” para proceder a su importación. Una vez finalizada, las soluciones importadas y sus proyectos ya estarán disponibles en el servidor de destino.

La importación se realiza tanto de los ficheros de [proyectos](/velneo-vdevelop/proyectos-objetos-y-editores) como de [ficheros adjuntos](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/fichero-adjunto) declarados en los mismos, y se enviarán de forma comprimida.

## Editor de soluciones

El explorador de proyectos incluye un editor de soluciones en el que, además de mostrar los proyectos de la solución abierta y sus relaciones de [herencia,](/velneo-vdevelop/herencia) podremos crear nuevos proyectos y nuevas relaciones entre ellos:

![](/files/-M7D77YHL0Jf679HM0Sh)

Dicho editor incluye los comandos siguientes:

Propiedades de la solución: permite editar las propiedades de la solución cargada.

Nuevo proyecto de datos: permite crear un nuevo proyecto de datos en la solución.

Nuevo proyecto de aplicación: permite crear un nuevo proyecto de aplicación en la solución.

Modo: edición: estando activada esta opción, el puntero del ratón estará en modo normal, es decir, nos permitirá seleccionar ítems del esquema, arrastrarlos, etc.

Modo: ver: estando activada esta opción, el puntero del ratón se convertirá en una mano con la que podremos mover el esquema completo dentro del editor cuando éste tenga partes que queden fuera del área del mismo.

Modo: crear herencia: estando activada esta opción, el puntero del ratón se convertirá en una mano con la que podremos crear una relación de herencia entre dos proyectos de la solución abierta o entre un proyecto de la solución abierta y otro de otra solución del mismo Velneo vServer.

Para establecer una relación de herencia entre dos proyectos de la misma, una pulsado el botón, no tendremos más que pinchar sobre el proyecto de origen, arrastrar hasta el proyecto que deba heredarlo y soltarlo sobre el mismo.

![](/files/-M7D77YOdnVd2VDY5T2f)

Una vez soltado el ratón comprobaremos que la relación de herencia ha sido establecida:

![](/files/-M7D77YQY74r-hP0M9I8)

Si volvemos al modo edición, veremos que el esquema de proyectos es recompuesto automáticamente para mostrar la nueva jerarquía de relaciones.

Para establecer una relación de herencia con otros proyectos del mismo Velneo vServer, una pulsado el botón, en la parte inferior del editor de soluciones se presenta la lista del resto de las soluciones declaradas en el mismo Velneo vServer:

![](/files/-M7D77YR2NKG_pW5RkMn)

Cada una de ellas precedida por el icono ![](/files/-M7D77YTVzKbWTle5jL-). Si junto a la lista de soluciones aparece el símbolo![](https://s3-eu-west-1.amazonaws.com/dl.velneo.com/es/productos/v7/ayuda/20/velneo_vdevelop/img/res_1759.jpg), quiere decir que hay más soluciones, si lo pulsamos, se abrirá una ventana con todas ellas.

Si queremos cargar los proyectos de una solución, haremos un clic sobre el icono![](/files/-M7D77YTVzKbWTle5jL-) que precede al nombre de la misma, al hacerlo el estado de la solución pasará a estar como marcado (![](/files/-M7D77YUvkp4yjElGoky)) y se visualizarán en el editor de soluciones los proyectos contenidos en la misma.

Para establecer la herencia, seguiremos los mismos pasos que hemos indicado anteriormente (pinchar, arrastrar y soltar), y podremos ver en el esquema cómo la nueva relación de herencia ha sido creada.

Si volvemos al modo normal del cursor, desaparecerán del editor los proyectos de la/s otra/s solución/es cargada/s, aunque la herencia establecida permanecerá.

Zoom: permite ampliar/reducir el tamaño del contenido del editor. El valor por defecto es 100%.

Recalcular escena: permite recomponer la vista del contenido de la solución.

Imprimir: envía el esquema de proyectos de la solución a una impresora.

Imprimir a fichero: exporta a disco el esquema de proyectos de la solución, en formato pdf o ps (post script).

{% hint style="info" %}
Es posible ejecutar una aplicación directamente desde Velneo vDevelop pulsando la tecla F5, para ello es necesario que la instancia tenga definido un identificador, para ello editaremos la instancia de aplicación y escribiremos un nombre en el parámetro del mismo nombre. Este identificador debe ser en mayúsculas y no puede contener espacios en blanco. Para ampliar información consultar el capítulo [interfaz de Velneo vDevelop](/velneo-vdevelop/interfaz-de-velneo-vdevelop).
{% endhint %}

En Windows, la ruta de Velneo vClient se configura en el valor vClientPath de la siguiente clave del registro:

`HKEY_CURRENT_USER\Software\Velneo\vDevelop`

En Linux, para configurar la ruta de ejecución de Velneo vClient tendremos que editar el fichero vDevelop.con, que encontramos en el directorio home/Usuario/.Config/Velneo/ y configurar el parámetro a configurar es: vClientPath=/ruta/vClient.sh.

{% hint style="warning" %}
En una misma sesión de Velneo vDevelop no se puede abrir una misma solución de dos servidores distintos, ya que podría contener versiones distintas y sólo puede tener una de cada proyecto en memoria.
{% endhint %}


# Control y edición de proyectos

[Velneo vDevelop](/velneo-vdevelop/introduccion) dispone de un sistema automático de bloqueo de proyectos y de un sistema automático de control de versiones.

## Control de edición compartida

[Velneo vServer ](/velneo-vserver/que-es-velneo-vserver)dispone de un sistema automático de protección en la edición de [proyectos ](/velneo-vdevelop/proyectos-objetos-y-editores)de modo que, si un usuario abre un proyecto para su edición, el sistema lo bloquea.

El estado de un proyecto que no está siendo editado es **protegido en edición**. Esto quiere decir que el proyecto puede ser abierto y editado, esto es, que puede ser **desprotegido para su edición**.

Cuando un usuario desprotege un proyecto para su edición el proyecto es bloqueado por Velneo vServer.&#x20;

Si otro usuario intenta abrir un proyecto que está bloqueado el sistema avisa mediante un mensaje, indicando el nombre del usuario que lo tienen bloqueado y le preguntará si quiere abrirlo en edición. Si responde que sí, el otro usuario perderá los cambios que no hubiese guardado. Si responde que no, le permitirá abrirlo en modo de solo lectura.

El abrir un proyecto en modo de sólo lectura implica que no se podrá modificar nada del proyecto, pero sí se podrán ver y copiar objetos del mismo. En la parte inferior derecha de Velneo vDevelop aparecerá un mensaje indicando quién está editando el proyecto:

![](/files/-M7D77mqBYeG34Tbidpo)

Si mientras tenemos abierto el proyecto en modo de solo lectura el usuario que lo estaba editando termina su edición, veremos que el texto del mensaje cambiará:

![](/files/-M7D77mp-dC9iWzss5mT)

Y si hacemos clic sobre él, pasaremos a editar el proyecto en modo de lectura/escritura.

También es posible abrir un proyecto en modo de solo lectura aunque no esté nadie editándolo, para ello, en la vista de la solución seleccionaremos el proyecto a editar y haremos clic en la opción **abrir proyecto modo solo lectura**, de la toolbar:

![](/files/-M7D77mogWBjhhXzKJgt)

Al editar el proyecto veremos que en la parte inferior derecha se indica que lo tenemos abierto en modo de solo lectura:

![](/files/-M7D77mp-dC9iWzss5mT)

Si queremos pasar a editar en modo lectura/escritura simplemente haremos clic sobre este mensaje. Si tras abrir un proyecto en modo de solo lectura otro usuario lo abre ne modo de lectura/escritura, entonces en el mensaje se informará del usuario que lo está editando:

![](/files/-M7D77mqBYeG34Tbidpo)

Si se diese el caso de que un usuario que tiene bloqueado un proyecto para su edición perdiese la conexión con Velneo vServer durante su edición, el proyecto seguirá bloqueado, por lo que no podrá ser desprotegido para su edición. Para poder quitar el bloqueo tendremos que deshacerlo desde [Velneo vAdmin,](/velneo-vadmin/que-es-velneo-vadmin) conectarnos con él a Velneo vServer, acceder al panel de [soluciones](/velneo-vadmin/gestion-de-aplicaciones/soluciones), seleccionar la solución donde está guardado el proyecto, buscar el proyecto, situar el cursor sobre él y ejecutar la opción **deshacer desprotección del proyecto** que aparece al pulsar el botón derecho del ratón sobre el mismo.

Cuando estamos editando un proyecto en Velneo vDevelop tenemos varias opciones de guardado, todas ellas contenidas en el menú Proyectos:

**Guardar proyecto:** guarda los cambios realizados en el proyecto y lo mantiene desprotegido para su edición para que podamos seguir trabajando con él. Es la opción de guardado por defecto disparable en la barra de herramientas de Velneo vDevelop.

**Guardar y proteger proyecto:** guarda los cambios realizados en el proyecto y lo cierra, dejando éste protegido para su edición.

**Deshacer desprotección de proyecto:** cierra el proyecto y lo deja protegido para su edición, pero sin guardar cambios; es decir, retorna el proyecto a la última versión guardada del mismo.

En el explorador de proyectos de Velneo vDevelop, tanto en la pestaña del editor de soluciones con en la pestaña de proyectos cargados del explorador de proyectos de podremos conocer, en tiempo real, si los proyectos de la solución actual están o no protegidos para su edición.

El icono![](/files/-M7D77YUvkp4yjElGoky)indica que el proyecto está desprotegido para su edición (bloqueado) por el usuario en curso.

El icono![](/files/-M7D77mspTlgy8JUlpoH) indica que el proyecto está protegido para su edición (listo para ser bloqueado y editado) por otro usuario. También muestra el nombre de dicho usuario.

El icono ![](/files/-M7D77mtRGCdpE_8r3uu) indica que el proyecto está protegido para su edición (listo para ser bloqueado y editado).

Estas vistas son actualizadas de forma automática por el sistema a medida que se van protegiendo/desprotegiendo los proyectos.

Cuando estamos editando un proyecto que es heredado por otros proyectos, si modificamos el identificador de un [objeto](/velneo-vdevelop/proyectos-objetos-y-editores) el sistema debe actualizarlo en todos los proyectos en los que dicho objeto es usado; esto implica que debe abrir todos los proyectos heredados para modificarlo y guardarlos. En el caso de que uno de esos proyectos esté siendo editado por otro usuario, el sistema nos advertirá que dicho proyecto no ha podido ser modificado.

Esto quiere decir que no ha podido actualizar en aquel proyecto el identificador del objeto modificado; por lo que es recomendable que deshagamos ese cambio de identificador y lo hagamos cuando los proyectos que hereden el actual no estén siendo editados por otros usuarios.

El servidor desconectará automáticamente aquellos componentes clientes de edición ([Velneo vDevelop,](/velneo-vdevelop/introduccion) [Velneo vTranslator](/velneo-vtranslator/que-es-velneo-vtranslator)) y de administración ([Velneo vAdmin](/velneo-vadmin/que-es-velneo-vadmin)) tras 12 horas sin uso.

En el caso de clientes de edición (Velneo vDevelop y Velneo vTranslator), no se deshará la desprotección de los proyectos, con el fin de permitir enviar los cambios realizados en esa sesión de edición que se ha mantenido abierta e inactiva durante más de 12 horas.

En ese caso, para guardar los cambios simplemente deberíamos ejecutar la opción de conexión con el servidor y, una vez restablecida, guardar el proyecto que estábamos editando.

## Control de versiones

Velneo vDevelop dispone de un control automático de versiones.

En las propiedades de un proyecto podremos conocer tanto la fecha y la hora en la que éste ha sido guardado por última vez como el número de veces que éste ha sido guardado:

Estos datos son actualizados automáticamente por Velneo vDevelop cada vez que guardamos cambios en un proyecto.

Existe la posibilidad de disponer de un historial de versiones. Se trata de un repositorio de proyectos de soluciones, que sirve para mantener y recuperar versiones, y llevar un log de modificaciones: quién creó y modificó soluciones y proyectos.

De esta forma, el usuario tiene una copia de seguridad de los proyectos y puede documentar versiones, recuperarlas en caso de error, etc.

Este historial estará disponible con el componente [**Velneo vVersion**](/velneo-vversion/que-es-velneo-vversion).

Además de mantener y recuperar versiones completas de proyectos, **vVersion** incorpora un control de cambios que registra automáticamente las diferencias entre versiones, permitiendo consultar qué objetos han sido creados, eliminados o modificados en cada guardado. Esta información puede consultarse tanto desde la propia aplicación vVersion como desde la opción [Histórico de cambios de un objeto](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-objetos#historial-de-cambios-de-un-objeto) del menú [Objetos](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-objetos) de Velneo vDevelop.

## Copia de seguridad automática de proyectos

Cuando guardamos un proyecto, Velneo guarda en el directorio de la solución una copia del estado previo del mismo con extensión bak (ejemplo: 63ffjad23.vca.bak).

Si por algún motivo, el fichero del proyecto se corrompe, por ejemplo, por un problema de disco, podremos recuperar la última versión guardada del mismo simplemente borrando el fichero y quitando la extensión .bak a la copia. Esto tendremos que hacerlo con el servicio vatp detenido.


# Herencia

La herencia es la propiedad que permite que un [proyecto ](/velneo-vdevelop/proyectos-objetos-y-editores)pueda hacer uso de los [objetos ](/velneo-vdevelop/proyectos-objetos-y-editores)de otro proyecto. Para ello debemos definir en la configuración del proyecto, en la pestaña correspondiente a la herencia, de qué proyectos queremos heredar sus objetos. Los [proyectos de datos](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos) únicamente pueden heredar de otros proyectos de datos. Esto se debe a que los proyectos de datos han de ser independientes del interfaz de nuestras aplicaciones, e independientes del usuario por tanto, y funcionar de forma autónoma.

Los [proyectos de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) heredan de los proyectos de datos sus objetos y sub objetos, permitiendo así que los objetos de la aplicación operen con las bases de datos que contienen los proyectos de datos. Además, los proyectos de aplicación pueden heredar de otros proyectos de aplicación. De esta forma podemos programar proyectos de aplicaciones haciendo uso tanto de los objetos de proyectos de datos como de los objetos de proyectos de aplicación.

Si un proyecto A hereda el proyecto B y el proyecto B hereda el proyecto C, el proyecto A también heredará el proyecto C sin necesidad de definir la relación de herencia entre ambos de forma explícita.

La herencia no es recíproca, no siendo posible establecer este tipo de relación entre dos proyectos.

Es posible heredar proyectos de otras soluciones de un mismo [Velneo vServer](/velneo-vserver/que-es-velneo-vserver). Solamente se podrán heredar proyectos de aquellas soluciones que hayan sido definidas como compartidas.

Cuando vayamos a diseñar una solución que implique diferentes tipos de herencia, debemos ser conscientes de que una **instancia de un proyecto de aplicación no puede heredar dos instancias distintas de un mismo proyecto de datos**.

Para verlo más claro, lo explicaré con un ejemplo. Partamos de esta estructura de herencias:

![](/files/-M7D77tbgtfVqS91U3RI)

En la estructura anterior, el proyecto de aplicación A está heredando dos veces el proyecto de datos D, una a través de la herencia del proyecto de aplicación C y otra por la herencia del proyecto de Aplicación B.

Sería lo mismo que intentar asignar en la herencia de un proyecto de aplicación dos veces la herencia del mismo proyecto de datos, veremos que el sistema no deja hacerlo; de esta otra forma podemos hacerlo porque se está haciendo de forma indirecta.

Si tal y como tenemos definidas las herencias, instanciamos por un lado el proyecto C en una carpeta y por otro el proyecto B en otra carpeta, tendremos dos instancias distintas del proyecto de datos D.

Si ahora instanciamos el proyecto A , dado que por definición una instancia de aplicación no puede heredar más de una instancia de un mismo proyecto de datos, solamente heredará una de las instancias del proyecto de datos D, lo que provoca que, al ejecutar el proyecto A todo se ejecute todo contra la misma instancia de datos.

Como solución se podrían cambiar las herencias:

O bien hacer que B herede C, C herede B y A herede B:

![](/files/-M7D77td5BG_EBPL1sgq)

O bien usar “arriba” dos proyectos de aplicación, en lugar de uno:

![](/files/-M7D77teNoP5YJv-K5ar)

## Herencia inversa

Es posible establecer **herencia inversa** entre dos proyectos. Cuando un proyecto A hereda un proyecto B, de forma automática, en el proyecto A podremos usar objetos del proyecto B, pero no al revés. Lo que la herencia inversa nos permite es hacer uso en el proyecto B de objetos del proyecto A. Esta herencia inversa no es automática sino programable.

La herencia inversa puede ser programada en [formularios](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/formularios) y en [acciones.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion)

Los pasos para programarla serán:

Crear en el proyecto B un objeto ([formulario](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/formularios) o [acción](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion)) y activarle el estilo “Punto de inserción”.

En el proyecto A crear el objeto (formulario/acción) que se quiere usar en el proyecto B y crear dentro del mismo un sub-objeto [inserción](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/insercion), en dicho sub-objeto se indicará el objeto del proyecto B donde se insertará el objeto actual.

Las acciones con herencia inversa solamente podrán ser usadas en [menús ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu)y [toolbars.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/toolbar)

## Herencia inversa en tablas de extension

A nivel de base de datos una tabla padre conoce sus tablas de extensión y sabe como obtener la información de dichos registros. A nivel de interfaz existe una forma muy sencilla de incluir en el formulario de la tabla padre los subformularios específicos de cada tabla de extensión.

Vamos a verlo con un ejemplo práctico. Hemos creado en el proyecto Pedidos, que hereda un proyecto de una solución llamada vBase, las tablas de extensión CLIENTES, PROVEEDORES y AGENTES, todas ellas son extensión de la tabla de ENT (Entidades) de la solución vBase. Queremos incluir en el separador de pestañas un subformulario para cada tabla extendida, cada uno con los datos específicos de su tabla. Vamos a ver los pasos a seguir con la tabla CLIENTES.

Creamos el formulario con los datos específicos de los campos de la tabla extendida CLIENTES. También se incluye en ese formulario un separador de pestañas con el histórico de pedidos.

![](/files/-M7D77tl9n654djmonBF)

Una vez creada ese formulario lo insertamos en el separador de pestañas del formulario de la tabla padre ENT (Entidades) mediante un punto de inserción. A esto es a lo que denominamos herencia inversa porque el formulario de Entidades está en un proyecto que no conoce a Pedidos, y sin embargo podemos conseguir que en ejecución ese formulario incluya un subformulario de un proyecto que se lo ha insertado en uno punto de inserción.

![](/files/-M7D77tnSyrxUuaz0Ljz)

Como podemos ver en la imagen anterior, se ha añadido una nueva propiedad al subobjeto inserción para la aplicación de herencia inversa. Se trata de la propiedad Tablas de extensión. Cuando se da esa circunstancia Velneo nos permite seleccionar si en la pestaña correspondiente a este subformulario se mostrará el botón de alta (si no existe la ficha de extensión) y/o el botón de baja (si ya existe la ficha de extensión). Esto nos permite configurar que permisos le otorgamos al usuario para crear o eliminar manualmente registros de extensión. Incluso podríamos añadir dos veces el mismo subformulario con diferente configuración en la propiedad Tablas de extensión y con condición de visible ajustada para el perfil de usuario correspondiente.

Aplicando el mismo criterio a los formularios de las tablas de extensión de PROVEEDORES y AGENTES, el formulario de ENTIDADES del proyecto de aplicación de la solución vBase podría mostrar el siguiente aspecto.

![](/files/-M7D77toChJjod1fy10i)

Como podemos apreciar en el formulario de ENTIDADES existen 3 pestañas correspondientes a las tablas de extensión añadidas por herencia inversa que además muestran un botón con un más o un menos en función de si existe o no existe el registro de extensión.

Por defecto una entidad sólo tendría sus datos básicos, si una entidad pasa a ser cliente el usuario podrá pulsar en el botón más de la pestaña y añadir los datos específicos como cliente, si posteriormente esa entidad también es proveedor, el usuario procedería de igual forma y lo mismo pasaría con las entidades que correspondan a agentes comerciales.

Los registros de extensión también pueden crearse de forma programada, simplemente creando el registro en la tabla correspondiente y asignándole al campo ID el mismo que tiene la tabla padre.

Si nos fijamos en el formulario anterior de ENTIDADES podemos que en la parte inferior de botones existe uno con el texto Extensiones. Este botón al pulsarlo mostrará la lista de extensiones que han sido declaradas mediante puntos de inserción en el formulario. La imagen siguiente muestra como se visualizan las opciones al pulsar el botón.

![](/files/-M7D77tp-5MJXCXWBhnk)

Como vemos se muestran activas las opciones para las que todavía no está creada la ficha de extensión. Para programar este botón tan sólo es necesario añadir el botón en el formulario y asignarle uno de los siguientes comandos de botón:

Alta de ficha en tabla de extensión (es la opción que tiene por defecto el botón de la pestaña).

Alta controlada de ficha en tabla de extensión (que solicita confirmación antes de dar el alta).

Como vemos no sólo resulta muy sencillo crear las tablas de extensión, sino que además es igual de fácil programar nuestro interfaz para incluir en el mismo formulario información de la tabla padre y de sus tablas de extensión.


# Inspectores

**Velneo vDevelop** incorpora una serie de utilidades que nos ayudarán en el desarrollo de nuestros [proyectos](/velneo-vdevelop/soluciones-y-proyectos): los **inspectores**.

Desde el menú de contexto que se presenta al pulsar el botón derecho del ratón sobre una pestaña de la vista de inspectores podremos mostrar u ocultar cada uno de ellos de forma individualizada y/o ocultar los textos de las mismas.

## Inspector de objetos

Este inspector muestra todos los objetos del proyecto agrupados por tipo. Para acceder al inspector bastará con seleccionar la pestaña **objetos** del panel de inspectores:

![](/files/-M7D77o_xl_FrkLONL0G)

Como puede apreciarse en la captura de pantalla anterior, cada nodo de la lista se corresponde con un tipo de objeto. Si queremos localizar un objeto concreto, por ejemplo, un informe, desplegaremos el nodo correspondiente y éste contendrá todos los informes del proyecto ordenados alfabéticamente:

![](/files/-M7D77ocsOpz9Hvv8NIF)

Si hacemos doble clic sobre el objeto, podremos acceder a la edición del mismo.

Si queremos localizar un objeto del inspector en el panel del proyecto, bastará con seleccionarlo en este inspector y ejecutar la opción Localizar en proyecto del menú Objetos, o bien, seleccionar la opción del mismo nombre del menú de contexto que aparecerá al situar el puntero del ratón sobre el objeto y pulsar el botón derecho. También es posible aplicar esta localización a sub-objetos.

## ¿Qué usa?

Por medio de este inspector, podremos conocer qué objetos o sub-objetos son usados por un objeto o subobjeto concreto. Para conocer qué objetos o sub-objetos usa un objeto concreto no tendremos más que seleccionar el objeto deseado o bien en la pestaña Proyecto del panel central de Velneo vDevelop o bien desde cualquier otro inspector del panel de inspectores. Una vez hecho esto accederemos a la pestaña ¿Qué usa? del panel de inspectores:

![](/files/-M7D77odOCuAkiQvllsh)

Si el objeto no usa ningún otro objeto, el inspector devolverá solamente el objeto seleccionado:

![](/files/-M7D77oe6xQioYZadHFv)

Si el objeto usa otros objetos, se presentará una lista con los mismos:

![](/files/-M7D77ofUMX3ef69CHga)

Si desplegamos el nodo de cualquiera de los objetos, el inspector nos indicará en qué propiedad del objeto es usado:

![](/files/-M7D77ogW9pv_8Fao4lF)

En este caso se nos indica que la acción seleccionada (DLV\_PUR\_SUPPLIER\_FIND) usa el dibujo BUTTON\_MASTER\_FIND en la propiedad Icono.

Si hacemos doble clic sobre el objeto, podremos acceder a la edición del mismo.

Si el objeto usado es un objeto de un proyecto heredado, solamente podremos editarlo si el proyecto heredado ha sido cargado previamente. Si no está editado, solamente podremos ver sus propiedades.

Si queremos localizar un objeto del inspector en el panel del proyecto, bastará con seleccionarlo en este inspector y ejecutar la opción Localizar en proyecto del menú Objetos, o bien, seleccionar la opción del mismo nombre del menú de contexto que aparecerá al situar el puntero del ratón sobre el objeto y pulsar el botón derecho.

## ¿Dónde se usa?

Por medio de este inspector, podremos conocer dónde es usado un objeto o un sub-objeto concreto. Para conocer dónde se usa un objeto o un sub-objeto concreto no tendremos más que seleccionarlo o bien en la pestaña Proyecto del panel central de Velneo vDevelop o bien desde cualquier otro inspector del panel de inspectores. Una vez hecho esto accederemos a la pestaña **¿Dónde se usa usa?** del panel de inspectores y haremos clic en el botón "refrescar".

![](/files/-M7D77oh-ZgKWQVttl5n)

Si el objeto o sub-objeto no es usado en ningún otro objeto, el inspector devolverá solamente el objeto seleccionado.

Si el objeto es usado en otros objetos, se presentará una lista con los mismos:

![](/files/-M7D77oi9-1BQCasREpK)

Si desplegamos el nodo de cualquiera de los objetos, el inspector nos indicará en qué propiedad o parte del es usado:

![](/files/-M7D77ojGhci9BS0a6iT)

En este caso se nos indica que el tubo de lista seleccionado (ORD\_SAL\_LIN\_GEN\_STC\_MOV\_SAL) es usado como parámetro en una línea del proceso ORD\_SAL\_GEN\_DLV\_SAL.

Si hacemos doble clic sobre el subobjeto, podremos acceder a la edición del mismo:

![](/files/-M7D77ok-VpruVu2-1iL)

Si el objeto o sub-objeto usado es un objeto de un proyecto heredado, solamente podremos editarlo si el proyecto heredado ha sido cargado previamente, en caso contrario, simplemente podremos ver sus propiedades.

Si queremos localizar un objeto del inspector en el panel del proyecto, bastará con seleccionarlo en este inspector y ejecutar la opción Localizar en proyecto del menú Objetos, o bien, seleccionar la opción del mismo nombre del menú de contexto que aparecerá al situar el puntero del ratón sobre el objeto y pulsar el botón derecho.

Este inspector podremos ejecutarlo usando la combinación de teclas control + U.

## Árbol de campos <a href="#arbol-de-campos" id="arbol-de-campos"></a>

Por medio de este inspector, podremos conocer la lista de campos de la [tabla ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla)asociada a un objeto concreto. Por tanto, este inspector solamente será funcional aplicado sobre tablas y sobre objetos de proyecto de aplicación que tengan asociada una tabla en sus propiedades. Para conocer cuáles son los campos de la tabla asociada a un objeto concreto no tendremos más que seleccionar el objeto deseado o bien en la pestaña **Proyecto** del panel central de Velneo vDevelop o bien desde cualquier otro inspector del panel de inspectores. Una vez hecho esto accederemos a la pestaña Árbol de campos del panel de inspectores:

![](/files/-M7D77olzagWeU9UVLGV)

Si el objeto seleccionado no hace uso de ninguna tabla el inspector no devolverá nada.

Si el objeto está asociado a una tabla, el inspector devolverá la lista de campos de la misma:

![](/files/-M7D77omzPCWcV_ASCOx)

Si hacemos doble clic sobre un campo, podremos editar las propiedades del mismo:

![](/files/-M7D77onnUknNtjFrK8u)

En el caso de [rejillas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla), podemos crear columnas con los campos que seleccionemos en el inspector, arrastrando y soltándolos sobre el editor de rejillas.

En el caso de [formularios](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario), podremos crear [etiquetas de campos](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/nombre-de-campo) y [controles de edición](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion) de los campos que seleccionemos en el inspector, arrastrando y soltándolos sobre el editor de formularios.

{% hint style="warning" %}
Si editamos y modificamos un campo de un desde un proyecto heredado no debemos olvidarnos de guardar cambios en el proyecto de datos heredado antes de cerrar la sesión de Velneo vDevelop.
{% endhint %}

## Inspector de errores

Se trata de una herramienta que nos será de gran ayuda para depurar nuestros proyectos.

Por medio de este inspector, podremos localizar errores en **identificadores** de objetos y subobjetos usados como valores en propiedades de otros objetos y errores de sintaxis en fórmulas.

También localiza errores en propiedades de objetos y comandos de instrucción de proceso donde se haga referencia a [scripts](#inspector-de-scripts).

Hace un [análisis estático](https://www.gitbook.com/book/velneo/manual-de-referencia-de-velneo/edit#) del código y del proyecto.

Cuando queramos comprobar si el proyecto que estamos editando contiene errores pulsaremos el botón accederemos al panel de este inspector y haremos clic en la opción "refrescar" que aparece en la parte superior del mismo.

Si el proyecto no contiene ningún error, se devolverá el mensaje "OK no se han encontrado errores".

Si el proyecto contiene errores, se presentará una lista con todos los objetos con errores:

![](/files/-M7D77oo17va_HyCEoZC)

Si desplegamos el nodo de cualquiera de los objetos con errores, el inspector nos indicará qué subobjeto/s del mismo contienen errores:

![](/files/-M7D77opWwIdeUA_jabK)

En este caso hemos desplegado el nodo correspondiente a un formulario. Si desplegamos el nodo de un subobjeto con error, se nos informará sobre la naturaleza del mismo:

![](/files/-M7D77oq1jqwFh2OVA_h)

En este caso el inspector nos indica que el un control de un formulario tiene un error de sintaxis en la propiedad **contenido**.

Si hacemos doble clic sobre el error, automáticamente será editado el subobjeto donde se encuentra el mismo, en este caso, se abrirá el cuadro de propiedades del control del formulario que contiene el error:

![](/files/-M7D77orIEL_NDtGapHa)

Donde podremos editar y corregir el valor del parámetro Contenido.

En el caso de procesos, si se detecta un error en un [proceso](https://velneo.es/info_v7_20_es/velneo_vdevelop/proyectos_objetos_y_editores/proceso):

![](/files/-M7D77os5hflIYghR_NS)

Al hacer doble clic sobre el mismo el sistema editará el proceso y se posicionará en la línea que contiene el error:

![](/files/-M7D77otsXIu0Pl2fFZF)

Si queremos localizar un objeto del inspector en el panel del proyecto, bastará con seleccionarlo en este inspector y ejecutar la opción Localizar en proyecto del menú Objetos, o bien, seleccionar la opción del mismo nombre del menú de contexto que aparecerá al situar el puntero del ratón sobre el objeto y pulsar el botón derecho.

## Inspector de scripts

Cada proyecto de Velneo contiene un directorio donde podemos crear una estructura de carpetas y guardar en ellas los ficheros qml, javascript, css, etc. y sus ficheros auxiliares.

Al ejecutar una aplicación con vClient o vDataClient, se cargarán también los directorios de scripts de cada proyecto de la aplicación. Un mismo fichero qml o javascript se puede usar desde distintos objetos.

Hay distintos tipos de objetos que los usan como [proceso](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso), [lista QML](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/lista-qml) y [formulario QML](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario-qml).

Un mismo fichero Javascript o QML puede ser usado en objetos con distintas entradas y salidas, tabla y/o ficha/lista.

También se puede asumir que un fichero Javascript o QML tiene una tabla de entrada y/o salida determinadas, con el nivel de abstracción deseado en cada fichero Script.

Para introducir en un objeto la propiedad fichero script, en la propiedad disponemos de un botón que presentará un árbol con los directorios de scripts del proyecto en curso y sus proyectos heredados.

Velneo incorpora también editores de código fuente para los distintos lenguajes soportados.

Si hacemos doble clic sobre un fichero de script en el inspector, automáticamente se abrirá en el editor del lenguaje correspondiente al mismo.

Se puede usar “Import” en los ficheros fuente QML para importar otros ficheros QML, Javascript o carpetas enteras contenidas en directorios scripts del proyecto y heredados.

En el menú scripts de Velneo vDevelop se encuentran englobadas todas las acciones que podemos llevar a cabo sobre nuestros scripts. Ver el capítulo [interfaz de Velneo vDevelop](/velneo-vdevelop/interfaz-de-velneo-vdevelop) para ampliar información al respecto. Estas acciones estarán también disponibles en el menú de contexto que obtendremos al pulsar el botón derecho del ratón dentro del inspector de scripts.

En el menú de contexto de un script se desplegará una lista de los objetos que lo usan, seleccionando uno de ellos, podremos editarlo.

Podremos decidir qué ficheros o conjunto de ficheros se guardarán en la caché del cliente y cuáles no. El objetivo es proteger el código fuente de estos scripts siempre que sea posible. Para hacerlo contamos con una característica en los ficheros y carpetas del directorio de script. Cuando abrimos el menú contextual veremos una opción llamada **Guardar en caché cliente**.

Esta opción funciona como un interruptor de 2 estados. Al hacer clic en la opción podemos activar o desactivar el guardado de caché cliente en función del estado anterior. Al mostrarse el menú contextual si el guardado está activo el icono del diskette aparece con un pequeño recuadro. Aunque la mejor forma de saber si un fichero o carpeta tienen activado el guardado es ver el color del texto:

Texto azul: guardado en caché cliente (Activado)

Texto negro: guardado en caché cliente (Desactivado)

Cuando activamos el guardado de una carpeta estamos indicando que se guardan en la caché todos los ficheros que contiene la carpeta y también sus subcarpetas y sus ficheros. Es decir, que la configuración es heredada por las subcarpetas de su carpeta superior. En la siguiente imagen vemos un ejemplo:

![](/files/-M7D77owq3Klc_7pmr3w)

En este caso como la carpeta qml (con el texto de color azul) tiene activado el guardado en caché cliente, todos los ficheros que contenga así como los de las subcarpetas (js, images y qml) también serán guardados en la caché del cliente.

También podemos configurar una carpeta para que no se guarde y de forma individual hacer que se guarde algún fichero o subcarpeta. Sin embargo, parece recomendable tener en carpetas separadas los objetos a guardar y los que no. De esa forma sabemos que todo lo que esté dentro de una carpeta se guardará en la caché y lo que esté en la otra no, evitando tener que hacer una gestión individual de ficheros.

Algo que es importante tener en cuenta es que los scripts de QML, por el momento, deben estar obligatoriamente en disco para poder ser ejecutados, y adicionalmente también deben estar en disco todos los ficheros declarados y usados en el QML, como pueden ser imágenes, JavaScript, etc. Sin embargo, los scripts de JavaScript para ser usados en procesos, fórmulas o manejadores de evento no necesitan se guardados en la caché del cliente para ser ejecutados y por lo tanto pueden estar protegidos. Debido a esto, cuando creamos un script de QML éste será creado con la opción de guardar en caché activada.

Para conseguir que los QML programados en versiones anteriores sigan estando operativos en la versión 7.12, al migrar un proyecto de una versión anterior a la 7.12 se marcarán todos los ficheros y carpetas que estén en la raíz del directorio de scripts a guardar en caché cliente. De esta forma las aplicaciones seguirán funcionando como hasta ahora, es responsabilidad del programador acceder al directorio de scripts a cambiar esta configuración según sus intereses.


# Proyectos objetos y editores

Un proyecto es un contenedor de objetos visuales. Los objetos visuales nos permiten definir la base de datos, operar con ésta y definir el interfaz de nuestra aplicación.\
Existen dos tipos de proyectos: [proyecto de datos](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-organizacion/proyecto-de-datos-1-carpetas-esquemas-tablas-e-indices-complejos) y [proyecto de aplicación.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) Además de tener una función específica cada tipo de proyecto, los objetos que pueden incluir vienen determinados por el tipo y la función que realizan.

El [proyecto de datos](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-organizacion/proyecto-de-datos-1-carpetas-esquemas-tablas-e-indices-complejos) define una base de datos por medio de objetos tales como [tablas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla), [variables globales](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/arquitectura/las-variables-globales), [procesos](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/procesos) y otros objetos, que nos permiten programar el funcionamiento de nuestra base datos, los datos que se almacenarán y cómo.

El proyecto de aplicación define cómo operar con la base de datos y cómo será el interfaz de la aplicación, medio de objetos tales como [rejillas](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/carga-de-registros-en-objetos-de-lista/rejillas), [formularios](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/formularios), [búsquedas,](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/busqueda) [marcos,](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/marco) [menús ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu)y otros objetos, que nos permiten programar la forma en que se presentan y se opera con los datos.

Una propiedad muy importante de los proyectos es la [herencia](/velneo-vdevelop/herencia). Un proyecto de datos puede heredar de otros proyectos de datos, de tal manera que las tablas de cada uno de los proyectos puedan hacer uso de las tablas de los proyectos heredados.

De igual manera, el proyecto de aplicación puede heredar de otros proyectos de aplicación haciendo uso de los objetos que contengan. Pero además puede heredar de proyectos de datos, siendo esta la manera de que un proyecto de aplicación opere con una base de datos.

Los proyectos de datos no heredan de proyectos de aplicación, ya que han de ser independientes del interfaz gráfico y por tanto de la interacción directa con el usuario.

Recomendamos usar distintos nombres para los proyectos que programemos ya que, a la hora de trabajar con proyectos heredados, al querer usar un objeto de un proyecto heredado, nos será más sencilla su localización si el proyecto al que pertenece tiene un nombre diferente al de otros proyectos heredados.

Un proyecto de datos se genera en disco con extensión vcd.

Un proyecto de aplicación se genera en disco con extensión vca.

Los proyectos se guardan en la [caché local ](/velneo-vclient/funcionalidades-especificas)de Velneo vClient encriptados con una extensión que los distingue de los proyectos para edición: **vha** para los proyectos de aplicación y **vhd** para los proyectos de datos.

Estos ficheros no pueden ser abiertos ni editados, no pueden ser instalados en un servidor para ser editados o ejecutados, ni es posible heredarlos o hacer otro uso de ellos que la ejecución contra el servidor que los ha distribuido.

De cara a movilidad y otras instalaciones donde sea importante optimizar el espacio en disco, se ha implementado una compresión extra de tal forma que ocupen menos espacio en la caché del cliente, con lo que ficheros de proyecto se encuentran comprimidos además de encriptados.


# Proyecto de datos

El [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores) de datos define una base de datos por medio de objetos tales como [tablas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla), [variables globales,](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/arquitectura/las-variables-globales) [procesos ](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/procesos)y otros, que nos permiten configurar el funcionamiento de nuestra base datos, los valores que se almacenarán y cómo.

Para crear un proyecto de datos usaremos la opción Nuevo proyecto de datos del menú de Proyectos. Para ello, previamente, habremos de tener definida una [solución](/velneo-vdevelop/soluciones-y-proyectos) en la que se creará el proyecto, si no, no nos permitirá la creación del proyecto.

![](/files/-M7D77_apCzZnJAEb56h)

## General

En la pestaña General nos presentará la información sobre la solución y el dominio de [Velneo vServer ](/velneo-vserver/que-es-velneo-vserver)en el que se creará el proyecto. Las propiedades son:

### **Nombre del proyecto**

Que luego servirá de referencia en su [instanciación.](/velneo-vadmin/gestion-de-aplicaciones/instancias)

### **Versión**

Que mostrará el proyecto al ser presentado.

### **Icono 32×32** e **Icono 64\~×64**

Estas propiedades nos permiten personalizar el icono que identificará al proyecto en el visor de soluciones de Velneo vDevelop. Si no especificamos ninguno, se usará un icono estándar.

### **Alias**

Permite establecer un alias al proyecto. En la programación de [scripts](/velneo-vdevelop/scripts) una referencia a un objeto se ha de componer mediante una cadena con el alias de un proyecto más el identificador del objeto, separados por “/”. También se podría usar en lugar del alias el id. del fichero, pero resultará menos legible.

Cuando creamos un proyecto de datos el sistema añadirá al alias automáticamente el sufijo \_dat.

{% hint style="warning" %}
Es muy importante tener el cuenta que **el alias debe ser único**. En un mismo servidor no pude haber alias repetidos en distintos proyectos. Por lo tanto, debemos ser muy cuidadosos a la hora de establecer un criterio para crear nuestros alias y tener en cuenta que si heredamos soluciones de otros desarrolladores, éstos también podrán tener alias.
{% endhint %}

### **Id. fichero**

Muestra el identificador que el sistema asigna automáticamente al proyecto para referenciarlo. Este identificador es único, e identifica a un proyecto de forma única y exclusiva. No puede haber dos proyectos con un mismo identificador. Este es el motivo por el que no debemos copiar físicamente en el disco ficheros correspondientes a un proyecto en distinta soluciones, ya que provocará errores. Este identificador no puede ser modificado.

Si quisiésemos duplicar un proyecto en distintas soluciones lo que tendremos que hacer será, con Velneo vDevelop, copiar los objetos del proyecto de origen, crear un nuevo proyecto en la solución de destino y pegar los objetos copiados.

### **Guardada**

El contenido de esta propiedad no puede ser editado. En ella se mostrará la fecha y hora en que el proyecto fue guardado por última vez.

### **Nº de historia**

El contenido de esta propiedad no puede ser editado. Es un contador que se incrementará en una unidad cada vez que guardemos el proyecto.

### **Protección contra edición**

Nos permite establecer una contraseña para proteger el proyecto en edición. Si se ha establecido alguna, será solicitada cada vez que un usuario intente cargar el proyecto en Velneo vDevelop.

## Herencia

En esta pestaña definiremos la [herencia](/velneo-vdevelop/herencia) correspondiente al proyecto, escogiendo de entre los proyectos de datos cargados aquellos cuyos objetos queramos heredar. De esta forma, desde el proyecto de datos que hemos creado accederemos a reutilizar los objetos de los proyectos heredados. Debemos hacer doble clic sobre los **proyectos heredables** para establecer una herencia del proyecto seleccionado y doble clic en los **proyectos heredados** para anular la herencia establecida.

## Colores

En esta pestaña definiremos las paletas de colores que aplicaremos en las propiedades de los objetos de nuestro proyecto. Esta opción nos permite modificar la paleta de colores de tal manera que se actualice en todas las propiedades de los objetos donde se use.

Pulsando la opción **añadir** paleta nos mostrará el cuadro de diálogo de selección de un color que nos permite seleccionar el color base de la paleta.

Una vez aceptamos, nos genera la paleta de forma automática a partir del color base, pudiendo asignar el nombre a la paleta rellenando el control de edición dePaleta. Este nombre será el que referenciaremos en las propiedades de los [objetos ](/velneo-vdevelop/proyectos-objetos-y-editores)de tal forma que se asignarán de forma automática los colores según la propiedad que estemos definiendo y en el caso de modificar la paleta, los colores usados serán actualizados en las propiedades que hagan uso de la paleta.

Haciendo doble clic sobre un color de la paleta podemos modificar el color seleccionado, apareciendo para ello de nuevo el cuadro de diálogo de Selección de un color.

{% hint style="success" %}
Recomendamos preferiblemente [usar CSS](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/interfaz/control#interfaz-establecer-hoja-de-estilo-css) en lugar de paletas de colores. El motivo principal es que al copiar objetos entre proyectos no se pueden reasignar las paletas de colores a las que tenga el proyecto de destino, lo que nos obligaría a ir, uno a uno, modificándolas.

Te recomendamos usar como referencia la CSS que se genera al ejecutar la opción [generar interfaz](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-objetos#generar-interfaz) del menú Objetos de Velneo vDevelop.&#x20;
{% endhint %}

## Fuentes

En esta pestaña definiremos los tipos de letra que aplicaremos en las propiedades de los objetos de nuestro proyecto. Esto nos permitirá, al igual que sucede con la las paletas de colores, modificar en esta opción un tipo de letra que usemos en nuestro proyecto, actualizándolo en todos las propiedades de los objetos donde se use.

Para añadir una fuente pulsaremos el botón “añadir fuente” y se abrirá la ventana de selección de fuentes, en la que seleccionaremos la fuente y atributos que deseemos. Al aceptar, la fuente seleccionada será añadida a la lista de fuentes.

Y le daremos un nombre. A partir de este momento, en cualquier propiedad en la que haya que especificar una fuente, ésta aparecerá en la lista de fuentes seleccionables. Ver el capítulo dedicado al [selector de fuentes ](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes)para ampliar información al respecto.

Las fuentes establecidas podrán ser usadas tanto en el proyecto actual como en los proyectos que lo hereden.

Si deseamos editar las propiedades de una fuente haremos doble clic sobre ella.

Si deseamos eliminar una fuente pulsaremos el botón “eliminar fuente”.

{% hint style="danger" %}
No debemos cambiar el nombre de una fuente cuando es usada por algún objeto/sub-objeto ya que el cambio de identificador no se replicará en el objeto u objetos afectados.
{% endhint %}

{% hint style="success" %}
Recomendamos preferiblemente [usar CSS](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/interfaz/control#interfaz-establecer-hoja-de-estilo-css) en lugar de fuentes de proyecto. El motivo principal es que al copiar objetos entre proyectos no se pueden reasignar las fuentes de los objetos copiados a las que tenga el proyecto de destino, lo que nos obligaría a ir, uno a uno, modificándolas.

Te recomendamos usar como referencia la CSS que se genera al ejecutar la opción [generar interfaz](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-objetos#generar-interfaz) del menú Objetos de Velneo vDevelop.&#x20;
{% endhint %}

## Idiomas

En esta pestaña configuraremos los idiomas que podremos definir en el proyecto y que se podrán seleccionar en ejecución para mostrar la información de los objetos. Debemos seleccionar un Idioma y un País al que se aplica el idioma. Usando las opciones Subir y Bajar podremos ordenar los idiomas del proyecto. El primero de la lista será el idioma por defecto del proyecto. Los países se presentan en función del idioma seleccionado.

Los textos que aparecen en una aplicación realizada con Velneo pueden ser internos (menús en stock, textos del sistema, etc.) o del proyecto Velneo.

En la ventana de propiedades del proyecto podemos definir los idiomas que se usarán en la aplicación. Las propiedades de los objetos que admiten idiomas (por ejemplo el nombre del objeto) tienen un editor que permite definir la propiedad en los diferentes idiomas del proyecto.

![](/files/-M7D77_ec1izl609Qh5p)

Los idiomas de los proyectos tienen un orden de carga en ejecución. Primero será el que coincida con la selección de Idioma y País. Si seleccionamos el valor Default para País, el idioma será aplicable para cualquier selección de país. En el caso de que el país del sistema no esté representado y de que haya de un idioma varias opciones de país, se tomará primero el definido comoDefault, si no, el primero del proyecto que coincida con el idioma. Si no existe el idioma del sistema se tomará el idioma por defecto del proyecto que es el primero que esté definido en el proyecto.

En cualquier caso, podemos dar opción al usuario para que seleccione de entre los idiomas del proyecto aquél que desee usar.

El listado de países seleccionables sigue la norma ISO 3166-1.

Listado de idiomas seleccionables sigue la norma ISO 639-1.

Los ejecutables de los componentes de Velneo (Velneo vClient, Velneo vDevelop, etc.) se suministran en inglés y español. A esto se añade la opción de incluir en el directorio de aplicación los ficheros de traducción de otro idioma, con lo que los textos de Velneo se podrán visualizar en dicho idioma.

Estos ficheros tienen el formato vClient\_IDIOMA\_PAIS.qm, donde IDIOMA es el identificador del idioma en formato ISO ISO 639 y PAIS es el identificador del país en formato 3166 (por ejemplo vClient\_CA\_ES.qm es el fichero de traducción en catalán). Iremos publicando en el Centro de soporte de Velneo los ficheros de traducción realizados por otros suscriptores según los vayan aportando.

## Comentarios

En esta pestaña podremos incluir todos aquellos datos que veamos necesarios para documentar nuestra aplicación.

Es posible **borrar un proyecto** cargado en Velneo vDevelop, para ello situaremos el cursor sobre el mismo en el explorador de proyectos cargados, pulsaremos el botón derecho del ratón y, en el menú de contexto que se abre, seleccionaremos la opción “eliminar”.

Si existen proyectos que [hereden](/velneo-vdevelop/herencia) el proyecto seleccionado, éste no podrá ser eliminado.


# Proyecto de aplicación

Un proyecto de aplicación contendrá los objetos visuales de una aplicación, o de un módulo de la misma.

Para crear un proyecto de datos hemos usar la opción **nuevo proyecto de aplicación** del menú **proyectos**. Para ello, previamente, habremos de tener definida una [solución](/velneo-vdevelop/soluciones-y-proyectos) en la que se creará la proyecto, si no, no nos permitirá la creación del mismo.

El cuadro de propiedades está dividido en varias pestañas, que pasamos a explicar a continuación.

## General

En la pestaña General nos presentará la información sobre la solución y el dominio del [Velneo vServer](/velneo-vserver/que-es-velneo-vserver) en el que se creará el proyecto. Las propiedades son:

### **Nombre**

Nombre del proyecto que luego servirá de referencia en su [instanciación](/velneo-vadmin/gestion-de-aplicaciones/instancias).

### **Versión**

Número de versión que mostrará el proyecto al ser presentado.

### **Icono 32×32 e Icono 64×64**

Estas propiedades nos permiten personalizar el icono que identificará al proyecto en el visor de soluciones de Velneo vDevelop. Si no especificamos ninguno, se usará un icono estándar de la plataforma.

### **Alias**

Permite establecer un alias al proyecto. En la programación de [scripts](/velneo-vdevelop/scripts) una referencia a un objeto se ha de componer mediante una cadena con el alias de un proyecto más el identificador del objeto, separados por “/”. También se podría usar en lugar del alias el id. del fichero, pero resultará menos legible.

Cuando creamos un proyecto de aplicación el sistema añadirá al alias automáticamente el sufijo \_app.

{% hint style="danger" %}
Es muy importante tener el cuenta que **el alias debe ser único**. En un mismo servidor no pude haber alias repetidos en distintos proyectos. Por lo tanto, debemos ser muy cuidadosos a la hora de establecer un criterio para crear nuestros alias y tener en cuenta que si heredamos soluciones de otros desarrolladores, éstos también podrán tener alias.
{% endhint %}

### Id. fichero

Muestra el identificador que el sistema asigna automáticamente al proyecto para referenciarlo. Este identificador es único, e identifica a un proyecto de forma única y exclusiva. No puede haber dos proyectos con un mismo identificador. Este es el motivo por el que no debemos copiar físicamente en el disco ficheros correspondientes a un proyecto en distintas soluciones, ya que provocará errores. Este identificador no puede ser modificado.

Si quisiésemos duplicar un proyecto en distintas soluciones lo que tendremos que hacer será, con Velneo vDevelop, copiar los objetos del proyecto de origen, crear un nuevo proyecto en la solución de destino y pegar los objetos copiados.

### Guardada

El contenido de esta propiedad no puede ser editado. En ella se mostrará la fecha y hora en que el proyecto fue guardado por última vez.

### Nº de historia

El contenido de esta propiedad no puede ser editado. Es un contador que se incrementará en una unidad cada vez que guardemos el proyecto.

### Protección contra edición

Nos permite establecer una contraseña para proteger el proyecto en edición. Si se ha establecido alguna, será solicitada cada vez que un usuario intente cargar el proyecto en Velneo vDevelop.

## Herencia

En esta pestaña definiremos la [herencia ](/velneo-vdevelop/herencia)correspondiente al proyecto, escogiendo de entre los proyectos de datos o de aplicación cargados aquellos cuyos objetos queramos heredar. De esta forma, desde el proyecto de aplicación que hemos creado accederemos a reutilizar los objetos de los proyectos heredados. Debemos hacer doble clic sobre los **proyectos heredables** para establecer una herencia del proyecto seleccionado y doble clic en los **proyectos heredados** para anular la herencia establecida.

## Colores

En la pestaña definiremos las paletas de colores que aplicaremos en las propiedades de los objetos de nuestro proyecto. Esta opción nos permite modificar la paleta de colores de tal manera que se actualice en todas las propiedades de los objetos donde se use.

Pulsando la opción "añadir paleta" nos mostrará el cuadro de diálogo de selección de un color que nos permite seleccionar el color base de la paleta.

Una vez aceptamos, nos genera la paleta de forma automática a partir del color base, pudiendo asignar el nombre a la paleta rellenando el control de edición de **paleta**. Este nombre será el que referenciaremos en las propiedades de los objetos de tal forma que se asignarán de forma automática los colores según la propiedad que estemos definiendo y en el caso de modificar la paleta, los colores usados serán actualizados en las propiedades que hagan uso de la paleta.

Haciendo doble clic sobre un color de la paleta podemos modificar el color seleccionado, apareciendo para ello de nuevo el cuadro de diálogo de Selección de un color.

{% hint style="success" %}
Recomendamos preferiblemente [usar CSS](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/interfaz/control#interfaz-establecer-hoja-de-estilo-css) en lugar de paletas de colores. El motivo principal es que al copiar objetos entre proyectos no se pueden reasignar las paletas de colores a las que tenga el proyecto de destino, lo que nos obligaría a ir, uno a uno, modificándolas.

Te recomendamos usar como referencia la CSS que se genera al ejecutar la opción [generar interfaz](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-objetos#generar-interfaz) del menú Objetos de Velneo vDevelop.&#x20;
{% endhint %}

## Fuentes

En esta pestaña definiremos los tipos de letra que aplicaremos en las propiedades de los objetos de nuestro proyecto. Esto nos permitirá, al igual que sucede con las paletas de colores, modificar en esta opción un tipo de letra que usemos en nuestro proyecto, actualizándolo en todas las propiedades de los objetos donde se use.

Para añadir una fuente pulsaremos el botón “añadir fuente” y se abrirá la ventana de selección de fuentes, en la que seleccionaremos la fuente y atributos que deseemos. Al aceptar, la fuente seleccionada será añadida a la lista de fuentes.

Y le asignaremos un nombre. A partir de este momento, en cualquier propiedad en la que haya que especificar una fuente, ésta aparecerá en la lista de fuentes seleccionables. Ver el capítulo dedicado al [selector de fuentes](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes) para ampliar información al respecto.

Las fuentes establecidas podrán ser usadas tanto en el proyecto actual como en los proyectos que lo hereden.

Si deseamos editar las propiedades de una fuente haremos doble clic sobre ella.

Si deseamos eliminar una fuente pulsaremos el botón “eliminar fuente”.

{% hint style="danger" %}
No debemos cambiar el nombre de una fuente cuando es usada por algún objeto/sub-objeto ya que el cambio de identificador no se replicará en el objeto u objetos afectados.
{% endhint %}

{% hint style="success" %}
Recomendamos preferiblemente [usar CSS](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/interfaz/control#interfaz-establecer-hoja-de-estilo-css) en lugar de fuentes de proyecto. El motivo principal es que al copiar objetos entre proyectos no se pueden reasignar las fuentes de los objetos copiados a las que tenga el proyecto de destino, lo que nos obligaría a ir, uno a uno, modificándolas.

Te recomendamos usar como referencia la CSS que se genera al ejecutar la opción [generar interfaz](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-objetos#generar-interfaz) del menú Objetos de Velneo vDevelop.&#x20;
{% endhint %}

## Idiomas

En esta pestaña configuraremos los idiomas que podremos definir en el proyecto y que se podrán seleccionar en ejecución para mostrar la información de los objetos. Debemos seleccionar un idioma y un país al que se aplica el idioma. Usando las opciones"subir" y "bajar" podremos ordenar los idiomas del proyecto. El primero de la lista será el idioma por defecto del proyecto. Los países se presentan en función del idioma seleccionado.

Los textos que aparecen en una aplicación realizada con Velneo pueden ser internos (menús en stock, textos del sistema, etc.) o del proyecto Velneo.

En la ventana de propiedades del proyecto podemos definir los idiomas que se usarán en la aplicación. Las propiedades de los objetos que admiten idiomas (por ejemplo el nombre del objeto) tienen un editor que permite definir la propiedad en los diferentes idiomas del proyecto.

Los idiomas de los proyectos tienen un orden de carga en ejecución. Primero será el que coincida con la selección de Idioma y País. Si seleccionamos el valorDefault para País, el idioma será aplicable para cualquier selección de país. En el caso de que el país del sistema no esté representado y de que haya de un idioma varias opciones de país, se tomará primero el definido como **default**, si no, el primero del proyecto que coincida con el idioma. Si no existe el idioma del sistema se tomará el idioma por defecto del proyecto que es el primero que esté definido en el proyecto.

En cualquier caso, podemos dar opción al usuario para que seleccione de entre los idiomas del proyecto aquél que desee usar.

El listado de países seleccionables sigue la norma [ISO 3166-1](https://es.wikipedia.org/wiki/ISO_3166-1).

Listado de idiomas seleccionables sigue la norma [ISO 639-1](https://es.wikipedia.org/wiki/ISO_639-1).

Los ejecutables de los componentes de Velneo (Velneo vClient, Velneo vDevelop, etc.) se suministran en inglés y español. A esto se añade la opción de incluir en el directorio de aplicación los ficheros de traducción de otro idioma, con lo que los textos de Velneo se podrán visualizar en dicho idioma.

Estos ficheros tienen el formato vClient\_IDIOMA\_PAIS.qm, donde IDIOMA es el identificador del idioma en formato ISO ISO 639 y PAIS es el identificador del país en formato 3166 (por ejemplo vClient\_CA\_ES.qm es el fichero de traducción en catalán). Iremos publicando en el Centro de soporte de Velneo los ficheros de traducción realizados por otros suscriptores según los vayan aportando.

## Comentarios

En esta pestaña podremos incluir todos aquellos datos que veamos necesarios para documentar nuestra aplicación.

Es posible **borrar un proyecto** cargado en Velneo vDevelop, para ello situaremos el cursor sobre el mismo, pulsaremos el botón derecho del ratón y, en el menú de contexto que se abre, seleccionaremos la opción "Eliminar".

Si existen proyectos que hereden el proyecto seleccionado, éste no podrá ser eliminado.


# Crear CSS para aplicar a objetos en edición

Es posible crear una CSS en un proyecto de aplicación para aplicar a determinados objetos en edición. De este modo podemos ver cómo quedará directamente en Velneo vDevelop, evitando así tener que ejecutar la solución y aplicar la css para ver el resultado.

Para ello, debemos crear en la raíz del [inspector de scripts](/velneo-vdevelop/inspectores#inspector-de-scripts) una carpeta con el nombre **velneodefault** y dentro de ella un archivo CSS con identificador default.css:

![](/files/-MLMnGTKwkpfxt_Qz_9E)

Para obtener información sobre las CSS aplicables a Velneo pulsa [aquí](https://doc.qt.io/qt-5.12/stylesheet-examples.html).

Los objetos que podemos personalizar en edición mediante CSS son:

* [Formulario](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario). La CSS se aplica solamente al previsualizarlo y no sobre el propio editor.
* [Rejilla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla). La CSS se aplicará en el propio editor.
* [Rejilla avanzada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada). La CSS se aplicará en el propio editor.

Pulsa [aquí](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/interfaz/control/ejemplo-de-css) para ver un ejemplo completo de personalización de objetos y controles.


# Objeto

Un objeto es un elemento definible dentro de un [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores) que, en tiempo de ejecución, realiza las tareas de un programa.\
Los objetos nos permiten definir la base de datos, operar con ésta y definir el interfaz de nuestra aplicación. Estos objetos son creados de forma visual y únicamente tendremos que definir sus propiedades.

Para desarrollar todas estas funcionalidades los objetos pueden interactuar unos con otros.

Las funcionalidades de los objetos están definidas por el tipo de objeto y en ejecución se realizan en función de las propiedades definidas en cada objeto. Por ejemplo, un objeto de tipo rejilla muestra listas de registros, uno de tipo formulario servirá para editar, uno de tipo tabla define una relación de datos, es decir, una estructura de datos, etc.

Un objeto, además, puede ser un elemento único, por ejemplo, un dibujo, o estar a su vez compuesto por sub-objetos, por ejemplo, un objeto tabla de datos está compuesta por sub-objetos de tipo campo, índice, etc.

Los objetos podrían clasificarse según el tipo de proyecto donde pueden ser creados. Así tendríamos:

Objetos de [proyecto de datos](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-organizacion/proyecto-de-datos-1-carpetas-esquemas-tablas-e-indices-complejos). Los objetos nos permiten definir la base de datos, operar con ésta y definir el interfaz de nuestra aplicación. Estos objetos son creados de forma visual y únicamente tendremos que definir sus propiedades.

Objetos de [proyecto de aplicación.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) Se trata de objetos relacionados con la interfaz.

Además, hay objetos que pueden residir tanto [en un proyecto de datos como en un proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos).

Para desarrollar todas estas funcionalidades los objetos pueden interactuar unos con otros.

Las funcionalidades de los objetos están definidas por el tipo de objeto y en ejecución se realizan en función de las propiedades definidas en cada objeto. Por ejemplo, un objeto de tipo rejilla muestra listas de registros, uno de tipo formulario servirá para editar, uno de tipo tabla define una relación de datos, es decir, una estructura de datos, etc.

Un objeto, además, puede ser un elemento único, por ejemplo, un dibujo, o estar a su vez compuesto por sub-objetos, por ejemplo, un objeto tabla de datos está compuesta por sub-objetos de tipo campo, índice, etc.

Otro concepto importante referente a los objetos es que éstos pueden tener una entrada y/o una salida. Las entradas y salidas posibles son, o bien ninguna, o bien una ficha o una lista de una [tabla.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla)

## Propiedades comunes

Las propiedades principales comunes a todos los objetos y [subobjetos](/velneo-vdevelop/proyectos-objetos-y-editores) son:

### **Identificador**

Etiqueta alfanumérica que identifica de forma unívoca un objeto de un tipo de objeto o un subobjeto dentro de un objeto. Este identificador será el que usemos para referenciarlo en otras propiedades y en [fórmulas.](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas)

El identificador constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un objeto o un subobjeto de un objeto no puede haber duplicidad. Puede haber objetos de distinto tipo con el mismo identificador, pero nunca objetos del mismo tipo con el mismo identificador. Así mismo, puede haber subobjetos con el mismo identificador pero de objetos distintos.

Cuando estamos editando un proyecto que es heredado por otros proyectos, si modificamos el identificador de un objeto el sistema debe actualizarlo en todos los proyectos en los que dicho objeto es usado; esto implica que debe abrir todos los proyectos heredados para modificarlo y guardarlos. En el caso de que uno de esos proyectos esté siendo editado por otro usuario, el sistema nos advertirá que dicho proyecto no ha podido ser modificado.

Esto quiere decir que no ha podido actualizar en aquel proyecto el identificador del objeto modificado; por lo que es recomendable que deshagamos ese cambio de identificador y lo hagamos cuando los proyectos que hereden el actual no estén siendo editados por otros usuarios.

### **Nombre**

Etiqueta alfanumérica que servirá como descriptor del objeto. Se usará para presentar información del objeto o subobjeto en otros objetos y en los [inspectores](/velneo-vdevelop/inspectores).

Podemos definir una etiqueta por cada idioma presente en el [proyecto.](/velneo-vdevelop/proyectos-objetos-y-editores)

### **Estilos**

Podemos definir los estilos ***privado***, que limita el acceso del usuario final a cierta información sobre ese objeto o subobjeto y ***heredable***, que permite que el objeto o subobjeto sea usado cuando el proyecto sea heredado.

### **Comentarios**

Esta propiedad nos permite documentar el uso del objeto o subobjeto en nuestro proyecto.

En aquellas propiedades en las que el contenido sea un objeto, podremos editar éste usando el menú de contexto. Para ello, no tendremos más que situar el puntero del ratón sobre el objeto seleccionando en la propiedad, pulsar el botón derecho del ratón y, en el menú de contexto que se abre, seleccionar la opción editar objeto de la propiedad.

### Edición directa de objetos y subobjetos desde las propiedades de otros

En las propiedades de un objeto o de un subobjeto existen propiedades que apuntan a otros objetos o subobjetos. Al editar una propiedad de este tipo se mostrará, junto al identificador del objeto/subobjeto apuntado, el siguiente botón ![](/files/21OGBVlWmGOJRpe8xFDe), si lo pulsamos, editaremos el objeto/subobjeto correspondiente.

## Galería de objetos

Se trata de una funcionalidad de Velneo vDevelop que nos permite añadir objetos a nuestros [proyectos](/velneo-vdevelop/proyectos-objetos-y-editores).\
Para abrir la galería ejecutaremos la opción **galería de objetos** del menú **objetos** de Velneo vDevelop.

Los objetos disponibles en la galería variarán en función de si estamos editando un [proyecto de datos ](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-organizacion/proyecto-de-datos-1-carpetas-esquemas-tablas-e-indices-complejos)o un [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion), ya que hay objetos específicos de datos, otros específicos de aplicación y otros comunes a ambos.

## Mover objeto

Es posible mover un objeto del proyecto en curso a un proyecto heredado. Podremos mover tanto objetos de proyecto de datos como de proyecto de aplicación.

Para ello seleccionaremos el objeto a mover o bien en el explorador de proyectos o bien en el panel del proyecto y ejecutaremos la opción **mover de proyecto** del menú **objetos** de Velneo vDevelop.

Una vez hecho esto el sistema pedirá que seleccionemos el proyecto al que queremos mover el objeto seleccionado, solamente nos dará opción a elegir entre los proyectos heredados por el proyecto en curso que sean del mismo tipo, es decir, si se trata de un objeto de proyecto de datos nos mostrará la lista de proyectos de datos heredados y si se trata de un objeto de proyecto de aplicación lo que nos mostrará será la lista de proyectos de aplicación heredados.

Seleccionaremos el proyecto deseado y pulsaremos el botón **aceptar** para continuar o el botón **cancelar** para abortar la operación.

El siguiente paso será seleccionar la carpeta del proyecto de destino en el que se desea incluir el objeto.

Seleccionaremos el proyecto deseado y pulsaremos el botón **aceptar** para continuar o el botón **cancelar** para abortar la operación.

Si aceptamos, el objeto habrá sido movido al proyecto de destino y quitado del proyecto en curso.

Si el objeto seleccionado usa a su vez otros objetos, esta operación moverá, además del objeto seleccionado, los objetos que éste use. Por ejemplo, si movemos una [rejilla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla) y ésta usa un [formulario ](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/formularios)en su propiedad Formulario de alta, el sistema moverá tanto la rejilla como el formulario al proyecto de destino. Si movemos un [marco ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/marco)que usa un [menú ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu)que usa [acciones](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion) que hacen uso a su vez de otros objetos, todos ellos serán movidos al proyecto de destino.

## Copiado y pegado de objetos

Velneo incorpora un potente sistema de refactorización que nos permitirá desarrollar más rápidamente mediante la técnica del copiado y pegado de objetos, tanto dentro de un mismo proyecto como entre proyectos distintos. Estos comandos los encontraremos dentro del menú **edición** de Velneo vDevelop.

### Comando “pegar” (ctrl + V)

Cuando dentro de un proyecto copiamos un grupo de objetos que están relacionados entre sí, al pegarlos, los nuevos objetos generados no quedarán relacionados a los originales, sino a las copias generadas de los mismos. Lo explicaremos con un ejemplo:

Supongamos que tenemos declarada una [acción ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion)llamada ACCION que dispara un [proceso ](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso)llamado PROCESO.

Si copiamos y pegamos la acción, se generará en el proyecto una nueva acción llamada ACCION1, y tendrá asociado el proceso PROCESO.

Si en lugar de hacer lo anterior seleccionamos la acción y el proceso, los copiamos y los pegamos en el proyecto, se generará en el proyecto una nueva acción llamada ACCION1 y un nuevo proceso llamado PROCESO1, y la ACCION1 tendrá asociado el PROCESO1.

Cuando en un proyecto copiamos un objeto o un grupo de objetos asociados a un origen (objetos asociados a una [tabla ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla)de datos concreta) o que hacen uso de otros objetos, y los pegamos en un proyecto distinto, si esos orígenes u objetos usados no existen en el destino, el sistema nos advertirá que en los objetos pegados tenemos referencias pendientes de resolver y nos dará opción de asociarlos a un nuevo origen del proyecto de destino o seleccionar el objeto del que haga uso.

En el caso de que al pegar los objetos asociados a un origen o que usen otros objetos y en el proyecto de destino coincidan identificadores de los mismos, el sistema los asignará automáticamente al pegarlos.

Al aceptar, todos los objetos copiados serán creados en el proyecto de destino y apuntando al origen adecuado y usando los objetos adecuados.

Esta funcionalidad nos será de gran utilidad para crear nuestros objetos visuales. Podremos tener un proyecto que contenga los objetos básicos de una tabla ([formulario,](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/formularios) [rejilla,](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla) [búsquedas](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/busqueda), etc.) y así poder reutilizarlos en proyectos que desarrollemos en el futuro.

### Comando “pegar como” (ctrl + shift + v)

Este comando, a diferencia del anterior, cuando copiemos objetos, nos permitirá cambiar la tabla asociada al pegarlos. No solamente pegará los objetos asociados a la nueva tabla, sino que también renombrará las etiquetas y los identificadores de acuerdo a la nueva asignación.

Realiza las acciones siguientes:

Muestra la lista de todas las tablas usadas en los objetos visuales copiados y todos los objetos que no haya podido resolver (sólo en el caso que copiemos y peguemos en proyectos diferentes).

Una vez que resolvemos, por cada tabla, pudiendo sustituirla por otra diferente o manteniendo la misma, aceptamos el formulario.

Veremos cómo se generan tantas carpetas, subcarpetas y objetos en el destino como teníamos copiados en el origen, produciéndose la siguiente metamorfosis: se sustituyen los Identificadores de los objetos, su descripción y el nombre de las carpetas, por aquellos que hayamos seleccionado como nueva resolución, siempre y cuando contengan el nombre de la tabla original.

Por ejemplo, si el identificador de la tabla original es CLIENTES y el de la tabla final es PROVEEDORES y una rejilla tiene como identificador CLIENTES, se cambiará por PROVEEDORES.\
Si el identificador de la rejilla fuera REJILLA\_CLIENTES se cambiará por REJILLA\_PROVEEDORES.

Si el identificador de dicha rejilla fuera REJILLA no se cambiará porque no contiene el identificador de la tabla original (CLIENTES).

En este caso, si además ya existe la rejilla REJILLA, el identificador será REJILLA1 porque no puede haber dos objetos del mismo tipo con el mismo identificador en el mismo proyecto.

El botón *Ver todos los objetos* que se muestra en la parte superior derecha de la ventana permite ver el listado completo de objetos que vamos a pegar y no sólo los que requieren resolución de objetos.

Esto nos supondrá un gran ahorro a la hora de programar nuestras aplicaciones, ya que nos permitirá duplicar objetos básicos de nuestras aplicaciones (formularios, rejillas, búsquedas, etc.) de una tabla a otra en cuestión de segundos.

{% hint style="danger" %}
No es posible pegar objetos que han sido copiados desde un Velneo vDevelop de una versión posterior.
{% endhint %}

## Subobjeto

Se trata un objeto que está contenido en otro objeto y que no tiene ninguna entidad por sí mismo, ya que depende totalmente del objeto contenedor.

Los subobjetos de proyecto de datos pueden ser heredados y usados en otros objetos.

Ejemplo: los [campos ](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos)y los [índices](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice) son subobjetos de [tabla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla).

Los subobjetos de proyecto de aplicación no pueden ser ni heredados ni usados en otros objetos.

Ejemplo: los [eventos ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/conexion-de-evento)y las [conexiones de evento](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/conexion-de-evento) son subobjetos de formulario.

Es posible copiar y pegar subobjetos de objetos; por ejemplo, de una tabla copiar y pegar campos.

Es posible también pegar subobjetos de subobjetos, por ejemplo, copiar y pegar una condición de estilo (sub-sub-objeto) de una columna (sub-objeto) de una rejilla (objeto) en otra columna de rejilla. Esto solamente podremos hacerlo desde el panel de subobjetos del objeto:

![](/files/-M7D78J_X0XAsnLfY1IQ)

{% hint style="warning" %}
Si en el panel de sub-objetos seleccionamos uno o varios objetos podremos borrarlos usando la techa Supr solamente en aquellos objetos que disponen de editor ([formulario](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario), [rejilla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla), etc.) y siempre y cuando el editor del objeto esté abierto.
{% endhint %}


# Refactorización automátca

Es una de las características más importantes de la plataforma Velneo.

Se trata de un automatismo de Velneo vDevelop que automáticamente se encarga de refrescar el cambio de identificador de cualquier objeto allí donde se use.

## Un ejemplo

Para aclarar mejor la explicación vamos a poner un ejemplo. Supongamos que creamos un formulario para editar clientes y le ponemos de identificador CLIENTES, ese formulario lo utilizamos en la propiedad formulario de alta, baja y modificación de la rejilla de clientes.

Unas semanas más tarde decidimos usar abreviaturas para reducir los identificadores y cambiamos el identifcador del formulario CLIENTES por CLT. Es posible que en otros lenguajes de programación o herramientas de desarrollo tengas que manualmente buscar donde se usaba ese formulario y cambiarlo. En Velneo no es necesario, porque cuando cambia un identificador el editor busca donde es usado y realiza el cambio por nosotros.&#x20;

El ejemplo que hemos puesto es muy sencillo, sin embargo, la potencia de la refactorización es enorme ya que no se limita a objetos, también se refactorizan los cambios de subobjetos sin límite de niveles. Esto significa, por ejemplo, que si cambiamos el nombre del identificador de un control de edición en un formulario y ese identificador es usado en múltiples códigos no hay problema, porque al cambiar el identificador se cambia en todos los sitios, y todos significa "todos" los objetos, subobjetos de Velneo.

La refactorización nos aporta:

* En primer lugar **seguridad**. Porque si esa refactorización no fuese automática y tuviésemos que hacer esos cambios nosotros manualmente es muy factible que nos quede algún sitio por cambiar. Es cierto que nuestro ejemplo era muy sencillo, pero cuando una aplicación tiene miles de objetos cambiar los identificadores puede convertirse en un acto muy complejo.
* En segundo lugar **productividad**. Porque cuando tienes miles de objetos poder cambiar el identificador y que se refresque en todos los sitios donde se usa en un segundo nos ahorra muchas horas de trabajo.

"Seguridad" y "productividad" son las palabras clave para poder ofrecer servicios de mantenimiento rentables.


# Exportación e importación de objetos

Velneo vDevelop permite la exportación a disco de uno o varios objetos para su posterior importación desde otro Velneo vDevelop.

Podemos exportar objetos desde los siguientes puntos:

Desde el [menú Edición](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-edicion).

Desde el menú de contexto del [*dock* de proyecto](/velneo-vdevelop/interfaz-de-velneo-vdevelop/dock-de-proyecto).

Desde la *toolbar* de edición de Velneo vDevelop.


# Objetos de proyecto de datos

Los objetos específicos de proyectos de datos son:

* [Índice complejo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/indice-complejo).
* [Tabla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla).
* [Tabla estática](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla-estatica).
* [Variable](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/variable).


# Indice complejo

En los índices normales, indexamos registros de la propia tabla y el resultado obtenido son registros de la misma tabla.\
En un índice complejo intervienen:

Una **tabla primaria** (tabla asociada) que se corresponde con la tabla cuyas altas y bajas generarán las altas y bajas de la clave indexada.

Una **tabla secundaria** (tabla para búsquedas) es la tabla de la que se obtienen los resultados. Cuando hagamos una búsqueda por un índice complejo obtendremos una lista de registros de esta tabla. La tabla secundaria puede ser la primaria o alguna de sus ascendientes (tablas apuntadas por campos de tipo puntero a maestro, indirecto real o virtual, etc.)

Una o múltiples **tablas terciarias**, son las que intervienen en la composición de la clave y en el cálculo de los pisos intermedios para el cálculo de la dirección. El cambio de valor de una tabla terciaria fuerza la regeneración de la dirección apuntada en el índice. Puede ser la tabla primaria o alguna de sus ascendientes (tablas apuntadas por campos de tipo puntero a maestro, indirecto real o virtual, etc.). También se consideran terciarias tablas que parecen no intervenir, por ejemplo, si indexamos el nombre de la población del cliente de la factura, todas las tablas son terciarias ya que el cliente puede cambiar de población y la factura puede cambiar de cliente y cualquiera de estos cambios produce el recálculo de la dirección a indexar. Incluso también son terciarias las tablas que intervienen en la tabla secundaria, por ejemplo, tenemos la tabla líneas de pedido que apunta al pedido que a su vez apunta al cliente, y las líneas también apuntan al artículo que a su vez apunta a la familia, si en nuestro índice hemos definido como secundaria a la familia, es decir obtenemos familias vendidas a clientes, la tabla artículos también será terciaria, ya que si un artículo cambia de familia obliga a la regeneración de las direcciones apuntadas en los índices.

Por ejemplo, podemos crear este índice para buscar facturas de una empresa por el nombre del transportista o del cliente.

{% hint style="warning" %}
No es posible usar tablas de tipo submaestro en un índice complejo.
{% endhint %}

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca al objeto. Este identificador será el que usemos en [fórmulas ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula)y para referenciarlo en otras propiedades.

Constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un campo de una tabla no puede haber duplicidad.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del índice.

Podemos definir una etiqueta por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Estilos

Podemos definir los estilos siguientes:

#### **P**rivado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del índice complejo.

### Tabla asociada

En esta propiedad indicaremos la tabla primaria que es aquella cuyas altas y bajas generarán las altas y bajas de la clave indexada.

### Tabla para búsquedas

En esta propiedad indicaremos la tabla secundaria, que es aquella que define el resultado de la búsqueda que se realiza por el índice.

### Tipo de índice

Esta propiedad nos permite definir de qué forma van a ser indexados los datos. Los tipos existentes son:

#### Clave única

No admite más que un registro con la misma clave.

#### Palabras

El registro es indexado por cada palabra encontrada en las partes que forman la clave. Por razones de optimización y rendimiento, solamente se indexarán los 9 primeros caracteres de cada palabra del campo o campos a indexar.

#### Múltiples claves

El registro es indexado desde cero claves hasta el número que el programador declare en la propiedad **número de claves**. El índice deberá estar compuesto al menos por tantos componentes como número de claves hayan sido declaradas. Si el [campo ](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos)o la fórmula de una clave está vacío, esa clave no será indexada.

Los campos a indexar han de ser del mismo tipo y longitud.

Un ejemplo de uso es cuando en una tabla tenemos dos o más campos enlazados a una tabla maestra. Por ejemplo, en la ficha de un libro, el autor primero y el autor segundo, y nos interesa buscar libros de un autor, sin importar si es el autor primero o el segundo.

Crearemos un índice con múltiples claves cuyo primer componente será el campo enlazado al autor1 y cuyo segundo componente será el campo enlazado al autor2.

En la propiedad nº de claves del índice estableceremos un 2.

Si queremos que al buscar por dicho índice el resultado salga ordenado, por ejemplo, por el título del libro, por ejemplo, al índice le añadiremos el campo NAME de la tabla, pero el número de claves del índice seguirá siendo 2 (los enlaces a los autores).

#### Acepta repetidas

La ficha es indexada sólo una vez pero, al contrario que la clave única, se admiten repeticiones. El sistema le añade 4 bytes a la clave para diferenciar las repetidas.

#### Trozos de palabras

El registro es indexado por cada grupo de 3 ó más caracteres de cada una de las partes que forman la clave.

Los índices de palabras y de trozos de palabras hacen una conversión interna a Alfa40, si no hay correspondencia de un carácter entra la tabla de caracteres de origen y la de Alfa40, no lo indexará. Además, solamente existe la tabla Alfa40 para el alfabeto latino. Esto quiere decir que por este tipo de índices se indexarán caracteres latinos, pero no de otros alfabetos.

### Condición para indexar

Esta propiedad permite establecer una condición para indexar el registro. Si la condición no se cumple, el registro no será indexado por ese índice. Si pulsamos el botón ![](/files/-M7D78P7-C8bYZDUjH2r) se abrirá el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). En esta fórmula solamente se permite usar campos de la tabla actual, no se permite usar campos de tablas enlazadas ni tampoco llamar a [funciones](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/funcion), dado que ambas cosas mermarían el rendimiento.

### Lista negra

Esta propiedad aparecerá en el caso de que el índice sea de tipo palabras. Permite establecer una lista de las palabras que no serán indexadas por ese índice. Para escribir la lista pulsar el botón que aparece al editar el valor.

### Número de claves

Esta propiedad aparecerá en el caso de que el índice sea de tipo **múltiples claves**. En ella se indicarán el número de claves que conforman el índice.

### Número de partes

Indica el número de campos o fórmulas (partes) que componen la clave.

### Longitud de la clave

Indica la longitud total, en bytes, del índice.

### Resolución dir

Esta propiedad solamente estará disponible cuando las tablas especificadas en las propiedades **tabla asociada** y **tabla para búsqueda** sean distintas. Aquí debemos definir el campo enlazado a la tabla de búsquedas que queremos usar.

## Partes índice complejo

Aquí es donde definiremos las claves que se indexarán y que se corresponden con la tabla o tablas terciarias que componen el índice.

En un mismo índice complejo, podremos indexar campos de la tabla primaria, de la secundaria y/o terciarias, componiendo todas ellas una única clave.

Un índice complejo estará compuesto por una o más partes. Para crear una parte de un índice complejo abrir el menú **objetos**, submenú **nuevo sub-objeto**, opción **parte índice**. Sus propiedades son:

### Identificador

Etiqueta alfanumérica que identifica al componente índice complejo. Este identificador será el que usemos para referenciarlo en otras propiedades.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del componente.

### Estilos

Podemos definir los estilos siguientes:

#### **Privado**

Limita el acceso del usuario final a cierta información sobre esa parte del índice.

#### **Heredable**

Permite que esa parte del índice complejo sea usada cuando el proyecto sea [heredado.](/velneo-vdevelop/herencia)

### Comentarios

Esta propiedad nos permite documentar el uso del componente del índice complejo.

### Modo

Permite establecer de qué forma se indexará la parte. Los valores posibles son:

#### **Campo completo**

La parte a indexar va a ser un campo y se indexará completo.

#### Campo porción

La parte a indexar va a ser un campo pero va a indexarse solamente una porción del mismo.

#### **Fórmula**

La parte a indexar va a ser una fórmula definible por el programador.

### Campo

Esta propiedad solamente estará disponible en el caso de que el **modo** sea **campo completo** o **campo porción**. Solamente podremos seleccionar campos de la tabla actual que tengan persistencia en disco; es decir, no es posible ni indexar campos de tablas enlazadas ni indexar campos de tipo fórmula.

### Fórmula

Esta propiedad solamente estará disponible en el caso de que el **modo** sea **fórmula**. Esta propiedad permite establecer una fórmula, cuyo resultado será indexado. Si pulsamos el botón ![](/files/-M7D78P7-C8bYZDUjH2r) se abrirá el asistente para edición de fórmulas. En esta fórmula solamente se permite usar campos de la tabla actual, no se permite usar campos de tablas enlazadas ni tampoco llamar a [funciones,](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/funcion) dado que ambas cosas mermarían el rendimiento.

### Longitud

Longitud, en bytes, que tendrá la parte a indexar.

Si el **modo** es **campo completo**, este valor no podrá ser modificado.

Si el **modo** es **campo porción**, en esta propiedad indicaremos el número de caracteres a indexar del campo. Ejemplo: Si el campo es alfabético de 35 bytes y este valor lo establecemos a 12, esta parte indexará solamente los 12 primeros caracteres del mismo.

Si el **modo** es **fórmula**, en esta propiedad indicaremos 0 si queremos indexar la totalidad del resultado de la fórmula; en caso contrario indicaremos el número de caracteres a indexar del campo.

### Conversión

Si el **modo** es **campo porción** y el campo es de tipo alfabético (Alfa Latin-1, alfa UTF-16, alfa 256, alfa 128 o alfa 64); en esta propiedad podremos hacer una conversión de la parte a una tabla de caracteres inferior.Ejemplo: un campo de tipo alfa256 indexarlo convertido a alfa 64.

{% hint style="warning" %}
Si en un componente realizamos una conversión tendremos que modificar también la longitud que se indexará del mismo en función de la nueva tabla de caracteres. Por ejemplo, si convertimos una parte de Alfa128 a alfa 64, dado que éste último cada cuatro caracteres que se introduzcan se comprimen en 3 grabado en disco, la longitud a indexar deberá ser un múltiplo de 3.
{% endhint %}

Si el **modo** es **fórmula** en esta propiedad podremos indicar al sistema de qué tipo será el dato resultante de la fórmula. Los tipos posibles son:

* **Número**: la parte del índice a indexar será un número.
* **Fecha**: la parte del índice a indexar será una fecha. En este caso la propiedad del componente **longitud** automáticamente será establecida a 3 y no podrá ser modificada; pues es la longitud que tiene un dato de tipo fecha.
* **Hora**: la parte del índice a indexar será una hora. En este caso la propiedad del componente **longitud** automáticamente será establecida a 3 y no podrá ser modificada; pues es la longitud que tiene un dato de tipo hora.
* **Tiempo**: la parte del índice a indexar será un dato de tipo tiempo. En este caso la propiedad del componente **longitud** automáticamente será establecida a 4 y no podrá ser modificada; pues es la longitud que tiene un dato de tipo tiempo.
* **Alfa 256**: la parte del índice a indexar será una cadena de tipo alfa 256.
* **Alfa 128**: la parte del índice a indexar será una cadena de tipo alfa 128.
* **Alfa 64**: la parte del índice a indexar será una cadena de tipo alfa 64.
* **Alfa 40**: la parte del índice a indexar será una cadena de tipo alfa 40.

### Decimales

Esta propiedad solamente es visible cuando el **modo** es **fórmula** y el valor de la **conversión** es **número**. Permite establecer el número de decimales que tendrá el número a indexar.

### Signo

Esta propiedad solamente es visible cuando el **modo** es **fórmula** y el valor de la **conversión** es **número**. Permite establecer si se va a contemplar o no el signo (positivo o negativo) del número a indexar.

A continuación vamos a revisar diferentes ejemplos que nos ayudarán en la comprensión desde el punto de vista práctico. Crear un índice complejo en vDevelop es realmente sencillo y se puede realizar en cuestión de segundos, sin embargo, detrás de esta aparente sencillez se esconden complejos algoritmos que nos harán la vida más sencilla a la hora de realizar búsquedas realmente complejas sobre información almacenada en una o múltiples tablas.

## Ejemplo 1

### **Pedidos por trozos del nombre del artículo**

Queremos crear una búsqueda en la que escribiendo trozos del nombre de un artículo podamos encontrar todos los pedidos en los que se haya vendido en alguna de sus líneas algún artículo que contenga el trozo a buscar. El esquema de tablas en el que está basado el ejemplo es el siguiente:

![](/files/-M7D78PAIayjNDxs0tV4)

Crear el índice complejo nos llevará un minuto. Sólo tenemos que cubrir las propiedades que se muestran en la imagen siguiente:

![](/files/-M7D78PCtMAjxoJtBnfW)

Las propiedades específicas del índice complejo que vemos cubiertas en la imagen son:

La tabla primaria LINEAS que es la que se encuentra en la parte más baja del esquema ya que es la que conoce al resto de tablas del índice complejo y la declaramos como tabla asociada.

La tabla secundaria PEDIDOS que es de la que queremos obtener los resultados de la búsqueda y la declaramos como tabla para búsqueda.

El índice lo declaramos del tipo “Trozos de palabras”.

Si la tabla asociada y la tabla para búsquedas no es la misma se nos solicitará resolver la propiedad Resolución dir con el campo puntero al registro a devolver en la búsqueda. Esta resolución es necesario hacerla manualmente ya que en la senda de resolución del índice complejo pueden existir más de un puntero a la tabla de búsqueda y el programador debe concretar cuál es el campo puntero adecuado para ser utilizado por el índice complejo.

En la parte del índice, en este ejemplo se configura simplemente el campo nombre del artículo a indexar.

![](/files/-M7D78PD6hWVrNewqiHv)

Tal y como está definido este índice el programa automáticamente (sin necesidad de ninguna programación por parte del desarrollador) realizarán las siguientes tareas:

Cada vez que se de un alta o baja de una línea de un pedido se regeneran las entradas en el índice complejo para dicho pedido.

Si cambiamos a una línea el artículo o la asignamos a otro pedido se regeneran las entradas del índice complejo de dicho pedido.

Cuando un artículo cambie su nombre se recalcularán las claves correspondiente del índice complejo.

## Ejemplo 2

### **Pedidos de venta por el nombre fiscal, comercial y CIF/DNI de la entidad de los clientes**

Supongo que lo queremos es buscar todos los pedidos que correspondan a una empresa o particular del que conocemos su nombre fiscal (Razón social) o su nombre comercial o su CIF/DNI. El esquema de tablas en el que está basado el ejemplo es el siguiente:

![](/files/-M7D78PHOYVigcuHVbH9)

En este ejemplo vemos como la misma tabla, en este caso la de PEDIDOS es a la vez la primaria y la secundaria. También vemos como la tabla de CLIENTES es una maestra de extensión de la tabla ENTIDADES que es donde se encuentran los campos a indexar.

Crear ese índice complejo es tan sencillo como completar las propiedades del objeto que vemos en la siguiente imagen:

![](/files/-M7D78PINZdw9g6POeGc)

Las propiedades específicas del índice complejo que vemos cubiertas en la imagen son:

La tabla primaria PEDIDOS que es la que se encuentra en la parte más baja del esquema ya que es la que conoce al resto de tablas del índice complejo y la declaramos como tabla asociada.

La tabla secundaria PEDIDOS que es de la que queremos obtener los resultados de la búsqueda y la declaramos como tabla para búsqueda.

El índice lo declaramos del tipo “Trozos de palabras” aunque puede estar definido de cualquiera de los tipos de índices soportados en Velneo.

Como en este caso la tabla asociada y la tabla para búsquedas son la misma, no se solicita la propiedad “Resolución dir” pues Velneo ya deduce que será el ID de la tabla PEDIDOS.

En la parte del índice, en este ejemplo se configuran los campos nombre fiscal (Razón Social), nombre comercial y CIF/DNI de la entidad.

Tal y como está definido este índice el programa automáticamente (sin necesidad de ninguna programación por parte del desarrollador) realizarán las siguientes tareas:

Cada vez que se de un alta o baja de un pedido se regeneran las entradas en el índice complejo para dicho pedido.

Cada vez que se modifique el cliente de un pedido se regeneran las entradas del índice complejo de dicho pedido.

Cuando una entidad cambie el nombre fiscal, el nombre comercial o el CIF/DNI se recalcularán las claves correspondiente del índice complejo.

## Ejemplo 3

### **Clientes por trozos de los contactos, nombre fiscal, comercial o CIF de la entidad**

Dada la abstracción y versatilidad de los índices complejos, también nos permiten crear índices sobre tablas de proyectos heredados sin modificarlos. Supongamos que tenemos una solución llamada vBase que contiene datos de empresa y es heredada por otra solución llamada Pedidos, donde gestionamos pedidos. En este ejemplo vamos a indexar tablas de la solución vBase desde nuestro proyecto Pedidos, sin tocar la solución vBase, de tal forma que si sale una nueva versión de la solución vBase podremos actualizarla sin problemas y nuestro índice complejo seguirá funcionando perfectamente.

Con este índice complejo queremos buscar clientes por los trozos de su teléfono, móvil, email, fax, skype, etc. y también si el trozo a buscar forma parte del nombre fiscal, nombre comercial o CIF/DNI de la entidad. Para conseguirlo declaramos como tabla asociada (primaria) la tabla de contactos que es el plural de contactos de le entidad, como tabla para búsqueda configuramos la de clientes y luego declaramos las partes del índices a indexar. El esquema de tablas en el que está basado el ejemplo es el siguiente:

![](/files/-M7D78PJvYrHTNpadxy3)

En un minuto tendremos declarado un índice verdaderamente complejo sobre las tablas de la solución vBase sin modificarla.

![](/files/-M7D78PKb11hNEIPwm-6)

Las propiedades específicas del índice complejo que vemos cubiertas en la imagen son:

La tabla primaria CTT que es la que se encuentra en la parte más baja del esquema ya que es la que conoce al resto de tablas del índice complejo y la declaramos como tabla asociada.

La tabla secundaria CLIENTES que es de la que queremos obtener los resultados de la búsqueda y la declaramos como tabla para búsqueda.

El índice lo declaramos del tipo “Trozos de palabras” aunque puede estar definido de cualquiera de los tipos de índices soportados en Velneo.

Nuevamente como la tabla asociada y la tabla para búsquedas no son la misma se nos solicita resolver la propiedad “Resolución dir” con el campo puntero al registro a devolver en la búsqueda que en este caso es el campo #ENT.EXTENSION\_CLIENTES que es el campo de ENTIDADES que apunta al registro de extensión.

En la parte del índice se configuran los campos a indexar que en este caso son el campo #VAL de la tabla de contactos que es la que contiene el dato de contacto y como ya hemos visto añadimos también los nombre fiscal (Razón Social), nombre comercial y CIF/DNI de la entidad.

Tal y como está definido este índice el programa automáticamente (sin necesidad de ninguna programación por parte del desarrollador) realizarán las siguientes tareas:

Cada vez que se de un alta o baja de un contacto de una entidad se regeneran las entradas en el índice complejo para dicho cliente.

Cada vez que se modifique en un contacto la entidad a la que pertenece se regeneran las entradas del índice complejo localizar el cliente.

Cuando modifiques el valor de un dato de contacto o cuando una entidad cambie el nombre fiscal, el nombre comercial o el CIF/DNI se recalcularán las claves correspondiente del índice complejo.

## Rendimiento

El rendimiento en ejecución de los índices complejos es similar al de los índices de tablas. Debemos tener en cuenta que el tiempo necesario para la generación del índice en su creación o en la regeneración del mismo variará en función de la complejidad de la clave. Si lo campos a indexar pertenecen a la tabla primaria, los tiempos serán similares a los actuales, sin embargo, en casos complejos donde existen muchas tablas terciarias este tiempo puede llegar a ser elevado si indexamos un número grande de registros, ya que debemos tener en cuenta que por ejemplo si indexamos los pedidos por el nombre del país de la entidad del cliente, cada clave de almacenar toda la senda de tablas que intervienen #PEDIDO.CLIENTE.ENT.PAIS.NOMBRE ya que si una entidad cambia de país, por ejemplo, será necesario regenerar las entradas del índice complejo para los pedidos afectados por ese cambio.

## Regeneración

Cuando creamos un índice complejo, éste no es regenerado automáticamente al reconstruir las tablas, será necesario forzar su regeneración.

La regeneración de estos índices puede hacerse desde el menú utilidades del vDataClient mediante la opción “Regenerar índices” del índice complejo seleccionado. También es posible regenerar los índices complejos desde las función JavaScript regenComplexIndex( String szIdRefIdxComplejo, Boolean bProgressDialog ) que se ha añadido a la clase VApp.

## Búsquedas

Existen 2 alternativas para realizar búsquedas en índices complejos:

El comando de instrucción de procesos Cargar lista de índice complejo que nos devolverá la lista de registros resueltos.

Los componentes del objeto búsqueda ahora tienen un nuevo parámetro “Grupo índices” que permite seleccionar si deseamos utilizar un índice normal o un índice complejo, en función de la selección la siguiente propiedad nos solicitará un índice normal o un índice complejo según corresponda. Una vez definida la búsqueda podrá ser usada como cualquier otra búsqueda de nuestra aplicación. En la siguiente imagen podemos ver la definición del componente.

![](/files/-M7D78PLbEPj5f6eAlsv)

## Reducción automática de claves

Una importante optimización que contemplan los índices complejos es la reducción automática de claves. Cuando se da la circunstancia de que existen muchas claves duplicadas en el índice complejo apuntando al mismo registro de la tabla secundaria, Velneo evita que se generen esas claves duplicadas consiguiendo una notable reducción del tamaño del índice y almacenando información sobre el número de veces que se repite cada clave. Esta información podría llegar a ser utilizada en futuras versiones para la creación de índices estadísticos.

{% hint style="warning" %}
En los índices complejos en los que indexemos un campo de un maestro, debe existir un índice del campo puntero a maestro declarado en la tabla que se indexa. Si no existe este índice Velneo es incapaz de saber que registros se verán afectados por el cambio y no podrá reindexarlos.

El índice del campo puntero a maestro no debe estar condicionado ya que si el índice está condicionado no podemos garantizar que seremos capaces de apuntar a todos los registros plurales de la tabla. Este criterio es el que aplica la base de datos de Velneo a la hora de reindexar registros de índices complejos de tal forma que, si no encuentra ningún indice al campo maestro sin condicionar, no realizará el refresco de los cambios del maestro en el índice complejo.
{% endhint %}

{% hint style="info" %}
Los índices complejos son funcionales solamente en tablas con persistencia en disco.
{% endhint %}


# Tabla

Es el objeto de [proyecto de datos](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-organizacion/proyecto-de-datos-1-carpetas-esquemas-tablas-e-indices-complejos) que sirve para almacenar la información de manera organizada. En cada una de ellas se guarda la información sobre un tema particular, pudiendo relacionarse unas con otras para formar una súper-estructura de información.

Una tabla organiza la información en fichas o registros que contienen los mismos campos o datos individuales. Por ejemplo, en una tabla de datos de clientes, tendremos una ficha o registro por cada cliente, con su nombre, dirección, teléfono y otros datos necesarios.

## Propiedades

### **Identificador**

Nombre interno de la tabla que será usado para referenciarla a nivel de programación.&#x20;

Este parámetro será el que se use para crear el archivo en disco correspondiente, por lo tanto, debemos asegurarnos de que su longitud nunca supere el tamaño máximo que admita el sistema operativo.

{% hint style="warning" %}
No debemos usar como identificador palabras reservadas del sistema operativo.

Palabras reservadas en Windows:

* CON
* PRN
* AUX
* RELOJ $
* NUL
* COM1, COM2, … hasta COM9
* LPT1, LPT2, … hasta LPT9

Palabras/caracteres reservados en Linux:

* /
* \>
* <
* |
* :
* &
  {% endhint %}

{% hint style="warning" %}
No debemos cambiar el identificador de una tabla en un proyecto que ya se encuentre instanciado, ya que para el sistema será como si se hubiese creado una nueva tabla, por lo que no se traspasarán los datos de la tabla antigua a la nueva.&#x20;
{% endhint %}

### **Nombre**

Nombre plural de la tabla. Ejemplo: *Artículos*.

Si en el proyecto de datos hemos declarado más de un idioma, si editamos esta propiedad, podremos establecer el nombre en todos los idiomas declarados pulsando sobre el botón que aparece a la derecha del control o pulsando la tecla F4.

### **Estilos**

Podemos definir el estilo siguiente:

#### **Privado**

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

### **Comentarios**

En esta propiedad escribiremos cualquier comentario sobre la tabla que pueda servir de ayuda a los programadores.

### **Nombre singular**

Nombre singular de la tabla. Ejemplo: *Artículo*.

### **Tipo**

Tipo de tabla. Puede ser:

* Maestro.
* Histórico.
* Sub-Maestro.
* Maestro con clave arbolada.
* Maestro de extensión.

### **Tabla de datos padre**

Si la tabla es de tipo submaestro, en esta propiedad se mostrará el identificador de la tabla padre.

### **Reside en**

Puede residir en disco o en memoria.

Las tablas en disco son compartidas por todos los usuarios de la aplicación y las tablas en memoria son de carácter local, esto es, su contenido será local a la máquina en la que se creen los registros.

Si creamos un registro desde una sesión de Velneo vClient ese registro será local a esa sesión de Velneo vClient.&#x20;

Si creamos un registro en un proceso ejecutado en tercer [plano](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/procesos/procesos-1-2-y-3-plano-cuando-usar-cada-uno) (en el servidor), el registro será creado en la memoria de esa sesión de Velneo vServer y para esa instancia de datos en concreto.

Las tablas en memoria son de carácter volátil y su contenido desaparecerá al cerrar la sesión del ejecutable en la que fueron creadas. El tamaño máximo que puede tener una tabla en memoria es de 2 Gb.

No es posible crear una estructura de tablas en la que desde una tabla en disco apuntamos a una tabla en memoria. Es decir una tabla en disco nunca podrá ser plural de una en memoria. Los históricos no pueden estar en disco y los maestros en memoria, ya que se pierde la integridad referencial.

### **Longitud de registro**

Muestra el tamaño en bytes de un registro de la tabla.

### **Número de campos**

Muestra el número de campos declarados en la tabla.

### **Número de índices**

Muestra el número de índices declarados en la tabla.

Desde el árbol de propiedades de una tabla tendremos acceso a todos sus subobjetos con sus correspondientes propiedades.

## El editor de tablas

Cuando pulsamos la tecla intro o hacemos doble clic sobre una tabla, se abrirá el editor de tablas. Éste contiene una toolbar con las siguientes opciones:

**Nuevo campo**: permite añadir un [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) nuevo a la tabla.

**Nuevo enlace a maestro**: permite añadir a la tabla un campo [enlazado](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace) a otra tabla.

**Nuevo índice**: permite añadir a la tabla un nuevo [índice.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice)

**Nuevo índice del campo**: permite añadir a la tabla un nuevo [índice](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice) a partir del campo que tengamos seleccionado en el editor de tablas.

**Nueva actualización**: permite añadir a la tabla una [actualización](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/actualizacion) a una tabla enlazada.

**Nuevo evento de tabla**: permite añadir a la tabla un [trigger](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/trigger).

**Borrar sub-objeto**: permite borrar el sub-objeto de tabla que tengamos seleccionado en el editor de tablas.

**Imprimir**: Permite imprimir la estructura de la tabla. Se imprimirá la siguiente información: Campos, índices, enlaces plurales, actualizaciones y triggers.

**Imprimir a fichero pdf**: permite imprimir a un fichero pdf la estructura de la tabla. Se imprimirá la siguiente información: Campos, índices, enlaces plurales, actualizaciones y triggers.

## Tipos de tabla

Hay seis tipos de tabla que determinan las características de los registros que contienen. Son los siguientes:

* Maestro normal con clave numérica.
* Maestro con clave arbolada.
* Submaestro.
* Histórico.
* Maestro de extensión.
* Estática.

Una vez creada una tabla, no será posible cambiar su tipo.

### Maestro normal con clave numérica

La tabla tiene un campo ID de tipo numérico que puede ir de 1 a 4 bytes, y un índice correspondiente ID de clave única, además de un campo NAME de tipo alfa-128 de longitud 35 bytes.

De esta manera, todos los registros de la tabla se encuentran identificados de forma unívoca por medio del campo ID que tiene un valor que no se repite y cuyo límite máximo puede ir desde 1 a 4 bytes, pudiendo de esta forma referenciar hasta 4.294.967.295 registros.

Tanto el nombre del campo ID como del campo NAME son personalizables, aunque los identificadores no pueden ser modificados. Podemos hacer además que el contenido del campo ID se genere de forma automática controlando que no se produzca la duplicidad de valores.

Se trata del tipo de tabla más habitual en una estructura de datos y su uso viene determinado por su capacidad de establecer una relación de maestro con tablas que serán [plurales](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/plural) de ésta, aunque también es posible establecer relaciones de plural con otras tablas que serán a su vez maestras de ésta.

### Maestro normal con clave arbolada

La tabla tiene por defecto un campo ID de tipo alfa-40 de 2 a 8 bytes (3 a 12 caracteres máximo), pero puede tener definido cualquier tipo de campo alfanumérico, y un índice correspondiente ID de clave única, además de un campo NAME de tipo alfa-128 de longitud 35 bytes.

Así, todos los registros de la tabla se encuentran identificados de forma unívoca por medio del campo ID que tiene un valor que no se repite y cuyo límite máximo puede ir desde 3 a 12 caracteres, pudiendo de esta forma referenciar hasta 2.676.111.755.885.568.000 registros.

Las tablas maestras con clave arbolada son maestras de sí mismas enlazando por su campo ID que se abre en nuevas ramas por cada carácter.

Tanto el nombre del campo ID como del campo NAME son personalizables, aunque los identificadores no pueden ser modificados. No podemos hacer que el contenido del campo ID se genere de forma automática ya que se trata de un campo alfabético.

Su uso viene determinado por su capacidad de establecer una relación de maestro con tablas que serán plurales de ésta, aunque también es posible establecer relaciones de plural con otras tablas que a su vez serán maestras de ésta.

### Submaestro

La tabla tiene un campo ID de tipo numérico que puede ir de 1 a 4 bytes, y un índice correspondiente ID de clave única que tiene por primer componente el campo enlazado al maestro y como segundo componente el campo ID de la propia tabla. Además tiene campo NAME de tipo alfa-128 de longitud 35 bytes.

Al contrario que en los casos anteriores, todos los registros de la tabla se encuentran identificados de forma unívoca por los dos campos componentes del índice, por medio del campo ID que tiene un valor que no se repite y cuyo límite máximo puede ir desde 1 a 4 bytes, y por el campo enlazado a maestro, que se puede repetir para los distintos registros de la tabla, pudiendo de esta forma referenciar hasta 18.446.744.065.119.617.025 registros si la tabla maestra es normal con clave numérica o 11.493.812.469.293.538.322.498.560.000 registros si se trata de una tabla maestra con clave arbolada.

De esta manera, el valor del campo ID es único para cada maestro enlazado de la tabla, pero se puede repetir para distintos registros en la misma tabla si el maestro es distinto. Se trata de una subnumeración unívoca para cada maestro. La tabla submaestra puede tener tantas tablas padre como sea necesario.

Tanto el nombre del campo ID como del campo NAME son personalizables, aunque los identificadores no pueden ser modificados. Podemos hacer además que el contenido del campo ID se genere de forma automática controlando que no se produzca la duplicidad de valores.

Su uso viene determinado por su capacidad de establecer una relación de plural con tablas maestras, aunque también es posible establecer relaciones de maestro con otras tablas que serán a su vez plurales de ésta.

### Histórico

Este tipo de tabla no tiene campos ni índices iniciales, se componen únicamente por campos enlazados que se pueden definir en el momento de la creación y los registros se referencian únicamente por los índices correspondientes a los campos, no teniendo ninguna condición de tipo de indexación.

Su uso viene determinado por su capacidad de establecer una relación de plural con tablas maestras ya que no puede establecer relaciones de maestro con otras tablas al carecer de campo ID.

### Maestro de extensión

Se trata de una tabla que se usará como extensión de otra tabla, esto nos permitirá poder gestionar ambas como una única tabla. Muy útil para personalizar tablas de soluciones heredadas, sin tener que tocar su estructura. Durante su generación, el asistente nos pedirá que indiquemos cuál será la tabla de datos padre. En la tabla se generará un campo ID, no editable, que será en enlace a la tabla de datos padre. Así mismo, se generarán, por cada índice de la tabla de datos padre, un [indice complejo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/indice-complejo) para poder buscar registros de esta tabla de extensión por índices de la tabla de datos padre.

Los maestros de extensión podremos editarlos usando [fichas de extensión](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension).

Podemos crear tablas de extensión de tablas que sean de tipo [maestro normal con clave numérica.](https://doc.velneo.com/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/pages/-M7D76ml9ceGyVOhCei4#maestro-normal-con-clave-numérica) El caso de [maestro normal con clave arbolada ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla#maestro-normal-con-clave-arbolada)no está soportado actualmente. No será posible crear tablas de extensión de tablas de tipo [submaestro](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla#submaestro) ni [histórico](https://doc.velneo.com/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/pages/-M7D76ml9ceGyVOhCei4#histórico). El motivo es que el enlace se hace a través del ID de la tabla padre y éste debe ser único y, el campo ID de las tablas submaestras no es único y las tablas históricas carecen de campo ID.

No es posible crear tablas de extensión en memoria de tablas maestras en disco ni viceversa.

{% hint style="danger" %}
Una tabla no puede tener dos o más tablas de extensión con el mismo identificador, aunque estén en proyectos de datos diferentes.
{% endhint %}

### Estática

Los elementos de la tabla estática se definen en edición, no siendo posible crear, modificar o eliminar estos registros en ejecución. Constan de un identificador referencia de forma unívoca los registros que componen la tabla estática y un nombre. El identificador tiene un byte por lo que podemos crear hasta 256 elementos. Además podemos asociar a cada elemento un objeto dibujo que podremos mostrar cuando presentemos el registro.

Su uso viene determinado por su capacidad de establecer una relación de maestro con tablas que serán plurales de ésta. No pueden establecer una relación de plural con ninguna tabla.

El carácter limitado en cuanto al número de registros se debe a su definición como elemento estático, definible en edición y no modificable en ejecución, usándose por tanto para listas de registros de número reducido y concreto que no suelen modificarse ni alterarse en el uso de la base de datos.

## Asistente para la creación de tablas

Para facilitar tanto la creación de tablas como la creación de campos y enlaces entre las mismas [Velneo vDevelop ](/velneo-vdevelop/introduccion)incorpora un asistente.

Para crear una tabla en Velneo vDevelop ejecutar la opción **nuevo objeto/tabla** del menú **objetos**. Esto hará que se nos presente un asistente para su creación.

### Paso 1

En el primer paso del mismo tendremos que darle un nombre y definir su tipo:

**Nombre plural**: nombre plural de la tabla de datos. Ejemplo: *Entidades*.

**Nombre singular**: nombre singular de la tabla de datos. Ejemplo: **Entidad**.

**Tipo de tabla**: los tipos de tabla posibles son:

* Maestro normal con clave numérica.
* Submaestro.
* Maestro con clave arbolada.
* Histórico.
* Maestro de extensión.

Una vez seleccionado el tipo, pulsar el botón "siguiente" para ir al paso siguiente o "cancelar" para abortar el asistente. En función del tipo que seleccionemos, los pasos del asistente y los subobjetos de la tabla resultante (campos e índices), por tanto, a continuación explicaremos los pasos siguientes del asistente en función del tipo de tabla seleccionado.

### Maestro normal con clave numérica

#### **PASO 2: datos de la clave**

En esta fase del asistente debemos especificar los datos de la clave (el código de la tabla), que son:

**Nombre del campo**: Descriptor que tendrá el campo clave en la aplicación. Si en el proyecto de datos hemos declarado más de un idioma, si editamos esta propiedad, podremos establecer el nombre en todos los idiomas declarados pulsando sobre el botón que aparece a la derecha del control o pulsando la tecla **F4**.

El programa por defecto propone el valor "código". Este campo será creado con el identificador ID. Este identificador no podrá ser modificado dado que es usado a nivel interno para las relaciones entre tablas.

**Nombre del índice**: descriptor que tendrá el índice de campo clave en la aplicación. El programa por defecto propone el valor **código**. Este identificador no podrá ser modificado dado que este campo es usado a nivel interno para las relaciones entre tablas.

**Numeración automática**: si se activa esta propiedad será el sistema quien se encargue de codificar el campo clave de forma automática, liberando al programador de esta tarea. Si no se activa, deberá ser, o bien el programador, o bien el usuario final, quien deba codificar cada registro de la tabla.

**Longitud/rango**: número de bytes del campo código y número máximo de registros que la tabla podrá contener. Los valores posibles son:

* 1 bytes – 255
* 2 bytes – 65.535
* 3 bytes – 16,7 millones
* 4 bytes – 4.000 millones

Pulsar el botón siguiente para “avanzar” o el botón “retroceder” para regresar al paso anterior o “cancelar” para abortar la creación de la tabla.

#### **PASO 3: datos de la descripción**

En esta fase del asistente debemos especificar los datos de la descripción (el campo nombre de la tabla). Son:

**Nombre del campo**: descriptor que tendrá el campo nombre en la aplicación. El programa por defecto propone el valor "nombre". El campo será generado con el el identificador NAME. Este identificador no podrá ser modificado dado que el sistema lo usa para mostrar información del registro en ciertos objetos y/o controles.

**Índice alfabético**: activaremos esta opción si queremos que en la tabla se genere un índice que indexe el campo nombre alfabéticamente.

**Nombre del índice**: descriptor que tendrá el índice alfabético. El programa por defecto propone el valor "alfabético". Este índice será generado con el el identificador NAME. Este identificador no podrá ser modificado dado que el sistema lo usa para mostrar información del registro en ciertos objetos y/o controles.

**Índice de palabras**: activaremos esta opción si queremos que en la tabla se genere un índice que indexe todas las palabras del campo nombre.

**Nombre del índice**: descriptor que tendrá el índice de palabras. El programa por defecto propone el valor "palabras".

**Índice de trozos palabras**: activaremos esta opción si queremos que en la tabla se genere un índice que indexe trozos de todas las palabras del campo nombre.

**Nombre del índice**: descriptor que tendrá el índice de trozos palabras. El programa por defecto propone el valor "trozos de palabras".

Pulsar el botón "siguiente" para ir al paso siguiente o el botón "retroceder" para regresar al paso anterior o "cancelar" para cancelar el asistente.

#### **PASO 4: campos adicionales**

En esta fase del asistente nos permitirá crear una serie de campos adicionales, que son:

**Fecha**: si activamos esta propiedad se creará en la tabla un [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) de tipo fecha. Si activamos la propiedad **índice** situada junto a esta, también se generará un [índice](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice) por este campo.

**Observaciones**: si activamos esta propiedad, se creará en la tabla un campo de tipo objeto texto.

**Foto**: si activamos esta propiedad, se creará en la tabla un campo de tipo objeto dibujo.

**Teléfono**: si activamos esta propiedad, se creará en la tabla un campo de tipo alfa40. Si activamos la propiedad **índice** situada junto a esta, también se generará un índice por este campo.

Pulsar el botón "siguiente" para ir al paso siguiente o el botón "regresar" para regresar al paso anterior o "cancelar" para cancelar el asistente.

#### **PASO 5: selección de maestros**

Este paso solamente se seguirá si en el proyecto ya existe alguna tabla de tipo maestro, maestro con clave arbolada o submaestra; de lo contrario será obviado.

De la lista de tablas que se presentan marcar aquella o aquellas que vayan a ser maestras de la nueva tabla que estamos creando; en caso de que ninguna vaya a ser maestra de la nueva, no marcaremos ninguna.

pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente.

#### **PASO 6: confirmación**

Pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente o el botón “finalizar” para proceder a la creación de la tabla.

{% hint style="success" %}
Si no se ha cancelado el asistente, la tabla y los objetos correspondientes serán añadidos al proyecto.
{% endhint %}

### Submaestro

#### **PASO 2: datos de la clave**

En esta fase del asistente debemos especificar los datos de la clave (el código de la tabla), que son:

**Tabla de datos padre**: desplegar el control y seleccionar la tabla padre del submaestro que vamos a crear.

**Nombre del campo**: descriptor que tendrá el campo clave en la aplicación. Si en el proyecto de datos hemos declarado más de un idioma, si editamos esta propiedad, podremos establecer el nombre en todos los idiomas declarados pulsando sobre el botón que aparece a la derecha del control o pulsando la tecla F4.

El programa por defecto propone el valor "código". Este campo será creado con el identificador **ID**. Este identificador no podrá ser modificado dado que este campo es usado a nivel interno para las relaciones entre tablas.

**Nombre del índice**: descriptor que tendrá el índice de campo clave en la aplicación. El programa por defecto propone el valor "código". Este índice será creado con el identificador **ID**. Este identificador no podrá ser modificado dado que este campo es usado a nivel interno para las relaciones entre tablas.

**Numeración automática**: si se activa esta propiedad será el sistema quien se encargue de codificar el campo clave de forma automática, liberando al programador de esta tarea. Si no se activa, deberá ser, o bien el programador, o bien el usuario final, quien deba codificar cada registro de la tabla.

**Longitud/Rango**: número de bytes del campo código y número máximo de registros que la tabla podrá contener. Los valores posibles son:

* 1 bytes – 255
* 2 bytes – 65.535
* 3 bytes – 16,7 millones
* 4 bytes – 4.000 millones

Pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente.

#### **PASO 3: datos de la descripción**

En esta fase del asistente debemos especificar los datos de la descripción (el campo nombre de la tabla). Que son:

**Nombre del campo**: descriptor que tendrá el campo nombre en la aplicación. El programa por defecto propone el valor "nombre". El campo será generado con el el identificador **NAME**. Este identificador no podrá ser modificado dado que el sistema lo usa para mostrar información del registro en ciertos objetos y/o controles.

**Índice alfabético**: activaremos esta opción si queremos que en la tabla se genere un índice que indexe el campo nombre alfabéticamente.

**Nombre del índice**: descriptor que tendrá el índice alfabético. El programa por defecto propone el valor "alfabético". El índice será generado con el el identificador **NAME**. Este identificador no podrá ser modificado dado que el sistema lo usa para mostrar información del registro en ciertos objetos y/o controles.

**Índice de palabras**: activaremos esta opción si queremos que en la tabla se genere un índice que indexe todas las palabras del campo nombre.

**Nombre del índice**: descriptor que tendrá el índice de palabras. El programa por defecto propone el valor "palabras".

**Índice de trozos palabras**: activaremos esta opción si queremos que en la tabla se genere un índice que indexe trozos de todas las palabras del campo nombre.

**Nombre del índice**: descriptor que tendrá el índice de trozos palabras. El programa por defecto propone el valor "trozos de palabras".

Pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente.

#### **PASO 4: campos adicionales**

En esta fase del asistente nos permitirá crear una serie de campos adicionales, que son:

**Fecha**: si activamos esta propiedad se creará en la tabla un campo de tipo fecha. Si activamos la propiedad **índice** situada junto a esta, también se generará un índice por este campo.

**Observaciones**: si activamos esta propiedad, se creará en la tabla un campo de tipo objeto texto.

**Foto**: si activamos esta propiedad, se creará en la tabla un campo de tipo objeto dibujo.

**Teléfono**: si activamos esta propiedad, se creará en la tabla un campo de tipo alfa40. Si activamos la propiedad **índice**

situada junto a esta, también se generará un índice por este campo.

Pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente.

#### **PASO 5: selección de maestros**

Este paso solamente se seguirá si en el proyecto ya existe alguna tabla de tipo maestro, maestro con clave arbolada o submaestra; de lo contrario será obviado.

De la lista de tablas que se presentan marcar aquella o aquellas que vayan a ser maestras de la nueva tabla que estamos creando; en caso de que ninguna vaya a ser maestra de la nueva, no marcaremos ninguna.

pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente.

#### **PASO 6: confirmación**

pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente o el botón “finalizar” para proceder a la creación de la tabla.

{% hint style="success" %}
Si no se ha cancelado el asistente, la tabla y los objetos correspondientes serán añadidos al proyecto.
{% endhint %}

### Maestro con clave arbolada

#### **PASO 2: datos de la clave**

En esta fase del asistente debemos especificar los datos de la clave (el código de la tabla), que son:

**Nombre del campo**: descriptor que tendrá el campo clave en la aplicación. Si en el proyecto de datos hemos declarado más de un idioma, si editamos esta propiedad, podremos establecer el nombre en todos los idiomas declarados pulsando sobre el botón que aparece a la derecha del control o pulsando la tecla **F4**.

El programa por defecto propone el valor "código". El campo será creado con el identificador **ID**. Este identificador no podrá ser modificado dado que este campo es usado a nivel interno para las relaciones entre tablas.

El campo código que se creará será de tipo ALFA40.

**Nombre del índice**: descriptor que tendrá el índice de campo clave en la aplicación. El programa por defecto propone el valor "código". El índice será creado con el identificador **ID**. Este identificador no podrá ser modificado dado que este campo es usado a nivel interno para las relaciones entre tablas.

**Longitud/Rango**: número de bytes del campo código y número máximo de registros que la tabla podrá contener. Los valores posibles son:

* 1 bytes – 255
* 2 bytes – 65.535
* 3 bytes – 16,7 millones
* 4 bytes – 4.000 millones

Pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente.

#### **PASO 3: datos de la descripción**

En esta fase del asistente debemos especificar los datos de la descripción (el campo nombre de la tabla). Que son:

**Nombre del campo**: descriptor que tendrá el campo nombre en la aplicación. El programa por defecto propone el valor "nombre". El campo será generado con el el identificador **NAME**. Este identificador no podrá ser modificado dado que el sistema lo usa para mostrar información del registro en ciertos objetos y/o controles.

**Índice alfabético**: activaremos esta opción si queremos que en la tabla se genere un índice que indexe el campo nombre alfabéticamente.

**Nombre del índice**: descriptor que tendrá el índice alfabético. El programa por defecto propone el valor "alfabético". El índice será generado con el el identificador **NAME**. Este identificador no podrá ser modificado dado que el sistema lo usa para mostrar información del registro en ciertos objetos y/o controles.

**Índice de palabras**: activaremos esta opción si queremos que en la tabla se genere un índice que indexe todas las palabras del campo nombre.

**Nombre del índice**: descriptor que tendrá el índice de palabras. El programa por defecto propone el valor "palabras".

**Índice de trozos palabras**: activaremos esta opción si queremos que en la tabla se genere un índice que indexe trozos de todas las palabras del campo nombre.

**Nombre del índice**: descriptor que tendrá el índice de trozos palabras. El programa por defecto propone el valor "trozos de palabras".

Pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente.

#### **PASO 4: campos adicionales**

En esta fase del asistente nos permitirá crear una serie de campos adicionales, que son:

**Fecha**: si activamos esta propiedad se creará en la tabla un campo de tipo fecha. Si activamos la propiedad **índice** situada junto a esta, también se generará un índice por este campo.

**Observaciones**: si activamos esta propiedad, se creará en la tabla un campo de tipo objeto texto.

**Foto**: si activamos esta propiedad, se creará en la tabla un campo de tipo objeto dibujo.

**Teléfono**: si activamos esta propiedad, se creará en la tabla un campo de tipo alfa40. Si activamos la propiedad **índice** situada junto a esta, también se generará un índice por este campo.

Pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente o el botón “finalizar” para proceder a la creación de la tabla.

#### **PASO 5: selección de maestros**

Este paso solamente se seguirá si en el proyecto ya existe alguna tabla de tipo maestro, maestro con clave arbolada o submaestra; de lo contrario será obviado.

De la lista de tablas que se presentan marcar aquella o aquellas que vayan a ser maestras de la nueva tabla que estamos creando; en caso de que ninguna vaya a ser maestra de la nueva, no marcaremos ninguna.

pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar.

#### **PASO 6: confirmación**

pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente o el botón “finalizar” para proceder a la creación de la tabla.

{% hint style="success" %}
Si no se ha cancelado el asistente, la tabla y los objetos correspondientes serán añadidos al proyecto.
{% endhint %}

### Histórico

#### **PASO 2: campos adicionales**

En esta fase del asistente nos permitirá crear una serie de campos adicionales, que son:

**Fecha**: si activamos esta propiedad se creará en la tabla un campo de tipo fecha. Si activamos la propiedad **índice** situada junto a esta, también se generará un índice por este campo.

**Observaciones**: si activamos esta propiedad, se creará en la tabla un campo de tipo objeto texto.

**Foto**: si activamos esta propiedad, se creará en la tabla un campo de tipo objeto dibujo.

**Teléfono**: si activamos esta propiedad, se creará en la tabla un campo de tipo alfa40. Si activamos la propiedad **índice** situada junto a esta, también se generará un índice por este campo.

Pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar.

#### **PASO 5: selección de maestros**

Este paso solamente se seguirá si en el proyecto ya existe alguna tabla de tipo maestro, maestro con clave arbolada o submaestra; de lo contrario será obviado.

De la lista de tablas que se presentan marcar aquella o aquellas que vayan a ser maestras de la nueva tabla que estamos creando; en caso de que ninguna vaya a ser maestra de la nueva, no marcaremos ninguna.

pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar.

#### **PASO 6: confirmación**

pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente o el botón “finalizar” para proceder a la creación de la tabla.

{% hint style="success" %}
Si no se ha cancelado el asistente, la tabla y los objetos correspondientes serán añadidos al proyecto.
{% endhint %}

### Maestro de extensión

#### **PASO 2: datos de la clave**

En esta fase del asistente debemos especificar los datos de la clave (el código de la tabla). Al tratarse de un maestro de extensión, la clave será la tabla de datos padre que seleccionemos en este paso del asistente.

**Nombre del campo**: descriptor que tendrá el campo clave en la aplicación. Si en el proyecto de datos hemos declarado más de un idioma, si editamos esta propiedad, podremos establecer el nombre en todos los idiomas declarados pulsando sobre el botón que aparece a la derecha del control o pulsando la tecla **F4.**

El programa por defecto propone el nombre singular de la tabla padre. Este identificador no podrá ser modificado dado que es usado a nivel interno para las relaciones entre tablas.

**Nombre del índice**: descriptor que tendrá el índice de campo clave en la aplicación. El programa por defecto propone el valor "código". Este identificador no podrá ser modificado dado que este campo es usado a nivel interno para las relaciones entre tablas.

Pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente.

#### **PASO 3: campos a crear**

En esta fase del asistente nos permitirá crear una serie de campos adicionales, que son:

**Fecha**: si activamos esta propiedad se creará en la tabla un campo de tipo fecha. Si activamos la propiedad **índice** situada junto a esta, también se generará un índice por este campo.

**Observaciones**: si activamos esta propiedad, se creará en la tabla un campo de tipo objeto texto.

**Foto**: si activamos esta propiedad, se creará en la tabla un campo de tipo objeto dibujo.

**Teléfono**: si activamos esta propiedad, se creará en la tabla un campo de tipo alfa40. Si activamos la propiedad "índice" situada junto a esta, también se generará un índice por este campo.

Pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente.

#### **PASO 4: selección de maestros**

Este paso solamente se seguirá si en el proyecto ya existe alguna tabla (además de la seleccionada como tabla padre) de tipo maestro, maestro con clave arbolada o submaestra; de lo contrario será obviado.

De la lista de tablas que se presentan marcar aquella o aquellas que vayan a ser maestras de la nueva tabla que estamos creando; en caso de que ninguna vaya a ser maestra de la nueva, no marcaremos ninguna.

pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente.

#### **PASO 6: confirmación**

pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente o el botón “finalizar” para proceder a la creación de la tabla.

{% hint style="success" %}
Si no se ha cancelado el asistente, la tabla y los objetos correspondientes serán añadidos al proyecto.
{% endhint %}

En la tabla se generará un campo ID, no editable, que será en enlace a la tabla de datos padre. Así mismo, se generarán, por cada índice de la tabla de datos padre, un [índice complejo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/indice-complejo) para poder buscar registros de esta tabla de extensión por índices de la tabla de datos padre.

### Tabla de partición

#### **PASO 2: tabla principal**

En esta fase del asistente debemos especificar cuál será la tabla principal.

#### **PASO 3: confirmación**

pulsar el botón “siguiente” para ir al paso siguiente o el botón “retroceder” para regresar al paso anterior o “cancelar” para cancelar el asistente o el botón “finalizar” para proceder a la creación de la tabla.

## Sub-objetos de tabla

A continuación tienes la lista de los subobjetos que puede tener una tabla:

* [Actualización](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/actualizacion).
* [Campo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/campo).
* [Enlace](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace).
* [Indice](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice).
* [Plural](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/plural).
* [Traspaso de campo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/traspaso-de-campo).
* [Trigger](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/trigger).


# Actualización

Una actualización es un subobjeto de tabla que permite actualizar el valor de los [campos](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) de un registro de una tabla enlazada cada vez que se produce un alta, una modificación o una baja en la [tabla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla) origen en la que definimos las actualizaciones.\
Para crear una actualización hemos de pulsar la opción ![](/files/-M7D77ocPMhx7Ao1RnLW) del panel de subobjetos y seleccionaremos la opción “actualización”.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca una actualización. Este identificador será el que usemos para referenciarlo en otras propiedades. Constará de mayúsculas y números exclusivamente.

### Nombre

Etiqueta alfanumérica que servirá como descriptor de la actualización. Se usará para presentar información del objeto en otros objetos y en los [inspectores](/velneo-vdevelop/inspectores). Podemos definir una etiqueta por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Que limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del objeto en nuestro proyecto.

### Campo enlazado

Debemos establecer el campo enlazado a través del que se realizará la actualización. El campo enlazado puede ser de cualquier [tipo.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace)

## Componente de actualización

Las actualizaciones están compuestas por componentes de actualización que definen los campos que se actualizarán de la tabla enlazada y cómo se realizará la actualización. En el componente hemos de establecer la acción positiva, es decir, cómo debe actualizar el valor del campo en el caso de alta de ficha, ya que en ejecución determinará de forma automática cuál ha de ser la forma de actualizar el campo en los otros dos casos: modificación y baja de la ficha.

Para crear un componente de actualización tendremos que editar las propiedades de la actualización, pulsar el botón ![](/files/-M7D77ocPMhx7Ao1RnLW) del panel de sub-objetos y, en el menú que se abre, seleccionando la opción componente de actualización.

Las propiedades de un componente de actualización son:

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca un componente de actualización. Este identificador será el que usemos para referenciarlo en otras propiedades.

Constará de mayúsculas y números exclusivamente.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del componente de actualización. Se usará para presentar información del subobjeto en otros objetos y en los [inspectores](/velneo-vdevelop/inspectores).

Podemos definir una etiqueta por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Estilos

Podemos definir los estilos:

#### Privado

Limita el acceso del usuario final a cierta información sobre este subobjeto.

#### Heredable

Permite que el subobjeto sea usado cuando el proyecto sea [heredada](/velneo-vdevelop/herencia).

### Comentarios

Esta propiedad nos permite documentar el uso del objeto en nuestro proyecto.

### Condición para modificar

[Fórmula](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula) lógica condicional que define si se produce la actualización o no por medio del componente en curso.

En la fórmula es posible hacer uso de [variables locales](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/variable-local) de la tabla. Estas tendrán que haber sido inicializadas antes de la actualización, es decir, en el [trigger](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/trigger) **anterior** o **interno** a la operación (alta, modificación o baja).

### Campo

Campo de la tabla enlazada que será modificado por el componente de la actualización.

### Modo

Tenemos dos posibles formas en las que el componente modifique el campo, en ambos casos, siempre que se cumpla la condición para modificar:

#### Acumulado

El componente acumula en el campo destino el valor resuelto en la fórmula.

#### Absoluto

El componente sustituye en el campo destino el valor original por el calculado en la fórmula.

#### Fórmula

Fórmula cuyo cálculo define el valor que se actualizará en el campo.

Los tipos de campo que son susceptibles de ser objeto de una actualización dependen directamente del modo de actualización. Así, si en modo Absoluto, podremos actualizar los tipos de campo siguientes:

* Alfa 256
* Alfa 128
* Alfa 64
* Alfa 40
* Alfa Latin 1
* Alfa UTF-16
* Alfa Numérico
* Fecha
* Hora
* Tiempo
* Booleano

En modo **acumular** podremos modificar campos de tipo **numérico**, **fecha**, **hora** y **tiempo**: en la fórmula de la actualización se ha de usar un dato de tipo numérico, que acumulará el valor numérico del campo de destino.

El número acumulado en un dato de tipo **fecha** actualizará días a la fecha.

El número acumulado en un dato de tipo **hora** y **tiempo** actualizará segundos a la hora.

{% hint style="info" %}
Si acumulamos un valor decimal a un campo de tipo fecha, hora o tiempo se desechará la parte decimal.
{% endhint %}

Una actualización será disparada cuando el registro sea modificado y cambie alguno de los campos que intervienen en la misma, tanto en la condición como en la fórmula de actualización.

{% hint style="info" %}
&#x20;**No se contempla la actualización de tablas en disco hacia tablas en memoria**, ya que no tiene sentido acumular valores en tablas que van a desaparecer al cerrar el cliente.
{% endhint %}


# Campo

Un campo es un subobjeto del objeto [tabla ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla)que define la mínima unidad de información dentro de un registro a la que podemos acceder.\
Un campo se crea pulsando la opción ![](/files/-M7D78AoQlj5CUvCPIHV).

Para crear un campo [enlazado a maestro](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace) pulsaremos la opción ![](/files/-M7D7EkW7SoahutDLeAf). Para crear un campo [enlazado a tabla estática](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace) pulsaremos la opción ![](/files/-M7D7Ek_su3pluoKrvyr).

## Propiedades

### **Identificador**

Etiqueta alfanumérica que identifica de forma unívoca un campo dentro de una tabla. Este identificador será el que usemos en fórmulas y para referenciarlo en otras propiedades.

El identificador constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un campo de una tabla no puede haber duplicidad.

{% hint style="danger" %}
No debemos modificar el identificador de un campo de una tabla que ya contenga datos ya que, si lo hacemos, se perderá el contenido del mismo al realizarse la regeneración de la tabla. En el caso de que queramos hacerlo, debemos hacer uso de un sub-objeto de tabla [traspaso de campo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/traspaso-de-campo).
{% endhint %}

**Los identificadores ID y NAME son palabras reservadas**. El identificador **ID** referencia el campo que es clave primaria de la tabla e identifica unívocamente cada registro. El identificador **NAME** referencia el campo principal de una [tabla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla) y que es usado por el sistema para presentar información de un registro. No debemos alterar ninguno de los dos identificadores si no queremos perder la funcionalidad implícita, aunque si podemos modificar sus descriptores, la propiedad **nombre**.

Sobre el campo **ID** es muy importante tener en cuenta que si en ejecución modificamos el ID de un registro que tiene registros en tablas plurales, se cambiará dicho ID en los mismos, pero no dispara ni [triggers](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/trigger), ni actualizaciones ni contenidos iniciales en los plurales, ya que simplemente lo que debe hacer es asignar el nuevo ID a los mismos. En este caso si deseamos forzar cambios de datos en los plurales, tendremos que programarlo en el trigger posterior a la modificación del maestro, recorriendo los plurales y realizando las modificaciones correspondientes.

### **Nombre**

Etiqueta alfanumérica que servirá como descriptor del campo. Se usará para presentar información del campo en objetos e [inspectores](/velneo-vdevelop/inspectores). Podemos definir una etiqueta por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### **Estilos**

#### **Privado**

Que limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo; si un campo tiene este estilo activado, no estará disponible al usuario final en las fórmulas para establecer filtrados, etc..

### **Comentarios**

Esta propiedad nos permite documentar el uso del campo.

### **Tipo de enlace**

Los campos pueden estar enlazados o no a otra tabla. En el caso de que no se encuentren enlazados hemos de definir las propiedades según el tipo de campo. Si está enlazado, asumirá las propiedades del campo **ID** de la tabla enlazada.

Los [tipos de enlace](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace) disponibles son:

* [Maestro.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace)
* [Estática](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace).
* [Indirecto real.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace)
* [Indirecto virtual.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace)
* [Singular de plural por posición.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace)
* [Singular de plural por índice.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace)
* [Hermano contiguo.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace)

### **Tabla enlazada**

Si hemos definido que el campo es enlazado debemos definir cuál es la tabla enlazada por el campo. Nos mostrará todas las tablas disponibles del proyecto y de los [proyectos heredados.](/velneo-vdevelop/herencia)

### **Campo padre**

Si hemos definido que el campo es enlazado y la tabla enlazada es de tipo submaestro, mostrará el campo padre de la tabla.

### **Tabla estática**

Si hemos definido que el campo es enlazado y la tabla enlazada es de tipo tabla estática, seleccionaremos la tabla estática enlazada.

### **Índice**

Si hemos definido que el campo es enlazado y el [tipo de enlace](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace) es enlace indirecto real o enlace indirecto virtual se seleccionará un índice de clave única por el que se buscará en la tabla enlazada.

### **Resolución**

Si hemos definido que el campo es enlazado y el tipo de enlace es enlace indirecto real, enlace indirecto virtual o enlace singular de plural por índice debemos resolver los valores para cada uno de los campos que componen el índice de clave única por el que buscamos en la tabla enlazada usando los datos del registro en curso usando fórmulas para ello.

### **Enlace plural**

Si hemos definido que el campo es enlazado y el tipo de enlace es singular de plural por posición o singular de plural por índice debemos seleccionar el enlace plural por el que se buscará.

### **Fórmula**

Si hemos definido que el campo es enlazado y el tipo de enlace es singular de plural por posición o singular de plural por índice debemos definir la expresión [fórmula ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula)que permite calcular la posición del registro que queremos apuntar.

### **Modo de buscar**

Si hemos definido que el campo es enlazado y el tipo de enlace es singular de plural por índice debemos definir el modo de búsqueda del [registro plural,](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/plural) que podrá ser:

#### **Igual**

Es decir, con el mismo valor que el definido en la resolución para ese componente.

#### **Igual o mayor**

Con un valor mayor o igual que el definido en la resolución.

#### **Igual o menor**

Con un valor igual o menor que el definido en la resolución.

#### **Mayor**

Con un valor mayor que el definido.

#### **Menor**

Con un valor menor que el definido.

#### **Primero**

Con el valor que se encuentre en la primera posición del índice.

#### **Último**

Con un valor que se encuentre en la última posición del índice.

### **Partes comunes**

Si hemos definido que el campo es enlazado y el tipo de enlace es hermano contiguo debemos definir las partes comunes que componen el índice por el que nos movemos al hermano contiguo.

### **Dirección**

Si hemos definido que el campo es enlazado y el tipo de enlace es hermano contiguo debemos definir la dirección por la que nos movemos al hermano contiguo, bien al registro anterior, bien al siguiente.

### **Tipo de campo**

En el caso de que no hayamos definido el campo como enlazado, debemos definir el tipo de campo y sus propiedades.

Los tipos de campo disponibles son:

#### **Alfabéticos**

Hay varios tipos de campos de campos alfabéticos. Son los siguientes:

**Alfa 40**

Se usa en códigos de barras y aquellos códigos que no necesiten usar espacios en blanco ni caracteres especiales. Cada 2 bytes almacena 3 caracteres. Se desprecian los espacios en blanco iniciales y finales.

**Alfa 64**

Se usa para datos textos que deban guardarse en mayúsculas o que contengan números y caracteres especiales de uso común como el guión o la barra inclinada. Cada 3 bytes almacena 4 caracteres.  Se desprecian los espacios en blanco iniciales y finales.

**Alfa 128**

Se usa para almacenar datos en los que se desprecien los espacios en blanco iniciales y finales. Permite almacenar textos en minúsculas, números y la mayoría de los caracteres especiales estándar. Cada 7 bytes almacena 8 caracteres.

**Alfa 256**

Tipo alfabético estándar que incluye todos los caracteres de la tabla ANSI. Debe usarse para almacenar URLs, direcciones de email, datos con caracteres especiales. Es un campo que no desprecia los espacios en blanco iniciales o finales, para otro tipo de datos, se recomienda usar los tipos Alfa indicados anteriormente para optimizar el uso del espacio en disco. Es el tipo de campo que se procesa más rápido al no estar comprimido. El rango máximo del campo es 65535 bytes (65535 caracteres). Se desprecian los espacios en blanco finales.

**Alfa Latin1**

Se usa para almacenar datos con la codificación ISO Latin1 (ISO-8859-1). Su velocidad de proceso es similar al del Alfa 256 ya que tampoco se comprime.

**Alfa UTF16**

Se corresponde con el estándar Unicode. Lo usamos cuando necesitamos almacenar datos de idiomas que usan doble byte como el chino, japonés, etc. Estos campos siempre ocupan como mínimo el doble que el resto de campos Alfa, por lo que deberíamos evitar su uso salvo que sea estrictamente necesario.

#### **Numérico**

Usado para datos numéricos. El rango máximo del campo es 10 bytes (Del 0 al 1.208.925.819.614.629.174.706.176, o con signo del -604.462.909.807.314.587.353.088 al 604.462.909.807.314.587.353.088, con 10 decimales del 0,0000000000 al 120.892.581.961.462,9531250000). De esta configuración se ha de excluir el campo ID que tiene como rango máximo 4 bytes (Del 0 al 4294967295).

Añadir que a nivel interno en los cálculos numéricos se opera con 34 dígitos significativos, sumando enteros y decimales e incluyendo el 0 y el punto en un número decimal. Si en un campo numérico realizamos una operación matemática de división en la que el divisor es 0, obtendremos Infinity (infinito) como resultado. En el caso de que tanto el dividendo como el divisor sean 0, obtendremos NaN (Not a number) como resultado.

Los campos numéricos internamente son guardados sin separador de miles y con el punto (.) como carácter de separador decimal. Ejemplo: 125521.32

#### **Fecha**

Permite introducir fechas con diversos formatos. Si bien por defecto el formato de fecha que admite es ISO 8601 (yyyy-mm-dd) cuando en una [fórmula](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas) queramos asignar una fecha a un campo de este tipo, podremos hacerlo pasándola como cadena en cualquiera de los formatos que se especifican en el artículo siguiente: [edición de campos de tipo fecha](https://doc.velneo.com/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/pages/-M7D76tN6ulVZug4572Z#edición-en-modo-alfanumérico).

#### **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. Los rangos mínimo y máximo que soporta este tipo de campo son 01-01-1970 01:00:01 y 07-02-2106 06:28:14.

El dato se guarda como un intervalo de segundos de época. El uso de segundos de época (epoch) es una práctica común para almacenar información de fecha y hora en sistemas informáticos. Se refiere a la cantidad de segundos transcurridos desde el 1 de enero de 1970 a las 00:00:00 UTC (el "epoch" o la "época" Unix).

En resumen, se guarda el dato con fecha y hora UTC, pero se muestran/leen en hora local en cada caso.

Para tener el dato en UTC basta usar las funciones de conversión a UTC usando como parámetro la zona horaria local donde se recupera el dato.

En los campos tipo Tiempo no se guardan milisegundos. Si queremos guardar esa información debemos hacerlo en un campo aparte. Sí se guardan los segundos pero no se mostrarán al pintar el campo. \
\
Para ver los segundos de un dato de tipo tiempo en un control de [edición fecha/hora](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-fechahora), puedes aplicar una [máscara](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-fechahora#mascara). En otros lugares, podemos aplicarle la función de fórmulas [dateTimeToString](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/funciones-estandar/funciones-de-tiempo#datetimetostring)().&#x20;

{% hint style="success" %}
Si convertimos un dato de tipo tiempo a número con la función de fórmulas [stringToNumber](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/funciones-estandar/funciones-numericas#stringtonumber), obtendremos un [*timestamp*](https://es.wikipedia.org/wiki/Tiempo_Unix) de UNIX. Ejemplo:

`stringToNumber(#TMP)`
{% endhint %}

#### **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. Es muy importante tener en cuenta que no se deben incluir en el contenedor objetos de más de 512 Mb. Por lo tanto, es preferible que por programación comprobemos su tamaño antes de almacenarlos, ya que el sistema permitirá meterlos hasta que llegue al límite de memoria ram, pero no podrán ser recuperados. Los tipos de campos objeto existentes son:

**Objeto 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 al 100% de calidad. Este tipo de campo no puede ser indexado.

**Objeto 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.

**Objeto texto enriquecido**

Su contenido es un documento con formato que permite seleccionar fuentes, estilos, alineación, etc. El formato se define mediante tags. Estos tags son análogos a los usados en html pero debemos tener en cuenta que no se trata de un soporte real y menos aún completo de html, por lo que no se recomienda incluir contenido externo, si no el generado por medio por el usuario escribiendo su contenido en el control correspondiente.

**Objeto binario**

Su contenido será cualquier tipo de archivo que será almacenado en el contenedor en formato binario. La única forma de trabajar con este tipo de campo es vía proceso, con los comandos de instrucción importar binario y exportar binario, pues no existe un control específico para su edición. Este tipo de campo no puede ser indexado.

**Objeto fórmula**

Su contenido es una [fórmula](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula) **de Velneo** (no admite [formulas JavaScript](/velneo-vdevelop/scripts/lenguajes/javascript/formulas-javascript)) 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.&#x20;

En tiempo de ejecución la fórmula se establecerá en un control de formularios de tipo [edición fórmula](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula), en el que se dispone del [asistente de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas) para su definición, teniendo acceso a través del mismo a los campos de la tabla enlazada, variables, constantes, etc. El rango máximo del campo es 65.535 bytes (65.535 caracteres).

En la propiedad **Tabla enlazada** podemos definir la [tabla enlazada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace) de la que se alimentará la fórmula. Puede ser la [tabla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla) en curso u otra tabla. En el caso de que queramos asignar la tabla de forma dinámica en tiempo de ejecución, podemos dejar este parámetro vacío y asignarla usando la función [setTable](/velneo-vdevelop/scripts/lenguajes/javascript/clases/vformulaeditbrowser#void-settable-string-szidreftable)() de la clase [VFormulaEditBrowser](/velneo-vdevelop/scripts/lenguajes/javascript/clases/vformulaeditbrowser) de la API de Velneo para JavaScript. En el caso de que hayamos asociado una tabla en esta propiedad, en ejecución prevalecerá la tabla asignada con la función [setTable](/velneo-vdevelop/scripts/lenguajes/javascript/clases/vformulaeditbrowser#void-settable-string-szidreftable)().

El cálculo de la fórmula establecida podremos obtenerlo a través de otra fórmula o [contenido inicial](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/campo#contenido-inicial) mediante el uso de la función de campo [calcDynamicFormula](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/funciones-de-campo#calcdynamicformula)().

En este tipo de campo no se pueden seleccionar tablas de tipo histórico ya que éstas no pueden ser enlazadas.

{% hint style="info" %}
El límite máximo de un contenedor es 36^5 = 60.466.176 de objetos de cada tipo de objeto.
{% endhint %}

#### **Fórmula**

Campos virtuales que no ocupan espacio en disco. 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. Si en un campo de tipo fórmula numérica realizamos una operación matemática de división en la que el divisor es 0, obtendremos Infinity (infinito) como resultado. En el caso de que tanto el dividendo como el divisor sean 0, obtendremos NaN (Not a number) como resultado.

**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).

Debemos tener en cuenta que los campos fórmula no disparan el recálculo de los contenidos iniciales. Es decir, si un campo incluye en su contenido inicial un campo fórmula, si el campo ya tiene un valor y cambia el contenido de la fórmula, el contenido inicial del campo no es disparado. Por lo tanto, en esos casos, en los contenidos iniciales, usaremos campos con persistencia en disco en lugar de fórmula.

**Puntero Virtual**

Su contenido es virtual ya que se trata de enlaces de carácter virtual que no guardan información en disco. Se asigna de forma automática cuando se selecciona un enlace virtual. Los punteros virtuales necesitan ser calculados y solicitados al servidor en cada ocasión que se muestren o se usen. Esto en ciertos casos como puede ser al mostrarlos en rejillas o al usarlos en condiciones de activo o visible de objetos o controles (que fuerza el refresco y la solicitud de datos al servidor), el rendimiento puede verse afectado.

El cómo se muestran por defecto los campos de tipo fecha, hora, tiempo y numéricos (carácter separador de miles y decimal) dependerá del idioma seleccionado en Velneo vClient:

* En Velneo vClients instalados en sistemas operativos Windows, si el idioma seleccionado es "sistema", entonces Velneo vClient hará uso de la API de Windows, es decir, tomará la configuración que el usuario tenga establecida en el propio sistema operativo.
* En el caso de que esté seleccionado otro idioma distinto al idioma "sistema", entonces la presentará según el estándar UnicodeCommon Locale Data Repository.
* En Velneo vClients instalados en el resto de las plataformas (macOS, Linux, iOS y Android, se usará siempre el estándar [UnicodeCommon Locale Data Repository](http://cldr.unicode.org/).

## Propiedades comunes de los campos

Las propiedades comunes de los campos son las siguientes:

### **Longitud**

Número de bytes que define el rango del campo.

### **Decimales**

Número de decimales para el campo de tipo numérico. Podrá especificar hasta 6 decimales que son los que se garantiza su precisión.

### **Signo**

Define si el campo de tipo numérico tiene signo.

### **Mínimo**

Rango límite mínimo válido para la entrada de valores.

### **Máximo**

Rango límite máximo válido para la entrada de valores.

El sistema comprueba que el máximo sea mayor que el mínimo. Esto quiere decir que el sistema no permitirá establecer como valor mínimo uno mayor al establecido en el máximo.

### **Contenido inicial**

Expresión fórmula que será el contenido inicial del campo. La fórmula puede contener cualquier elemento que podamos incluir a través del [asistente de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Puede ser una [constante,](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/constante) el identificador de un [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos), una [variable global ](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/variables-globales)o una [variable del sistema](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/variables-del-sistema). El contenido inicial es la fórmula y no el valor obtenido de su cálculo, por lo que si modificamos la ficha y alguno de los campos que intervienen en la fórmula es modificado, se actualizará el contenido inicial del campo.

En el campo que es clave primaria denotado con el identificador ID sólo se permiten tres opciones:

* **Ninguno**: el valor ha de introducirse en tiempo de ejecución.
* **Siguiente al último**: el valor es autonumérico y se genera de forma automática en ejecución.
* **Contador en variable**: el valor lo controlamos en edición por medio de una variable global que debemos procesar.

En los campos alfabéticos también debe introducirse el contenido inicial de los mismos como fórmula.

El orden del cálculo de los contenidos iniciales de los campos viene determinado por su uso y no por el orden definido en la estructura de la tabla.

Cuando se inicia un contenido inicial y se modifica su valor esto implica verificar en qué otros contenidos iniciales de otros campos se usa este campo y lanza su cálculo. Por ejemplo:

CAMPO1 Contenido inicial = 1\
CAMPO2 Contenido inicial = CAMPO1\
CAMPO3 Contenido inicial = CAMPO1 + CAMPO2

La secuencia que se desencadena es la siguiente:

Se calcula el CAMPO1 y manda calcular el CAMPO2 (=1) y calcular el CAMPO3 (=1 + 0) ya que sus resultados dependen de CAMPO1.

Se calcula el CAMPO2 y se manda calcular nuevamente el CAMPO3 (=1 + 1), porque su resultado depende de CAMPO2.

Se calcula el CAMPO3 pero nadie depende de este campo.

Este modo de evaluar los contenidos iniciales permite que éstos no dependan del orden de los campos.

Añadir que modificado un campo se calcularán solamente los campos que usen dicho campo.

Esta forma de evaluar los contenidos iniciales, por tanto, garantizará el resultado correcto de los campos independientemente del orden en el que éstos sean modificados.

Esto, no obstante, es conveniente tenerlo en cuenta a la hora de diseñar nuestras estructuras de datos, sobre todo en tablas en las que exista un número elevado de campos, y para evitar generar la recursividad en el cálculo de contenidos iniciales.

### **Fórmula**

Expresión fórmula usada para calcular los campos de tipo fórmula.

{% hint style="danger" %}
No debemos usar [funciones](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/funcion) en contenidos iniciales de campos ni en fórmulas de campos de tipo fórmula.
{% endhint %}

## Tablas de caracteres

Las tablas de caracteres para los distintos tipos de campo alfabéticos propios son:

| Tipo de campo | Tabla de caracteres                                                                                                                                |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| Alfa 40       | (Espacio) – 0123456789 ABCÇDEFGHIJKLMNÑOPQRSTUVWXYZ                                                                                                |
| Alfa 64       | (Espacio) -+!¡”¿?,.;:\*/%&()’$#ºª 0123456789 ABCÇDEFGHIJKLMNÑOPQRSTUVWXYZ                                                                          |
| Alfa 128      | (Espacio) -+!¡”¿?,.;:\*/%&()=’ºª 0123456789 ABCÇDEFGHIJKLMNÑOPQRSTUVWXYZ abcçdefghijklmnñopqrstuvwxyz ÁÀÂÄáàâä ÉÈÊËéèêë ÍÌÎÏíìîï ÓÒÔÖóòôö ÚÙÛÜúùûü |
| Alfa 256      | ![](/files/-M7D7EkjbSckDpx8mG5q)                                                                                                                   |
| Alfa Latin1   | ![](/files/-M7D7EkqIjgDZsqkIdfJ)                                                                                                                   |

Los códigos Unicode de los caracteres de las distintas tablas de caracteres propias son:

| Alfa 40            | Alfa 64            | Alfa 128           | Alfa 256                                                       |
| ------------------ | ------------------ | ------------------ | -------------------------------------------------------------- |
| 001 0x0020 espacio | 001 0x0020 espacio | 001 0x0020 espacio | 001 0x0020 espacio                                             |
| 002 0x002D –       | 002 0x002D –       | 002 0x002D –       | 002 0x002D –                                                   |
| 003 0x0030 0       | 003 0x002B +       | 003 0x002B +       | 003 0x002B +                                                   |
| 004 0x0031 1       | 004 0x00A1 ¡       | 004 0x00A1 ¡       | 004 0x00A1 ¡                                                   |
| 005 0x0032 2       | 005 0x0021 !       | 005 0x0021 !       | 005 0x0021 !                                                   |
| 006 0x0033 3       | 006 0x0022 ”       | 006 0x0022 ”       | 006 0x0022 ”                                                   |
| 007 0x0034 4       | 007 0x00BF ¿       | 007 0x00BF ¿       | 007 0x00BF ¿                                                   |
| 008 0x0035 5       | 008 0x003F ?       | 008 0x003F ?       | 008 0x003F ?                                                   |
| 009 0x0036 6       | 009 0x002C ,       | 009 0x002C ,       | 009 0x002C ,                                                   |
| 010 0x0037 7       | 010 0x002E .       | 010 0x002E .       | 010 0x002E .                                                   |
| 011 0x0038 8       | 011 0x003B ;       | 011 0x003B ;       | 011 0x003B ;                                                   |
| 012 0x0039 9       | 012 0x003A :       | 012 0x003A :       | 012 0x003A :                                                   |
| 013 0x0041 A       | 013 0x002A \*      | 013 0x002A \*      | 013 0x002A \*                                                  |
| 014 0x0042 B       | 014 0x002F /       | 014 0x002F /       | 014 0x002F /                                                   |
| 015 0x0043 C       | 015 0x0025 %       | 015 0x0025 %       | 015 0x0025 %                                                   |
| 016 0x00C7 Ç       | 016 0x0026 &       | 016 0x0026 &       | 016 0x0026 &                                                   |
| 017 0x0044 D       | 017 0x0028 (       | 017 0x0028 (       | 017 0x0028 (                                                   |
| 018 0x0045 E       | 018 0x0029 )       | 018 0x0029 )       | 018 0x0029 )                                                   |
| 019 0x0046 F       | 019 0x003C         | 019 0x003D =       | 019 0x003D =                                                   |
| 020 0x0047 G       | 022 0x0027 ‘       | 020 0x0027 ‘       | 020 0x0027 ‘                                                   |
| 021 0x0048 H       | 023 0x0024 $       | 021 0x0030 0       | 021 0x0030 0                                                   |
| 022 0x0049 I       | 024 0x0023 #       | 022 0x0031 1       | 022 0x0031 1                                                   |
| 023 0x004A J       | 025 0x0030 0       | 023 0x0032 2       | 023 0x0032 2                                                   |
| 024 0x004B K       | 026 0x0031 1       | 024 0x0033 3       | 024 0x0033 3                                                   |
| 025 0x004C L       | 027 0x0032 2       | 025 0x0034 4       | 025 0x0034 4                                                   |
| 026 0x004D M       | 028 0x0033 3       | 026 0x0035 5       | 026 0x0035 5                                                   |
| 027 0x004E N       | 029 0x0034 4       | 027 0x0036 6       | 027 0x0036 6                                                   |
| 028 0x00D1 Ñ       | 030 0x0035 5       | 028 0x0037 7       | 028 0x0037 7                                                   |
| 029 0x004F O       | 031 0x0036 6       | 029 0x0038 8       | 029 0x0038 8                                                   |
| 030 0x0050 P       | 032 0x0037 7       | 030 0x0039 9       | 030 0x0039 9                                                   |
| 031 0x0051 Q       | 033 0x0038 8       | 031 0x0041 A       | 031 0x0041 A                                                   |
| 032 0x0052 R       | 034 0x0039 9       | 032 0x00C1 Á       | 032 0x00C1 Á                                                   |
| 033 0x0053 S       | 035 0x0041 A       | 033 0x00C0 À       | 033 0x00C0 À                                                   |
| 034 0x0054 T       | 036 0x0042 B       | 034 0x00C2 Â       | 034 0x00C2 Â                                                   |
| 035 0x0055 U       | 037 0x0043 C       | 035 0x00C4 Ä       | 035 0x00C3 Ã                                                   |
| 036 0x0056 V       | 038 0x00C7 Ç       | 036 0x0061 a       | 036 0x00C4 Ä                                                   |
| 037 0x0057 W       | 039 0x0044 D       | 037 0x00E1 á       | 037 0x00C5 Å                                                   |
| 038 0x0058 X       | 040 0x0045 E       | 038 0x00E0 à       | 038 0x00C6 Æ                                                   |
| 039 0x0059 Y       | 041 0x0046 F       | 039 0x00E2 â       | 039 0x0061 a                                                   |
| 040 0x005A Z       | 042 0x0047 G       | 040 0x00E4 ä       | 040 0x00E1 á                                                   |
|                    | 043 0x0048 H       | 041 0x0042 B       | 041 0x00E0 à                                                   |
|                    | 044 0x0049 I       | 042 0x0062 b       | 042 0x00E2 â                                                   |
|                    | 045 0x004A J       | 043 0x0043 C       | 043 0x00E3 ã                                                   |
|                    | 046 0x004B K       | 044 0x0063 c       | 044 0x00E4 ä                                                   |
|                    | 047 0x004C L       | 045 0x00C7 Ç       | 045 0x00E5 å                                                   |
|                    | 048 0x004D M       | 046 0x00E7 ç       | 046 0x00E6 æ                                                   |
|                    | 049 0x004E N       | 047 0x0044 D       | 047 0x0042 B                                                   |
|                    | 050 0x00D1 Ñ       | 048 0x0064 d       | 048 0x0062 b                                                   |
|                    | 051 0x004F O       | 049 0x0045 E       | 049 0x0043 C                                                   |
|                    | 052 0x0050 P       | 050 0x00C9 É       | 050 0x0063 c                                                   |
|                    | 053 0x0051 Q       | 051 0x00C8 È       | 051 0x00C7 Ç                                                   |
|                    | 054 0x0052 R       | 052 0x00CA Ê       | 052 0x00E7 ç                                                   |
|                    | 055 0x0053 S       | 053 0x00CB Ë       | 053 0x0044 D                                                   |
|                    | 056 0x0054 T       | 054 0x0065 e       | 054 0x0064 d                                                   |
|                    | 057 0x0055 U       | 055 0x00E9 é       | 055 0x0045 E                                                   |
|                    | 058 0x0056 V       | 056 0x00E8 è       | 056 0x00C9 É                                                   |
|                    | 059 0x0057 W       | 057 0x00EA ê       | 057 0x00C8 È                                                   |
|                    | 060 0x0058 X       | 058 0x00EB ë       | 058 0x00CA Ê                                                   |
|                    | 061 0x0059 Y       | 059 0x0046 F       | 059 0x00CB Ë                                                   |
|                    | 062 0x005A Z       | 060 0x0066 f       | 060 0x0065 e                                                   |
|                    | 063 0x00BA º       | 061 0x0047 G       | 061 0x00E9 é                                                   |
|                    | 064 0x00AA ª       | 062 0x0067 g       | 062 0x00E8 è                                                   |
|                    |                    | 063 0x0048 H       | 063 0x00EA ê                                                   |
|                    |                    | 064 0x0068 h       | 064 0x00EB ë                                                   |
|                    |                    | 065 0x0049 I       | 065 0x0046 F                                                   |
|                    |                    | 066 0x00CD Í       | 066 0x0066 f                                                   |
|                    |                    | 067 0x00CC Ì       | 067 0x0047 G                                                   |
|                    |                    | 068 0x00CE Î       | 068 0x0067 g                                                   |
|                    |                    | 069 0x00CF Ï       | 069 0x0048 H                                                   |
|                    |                    | 070 0x0069 i       | 070 0x0068 h                                                   |
|                    |                    | 071 0x00ED í       | 071 0x0049 I                                                   |
|                    |                    | 072 0x00EC ì       | 072 0x00CD Í                                                   |
|                    |                    | 073 0x00EE î       | 073 0x00CC Ì                                                   |
|                    |                    | 074 0x00EF ï       | 074 0x00CE Î                                                   |
|                    |                    | 075 0x004A J       | 075 0x00CF Ï                                                   |
|                    |                    | 076 0x006A j       | 076 0x00D0 Ð                                                   |
|                    |                    | 077 0x004B K       | 077 0x0069 i                                                   |
|                    |                    | 078 0x006B k       | 078 0x00ED í                                                   |
|                    |                    | 079 0x004C L       | 079 0x00EC ì                                                   |
|                    |                    | 080 0x006C l       | 080 0x00EE î                                                   |
|                    |                    | 081 0x004D M       | 081 0x00EF ï                                                   |
|                    |                    | 082 0x006D m       | 082 0x00F0 ð                                                   |
|                    |                    | 083 0x004E N       | 083 0x004A J                                                   |
|                    |                    | 084 0x006E n       | 084 0x006A j                                                   |
|                    |                    | 085 0x00D1 Ñ       | 085 0x004B K                                                   |
|                    |                    | 086 0x00F1 ñ       | 086 0x006B k                                                   |
|                    |                    | 087 0x004F O       | 087 0x004C L                                                   |
|                    |                    | 088 0x00D3 Ó       | 088 0x006C l                                                   |
|                    |                    | 089 0x00D2 Ò       | 089 0x004D M                                                   |
|                    |                    | 090 0x00D4 Ô       | 090 0x006D m                                                   |
|                    |                    | 091 0x00D6 Ö       | 091 0x004E N                                                   |
|                    |                    | 092 0x006F o       | 092 0x006E n                                                   |
|                    |                    | 093 0x00F3 ó       | 093 0x00D1 Ñ                                                   |
|                    |                    | 094 0x00F2 ò       | 094 0x00F1 ñ                                                   |
|                    |                    | 095 0x00F4 ô       | 095 0x004F O                                                   |
|                    |                    | 096 0x00F6 ö       | 096 0x00D3 Ó                                                   |
|                    |                    | 097 0x0050 P       | 097 0x00D2 Ò                                                   |
|                    |                    | 098 0x0070 p       | 098 0x00D4 Ô                                                   |
|                    |                    | 099 0x0051 Q       | 099 0x00D5 Õ                                                   |
|                    |                    | 100 0x0071 q       | 100 0x00D6 Ö                                                   |
|                    |                    | 101 0x0052 R       | 101 0x00D8 Ø                                                   |
|                    |                    | 102 0x0072 r       | 102 0x006F o                                                   |
|                    |                    | 103 0x0053 S       | 103 0x00F3 ó                                                   |
|                    |                    | 104 0x0073 s       | 104 0x00F2 ò                                                   |
|                    |                    | 105 0x0054 T       | 105 0x00F4 ô                                                   |
|                    |                    | 106 0x0074 t       | 106 0x00F5 õ                                                   |
|                    |                    | 107 0x0055 U       | 107 0x00F6 ö                                                   |
|                    |                    | 108 0x00DA Ú       | 108 0x00F8 ø                                                   |
|                    |                    | 109 0x00D9 Ù       | 109 0x0050 P                                                   |
|                    |                    | 110 0x00DB Û       | 110 0x0070 p                                                   |
|                    |                    | 111 0x00DC Ü       | 111 0x0051 Q                                                   |
|                    |                    | 112 0x0075 u       | 112 0x0071 q                                                   |
|                    |                    | 113 0x00FA ú       | 113 0x0052 R                                                   |
|                    |                    | 114 0x00F9 ù       | 114 0x0072 r                                                   |
|                    |                    | 115 0x00FB û       | 115 0x0053 S                                                   |
|                    |                    | 116 0x00FC ü       | 116 0x0073 s                                                   |
|                    |                    | 117 0x0056 V       | 117 0x0054 T                                                   |
|                    |                    | 118 0x0076 v       | 118 0x0074 t                                                   |
|                    |                    | 119 0x0057 W       | 119 0x0055 U                                                   |
|                    |                    | 120 0x0077 w       | 120 0x00DA Ú                                                   |
|                    |                    | 121 0x0058 X       | 121 0x00D9 Ù                                                   |
|                    |                    | 122 0x0078 x       | 122 0x00DB Û                                                   |
|                    |                    | 123 0x0059 Y       | 123 0x00DC Ü                                                   |
|                    |                    | 124 0x0079 y       | 124 0x0075 u                                                   |
|                    |                    | 125 0x005A Z       | 125 0x00FA ú                                                   |
|                    |                    | 126 0x007A z       | 126 0x00F9 ù                                                   |
|                    |                    | 127 0x00BA º       | 127 0x00FB û                                                   |
|                    |                    | 128 0x00AA ª       | 128 0x00FC ü                                                   |
|                    |                    |                    | 129 0x0056 V                                                   |
|                    |                    |                    | 130 0x0076 v                                                   |
|                    |                    |                    | 131 0x0057 W                                                   |
|                    |                    |                    | 132 0x0077 w                                                   |
|                    |                    |                    | 133 0x0058 X                                                   |
|                    |                    |                    | 134 0x0078 x                                                   |
|                    |                    |                    | 135 0x0059 Y                                                   |
|                    |                    |                    | 136 0x00DD Ý                                                   |
|                    |                    |                    | 137 0x0079 y                                                   |
|                    |                    |                    | 138 0x00FD ý                                                   |
|                    |                    |                    | 139 0x005A Z                                                   |
|                    |                    |                    | 140 0x007A z                                                   |
|                    |                    |                    | 141 0x00DE Þ                                                   |
|                    |                    |                    | 142 0x00FE þ                                                   |
|                    |                    |                    | 143 0x00DF ß                                                   |
|                    |                    |                    | 144 0x00FF ÿ                                                   |
|                    |                    |                    | 145 0x00BA º                                                   |
|                    |                    |                    | 146 0x00AA ª                                                   |
|                    |                    |                    | 147 0x0023 #                                                   |
|                    |                    |                    | 148 0x0024 $                                                   |
|                    |                    |                    | 149 0x003C                                                     |
|                    |                    |                    | 151 0x0040 @                                                   |
|                    |                    |                    | 152 0x005B \[                                                  |
|                    |                    |                    | 153 0x005D ]                                                   |
|                    |                    |                    | 154 0x005C \\                                                  |
|                    |                    |                    | 155 0x005E ^                                                   |
|                    |                    |                    | 156 0x005F \_                                                  |
|                    |                    |                    | 157 0x0060 \`                                                  |
|                    |                    |                    | 158 0x007B {                                                   |
|                    |                    |                    | 159 0x007D }                                                   |
|                    |                    |                    | 160 0x007C \|                                                  |
|                    |                    |                    | 161 0x007E \~                                                  |
|                    |                    |                    | 162 0x00A2 ¢                                                   |
|                    |                    |                    | 163 0x00A3 £                                                   |
|                    |                    |                    | 164 0x00A4 ¤                                                   |
|                    |                    |                    | 165 0x00A5 ¥                                                   |
|                    |                    |                    | 166 0x00A6 ¦                                                   |
|                    |                    |                    | 167 0x00A7 §                                                   |
|                    |                    |                    | 168 0x00A8 ¨                                                   |
|                    |                    |                    | 169 0x00A9 ©                                                   |
|                    |                    |                    | 170 0x00AB «                                                   |
|                    |                    |                    | 171 0x00BB »                                                   |
|                    |                    |                    | 172 0x00AC ¬                                                   |
|                    |                    |                    | 173 0x00AD ­                                                   |
|                    |                    |                    | 174 0x00AE ®                                                   |
|                    |                    |                    | 175 0x00AF ¯                                                   |
|                    |                    |                    | 176 0x00B0 °                                                   |
|                    |                    |                    | 177 0x00B1 ±                                                   |
|                    |                    |                    | 178 0x00B2 ²                                                   |
|                    |                    |                    | 179 0x00B3 ³                                                   |
|                    |                    |                    | 180 0x00B4 ´                                                   |
|                    |                    |                    | 181 0x00B5 µ                                                   |
|                    |                    |                    | 182 0x00B6 ¶                                                   |
|                    |                    |                    | 183 0x00B7 ·                                                   |
|                    |                    |                    | 184 0x00B8 ¸                                                   |
|                    |                    |                    | 185 0x00B9 ¹                                                   |
|                    |                    |                    | 186 0x00BC ¼                                                   |
|                    |                    |                    | 187 0x00BD ½                                                   |
|                    |                    |                    | 188 0x00BE ¾                                                   |
|                    |                    |                    | 189 0x00D7 ×                                                   |
|                    |                    |                    | 190 0x00F7 ÷                                                   |
|                    |                    |                    | 191 0x0E3F Signo del Thai Baht                                 |
|                    |                    |                    | 192 0x20A1 Signo del colón                                     |
|                    |                    |                    | 193 0x20A2 Signo del cruzeiro                                  |
|                    |                    |                    | 194 0x20A4 Signo de la lira                                    |
|                    |                    |                    | 195 0x20A5 Signo de mil                                        |
|                    |                    |                    | 196 0x20A6 Signo del naira                                     |
|                    |                    |                    | 197 0x20A8 Signo de la rupia                                   |
|                    |                    |                    | 198 0x20A9 Signo del won                                       |
|                    |                    |                    | 199 0x20AA Signo de nuevo shequel                              |
|                    |                    |                    | 200 0x20AB Signo del dong                                      |
|                    |                    |                    | 201 0x20AC Signo del euro                                      |
|                    |                    |                    | 202 0x2202 Derivada parcial                                    |
|                    |                    |                    | 203 0x2206 Incremento                                          |
|                    |                    |                    | 204 0x220F Productorio                                         |
|                    |                    |                    | 205 0x2211 Sumatoria                                           |
|                    |                    |                    | 206 0x2212 Signo menos                                         |
|                    |                    |                    | 207 0x2215 Barra (oblicua) de división                         |
|                    |                    |                    | 208 0x2219 Operador de viñeta                                  |
|                    |                    |                    | 209 0x221A Raíz cuadrada                                       |
|                    |                    |                    | 210 0x221E Infinito                                            |
|                    |                    |                    | 211 0x2220 Angulo                                              |
|                    |                    |                    | 212 0x222B Integral                                            |
|                    |                    |                    | 213 0x2248 Casi igual a                                        |
|                    |                    |                    | 214 0x2260 Distinto                                            |
|                    |                    |                    | 215 0x2261 Idéntico                                            |
|                    |                    |                    | 216 0x2264 Menor que o igual a                                 |
|                    |                    |                    | 217 0x2265 Mayor que o igual a                                 |
|                    |                    |                    | 218 0x0192 Letra latina minúscula f con gancho                 |
|                    |                    |                    | 219 0x2310 Signo de negación invertido                         |
|                    |                    |                    | 220 0x2122 Signo inglés de marca comercial                     |
|                    |                    |                    | 221 0x2018 Comilla tipográfica de apertura                     |
|                    |                    |                    | 222 0x2019 Comilla tipográfica de cierre                       |
|                    |                    |                    | 223 0x201C Comillas tipográficas de apertura                   |
|                    |                    |                    | 224 0x201D Comillas tipográficas de cierre                     |
|                    |                    |                    | 225 0x2022 Viñeta                                              |
|                    |                    |                    | 226 0x2014 Guión largo o raya                                  |
|                    |                    |                    | 227 0x201A Comilla tipográfica en forma de 9 simple y baja     |
|                    |                    |                    | 228 0x201E Comilla tipográfica en forma de 9 doble y baja      |
|                    |                    |                    | 229 0x2020 Cruz                                                |
|                    |                    |                    | 230 0x2021 Cruz doble                                          |
|                    |                    |                    | 231 0x2026 Elipsis horizontal                                  |
|                    |                    |                    | 232 0x2032 Prima                                               |
|                    |                    |                    | 233 0x02C6 Acento circunflejo modificador de letra             |
|                    |                    |                    | 234 0x02C7 Acento circunflejo                                  |
|                    |                    |                    | 235 0x2030 Signo de por mil                                    |
|                    |                    |                    | 236 0x0160 Letra latina mayúscula S con acento circunflejo     |
|                    |                    |                    | 237 0x0161 Letra latina minúscula s con acento anticircunflejo |
|                    |                    |                    | 238 0x2039 Comilla tipográfica simple angular de apertura      |
|                    |                    |                    | 239 0x0152 Ligadura latina mayúscula OE                        |
|                    |                    |                    | 240 0x017D Letra latina mayúscula Z con acento anticircunflejo |
|                    |                    |                    | 241 0x0392 Letra griega mayúscula alfa                         |
|                    |                    |                    | 242 0x03B1 Letra griega minúscula alfa                         |
|                    |                    |                    | 243 0x0392 Letra griega mayúscula beta                         |
|                    |                    |                    | 244 0x03B2 Letra griega minúscula beta                         |
|                    |                    |                    | 245 0x0393 Letra griega mayúscula gamma                        |
|                    |                    |                    | 246 0x03B3 Letra griega minúscula gamma                        |
|                    |                    |                    | 247 0x0394 Letra griega mayúscula delta                        |
|                    |                    |                    | 248 0x03B4 Letra griega minúscula delta                        |
|                    |                    |                    | 249 0x0395 Letra griega mayúscula epsilon                      |
|                    |                    |                    | 250 0x03B5 Letra griega minúscula epsilon                      |
|                    |                    |                    | 251 0x0396 Letra griega mayúscula zeta                         |
|                    |                    |                    | 252 0x03B6 Letra griega minúscula zeta                         |
|                    |                    |                    | 253 0x2640 Signo de la mujer                                   |
|                    |                    |                    | 254 0x2642 Signo del hombre                                    |
|                    |                    |                    | 255 0x0009 Carácter de tabulación                              |
|                    |                    |                    | 256 0x000A Nueva linea                                         |

�

Para más información sobre los tipos de campo estándar Latin1 (ISO 8859-1) y UTF-16 (ISO 10646) ver: <http://www.unicode.org>


# Enlace

Es el elemento que nos permite establecer una relación entre dos registros de distintas tablas por medio de un campo y un índice de clave única de la tabla enlazada.

Un enlace se establece a nivel de campo en el panel de propiedades de Velneo vDevelop, en la propiedad **tipo** de enlace.

## Tipos de enlace

### **Ninguno**

El campo no estará enlazado con ninguna tabla.

### **Maestro**

Enlaza la tabla de datos actual mediante el campo a la tabla de datos maestra elegida en la propiedad **tabla enlazada** en la Lista desplegable Identificador. Este enlace es resuelto automáticamente por Velneo vDevelop mediante el campo ID de la tabla de datos enlazada. Una tabla puede apuntarse a sí misma a través de un enlace de este tipo.

Cuando creamos un enlace a una tabla maestra, es importante que creemos también un [índice](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice) del campo enlazado, del tipo **acepta repetidas**, para que, desde el maestro, pueda generarse un [enlace plural](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/plural) a la tabla. **Este índice no puede estar condicionado** ya que, si el índice está condicionado, no se podrá garantizar que el sistema apunte a todos los registros plurales de esta tabla desde su maestro. Si no lo hacemos, podrán fallarnos la carga de plurales, la correcta regeneración de los índices complejos de la tabla en los que se indexe un campo del maestro, etc. Si queremos crear un índice por dicho campo con algún tipo de condición, lo que haremos será duplicarlo y condicionar el duplicado.

### **Estática**

Enlaza la tabla de datos actual mediante el campo a la tabla estática elegida en la propiedad **tabla estática**.

### **Indirecto real**

Este enlace se utiliza para relacionar la tabla de datos actual con otra tabla que no es maestra de la actual y que se elige en la propiedad **tabla enlazada**. Este enlace necesita ser resuelto manualmente por el diseñador; para ello se ha de usar un índice de clave única de la tabla a enlazar. Tiene persistencia en disco. El resto de las propiedades a cumplimentar son:

#### **Índice**

En esta propiedad tendremos que seleccionar, de la lista de [índices ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice)que se muestran de la tabla enlazada, el índice de clave única que queramos usar para resolver el enlace.

#### **Resolución**

Una vez seleccionado el índice en la propiedad anterior en ésta aparecerá la lista de campos que lo componen. En esta propiedad es donde debemos resolver el enlace, para ello situar el foco en la misma y pulsar el botón ![](/files/-M7D78P7-C8bYZDUjH2r) que aparece a la derecha. Al pulsarlo se desplegará una ventana en la que cada fila se corresponderá con un componente del índice seleccionado. Cada componente del índice ha de ser resuelto de manera individual, es decir, debemos indicar al sistema qué dato resuelve cada campo componente del índice de la tabla indirecta. Dicha resolución será definida mediante una fórmula. Para la introducción de la misma se dispone del [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas), para abrirlo pulsar botón ![](/files/-M7D78P7-C8bYZDUjH2r). Una vez resueltos todos los componentes del índice, pulsar el botón "aceptar".

Debemos usar para la resolución del enlace campos de la propia tabla y no campos de tablas enlazadas.

{% hint style="warning" %}
Para que en en ejecución se genere en enlace, es necesario que se resuelvan todos los componentes del mismo, es decir, que no esté vacío ninguno de los campos usados en su resolución.
{% endhint %}

{% hint style="warning" %}
No es posible indexar este tipo de enlace. Debemos usar para la resolución del enlace campos de la propia tabla y no campos de tablas enlazadas.
{% endhint %}

{% hint style="warning" %}
La información guardada en el campo es ilegible, ya que se trata de información binaria que resuelve el puntero. Por lo tanto, no debemos usar nunca ese campo para mostrar información del enlace. Si queremos mostrar información, tendrá que ser la de un campo del registro enlazado.
{% endhint %}

### **Indirecto virtual**

Este enlace se utiliza para relacionar la tabla de datos actual con otra tabla que no es maestra de la actual y que se elige en la propiedad **tabla enlazada**. Este enlace necesita ser resuelto manualmente por el diseñador; para ello se ha de usar un índice de clave única de la tabla a enlazar. Este enlace tiene persistencia en memoria. El resto de las propiedades a cumplimentar son:

#### **Índice**

En esta propiedad tendremos que seleccionar, de la lista de [índices](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice) que se muestran de la tabla enlazada, el índice de clave única que queramos usar para resolver el enlace.

#### **Resolución**

Una vez seleccionado el índice en la propiedad anterior en ésta aparecerá la lista de campos que lo componen. En esta propiedad es donde debemos resolver el enlace, para ello situar el foco en la misma y pulsar el botón ![](/files/-M7D78P7-C8bYZDUjH2r) que aparece a la derecha. Al pulsarlo se desplegará una ventana en la que cada fila se corresponderá con un componente del índice seleccionado. Cada componente del índice ha de ser resuelto de manera individual, es decir, debemos indicar al sistema qué dato resuelve cada campo componente del índice de la tabla indirecta. Dicha resolución será definida mediante una fórmula. Para la introducción de la misma se dispone del asistente para edición de fórmulas, para abrirlo pulsar el botón ![](/files/-M7D78P7-C8bYZDUjH2r) . Una vez resueltos todos los componentes del índice, pulsar el botón “aceptar”.

{% hint style="warning" %}
Para que en en ejecución se genere en enlace, es necesario que se resuelvan todos los componentes del mismo, es decir, que no esté vacío ninguno de los campos usados en su resolución.
{% endhint %}

{% hint style="warning" %}
No es posible indexar este tipo de enlace. Debemos usar para la resolución del enlace campos de la propia tabla y no campos de tablas enlazadas.
{% endhint %}

{% hint style="warning" %}
La información guardada en el campo es ilegible, ya que se trata de información binaria que resuelve el puntero. Por lo tanto, no debemos usar nunca ese campo para mostrar información del enlace. Si queremos mostrar información, tendrá que ser la de un campo del registro enlazado.
{% endhint %}

La diferencia entre un enlace indirecto real y uno indirecto virtual radica en que el primero ocupa espacio en disco y el segundo no, es decir, el real tiene persistencia en disco y el virtual en memoria. Además, tampoco podrán dispararse [actualizaciones](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/actualizacion) desde una tabla cuando el enlace indirecto es virtual.

### **Singular de plural por posición**

Permite crear un enlace singular a una tabla histórica de la tabla actual, usando para ello uno de los enlaces plurales definidos en la tabla maestra y se resolverá la posición fija del histórico con el que se desea establecer dicho enlace. Los parámetros a cumplimentar son:

#### **Histórico**

En esta propiedad tendremos que seleccionar, de la lista de [enlaces plurales plural ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace)que se muestra, el plural que queramos usar para resolver el enlace.

#### **Fórmula**

Debemos resolver el enlace indicando al sistema con qué posición, dentro del histórico del registro, queremos enlazar. Dicha resolución será definida mediante una fórmula. Para la introducción de la misma se dispone del asistente para edición de fórmulas, para abrirlo pulsar el botón ![](/files/-M7D78P7-C8bYZDUjH2r) . Ejemplo: si en la fórmula escribimos un1enlazaremos con el primer registro del histórico, si usamos la [variable del sistema ](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/variables-del-sistema)**sysListSize** enlazaremos con el último registro del histórico.

El orden de los registros históricos vendrá determinado por los componentes que se añadan en el histórico al índice del campo enlazado con la tabla actual.

### **Singular de plural por índice**

Permite crear un enlace singular a una tabla histórica de la tabla actual, utilizando para su resolución el índice usado en el enlace plural que se seleccione. El programador únicamente tendrá que resolver aquellas partes del índice usado en enlace plural que no sean el campo enlazado a la tabla actual.

El índice usado para resolver este tipo de enlace debe ser de clave única.

La primera parte del índice usado para resolver este tipo de enlace puede ser un campo enlazado a maestro.

Las propiedades a cumplimentar son:

#### **Histórico**

En esta propiedad tendremos que seleccionar, de la lista de enlaces plurales que se muestra, el que queramos usar para resolver el enlace.

#### **Modo de buscar**

En esta propiedad se indicará de qué forma se va a realizar la búsqueda del registro a enlazar. Los valores posibles son:

* **Igual**: se buscará el registro que tenga el mismo valor.
* **Igual o mayor**: se buscará el registro que tenga el mismo valor o el posterior más próximo.
* **Igual o menor**: se buscará el registro que tenga el mismo valor o el anterior más próximo.
* **Mayor**: se buscará el registro con el valor mayor.
* **Menor**: se buscará el registro con el valor menor.
* **Primero**: se buscará el primer registro. Será lo mismo que usar un enlace singular de plural por posición, resolviendo la posición con 1.
* **Último**: se buscará el último registro. Será lo mismo que usar un enlace singular de plural por posición, resolviendo la posición con la **resolución**: una vez seleccionado el enlace plural en esta propiedad aparecerá la lista de campos que componen el índice usado en el mismo, a excepción del campo que se corresponde con en enlace a la tabla actual.

En esta propiedad es donde debemos resolver el enlace, para ello situar el foco en la misma y pulsar el botón ![](/files/-M7D78P7-C8bYZDUjH2r) que aparece a la derecha. Al pulsarlo se desplegará una ventana en la que cada fila se corresponderá con un componente del índice del enlace plural seleccionado.

Cada componente del índice ha de ser resuelto de manera individual, es decir, debemos indicar al sistema qué dato resuelve cada campo componente del mismo. Dicha resolución será definida mediante una fórmula. Para la introducción de la misma se dispone del asistente para edición de fórmulas, para abrirlo pulsar el botón ![](/files/-M7D78P7-C8bYZDUjH2r) . Una vez resueltos todos los componentes del índice, pulsar el botón “aceptar”.

{% hint style="warning" %}
Es obligatorio resolver todas las partes del índice.
{% endhint %}

### **Hermano contiguo**

Permite crear un enlace singular a un registro de la misma tabla. Este tipo de enlace es virtual, no ocupa espacio en disco. Los parámetros a cumplimentar son:

#### **Indice**

Indice de la tabla actual por el cual se va a realizar el enlace. Debe tratarse de un índice de clave única.

#### **Partes comunes**

Número de partes del índice que tendrán en común los registros a enlazar; es decir, el número de campos comunes en los registros a enlazar.

#### **Dirección**

Dirección en la que se buscará el registro a enlazar. Los valores posibles son:

* **Anterior**: se enlazará con el registro anterior por el índice seleccionado.
* **Siguiente**: se enlazará con el registro siguiente por el índice seleccionado.

{% hint style="warning" %}
No es posible indexar este tipo de enlace.
{% endhint %}


# Indice

Se trata de una estructura de datos que mejora la velocidad de las operaciones, permitiendo un rápido acceso a los registros de una [tabla.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla)\
Un índice puede estar compuesto por uno o varios [campos,](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) por fórmulas o por una combinación de ellos. A cada uno de estos componentes del índice se le llama **parte**.

## Propiedades

### **Identificador**

Etiqueta alfanumérica que identifica de forma unívoca un índice dentro de una tabla. Este identificador será el que usemos en [fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula) y para referenciarlo en otras propiedades.

El identificador constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un campo de una tabla no puede haber duplicidad.

Para evitar pérdidas de información como resultado de cambiar el identificador de un índice se guarda el identificador antiguo del mismo. De esta forma, al ejecutar la aplicación de nuevo, se reconstruirá la tabla sin perder ningún dato.

Los identificadores **ID** y **NAME** son palabras reservadas. El identificador **ID** referencia el índice que es clave primaria de la tabla e identifica unívocamente cada registro. No debemos alterar este identificador si no queremos perder la funcionalidad implícita, aunque si podemos modificar sus descriptores, la propiedad **nombre**.

### **Nombre**

Etiqueta alfanumérica que servirá como descriptor del índice. Podemos definir una etiqueta por cada idioma presente en el [proyecto.](/velneo-vdevelop/proyectos-objetos-y-editores)

### **Estilos**

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

### **Comentarios**

Esta propiedad nos permite documentar el uso del índice.

### **Tipo de índice**

Esta propiedad nos permite definir de qué forma van a ser indexados los datos. Los tipos existentes son:

#### **Clave única**

No admite más que un registro con la misma clave.

#### **Palabras**

El registro es indexado por cada palabra encontrada en las partes que forman la clave. Por razones de optimización y rendimiento, solamente se indexarán los 9 primeros caracteres de cada palabra del campo o campos a indexar.

#### **Múltiples claves**

El registro es indexado desde cero claves hasta el número que el programador declare en la propiedad **número de claves**. El índice deberá estar compuesto al menos por tantos componentes como número de claves hayan sido declaradas. Si el [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) o la fórmula de una clave está vacío, esa clave no será indexada. Los campos a indexar han de ser del mismo tipo y longitud.

Un ejemplo de uso es cuando en una tabla tenemos dos o más campos enlazados a una tabla maestra. Por ejemplo, en la ficha de un libro, el autor primero y el autor segundo, y nos interesa buscar libros de un autor, sin importar si es el autor primero o el segundo.

Crearemos un índice con múltiples claves cuyo primer componente será el campo enlazado al autor1 y cuyo segundo componente será el campo enlazado al autor2.

En la propiedad nº de claves del índice estableceremos un 2.

Si queremos que al buscar por dicho índice el resultado salga ordenado por el título del libro, por ejemplo, al índice le añadiremos el campo NAME de la tabla, pero el número de claves del índice seguirá siendo 2 (los enlaces a los autores).

#### **Acepta repetidas**

La ficha es indexada sólo una vez pero, al contrario que la clave única, se admiten repeticiones. El sistema le añade 4 bytes a la clave para diferenciar las repetidas.

{% hint style="warning" %}
El tamaño máximo permitido en este tipo de índice es de 4084 bytes.
{% endhint %}

#### **Trozos de palabras**

El registro es indexado por cada grupo de 3 ó más caracteres de cada una de las partes que forman la clave.

Los índices de palabras y de trozos de palabras hacen una conversión interna a Alfa40, si no hay correspondencia de un carácter entre la tabla de caracteres de origen y la de Alfa40, no lo indexará. Además, solamente existe la tabla Alfa40 para el alfabeto latino. Esto quiere decir que por este tipo de índices se indexarán caracteres latinos, pero no de otros alfabetos.

Indice de palabras y de trozos no indexan signos de puntuación.

Los campos de tipo objeto texto y objeto texto enriquecido pueden ser indexados en índices de tipo palabras y de trozos. En el caso de los campos de tipo objeto texto enriquecido, al indexarlos se quitan los tags html de su contenido; solamente indexa el texto.

{% hint style="warning" %}
Los campos de UTF-16 no indexan en índices de palabras y de trozos de palabras. El motivo es que hacen una conversión interna a Alfa40, si no hay correspondencia de un carácter entre la tabla de caracteres de origen y la de Alfa40, no lo indexará. Además, solamente existe la tabla Alfa40 para el alfabeto latino. Esto quiere decir que por este tipo de índices se indexarán caracteres latinos, pero no de otros alfabetos.
{% endhint %}

### **Condición para indexar**

Esta propiedad permite establecer una condición para indexar el registro. Si la condición no se cumple, el registro no será indexado por ese índice. Si pulsamos el botón ![](/files/-M7D78P7-C8bYZDUjH2r) se abrirá el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). En esta fórmula solamente podemos usar campos de la tabla actual, no se pueden usar campos de tablas enlazadas; si lo hacemos, el índice no será funcional.

{% hint style="warning" %}
Cuando se trate de un índice de un campo enlazado al maestro, **este índice no puede estar condicionado** ya que, si el índice está condicionado, no se podrá garantizar que el sistema apunte a todos los registros plurales de esta tabla desde su maestro.

Si no lo hacemos, podrá fallarnos la carga de plurales, la correcta regeneración de los índices complejos de la tabla en los que se indexe un campo del maestro, etc.

Si queremos crear un índice por dicho campo con algún tipo de condición, lo que haremos será duplicarlo y condicionar el duplicado.
{% endhint %}

### **Lista negra**

Esta propiedad aparecerá en el caso de que el índice sea de tipo **palabras**. Permite establecer una lista de las palabras que no serán indexadas por ese índice. Para escribir la lista pulsar el botón que aparece al editar el valor.

### **Número de claves**

Esta propiedad aparecerá en el caso de que el índice sea de tipo **múltiples claves**. En ella se indicarán el número de claves que conforman el índice.

### **Número de partes**

Indica el número de campos o fórmulas (partes) que componen la clave.

### **Longitud de la clave**

Indica la longitud total, en bytes, del índice.

## Partes índice

Un índice estará compuesto por una o más partes. Para crear una parte de un índice pulsar el botón ![](/files/-M7D77ocPMhx7Ao1RnLW) de la barra de herramientas o abrir el menúObjetos, sub-menú Nuevo sub-objeto, opciónParte índice. Sus propiedades son:

### Identificador

Etiqueta alfanumérica que identifica al componente índice. Este identificador será el que usemos para referenciarlo en otras

propiedades.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del componente.

### Estilos

Podemos definir los estilos:

#### Privado

que limita el acceso del usuario final a cierta información sobre esa parte del índice.

#### Heredable

Que permite que esa parte del índice sea usada cuando el proyecto sea [heredado](/velneo-vdevelop/herencia).

### Comentarios

Esta propiedad nos permite documentar el uso del componente del índice.

### Modo

Permite establecer de qué forma se indexará la parte. Los valores posibles son:

#### Campo completo

La parte a indexar va a ser un campo y se indexará completo.

#### Campo porción

La parte a indexar va a ser un campo pero va a indexarse solamente una porción del mismo.

#### Fórmula

La parte a indexar va a ser una fórmula definible por el programador. Ejemplos de uso:

* Fechas u horas a partir de campos tiempo: para generar un índice de fecha y hora a partir de un campo de la tabla que es de tipo tiempo.
* Numéricos con signo a absoluto: para permitir encontrar registros por valores absolutos de un número, e indexar entonces ese valor en un índice fórmula.

No se recomienda usar este tipo de índice para concatenar campos de la tabla. En esos casos es preferible usar un índice con varias partes. Por ejemplo en lugar de crear un índice con una única parte con esta fórmula: `#APELLIDOS + #NOMBRE` es preferible crear un índice compuesto por dos parte, una que indexe el campo #APELLIDOS y otra que indexe el campo #NOMBRE.

### Campo

Esta propiedad solamente estará disponible en el caso de que el **modo** sea **campo completo** o **Campo porción**. Solamente podremos seleccionar campos de la tabla actual que tengan persistencia en disco; es decir, no es posible ni indexar campos de tablas enlazadas ni indexar campos de tipo fórmula.

### Fórmula

Esta propiedad solamente estará disponible en el caso de que el **modo** sea **fórmula**. Esta propiedad permite establecer una fórmula, cuyo resultado será indexado. Si pulsamos el botón ![](/files/-M7D78P7-C8bYZDUjH2r) se abrirá el asistente para edición de fórmulas. En esta fórmula solamente se permite usar campos de la tabla actual, no se permite usar campos de tablas enlazadas ni tampoco llamar a [funciones](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/funcion), dado que ambas cosas mermarían el rendimiento.

### Longitud

Longitud, en bytes, que tendrá la parte a indexar.

Si el **modo** es **campo completo**, este valor no podrá ser modificado.

Si el **modo** es **campo porción**, en esta propiedad indicaremos el número de caracteres a indexar del campo.

Ejemplo: si el campo es alfabético de 35 bytes y esta valor lo establecemos a 12, esta parte indexará solamente los 12 primeros caracteres del mismo.

### Conversión

Si el **modo** es **campo porción** y el campo es de tipo alfabético (Alfa Latin-1, alfa UTF-16, alfa 256, alfa 128 o alfa 64); en esta propiedad podremos hacer una conversión de la parte a una tabla de caracteres inferior.Ejemplo: un campo de tipo alfa256 indexarlo convertido a alfa 64.

{% hint style="warning" %}
Si en un componente realizamos una conversión tendremos que modificar también la longitud que se indexará del mismo en función de la nueva tabla de caracteres.

Por ejemplo, si convertimos una parte de Alfa128 a alfa 64, dado que éste último cada cuatro caracteres que se introduzcan se comprimen en 3 grabado en disco, la longitud a indexar deberá ser un múltiplo de 3.

A continuación indicamos los múltiplos según el tipo de campo: alfa 128 múltiplo de 7, alfa 64 múltiplo de 3 y alfa 40 múltiplo de 2.
{% endhint %}

Si el **modo** es **fórmula** en esta propiedad podremos indicar al sistema de qué tipo será el dato resultante de la fórmula. Los tipos posibles son:

#### Número

La parte del índice a indexar será un número.

#### Fecha

La parte del índice a indexar será una fecha. En este caso la propiedad del componente **longitud** automáticamente será establecida a 3 y no podrá ser modificada; pues es la longitud que tiene un dato de tipo fecha.

#### Hora

La parte del índice a indexar será una hora. En este caso la propiedad del componente **longitud** automáticamente será establecida a 3 y no podrá ser modificada; pues es la longitud que tiene un dato de tipo hora.

#### Tiempo

La parte del índice a indexar será un dato de tipo tiempo. En este caso la propiedad del componente **longitud** automáticamente será establecida a 4 y no podrá ser modificada; pues es la longitud que tiene un dato de tipo tiempo.

#### Alfa 256

La parte del índice a indexar será una cadena de tipo alfa 256.

#### Alfa 128

La parte del índice a indexar será una cadena de tipo alfa 128.

#### Alfa 64

* La parte del índice a indexar será una cadena de tipo alfa 64.
* **Alfa 40**: la parte del índice a indexar será una cadena de tipo alfa 40.

### Decimales

Esta propiedad solamente es visible cuando el **modo** es **fórmula** y el valor de la **conversión** es **número**. Permite establecer el número de decimales que tendrá el número a indexar.

### Signo

Esta propiedad solamente es visible cuando el **modo** es **fórmula** y el valor de la **conversión** es **número**. Permite establecer si se va a contemplar o no el signo (positivo o negativo) del número a indexar.

En Velneo también existe la posibilidad de crear índices complejos, pero no se trata de un subobjeto de tabla, sino de un objeto visual independiente. Hacer clic [aquí](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/indice-complejo) para acceder a la información sobre los mismos.


# Plural

Un enlace plural relaciona los registros de la tabla [maestra ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla)con sus registros en la tabla [plural.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/plural)

Los enlaces plurales se crean de forma automática y no es posible crearlos, modificarlos o borrarlos de forma manual.

Las relaciones son de uno a n, es decir, de un registro de la tabla de datos maestra a varios registros de la tabla plural apuntada por el enlace plural. Estas relaciones se establecen tanto entre tablas del mismo [proyecto de datos](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-organizacion/proyecto-de-datos-1-carpetas-esquemas-tablas-e-indices-complejos) como con tablas de proyectos de datos heredados .

Para que se establezca un [enlace plural ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace)basta que exista un campo enlazado a una tabla maestra y el [índice](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice) correspondiente en la tabla plural.

Se establecerán tantas relaciones, tantos enlaces de plural, como campos enlazados tenga la tabla plural con sus índices correspondientes. En el caso de que haya varios índices en la tabla plural cuya primer componente sea el campo enlazado, se establecerán tantos enlaces de plural como índices para ese campo.

El **identificador** del enlace plural se forma con el **identificador** de la tabla maestra y el **identificador** del índice del campo enlazado en la tabla plural separados por un **guión bajo (\_)**.

Las tablas de tipo maestro de extensión heredará los enlaces plurales de su tabla padre.


# Traspaso de campo

Se trata de un sub-objeto de tabla que permite, cuando añadimos un nuevo campo o cuando modificamos el identificador de un campo de esa tabla, darle un contenido en la siguiente reconstrucción de la tabla. Este objeto es solamente válido para campos de la propia tabla que no sean de tipo objeto.

Cuando modifiquemos el identificador de un campo de una tabla que ya tiene datos, tendremos que crear un sub-objeto de este tipo para indicar al sistema que el contenido del campo viejo será traspasado al campo nuevo. Nos permitirá identificar distintos cambios de identificador de un mismo campo.

Cuando creamos un nuevo campo en una tabla y éste va a tener un contenido inicial, podemos usar este sub-objeto para establecer ese contenido en los registros que ya existían en la tabla antes de su creación.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca a este subobjeto dentro de una [tabla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla).

Constará de mayúsculas y números exclusivamente.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del sub-objeto.

Podemos definir una etiqueta por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Estilos

Podemos definir el estilo siguiente:

### Privado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del sub-objeto.

### Campo nuevo

En esta propiedad indicaremos seleccionaremos cuál es el campo de la tabla cuyo identificador hemos modificado.

### Campo viejo

En esta propiedad escribiremos manualmente el identificador exacto que tenía anteriormente el campo.

### Fórmula

Expresión de tipo fórmula que nos permitirá indicar qué es lo que se traspasará al campo nuevo. Para su selección podremos hacer uso del [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Si se trata de una modificación del identificador de un campo, este parámetro lo dejaremos vacío.

Si queremos modificar el identificador de un campo cuyo identificador ya había sido modificado con anterioridad, en la propiedad campo nuevo seleccionaremos nuevamente el campo y en la propiedad campo viejo añadiremos una coma al identificador que ya tenía, y añadiremos el siguiente. Por ejemplo, si el identificador de un campo era AÑO y posteriormente lo cambiamos por ANYO, en la propiedad campo viejo indicaremos AÑO. Si posteriormente cambiamos ese identificador por YEAR, en la propiedad campo viejo, estableceremos AÑO,ANYO.

Si en la fórmula necesitamos especificar el valor del campo viejo, podremos obtenerlo usando la **variable del sistema** [sysInterchangeDat](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/variables-del-sistema#sysinterchangedat).

{% hint style="info" %}
Solamente es posible usar campos de la propia tabla, e**xcepto los campos de tipo objeto**.&#x20;

Tampoco podremos usar campos de tablas enlazadas, ni llamadas a funciones, a librerías dll, etc.

El motivo es que durante la reconstrucción de la tabla y puede ser que aún no se haya reconstruido o cargado la tabla origen de los campos maestros o los objetos a disparar.
{% endhint %}


# Trigger

Un trigger es un [proceso](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/procesos) definido por el programador que es ejecutado automáticamente al producirse el evento al que hace referencia.\
Los triggers posibles son:

## Alta

### Anterior a un alta de ficha

El proceso es disparado antes de que la ficha sea guardada en disco.

### Interno a un alta de ficha

El proceso es disparado después de que la ficha haya sido guardada en disco y antes de disparar las [actualizaciones](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/actualizacion).

### Posterior a un alta de ficha

El proceso es disparado después de que la ficha haya sido guardada en disco y después de disparar las actualizaciones.

## Modificación

### Anterior a una modificación de ficha

El proceso es disparado antes de que los cambios en la ficha sean guardados en disco.

### Interno a una modificación de ficha

El proceso es disparado después de que los cambios en la ficha hayan sido guardados en disco y antes de disparar las actualizaciones.

### Posterior a una modificación de ficha

El proceso es disparado después de que los cambios en la ficha hayan sido guardados en disco y después de disparar las actualizaciones.

## Baja

### Anterior a una baja de ficha

El proceso es disparado antes de producirse el borrado de la ficha.

### Interno a una baja de ficha

El proceso es disparado después de producirse el borrado de la ficha y antes de disparar las actualizaciones.

### Posterior a una baja de ficha

El proceso es disparado después de producirse el borrado de la ficha y después de disparar las actualizaciones.

Los triggers son ejecutados en el [servidor](/velneo-vserver/que-es-velneo-vserver) por lo que no se debe incluir en ellos ninguna instrucción que requiera la intervención del usuario.

Cualquier cambio que se desee realizar en la ficha, siempre deberá ser hecho antes de su grabación, es decir, en el trigger anterior. Si lo hacemos en los triggers interno o posterior, si bien no se grabará el cambio en la tabla, provocará un refresco erróneo de la información en el cliente.

La ficha permanecerá bloqueada por el sistema mientras los procesos de los triggers estén siendo ejecutados.

Si desde un [trigger](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/trigger) se ejecuta un proceso de Velneo con origen ficha lanzado con el comando de instrucción [ejecutar proceso](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/basicos/ejecucion#ejecutar-proceso), la ficha recibida es la que tiene el trigger en memoria, recibiendo los cambios realizados en el trigger anterior al alta o modificación. Si realizamos modificar campo en el proceso se cambia correctamente la ficha en memoria que tras finalizar el proceso es recibida por el trigger que puede continuar con todos los cambios realizados.

Sin embargo, si usamos para ejecutar el proceso el comando de instrucción [disparar objeto](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/interfaz/objeto-grupo-de-comandos#disparar-objeto) creando un manejador de objeto el funcionamiento no es el mismo ya que el proceso recibe una ficha diferente a la que usa el trigger en memoria y los cambios que se realicen con el comando de instrucción modificar campo no son funcionales.

Por lo tanto, si queremos modificar campos en procesos de Velneo lanzados desde triggers de tabla, tendremos que hacerlo siempre con el comando de instrucción de proceso [ejecutar proceso](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/basicos/ejecucion#ejecutar-proceso).

Podemos crear un trigger desde la barra de herramientas de sub-objetos de una tabla.

{% hint style="warning" %}
Las modificaciones de registros tanto asegurados (transacción por proceso) como no aseguradas (formulario) se comportan igual y en el caso de ejecutar el comando [set retorno proceso = NO](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/basicos/salidaretornos) en cualquiera de los triggers, lógicamente no se produce el alta, modificación o baja del registro, pero debemos tener en cuenta que no se deshace el resto de la transacción, por lo que si antes de hacer el set retorno proceso = NO hubiésemos realizados otros operaciones en la base de datos no relacionadas con el registro del trigger, **éstas no serán deshechas**.

En principio, en un trigger previo no se deberían realizar operaciones de disco, pero si las hacemos debes saber que el sistema no las deshará.
{% endhint %}

{% hint style="danger" %}
No se puede modificar desde un trigger de una tabla un registro que hemos modificado a través de una actualización desde la misma tabla.
{% endhint %}


# Tabla estática

La tabla estática es un objeto de [proyecto de datos](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos) que define una [tabla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla) y sus fichas en tiempo de edición, que en tiempo de ejecución no se pueden modificar por el usuario.

Para crear una tabla estática usaremos la sub-opción del mismo nombre de la opción **nuevo objeto** del menú **objetos** o a través de la galería de objetos (Tecla Insert).

En el objeto tabla estática se define tanto las propiedades de la tabla como los registros que contiene, ya que únicamente se pueden definir los registros en tiempo de edición. En ejecución, el usuario no puede hacer alta, modificación o baja de los registros, debiendo trabajar con aquellos que haya definido el programador.

La tabla estática se crea pulsando el botón nueva tabla estática, o la opción de menú **objetos**: **nuevo objeto/tabla estática**.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca una tabla estática dentro del proyecto de datos. Este identificador será el que usemos en [fórmulas ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula)y para referenciarlo en otras propiedades.

Constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca una tabla estática no puede haber duplicidad.

### Nombre

Etiqueta alfanumérica que servirá como descriptor de la tabla estática. Se usará para presentar información de la tabla estática en objetos y en los [inspectores](/velneo-vdevelop/inspectores).

Podemos definir una etiqueta por cada idioma presente en el [proyecto.](/velneo-vdevelop/proyectos-objetos-y-editores)

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso de la tabla estática.

## Item

La tabla estática contiene un subobjeto denominado **ítem**. El ítem de tabla estática se crea pulsando el botón correspondiente del editor de tablas estáticas o la opción de menú **objetos**: **nuevo sub-objeto/ítem de tabla estática**.

El ítem de tabla estática tiene las siguientes propiedades:

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca un ítem dentro de la tabla estática. Este identificador será el que usemos en [fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula) y para referenciarlo en otras propiedades.

Constará un único carácter alfanumérico de un byte (dígitos de 0 a 9, letras de la A a la Z, incluidas la Ñ y la Ç y el carácter \_). Al identificar de forma unívoca un ítem de tabla estática no puede haber duplicidad.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del ítem de tabla estática. Se usará para presentar información del ítem en objetos y en los inspectores.

Podemos definir una etiqueta por cada idioma presente en el proyecto.

### Estilos

Podemos definir los estilos siguientes:

#### Privado

Limita el acceso del usuario final a cierta información sobre él ítem de la tabla estática, y

#### Heredable

Permite que el ítem de la tabla estática sea usado cuando el proyecto sea [heredado](/velneo-vdevelop/herencia).

### Comentarios

Esta propiedad nos permite documentar el uso del ítem de la tabla estática.

### Dibujo

Esta propiedad nos permite seleccionar un [objeto dibujo ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/objeto-dibujo)del proyecto de datos en curso o de un proyecto heredado que servirá para representar el ítem de la tabla estática en otros objetos.

Si enlazamos un campo de una tabla de datos a una tabla estática, los identificadores de los ítems serán los distintos valores posibles del campo.


# Variable

Se trata de un objeto cuya finalidad es la de almacenar datos individuales en disco o en memoria. Son datos globales a la aplicación y comunes, en el ámbito de red, para todos los usuarios si son en disco, y de carácter local si son en memoria. Si un usuario modifica una variable global en disco, ésta será modificada para el resto de los usuarios, si modifica una variable global en memoria, el cambio solo le afectará a él.

Podremos crear una variable ejecutando la sub-opción del mismo nombre de la opción **nuevo objeto** del menú **objeto** o desde la galería de objetos (Tecla Insert).

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca al objeto dentro del [proyecto.](/velneo-vdevelop/proyectos-objetos-y-editores) Este identificador será el que usemos para referenciarlo en otras propiedades de otros [objetos.](/velneo-vdevelop/scripts/lenguajes/javascript/clases/objetos)

Constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un objeto no puede haber duplicidad.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del objeto. Se usará para presentar información del objeto en otros objetos\
y en los inspectores.

Podemos definir una etiqueta por cada idioma presente en el proyecto.

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del objeto.

### Persistencia

Esta propiedad nos permite definir la persistencia de la variable. Los valores posibles son:

#### Disco

El valor de la variable será común para todos los usuarios de la aplicación; si un usuario modifica su valor, este cambio afectará al resto de los usuarios.

#### Memoria

El valor de la variable tiene carácter local, es decir, si un usuario modifica su valor el cambio solamente le afectará a él.

### Tipo

Permite definir el tipo de dato que va a manejar la variable. Los tipos disponibles son:

#### Alfabético

Usado para datos alfanuméricos.

#### Numérico

Usado para datos numéricos. Se mantiene la precisión numérica hasta el quinto decimal.

#### Fecha

Usado para datos de tipo fecha. Por defecto admite el formato de fecha ISO 8601. El carácter de separación puede ser el guión o la barra.

#### Hora

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

#### Tiempo

Usado para 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 tipo lógico que permite definir el contenido como 1 ó 0 (Sí o No).

{% hint style="danger" %}
**Debemos asegurarnos de que el tipo de dato seleccionado se corresponda con el tipo de valor a almacenar**. Por ejemplo, si vamos a manejar datos alfabéticos la variable tendremos que definirla como alfabética ya que, si la definimos como numérica, al asignarle una cadena, no guardaría nada.
{% endhint %}

### Array

Esta propiedad nos permite hacer que la variable sea un array unidimensional.

{% hint style="info" %}
Las variables globales de tipo array solamente se pueden gestionar a través de la API de Velneo para JavaScript, para ello se dispone de una [serie de funciones](/velneo-vdevelop/scripts/lenguajes/javascript/clases/vapp#de-variables-globales-tipo-array) dentro de la clase **VApp**.
{% endhint %}

### Dimensiones

Esta propiedad solamente estará activa cuando el valor de la propiedad **array** sea **verdadero**. Nos permite declarar el número de ítems que tendrá el array.

### Decimales

Esta propiedad solamente estará activa cuando el valor de la propiedad **tipo** sea **numérico**. Nos permite declarar el número de decimales de la variable. Podrá especificar hasta 6 decimales que son los que se garantiza su precisión.

### Signo

Esta propiedad solamente estará activa cuando el valor de la propiedad **tipo** sea **numérico**. Define si la variable de tipo numérico\
tiene signo.

### Mínimo

Esta propiedad solamente estará activa cuando el valor de la propiedad **tipo** sea **numérico**. Permite establecer el rango límite mínimo válido para la entrada de valores.

### Máximo

Esta propiedad solamente estará activa cuando el valor de la propiedad **tipo** sea **numérico**. Permite establecer el rango límite máximo válido para la entrada de valores.

## Ámbito de las variables globales

El contenido de una variable en **disco** es común a todos los usuarios y [planos ](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/procesos/procesos-1-2-y-3-plano-cuando-usar-cada-uno)de ejecución (tanto en los clientes como en el servidor).

Por tanto, si desde una sesión de Velneo vClient se modifica una variable global en disco, esta modificación afectará tanto al resto de los clientes que estén ejecutando la misma [instancia](/velneo-vadmin/gestion-de-aplicaciones/instancias) como a los procesos que hagan uso de ella en el servidor (procesos ejecutados en tercer plano).

Debemos tener en cuenta que cada vez que usamos una variable global con persistencia en disco el sistema ha de leer su valor en el servidor para asegurarse de que el mismo está actualizado, esto, en ejecución a través de internet puede penalizar el rendimiento de la aplicación.

Por este motivo no aconsejamos su uso en contenidos iniciales, especialmente en [campos](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) de tipo fórmula, ya que el contenido de este tipo de campos se calcula dinámicamente, por lo que, a la hora de presentar un campo en una lista, por ejemplo, por cada registro a presentar en la lista se deberá leer el valor de la variable global en el servidor para calcular la fórmula.

Las variables globales con persistencia en **memoria** son globales a la máquina en la que se haga uso de ellas. No hay replicación entre clientes y servidor ni viceversa.

Es decir, que la modificación que haga un usuario a una variable global en memoria afecta única y exclusivamente a esta sesión de Velneo vClient. No afecta a otras sesiones de Velneo vClient (ni abiertas en la misma máquina ni en máquinas distintas) ni al servidor.

Por ejemplo, si modificamos una variable global en memoria en un proceso ejecutado en primer plano y lanzamos desde éste un proceso en tercer plano (ejecución en el servidor) que use esa misma variable global, no se replica el valor dado en esa sesión de Velneo vClient, sino que tomará el valor que tenga el servidor.

Si modificamos una variable global en memoria en un proceso ejecutado en 2º plano y ejecutamos al mismo tiempo otros procesos en 2º plano que hagan uso de la misma, el cambio afectará a todos ellos.

{% hint style="warning" %}
Que una variable sea **global** implica que, cuando modifiquemos el valor de una variable global durante la ejecución de una aplicación, se tendrán que recalcular todas las propiedades que sean de tipo **fórmula** de todos los objetos de la interfaz (controles de formulario, condiciones activo/visible, columnas de rejillas, etc.), por lo tanto, en la medida de lo posible debemos hacer uso de variables locales a lo objetos en lugar de variables globales.
{% endhint %}


# Objetos de proyecto de aplicación

Los objetos de proyecto de aplicación que existen en Velneo son:

* [Acción](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion).
* [Alternador de lista](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/alternador-de-lista).
* [Arbol visor de tablas](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/arbol-visor-de-tablas).
* [Bloc de formularios](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/bloc-de-formularios).
* [Casillero](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/casillero).
* [Cesta](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/cesta).
* [Comboview](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/comboview).
* [Control SVG](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/control-svg).
* [Dispositivo serie](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/dispositivo-serie).
* [Formulario](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario).
* [Formulario QML](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario-qml).
* [Gráfico](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/grafico).
* [Imagen SVG](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/imagen-svg).
* [Impresora lógica](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/impresora-logica).
* [Informe](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/informe).
* [Informe personalizable](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/informe-personalizable).
* [ListView](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/listview).
* [Lista QML](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/lista-qml).
* [Localizador](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/localizador).
* [Marco](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/marco).
* [Menú](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu).
* [Multivista](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/multivista).
* [Protocolo TCP/IP](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/comunicacion/protocolo-tcp).
* [Reemplazo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/reemplazo).
* [Rejilla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla).
* [Rejilla avanzada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada).
* [Toolbar](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/toolbar).
* [ViewFlow](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/viewflow).


# Acción

Una acción es el objeto de proyecto de aplicación que permite disparar un comando. Éste puede ser un comando en stock (preprogramado) o un comando programado que, en general, disparará objetos.

Como entrada puede no tener origen u origen lista y una tabla asociada.

La acción puede ser usada en opciones de menú, toolbars, botones en formularios, etc. Para crear un objeto de este tipo seleccionar la opción **nuevo objeto/acción** del menú **objetos** de Velneo vDevelop o a través de la galería de objetos.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca un objeto dentro del proyecto de aplicación. Este identificador será el que usemos para referenciarlo en otras propiedades de otros objetos.

El **identificador** constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un objeto no puede haber duplicidad.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del objeto. Se usará para presentar información del objeto en objetos y en los inspectores. Así mismo será el dato que mostrará la acción cuando se muestre en un [menú](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu) (si se configura con texto) y en una [toolbar](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/toolbar).

Podemos definir una etiqueta por cada idioma presente en el proyecto.

### Estilos

Podemos definir los estilos:

#### Privado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

#### Punto de inserción

Permitirá establecer una relación de [herencia inversa ](/velneo-vdevelop/herencia)con un objeto de un proyecto que hereda el proyecto actual. La activación de este estilo hará que el comando a disparar no pueda ser establecido ya que éste será definido en el proyecto heredado por éste. Ver el capítulo relativo a sub-objeto inserción para ampliar información al respecto. Una acción con este estilo activado se distinguirá visualmente en el panel de proyectos por usar una tipografía cursiva en su identificador. Las acciones con herencia inversa solamente podrán ser usadas en menús y toolbars.

![](/files/-M7D78SC6FTH62Zuducl)

En una acción definida como punto de inserción no solamente se puede insertar una única acción, sino que se pueden insertar n acciones, por lo tanto, este tipo de acciones solamente podrá ser usada en objetos que soporten multiplicidad, como pude ser una toolbar o un menú, por ejemplo.

#### **Personalizable**

Si activamos este estilo, el objeto podrá ser reemplazado por otro del mismo tipo en tiempo de ejecución mediante un objeto [reemplazo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/reemplazo).

### Comentarios

Esta propiedad nos permite documentar el uso del objeto.

### Tabla asociada

Tabla de un proyecto de datos que define la entrada de la acción.

### Texto de estado

Texto que se presentará en la barra de estado cuando estemos sobre la acción o seleccionemos ésta.

### Texto de tooltip

Texto que se presentará sobre la acción cuando estemos sobre ella con el ratón.

### Texto de ayuda

Texto que se presentará al solicitar ayuda sobre la acción. Esta opción de mantiene por compatibilidad con sistemas operativos Windows más antiguos en los que, junto al botón de cerrar ventana \[x] se incluye el botón *what's this?* \[?] que al pulsarlo muestra la ayuda de un elemento concreto.

### Texto de icono

Texto que se presentará junto con el icono cuando la acción se use en una toolbar. En caso de no estar definido se presentará el nombre de la acción.

### Icono

[Dibujo](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/dibujo) que se presentará como representación de la acción junto al texto de la acción.

### Tecla aceleradora

Tecla que hace que se ejecute la acción.

Debemos de tener la precaución de no hacer coincidir dentro de un mismo contexto dos controles y/o subcontroles con la misma tecla aceleradora ya que, en el caso de suceder, no se disparará ninguno de ellos.

Los aceleradores de teclado no son funcionales cuando la acción está dentro de un menú arbolado.

### Combinación de la tecla aceleradora

Combinación de teclas para que la tecla aceleradora ejecute la acción.

### Comando

Comando que se disparará al ejecutar la acción. Los comandos posibles son:

#### Disparar objetos

Ejecuta una serie de objetos presentando el último en pantalla.&#x20;

#### Disparar señal

Dispara una señal que puede ser usada en una conexión de evento para ejecutar un manejador de evento.

#### Ejecutar proceso 2º plano

Ejecuta un proceso declarado en el proyecto actual o en un proyecto heredado en 2º plano o multitarea.

#### Seleccionar instancia

Nos permite [abrir otra instancia](/velneo-vclient/funcionalidades-especificas/cambiar-instancia) en la misma sesión de Velneo vClient que tengamos abierta.

{% hint style="warning" %}
Esta acción debe estar incluida en una opción del [marco](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/marco) de la aplicación, es decir, o en el [menú principal](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/marco#menu-principal) o en una [toolbar](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/marco#dock) del mismo.
{% endhint %}

#### Ficha: Formulario de alta

Presenta el formulario de alta seleccionado (no necesita origen). Si la acción la disparamos desde otro formulario que contenga una rejilla asociada al formulario declarada en dicha acción, al dispararla, el registro creado será añadido a la rejilla; pero solamente en el caso de que la rejilla esté visible en el momento de disparar la acción. Además, si el registro dado de alta es histórico (plural) de la ficha editada en el formulario desde el que disparamos la acción, se inducirá ese maestro en el momento del alta.

#### Ficha: Formulario de modificación

Presenta el formulario de modificación de la tabla a la que está asociada la acción.

#### Ficha: Formulario de baja

Presenta el formulario de baja de la tabla a la que está asociada la acción.

#### Ficha: Alta de maestro

Alta del maestro seleccionado de la tabla a la que está asociada la acción.

#### Ficha: Edición de maestro

Edición del maestro seleccionado de la tabla a la que está asociada la acción.

#### Ficha: Localizar maestro

Localizar maestro seleccionado de la tabla a la que está asociada la acción.

#### Lista: Invertir

Invertir el orden de la lista.

#### Lista: Filtrar

Solicita la fórmula con que se filtrará la lista seleccionada.

#### Lista: Ordenar...

Reordenar la lista según el campo seleccionado. Para realizar la ordenación, el sistema hace una indexación previa. El tamaño de las claves es de 24 caracteres para los campos alfabéticos menores que alfa256 y de 48 para campos alfa256 y superiores.

Este comando está optimizado ya que la ordenación ser hará en el servidor. No se hará la ordenación en el servidor si el campo por el que se ordena es fórmula, o si se trata de una fórmula compuesta en la columna.

#### Lista: Partir

Partir la lista por el elemento seleccionado.

#### Lista: Multipartir...

Multipartirá la lista según el campo seleccionado. Este tipo de comando no puede ser usado en menús de contexto o toolbars asociados a objetos de lista (rejilla, casillero, etc.).

#### Lista: Quitar de la lista el seleccionado

Quita de la lista el elemento seleccionado.

#### Lista: Campos duplicados...

Devuelve una lista con los elementos con campos con valores duplicados. Este tipo de comando no puede ser usado en menús de contexto o toolbars asociados a objetos de lista (rejilla, casillero, etc.).

#### Lista: Modificar campo...

Modificará el campo seleccionado con el dato que suministremos. [Ver funcionalidad](/velneo-vclient/funcionalidades-especificas/rejillas-vclient#modificar-campo).

{% hint style="info" %}
Esta opción recomendamos usarla solo para usuarios supervisores/administradores, ya que permite modificar cualquier campo, aunque sea privado.
{% endhint %}

#### Lista: Modificar campo si... (OBSOLETO)

Modificará el campo seleccionado con el dato que suministremos si se da la condición.

Este comando está obsoleto ya que el comando modifica campo ahora incluye esta funcionalidad.

#### Lista: Generar lista con seleccionados

Genera una nueva vista con los registros seleccionados.

#### Lista: Generar vista con otro visor...

Este comando nos permite generar una nueva vista con los registros de la lista en curso usando otro visor de listas distinto al actual (rejilla, informe, ViewFlow. Al ejecutar esta opción el sistema mostrará una ventana con todos los objetos de lista públicos asociados a la tabla en curso para que el usuario seleccione el que quiera usar para generar la nueva vista. Solamente serán mostrados aquellos objetos de lista que no tengan activado el **estilo privado**. Aconsejamos por tanto el **estilo privado** en todos aquellos objetos cuyo origen sea lista que no se quiera estén disponibles al usuario final al usar este comando. Este tipo de comando no puede ser usado en menús de contexto o toolbars asociados a objetos de lista (rejilla, casillero, etc.).

#### Lista: Guardar lista virtual

Permite guardar en disco una lista virtual a partir de los registros contenidos en una vista de datos de lista. El archivo generado tendrá extensión v7v.

#### Lista: Recuperar de lista virtual

Permite recuperar en una vista de datos de lista una lista virtual generada, o bien con la acción en stock **Lista: Guardar lista virtual**, o bien con el comando **Guardar** del submenú Lista virtual del [menú de lista extendida](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu#lista-extendida), o bien con el comando de instrucción de proceso [guardar en lista virtual](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/base-de-datos/listas#guardar-en-lista-virtual), o bien con la función [saveToFile](/velneo-vdevelop/scripts/lenguajes/javascript/clases/vregisterlist#savetofile) de la clase VRegisterList de la API de Velneo para Javascript. Por defecto buscará archivos con extensión v7v pero podremos cambiar el filtro en la ventana de selección del fichero.&#x20;

Ver el capítulo [listas virtuales](/velneo-vclient/funcionalidades-especificas/listas-virtuales) para ampliar información sobre su funcionamiento.

#### Lista: Imprimir

Específica para rejillas avanzadas. Envía a impresora el contenido de la rejilla. Equivale al comando del mismo nombre existente en el menú por defecto de las rejilla avanzadas.

#### Lista: Exportar a pdf

Específica para rejillas avanzadas. Genera un pdf con contenido de la rejilla. Equivale al comando del mismo nombre existente en el menú por defecto de las rejilla avanzadas.

#### Lista: Exportar a xml

Genera un fichero XML con el contenido de una rejilla o de una rejilla avanzada. Equivale a la opción del mismo nombre del menú por defecto extendido de ambos objetos.

#### Filtros: Igual a seleccionados de la columna

Si seleccionamos varias filas de una misma columna, podremos dejar en la lista solamente aquellos registros que contengan los mismos valores que los registros seleccionados.

#### Filtros: Por columna

Filtrará la lista dejando solamente los registros cuyo valor coincida con el valor de la columna que tengamos seleccionada.

#### Filtros: Con una fórmula avanzada...

La condición a evaluar se establecerá por medio de una fórmula por lo que se abrirá el [asistente para la edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). En él tendremos acceso a las **Funciones estándar** de fórmulas, a la **lista de campos de la tabla** y a las **variables del sistema**.

#### Filtros: Quitar de la lista los seleccionados

Como su propio nombre indica, permite quitar de la lista todos los registros que estén seleccionados.

#### Navegante: Navegar a plurales de uno... (obsoleto)

Navega a los plurales del registro seleccionado solicitando el plural y el objeto con que se quiere mostrar. Se recomienda sustituirla por la acción [navegante: navegante asistido](#navegante-navegante-asistido).

#### Navegante: Navegar a plurales de todos... (obsoleto)

Navega a los plurales de todos los registros de la lista solicitando el plural y el objeto con que se quiere mostrar. Se recomienda sustituirla por la acción [navegante: navegante asistido](#navegante-navegante-asistido).

#### Navegante: Navegar a maestros... (obsoleto)

Navega a los maestros de los registros solicitando el campo enlazado a maestro y el objeto con que se quiere mostrar. Se recomienda sustituirla por la acción [navegante: navegante asistido](#navegante-navegante-asistido).

#### Navegante: navegante asistido

Esta opción permite cargar los registros de las tablas relacionadas (tanto maestras como plurales) del registro o los registros que seleccionemos en una rejilla del panel de datos.

Para que la opción esté activa se deben dar las circunstancias siguientes:

1. Que la tabla tenga campos enlazados a maestro o enlaces plurales.
2. Que en la rejilla tengamos seleccionado al menos un registro.

Al ejecutar esta opción, se abrirá un asistente de navegación en el que se verá:

* El número de registros que hemos seleccionado en la rejilla.
* El tipo de relación (maestro o plural) de cada tabla relacionada.
* El nombre de cada tabla relacionada.
* Una columna **Nº de registros** que, inicialmente se mostrará vacía.
* Junto a cada tabla relacionada hay una casilla de verificación que podremos activar para cargar los registros de la misma.
* Un botón **Calcular**. Si lo pulsamos, calculará el nº de registros de cada tabla enlazada y lo mostrará en la columna Nº de registros. Además, activará automáticamente las casillas de verificación de todas las tablas relacionadas que tengan registro.

Una vez que hayamos seleccionado las tablas relacionadas que queramos cargar finalmente, pulsaremos el botón "Mostrar" y nos abrirá una nueva vista de cada una de ellas con sus registros.

El botón "Cancelar" abortará la operación.

La ventana, además, incluye un campo para poder buscar por nombre una tabla relacionada.

Si solamente seleccionamos un registros, la opción automáticamente calculará y seleccionará inicialmente todas las tablas relacionadas que tengan registros enlazados con el seleccionado.

#### Archivo: Multitarea (Procesos colas y servicios)

Presenta los [procesos](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso), [colas](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/cola) y [servicios](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/protocolo-tcp-ip) que se están ejecutando en multiarea.

#### Archivo: Cachés de fichas

Presenta una ventana que muestra la lista de tabla del proyecto junto con el número de fichas de las mismas que se encuentran en la caché local.

#### Archivo: Modificar contraseña usuario...

Permite cambiar la contraseña del usuario en el Velneo vServer con el que se ha conectado el cliente. Al ejecutarlo se presentará una ventana en la que el usuario tendrá que escribir la contraseña actual y la contraseña nueva con confirmación.

#### Archivo: Configurar impresoras lógicas...

Este comando abre el cuadro de diálogo que permite asociar impresoras lógicas a físicas.

#### Archivo: Salir

Cierra la aplicación.

#### Editar: Cortar

Corta el texto u objeto y lo deja en el portapapeles.

#### Editar: Copiar

Copia el texto u objeto y lo deja en el portapapeles.

#### Editar: Pegar

Pega el texto u objeto.

#### Ventana: Cerrar

Cierra la ventana en curso. Dado el funcionamiento del sistema de ventanas, no es posible usar esta acción dentro de una ventana para cerrarse a sí misma. Tendremos que, o bien incluir la acción fuera de la ventana, por ejemplo, en el menú principal del proyecto o, si se trata de un formulario, usar el comando de botón “cancelar” para provocar su cierre.

#### Ventana: Cerrar todas

Cierra todas las ventanas.

#### Ventana: Cascada

Visualiza todas las ventanas en cascada.

#### Ventana: Mosaico

Visualiza todas las ventanas en mosaico.

#### Ventana: Panel anterior

Visualiza el siguiente panel.

#### Ventana: Panel siguiente

Visualiza el panel anterior.

#### Ver: Pantalla completa

Presenta la ventana en pantalla completa.

#### Página web

Presenta una página web en un explorador web propio del sistema. La URL a ejecutar será resuelta por medio de una [constante.](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/constante)

#### Página web con inspector

Este comando de acción está obsoleto.

#### Mensajes y alertas...

Presenta el gestor de mensajes que permitirá al usuario enviar y recibir mensajes a/de otros usuarios. Ver el capítulo [mensajería ](/velneo/funcionalidades-comunes/mensajeria-interna-entre-usuarios)para ampliar información sobre su funcionamiento.

#### Ayuda: Acerca de…

Presenta el cuadro de diálogo sobre la aplicación.

#### Rejilla avanzada: Mostrar/Ocultar caja para agrupar

Permite mostrar/ocultar la caja de agrupamientos de una [rejilla avanzada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada). Funcional en cabeceras y cuerpo.

#### Rejilla avanzada: Pie de grupo

Permite mostrar/ocultar pies de agrupamientos de una [rejilla avanzada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada). Funcional en cabeceras y cuerpo.

#### Rejilla avanzada: Pie de rejilla

Permite mostrar/ocultar el pie de una [rejilla avanzada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada). Funcional en cabeceras y cuerpo.

#### Rejilla avanzada: Aumentar zoom

Permite aumentar un 25% el tamaño de la fuente de la [rejilla avanzada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada). Funcional en cabeceras y cuerpo.

#### Rejilla avanzada: Disminuir zoom

Permite disminuir un 25% el tamaño de la fuente de la rejilla. Funcional en cabeceras y cuerpo.

#### Rejilla avanzada: Expandir todo

Si la [rejilla avanzada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada) contiene agrupamientos, esta opción abrirá todos los nodos de las agrupaciones. Funcional en cabeceras y cuerpo.

#### Rejilla avanzada: Contraer todo

Si la [rejilla avanzada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada) contiene agrupamientos, esta opción replegará todos los nodos de las agrupaciones. Funcional en cabeceras y cuerpo.

#### Rejilla avanzada: Guardar configuración

Permite guardar el estado de configuración de la [rejilla avanzada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada), esto es: columnas, pies de rejilla, pies de grupo, cálculos configurados y los filtros combinados utilizados.

#### Rejilla avanzada: Filtro combinado...

Permite para quitar de una [rejilla avanzada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada) aquellos registros que no cumplan una determinada condición.

#### Rejilla avanzada: Buscar...

Permite destacar en la [rejilla avanzada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada) todas las columnas que contengan la cadena que escribamos en el campo de búsqueda.

#### Rejilla avanzada: Mejor ajuste

Ajusta el contenido de la [rejilla avanzada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/rejilla-avanzada) de la mejor forma posible dentro del área donde se está mostrado.

Los comandos hacen uso de las siguientes propiedades para configurarlos:

### Objeto 1…n

Objetos que se dispararán con el comando [disparar objetos](#disparar-objetos). El primer elemento tiene la misma entrada que la acción (Ninguno o lista de la tabla asociada) y los siguientes se encadenarán con la salida del objeto anterior, presentándose el último objeto de la lista. Debemos tener en cuenta que si un objeto no tiene salida, no podrá alimentar la entrada de otro.

### Formulario

Formulario que se presentará al hacer uso del comando [ficha: formulario de alta](#ficha-formulario-de-alta).

### Campo

Campo que se editará al hacer uso de los comandos:

* [Ficha: alta de maestro](#ficha-alta-de-maestro).
* [Ficha: edición de maestro](#ficha-edicion-de-maestro).
* [Ficha: localizar maestro](#ficha-localizar-maestro).

### Objeto

Objeto que se dispara al hacer uso de los comandos:

* [Ficha: alta de maestro](#ficha-alta-de-maestro).
* [Ficha: edición de maestro](#ficha-edicion-de-maestro).
* [Ficha: localizar maestro](#ficha-localizar-maestro).

{% hint style="warning" %}
Las opciones del menú principal del proyecto se disparan únicamente sobre los controles de vista de datos en vista, no hemos de usarlos para interactuar con docks en toolbar o en formularios.
{% endhint %}


# Alternador de lista

Se trata de un objeto de lista al que se le pueden declarar múltiples objeto de salida (rejilla, informe, casillero, etc.) entre los que el usuario final podrá alternar en tiempo de ejecución. Para crear un objeto de este tipo seleccionar la opción **nuevo objeto/alternador de lista** del menú **objetos** de Velneo vDevelop o a través de la galería de objetos.

En este objeto podemos hacer scroll con el dedo en dispositivos móviles.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca al objeto dentro del proyecto. Este identificador será el que usemos para referenciarlo en otras propiedades de otros objetos.

Constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un objeto no puede haber duplicidad.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del objeto. Se usará para presentar información del objeto en otros objetos y en los inspectores.

Podemos definir una etiqueta por cada idioma presente en el proyecto.

### Estilos

Podemos definir los estilos:

#### Privado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

#### Punto de inserción

Permitirá establecer una relación de [herencia inversa ](/velneo-vdevelop/herencia)con un objeto de un proyecto que hereda el proyecto actual. La activación de este estilo hará que el alternador no pueda ser editado ya que su contenido será establecido en el proyecto heredado por éste. Ver el capítulo relativo a sub-objeto [inserción ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/insercion)para ampliar información al respecto. Un alternador con este estilo activado se distinguirá visualmente en el panel de proyectos por usar una tipografía cursiva en su identificador:

![](/files/-M7D789HtgLh6fK2K2ma)

En un alternador definido como punto de inserción no solamente se puede insertar un único alternador, sino que se pueden insertar n alternadores.

#### Sin barra de título (Sólo diálogos)

Permite omitir la barra de título de la ventana. Solamente funcional en cuadros de diálogo.

#### Sin menú de sistema

Permite omitir el menú de sistema de la ventana.

#### Sin botón maximizar

Permite ocultar el botón maximizar de la ventana.

#### Sin botón minimizar

Permite ocultar el botón minimizar de la ventana.

#### Sin botón cerrar

Permite ocultar el botón de cierre de la ventana.

#### Personalizable

Si activamos este estilo, el objeto podrá ser reemplazado por otro del mismo tipo en tiempo de ejecución mediante un objeto [reemplazo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/reemplazo).

### Comentarios

Esta propiedad nos permite documentar el uso del objeto.

### Tabla asociada

Tabla de un proyecto de datos heredado cuyos registros van a ser visualizados en el objeto.

### Objeto 1… Objeto 10

En estas propiedades especificaremos uno a uno los distintos objetos de lista que queramos que los usuarios finales puedan usar desde este alternador. Podremos especificar hasta 10 objetos de lista diferentes.

### Toolbar

Si seleccionamos una toolbar en este parámetro, cada vez que usemos este alternador, éste llevará embebida la toolbar seleccionada, que podrá situarse, o bien encima o bien debajo de la rejilla.

### Cambio de vista privado

En este parámetro indicaremos si el cambio de vista del alternador va a ser público (**falso**) o solamente podrá hacerse donde nosotros lo programemos (**verdadero**). En este caso, será necesario que programemos un proceso o un evento de interfaz usando el comando de instrucción de proceso interfaz: cambiar vista de alternador.

En el caso de que el cambio de vista vaya a ser público, en tiempo de ejecución el usuario podrá cambiar el objeto de salida del alternador usando los siguientes aceleradores de teclado: Alt + F6 para cambiar al objeto siguiente y Alt + F5 para cambiar al objeto anterior. Además, en aquellos objetos que tengan un menú de contexto por defecto también podrá cambiarse la vista a través del mismo:

![](/files/-M7D789KMxNor57-xreZ)

El orden que se seguirá será el establecido en las propiedades del control.

### Timer (Milisegundos)

Es un reloj que permitirá ejecutar automáticamente uno o varios eventos declarados en el alternador de forma periódica. En este parámetro se indicará el tiempo, en milisegundos, para cada iteración del timer. Si el valor es 0, querrá decir que no se activará el timer.


# Arbol visor de tablas

El árbol visor de tablas arboladas es un objeto que sirve para presentar, en distintos niveles, la información de una [tabla](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/base-de-datos/tablas) de datos Maestra con clave arbolada. Los árboles presentan la información de este tipo de tablas de una forma gráfica (se incluyen líneas, imágenes…), visualizando de forma clara los niveles en los que se encuentra estructurada la información.

![](/files/-M7D79nxz-DytzNh88dm)\
El árbol siempre va asociado a una tabla de un [proyecto de datos ](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-organizacion/proyecto-de-datos-1-carpetas-esquemas-tablas-e-indices-complejos)heredado. El flujo es lista de la tabla asociada tanto para la entrada como para la salida.

Para crear un objeto de este tipo seleccionar la opción **nuevo objeto/árbol visor de tablas** del menú **objetos** de Velneo vDevelop o a través de la galería de objetos.

En este objeto podemos hacer scroll con el dedo en dispositivos móviles.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al objeto. Este identificador será el que se usa para referenciarlo en los inspectores y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del árbol. Es el texto que se presentará al usuario final de la aplicación para referenciar al árbol. Podemos definir una etiqueta por cada idioma presente en el proyecto.

### Estilos

Podemos definir los estilos siguientes:

#### Privado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

#### Arrastrable para copiar

Cuando la rejilla va a ser el origen en un evento de drag and drop, si está activado este estilo, en ejecución los items arrastrados no serán quitados de la misma tras ejecutar el evento de drop.

#### Arrastrable para mover

Cuando la rejilla va a ser el origen en un evento de drag and drop, si está activado este estilo, en ejecución los items arrastrados serán quitados de la misma tras ejecutar el evento de drop.

#### Simple-click dispara

Si el casillero tiene asociado un formulario de modificación si este estilo está activado al hacer un clic sobre un ítem del árbol éste será editado en el formulario correspondiente. Si este estilo está desactivado el usuario tendrá que hacer doble clic para editar la ficha.

#### Solo una rama abierta

Si este estilo está activado, el árbol sólo permitirá una rama abierta. Esto quiere decir que, cuando abramos una rama, se cerrarán las otras automáticamente.

#### Sin barra de título (Sólo diálogos)

Permite omitir la barra de título de la ventana. Solamente funcional en cuadros de diálogo.

#### Sin menú de sistema

Permite omitir el menú de sistema de la ventana.

#### Sin botón maximizar

Permite ocultar el botón maximizar de la ventana.

#### Sin botón minimizar

Permite ocultar el botón minimizar de la ventana.

#### Sin botón cerrar

Permite ocultar el botón de cierre de la ventana.

#### **Optimizado**

Si activamos esta opción, el sistema cargará inicialmente solo los registros que se correspondan con las ramas de primer nivel en el árbol. Si desplegamos un nodo, en ese momento cargará los registros correspondientes a los nodos nodos de siguiente nivel y así sucesivamente.

Si no está activada, cargará todos los registros.

#### **Personalizable**

Si activamos este estilo, el objeto podrá ser reemplazado por otro del mismo tipo en tiempo de ejecución mediante un objeto [reemplazo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/reemplazo).

### Comentarios

Esta propiedad nos permite documentar el uso del árbol.

### Tabla asociada

Tabla de un proyecto de datos heredado cuyos registros van a ser visualizados en el árbol.

### Ver botones +-

Esta propiedad nos permite visualizar u ocultar los botones + – que aparecen en cada nodo del árbol y que permite desplegar y plegar una rama del árbol, respectivamente.

### Ver imágenes

Esta propiedad nos permite mostrar u ocultar un icono en cada rama del árbol.

### Ver campo código

Esta propiedad nos permite mostrar u ocultar el campo código de cada registro visualizado en cada rama del árbol.

### Orden alfabético

Si esta propiedad está desactivada las ramas del árbol de un mismo nivel serán ordenadas por el campo ID de la tabla y si está activada serán ordenadas alfabéticamente por el campo NAME de la tabla.

### Formulario de alta

[Formulario](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/formularios) del proyecto en curso o de un proyecto heredado que será usado para dar de alta una ficha desde el árbol.

### Formulario de modificación

Formulario del proyecto en curso o de un proyecto heredado que será para editar una ficha desde el árbol.

### Formulario de baja

Formulario del proyecto en curso o de un proyecto heredado que será para eliminar una ficha desde el árbol.

### Tipo de menú de contexto

El menú de contexto es el que aparece cuando el usuario final hace clic con el botón derecho del ratón. Los valores posibles son:

#### Ninguno

El objeto carecerá de menú de contexto.

#### Por defecto

El objeto dispondrá de un menú de contexto creado automáticamente por el sistema, que contendrá las opciones siguientes:

* **Alta de ficha**: si el objeto tiene asociado un formulario de altas, lo abrirá para que el usuario pueda añadir una ficha.
* **Modificación de ficha**: editará la ficha seleccionada en el formulario de modificación asociado al objeto.
* **Baja de ficha**: abrirá el formulario de bajas asociado al objeto.
* **Invertir**: invierte el orden de la lista, usando para ello el campo por el que se encuentra ordenada.
* **Filtrar**: permite al usuario establecer y aplicar un filtro al objeto.
* **Ordenar**: permite al usuario ordenar la lista por el campo que elija.
* **Quitar de la lista el seleccionado**: quita del objeto el registro que el usuario tenga seleccionado. No lo borra físicamente, sino que simplemente lo quita de la lista.

#### Por defecto extendido

El objeto dispondrá de un menú de contexto creado automáticamente por el sistema que, además de las opciones del menú **por defecto**, incluye las siguientes:

* **Modificar campo…**: permitirá al usuario modificar un campo de todos los registro de la lista.
* **Modificar campo si…**: permitirá al usuario modificar un campo de todos los registro de la lista que cumplan una determinada condición.
* **Exportar a XML**: permitirá al usuario exportar los registros de la lista a un fichero XML.

#### Personalizado

El menú de contexto del objeto será un objeto [menú ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu)contenido en el proyecto.

### Menú de contexto

Esta propiedad solamente estará disponible cuando el valor de la propiedad [tipo de menú de contexto](#tipo-de-menu-de-contexto) sea ***personalizado***. Nos permitirá seleccionar el objeto menú que queramos usar como menú de contexto del árbol.

### Toolbar

Esta propiedad permite asociar una [toolbar](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/toolbar) al árbol.

### Posición de la toolbar

Esta propiedad permite indicar la posición donde se mostrará la toolbar seleccionada en la propiedad anterior. Los valores posibles son:

* **Arriba**: la toolbar será mostrada en la parte superior del árbol.
* **Abajo**: la toolbar será mostrada en la parte inferior del árbol.

{% hint style="info" %}
La navegación por las distintas ramas de un árbol usando las teclas de movimiento de cursor variará en función del estilo visual que estemos utilizando. Por ejemplo, con los estilos visuales Motif, CDE y Cleanlooks, cuando estamos en una subcarpeta de un árbol que no está desplegada, al pulsar la tecla del cursor izquierda el foco permanece en esa subcarpeta en lugar de moverse a la carpeta padre.
{% endhint %}

##


# Bloc de formularios

Se trata de un objeto que nos permite editar en un [formulario,](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/formularios) una a una, una lista de registros de una [tabla.](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/base-de-datos/tablas)

![](/files/-M7D78GCkh_gBrHF2Jim)

El bloc de formularios siempre va asociado a una tabla de un proyecto de datosheredado. El flujo es lista de la tabla asociada tanto para la entrada como para la salida.

Para crear un objeto de este tipo seleccionar la opción **nuevo objeto/bloc de formularios** del menú **objetos** de Velneo vDevelop o a través de la galería de objetos.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al objeto. Este identificador será el que se usa para referenciarlo en los inspectores y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del objeto. Es el texto que se presentará al usuario final de la aplicación para referenciar al objeto. Podemos definir una etiqueta por cada idioma presente en el proyecto.

### Estilos

Podemos definir los estilos:

#### Privado

Llimita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

#### Sin barra de título (Sólo diálogos)

Permite omitir la barra de título de la ventana. Solamente funcional en cuadros de diálogo.

#### Sin menú de sistema

Permite omitir el menú de sistema de la ventana.

#### Sin botón maximizar

Permite ocultar el botón maximizar de la ventana.

#### Sin botón minimizar

Permite ocultar el botón minimizar de la ventana.

#### Sin botón cerrar

Permite ocultar el botón de cierre de la ventana.

#### **Personalizable**

Si activamos este estilo, el objeto podrá ser reemplazado por otro del mismo tipo en tiempo de ejecución mediante un objeto [reemplazo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/reemplazo).

### Comentarios

Esta propiedad nos permite documentar el uso del bloc de formularios.

### Tabla asociada

Tabla de un proyecto de datos heredado que alimentará al bloc de formularios.

### Formulario

En esta propiedad especificaremos el formulario que será usado en el bloc de formularios. El origen del mismo ha de ser la

tabla seleccionada en la propiedad anterior.

### Tipo de menú de contexto

El menú de contexto es el que aparece cuando el usuario final hace clic con el botón derecho del ratón. Los valores posibles son:

#### Ninguno

El objeto carecerá de menú de contexto.

#### Por defecto

El objeto dispondrá de un menú de contexto creado automáticamente por el sistema, que contendrá las opciones siguientes:

* **Alta de ficha**: si el objeto tiene asociado un formulario de altas, lo abrirá para que el usuario pueda añadir una ficha.
* **Modificación de ficha**: editará la ficha seleccionada en el formulario de modificación asociado al objeto.
* **Baja de ficha**: abrirá el formulario de bajas asociado al objeto.
* **Invertir**: invierte el orden de la lista, usando para ello el campo por el que se encuentra ordenada.
* **Filtrar**: permite al usuario establecer y aplicar un filtro al objeto.
* **Ordenar**: permite al usuario ordenar la lista por el campo que elija.
* **Quitar de la lista el seleccionado**: quita del objeto el registro que el usuario tenga seleccionado. No lo borra físicamente, sino que simplemente lo quita de la lista.

#### Por defecto extendido

El objeto dispondrá de un menú de contexto creado automáticamente por el sistema que, además de las opciones del menú **por defecto**, incluye las siguientes:

* **Modificar campo…**: permitirá al usuario modificar un campo de todos los registro de la lista.
* **Modificar campo si…**: permitirá al usuario modificar un campo de todos los registro de la lista que cumplan una determinada condición.
* **Exportar a XML**: permitirá al usuario exportar los registros de la lista a un fichero XML.
* **Personalizado**:  el menú de contexto del objeto será un objeto menú contenido en el proyecto.

### Cambios en ficha

En esta propiedad indicaremos cómo se ha de comportar el programa si el usuario realiza modificaciones en una ficha y se mueve a otra. Los valores posibles son:

#### Pregunta

El sistema preguntará al usuario si quiere guardar los cambios de la ficha modificada.

#### Acepta

El sistema guardará automáticamente los cambios efectuados en la ficha.

#### Cancela

El sistema cancelará automáticamente los cambios efectuados en la ficha.

### Toolbar

Este parámetro nos permite asociar un objeto toolbar al bloc de formularios.

En ejecución, cuando este objeto tiene el foco, usará las siguientes teclas aceleradoras:

Ctrl+Pág Adelante para ir al registro siguiente.\
Ctrl+Pág Atrás para ir al registro anterior.

Si en el control seleccionamos la barra de navegación, serán funcionales las teclas de movimiento del cursor izquierda y derecha.


# Casillero

El casillero es un objeto que sirve para presentar listas de registros de las [tablas.](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/base-de-datos/tablas)

![](/files/-M7D79JJpnP9kynv2gjY)

El casillero siempre va asociado a una tabla de un proyecto de datos heredado. El flujo es lista de la tabla asociada tanto para la entrada como para la salida.

El casillero está compuesto por una serie de celdas (casillas) distribuidas en forma de filas y columnas. Una celda se corresponde con un registro de una tabla. Una celda permitirá mostrar un formulario concreto de un registro concreto de la tabla a la que pertenece el casillero. Cada celda a su vez es un botón que permite disparar un comando al hacer clic sobre él.

Para crear un objeto de este tipo seleccionar la opción **nuevo objeto/casillero** del menú **objetos** de Velneo vDevelop o a través de la galería de objetos.

En este objeto podemos hacer scroll con el dedo en dispositivos móviles.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al objeto. Este identificador será el que se usa para referenciarlo en los inspectores y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del casillero. Es el texto que se presentará al usuario final de la aplicación para referenciar el casillero. Podemos definir una etiqueta por cada idioma presente en el proyecto.

### Estilos

Podemos definir los estilos siguientes:

#### Privado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

#### Arrastrable para copiar

Cuando la rejilla va a ser el origen en un evento de drag and [drop,](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/drop) si está activado este estilo, en ejecución los items arrastrados no serán quitados de la misma tras ejecutar el evento de drop.

#### Arrastrable para mover

Cuando la rejilla va a ser el origen en un evento de drag and drop, si está activado este estilo, en ejecución los items arrastrados serán quitados de la misma tras ejecutar el evento de drop.

#### Simple-click dispara

Si este estilo está activado el comando asociado al casillero será disparado al hacer un clic sobre un ítem del casillero. Si este estilo está desactivado el usuario tendrá que hacer doble clic para ejecutar el comando.

#### Sin barra de título (Sólo diálogos)

Permite omitir la barra de título de la ventana. Solamente funcional en cuadros de diálogo.

#### Sin menú de sistema

Permite omitir el menú de sistema de la ventana.

#### Sin botón maximizar

Permite ocultar el botón maximizar de la ventana.

#### Sin botón minimizar

Permite ocultar el botón minimizar de la ventana.

#### Sin botón cerrar

Permite ocultar el botón de cierre de la ventana.

#### **Optimizado**

Si activamos esta opción, el sistema reducirá el número de conexiones con el servidor que requieren determinados tipos de [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) (enlaces a maestro, campos objeto) para mejorar los tiempos de carga del casillero.

Si el casillero tiene activado este estilo, se [aplican CSS](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/interfaz/control#interfaz-establecer-hoja-de-estilo-css) en las celdas de los [casilleros](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/casillero), heredando del css principal o permitiendo la aplicación de css específicos en los casilleros, en caso contrario, no se aplicarán CSS.

#### **Personalizable**

Si activamos este estilo, el objeto podrá ser reemplazado por otro del mismo tipo en tiempo de ejecución mediante un objeto [reemplazo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/reemplazo).

### Comentarios

Esta propiedad nos permite documentar el uso del casillero.

### Tabla asociada

Tabla de un proyecto de datos heredado cuyos registros van a ser visualizados en el casillero.

### Formulario

Formulario del proyecto en curso o de un proyecto heredado que será usado para mostrar cada ficha en cada celda del casillero.

{% hint style="warning" %}
El casillero es cargado solamente en el inicio. Lee los datos de la ficha y crea la celda correspondiente en el casillero, por lo que no es recomendable utilizar en el formulario controles cuya lectura no sea inmediata como los [gráficos](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/grafico) o como el control [visor HTML](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/visor-html) cuyo contenido sea una url.
{% endhint %}

### Columnas/Filas

Expresión de tipo fórmula que nos permite definir un número fijo de columnas o de filas que tendrá el casillero.

El que sean columnas o filas vendrá determinado por el valor que se establezca en la propiedad Barra de scroll. Si seleccionamos el scroll Horizontal el número indicado en este parámetro será el número de filas del casillero. Si seleccionamos el scroll Vertical el número indicado en este parámetro será el número de columnas del casillero.

Si queremos que sea el propio sistema el que se encargue de calcular el número de columnas/filas automáticamente en tiempo de ejecución en función de tamaño disponible en pantalla para pintar el casillero, entonces estableceremos el valor 0 en este parámetro.

El tamaño que tomarán las casillas y el número de elementos que se presentará por fila y columna vendrá dado por el tamaño del formulario elegido, que será el tamaño mínimo que tendrá cada casilla.

Al tratarse de una fórmula podremos hacer que este valor sea un valor dinámico.

{% hint style="warning" %}
Si en este parámetro usamos un dato variable debemos tener en cuenta que solamente se leerá al crear el casillero. Esto quiere decir que, si una vez en pantalla modificamos el valor de dicho dato, el casillero no será reconstruido. Para que el cambio se haga efectivo será necesario cerrar la vista y volver a lanzar el casillero.
{% endhint %}

### Tipo de menú de contexto

El menú de contexto es el que aparece cuando el usuario final hace clic con el botón derecho del ratón. Los valores posibles son:

#### Ninguno

El objeto carecerá de menú de contexto.

#### Por defecto

El objeto dispondrá de un menú de contexto creado automáticamente por el sistema, que contendrá las opciones siguientes:

* **Alta de ficha**: si el objeto tiene asociado un formulario de altas, lo abrirá para que el usuario pueda añadir una ficha.
* **Modificación de ficha**: editará la ficha seleccionada en el formulario de modificación asociado al objeto.
* **Baja de ficha**: abrirá el formulario de bajas asociado al objeto.
* **Invertir**: invierte el orden de la lista, usando para ello el campo por el que se encuentra ordenada.
* **Filtrar**: permite al usuario establecer y aplicar un filtro al objeto.
* **Ordenar**: permite al usuario ordenar la lista por el campo que elija.
* **Quitar de la lista el seleccionado**: quita del objeto el registro que el usuario tenga seleccionado. No lo borra físicamente, sino que simplemente lo quita de la lista.

#### Por defecto extendido

El objeto dispondrá de un menú de contexto creado automáticamente por el sistema que, además de las opciones del menú por defecto, incluye las siguientes:

* **Modificar campo…**: permitirá al usuario modificar un campo de todos los registro de la lista.
* **Modificar campo si…**: permitirá al usuario modificar un campo de todos los registro de la lista que cumplan una determinada condición.
* **Exportar a XML**: permitirá al usuario exportar los registros de la lista a un fichero XML.

#### Personalizado

El menú de contexto del objeto será un objeto menú contenido en el proyecto.

### Menú de contexto

Esta propiedad solamente estará disponible cuando el valor de la propiedad [tipo de menú de contexto](#tipo-de-menu-de-contexto) sea **personalizado**. Nos permitirá seleccionar el objeto menú que queramos usar como menú de contexto del casillero.

### Comando

El comando es la instrucción que se ejecuta cuando el usuario final hace doble clic con el botón izquierdo del ratón sobre una celda del casillero. Los valores posibles son:

#### Ninguno

No hará nada.

#### Editar sobre casillero (obsoleto)

Se activará el formulario incluido en la casilla (el especificado en la propiedad [formulario](#formulario)) para la modificación de la ficha correspondiente a la celda pulsada. La edición del formulario se hará en la propia celda. Este método no usa el formulario directamente, sino que presenta una imagen del formulario que se calcula al crear el casillero por lo que, si el formulario contiene controles que no se cargan de forma inmediata como visores html o gráficos, éstos se mostrarán vacíos. Este método está obsoleto y se recomienda usar en su lugar [editar sobre el casillero optimizado](#editar-sobre-el-casillero-optimizado). Para editar un registro se debe hacer simple clic o doble clic, según esté configurado, para editar un registro.

#### Ejecutar proceso

Se ejecutará un objeto proceso contenido en el proyecto. El proceso a disparar deberá tener origen ficha de la tabla asociada al casillero.

#### Editar sobre el casillero optimizado

Similar al método [editar sobre casillero (obsoleto)](#editar-sobre-casillero-obsoleto) pero que usa directamente el formulario en la casilla y no una imagen del mismo. Además, carga directamente el formulario en edición, por lo que se puede editar directamente sobre él sin tener que hacer clic o doble clic para activarlo. Cuando se elige esta opción, el casillero se pone internamente en modo [optimizado](#optimizado), no hace falta configurar ese estilo.

### Abrir formulario de modificación

Si en la propiedad [formulario de modificación](#formulario-de-modificacion) hemos especificado un formulario, este comando abrirá ese formulario en una nueva ventana para que el usuario pueda editar la ficha seleccionada. Si no hay formulario seleccionado, no hará nada.

### Proceso

Esta propiedad solamente estará disponible cuando el valor de la propiedad [comando](#comando) sea **ejecutar proceso**. Nos permitirá seleccionar el objeto proceso que queramos usar como acción al pulsar sobre una celda del casillero. Este objeto proceso deberá tener como origen ficha de la tabla origen del casillero.

### Toolbar

Esta propiedad nos permitirá seleccionar el objeto toolbar que queramos adjuntar al casillero.

### Posición de la toolbar

Esta propiedad solamente estará disponible cuando se haya seleccionado un objeto toolbar en la propiedad [toolbar](#toolbar). Nos permitirá seleccionar la posición donde se aparcará el objeto toolbar. Los valores posibles son:

#### Arriba

Se aparcará en la parte superior del casillero.

#### Abajo

Se aparcará en la parte inferior del casillero.

### Formulario de alta

Formulario del proyecto en curso o de un proyecto heredado que será usado para dar de alta una ficha desde el casillero.

### Formulario de modificación

Formulario del proyecto en curso o de un proyecto heredado que será usado para editar una ficha desde el casillero. Si en la propiedad [comando](#comando) no hemos establecido el valor **abrir formulario de modificación**, al hacer doble clic sobre un elemento del casillero no se lanzará este formulario sino que se ejecutará el comando declarado en aquella propiedad.

### Formulario de baja

Formulario del proyecto en curso o de un proyecto heredado que será para eliminar una ficha desde el casillero.

### Timer (Milisegundos)

Es un reloj que permitirá ejecutar automáticamente uno o varios [manejadores de evento ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/manejador-de-evento)declarados en el casillero de forma periódica. En este parámetro se indicará el tiempo, en milisegundos, para cada iteración del timer. Si el valor es 0, querrá decir que no se activará el timer.

### Barra de scroll

Esta propiedad permite indicar si el casillero será distribuido en filas o en columnas según el número establecido en el parámetro c**olumnas/filas**. Los valores posibles son:

#### Vertical

El casillero será distribuido en columnas.

#### Horizontal

El casillero será distribuido en filas.

El tamaño del casillero tendrá que ser por lo menos, el que permita mostrar una casilla.


# Cesta

Se trata de un objeto que se utiliza para guardar una serie de registros de una tabla de datos para su posterior utilización en otras partes de la aplicación. El contenido de las mismas se almacena en memoria y, por tanto, se borrará una vez finalice la ejecución de la misma.

La cesta, por tanto, es de carácter local, esto es, su contenido será local a la máquina en la que se use. Si añadimos registros a una cesta desde una sesión de Velneo vClient esta cesta será local únicamente a esa sesión de Velneo vClient.&#x20;

Si añadimos registros a una cesta en un proceso ejecutado en tercer plano (en el servidor), la cesta será en la memoria de esa sesión de Velneo vServer y para esa instancia de datos en concreto.&#x20;

Una cesta de la compra podrá ser manejada o bien de forma directa por los usuarios finales del proyecto (ver el capítulo [Manejo de cestas](/velneo-vclient/funcionalidades-especificas/manejo-de-cestas-de-la-compra) o bien a través de [procesos,](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/procesos) usando los comandos de instrucción de [cestas](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/base-de-datos/cestas). Para crear un objeto de este tipo seleccionar la opción **nuevo objeto/cesta de la compra** del menú **objetos** de Velneo vDevelop o a través de la galería de objetos.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca al objeto dentro del [proyecto.](/velneo-vdevelop/proyectos-objetos-y-editores) Este identificador será el que usemos para referenciarlo en otras propiedades de otros objetos.

Constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un objeto no puede haber duplicidad.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del objeto. Se usará para presentar información del objeto en otros objetos y en los [inspectores](/velneo-vdevelop/inspectores).

Podemos definir una etiqueta por cada idioma presente en el proyecto.

### Estilos

Podemos definir el estilo:

#### Privado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del objeto.

### Tabla asociada

[Tabla](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/base-de-datos/tablas) de un [proyecto de datos ](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-organizacion/proyecto-de-datos-1-carpetas-esquemas-tablas-e-indices-complejos)cuyos [registros](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/arquitectura/listas-de-registros) podrán ser enviados a la cesta de la compra.

### Rejilla

Una cesta de la compra puede ser disparada como dock de un [marco.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/marco) El contenido de la misma será refrescado automáticamente por el sistema, a medida que vayamos operando con la misma en una misma sesión de Velneo vClient, o bien a través de procesos, o bien por su manejo por parte del usuario final.

{% hint style="warning" %}
Una cesta ha de tener asociada obligatoriamente una rejilla, en caso contrario, no se creará. Ni al invocarla directamente ni al intentar interactuar con ella desde procesos.
{% endhint %}


# ComboView

Es un objeto que sirve para presentar listas de registros de las tablas.

![](/files/-M7D7820LZJ6ySFS6v5t)\
Para crear un objeto de este tipo seleccionar la opción **nuevo objeto/comboview** del menú **objetos** de Velneo vDevelop o a través de la galería de objetos.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca al objeto dentro del proyecto. Este identificador será el que usemos para referenciarlo en otras propiedades de otros objetos.

Constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un objeto no puede haber duplicidad.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del objeto. Se usará para presentar información del objeto en otros objetos y en los inspectores.

Podemos definir una etiqueta por cada idioma presente en el proyecto.

### Estilos

Podemos definir los estilos:

#### Privado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

#### Arrastrable para copiar

Cuando la rejilla va a ser el origen en un evento de drag and drop, si está activado este estilo, en ejecución los items arrastrados no serán quitados de la misma tras ejecutar el evento de drop.

#### Arrastrable para mover

Cuando la rejilla va a ser el origen en un evento de drag and drop, si está activado este estilo, en ejecución los items arrastrados serán quitados de la misma tras ejecutar el evento de drop.

#### Sin barra de título (Sólo diálogos)

Permite omitir la barra de título de la ventana. Solamente funcional en cuadros de diálogo.

#### Sin menú de sistema

Permite omitir el menú de sistema de la ventana.

#### Sin botón maximizar

Permite ocultar el botón maximizar de la ventana.

#### Sin botón minimizar

Permite ocultar el botón minimizar de la ventana.

#### Sin botón cerrar

Permite ocultar el botón de cierre de la ventana.

#### **Personalizable**

Si activamos este estilo, el objeto podrá ser reemplazado por otro del mismo tipo en tiempo de ejecución mediante un objeto [reemplazo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/reemplazo).

### Comentarios

Esta propiedad nos permite documentar el uso del objeto.

### Tabla asociada

Tabla de un proyecto de datos heredado cuyos registros van a ser visualizados en el objeto.

### Icono

Campo de tipo objeto dibujo de la tabla en curso o de una tabla enlazada que se mostrará acompañando al contenido.

### Icono nulo

Permite definir el dibujo que se mostrará a modo de icono en aquellos registros del ComboView que no tengan ningún contenido en el campo objeto dibujo especificado en el parámetro anterior. Determinará el tamaño por defecto del control. Si no está definido, el tamaño por defecto será de 16×16.

{% hint style="warning" %}
Es obligatorio asignar un icono en esta propiedad pues será el que se use para determinar el tamaño de cada ítem contenido en el objeto.
{% endhint %}

### Contenido

En esta propiedad indicaremos qué texto es lo que va a mostrarse de cada registro en el ComboView mediante una fórmula, que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Fuente

En esta propiedad seleccionaremos la fuente que usará el objeto. Pulsar el botón que aparece al editar esta propiedad para abrir el selector de fuentes.

### Color texto

En esta propiedad seleccionaremos el color del texto. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Formulario de alta

Formulario del proyecto en curso o de un proyecto heredado que será usado para dar de alta una ficha desde el objeto.

### Formulario de modificación

Formulario del proyecto en curso o de un proyecto heredado que será para editar una ficha desde el objeto.

### Formulario de baja

Formulario del proyecto en curso o de un proyecto heredado que será para eliminar una ficha desde el objeto.

### Tipo de menú de contexto

El menú de contexto es el que aparece cuando el usuario final hace clic con el botón derecho del ratón. Los valores posibles son:

#### Ninguno

El objeto carecerá de menú de contexto.

#### Por defecto

El objeto dispondrá de un menú de contexto creado automáticamente por el sistema, que contendrá las opciones siguientes:

* **Alta de ficha**: ai el objeto tiene asociado un formulario de altas, lo abrirá para que el usuario pueda añadir una ficha.
* **Modificación de ficha**: editará la ficha seleccionada en el formulario de modificación asociado al objeto.
* **Baja de ficha**: abrirá el formulario de bajas asociado al objeto.
* **Invertir**: invierte el orden de la lista, usando para ello el campo por el que se encuentra ordenada.
* **Filtrar**: permite al usuario establecer y aplicar un filtro al objeto.
* **Ordenar**: permite al usuario ordenar la lista por el campo que elija.
* **Quitar de la lista el seleccionado**: quita del objeto el registro que el usuario tenga seleccionado. No lo borra físicamente, sino que simplemente lo quita de la lista.

#### Por defecto extendido

El objeto dispondrá de un menú de contexto creado automáticamente por el sistema que, además de las opciones del menú por defecto, incluye las siguientes:

* **Modificar campo…**: permitirá al usuario modificar un campo de todos los registro de la lista.
* **Modificar campo si…**: permitirá al usuario modificar un campo de todos los registro de la lista que cumplan una determinada condición.
* **Exportar a XML**: permitirá al usuario exportar los registros de la lista a un fichero XML.

#### Personalizado

El menú de contexto del objeto será un objeto menú contenido en el proyecto.

### Menú de contexto

Esta propiedad solamente estará disponible cuando el valor de la propiedad [tipo de menú de contexto](#tipo-de-menu-de-contexto) sea **personalizado**. Nos permitirá seleccionar el objeto menú que queramos usar como menú de contexto del objeto.

### Toolbar

Si seleccionamos una toolbar en este parámetro, cada vez que usemos este objeto, llevará embebida la toolbar seleccionada, que podrá situarse, o bien encima o bien debajo del objeto.

### Timer (Milisegundos)

Es un reloj que permitirá ejecutar automáticamente uno o varios eventos declarados en el objeto de forma periódica. En este parámetro se indicará el tiempo, en milisegundos, para cada iteración del timer. Si el valor es 0, querrá decir que no se activará el timer.

Cuando este objeto es usado en un formulario, no es posible quitar la propiedad Alto del control en el formulario, por lo que se ha de tener en cuenta que ésta, aún estando disponible, no se tendrá en cuenta, y el alto del control se calculará en función del tamaño del icono por defecto.

Este objeto usado en un multivista horizontal puede hacer que no se muestre con el alto que esperamos, debido al tamaño que tiene comboview.


# Control SVG

Se trata de un objeto con el que podremos crear controles tipo botón, interruptor, etc. para su posterior uso en [formularios](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/formularios). Este objeto estará compuesto por varias [imágenes Svg ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/imagen-svg-control)(gráficos vectoriales), cada una de las cuales se corresponderá con un estado del control. Para crear un objeto de este tipo seleccionar la opción **nuevo objeto/control svg** del menú **objetos** de Velneo vDevelop o a través de la galería de objetos.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca al objeto dentro del proyecto. Este identificador será el que usemos para referenciarlo en otras propiedades de otros objetos.

El **identificador** constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un objeto no puede haber duplicidad.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del objeto. Se usará para presentar información del objeto en otros objetos y en los [inspectores.](/velneo-vdevelop/inspectores)

Podemos definir una etiqueta por cada idioma presente en el [proyecto.](/velneo-vdevelop/proyectos-objetos-y-editores)

### Estilos

#### **Privado**

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

#### **Personalizable**

Si activamos este estilo, el objeto podrá ser reemplazado por otro del mismo tipo en tiempo de ejecución mediante un objeto [reemplazo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/reemplazo).

### Comentarios

Esta propiedad nos permite documentar el uso del objeto.

### Tipo de control

Esta propiedad nos permite definir el tipo de control que conformará el objeto. Los valores posibles son:

### Botón Svg

Permite crear un control gráfico de tipo botón. Al seleccionarlo se activarán tres nuevas propiedades, que son:

### SVG 1

En esta propiedad tendremos que seleccionar un objeto imagen Svg incluido en el proyecto o en proyectos heredados, que se corresponda con el estado **normal** del botón.

![](/files/-M7D77xriAVndGqjMwmu)

### SVG 2

En esta propiedad tendremos que seleccionar un objeto imagen Svg incluido en el proyecto o en proyectos heredados, que se corresponda con el estado **pulsado** del botón.

![](/files/-M7D77xsm3XI5spZcBLr)

### SVG 3

En esta propiedad tendremos que seleccionar un objeto imagen Svg incluido en el proyecto o en proyectos heredados, que se corresponda con el estado del botón cuando el cursor del ratón pase por encima del mismo (**mouseover**).

![](/files/-M7D77xtxRYXvqIuyc05)

### Interruptor Svg

Permite crear un control gráfico de tipo interruptor. Al seleccionarlo se activarán dos nuevas propiedades, que son:

### SVG 1

En esta propiedad tendremos que seleccionar un objeto imagen Svg incluido en el proyecto o en proyectos heredados, que se corresponda con el estado **apagado/off** del interruptor.

![](/files/-M7D77xu3JU3vQohifpw)

### SVG 2

En esta propiedad tendremos que seleccionar un objeto imagen Svg incluido en el proyecto o en proyectos heredados, que se corresponda con el estado **encendido/on** del interruptor.

![](/files/-M7D77xvZmegrc3h4e96)

### Switch Svg

Permite crear un control gráfico de tipo interruptor-deslizador.

![](/files/-M7D77xwKl0UVexlOvmC)

Al seleccionarlo se activarán cuatro nuevas propiedades, que son:

### SVG 1

En esta propiedad tendremos que seleccionar un objeto imagen Svg incluido en el proyecto o en proyectos heredados, que se corresponda con el **fondo** del interruptor-deslizador.

![](/files/-M7D77xxlAittyDI3Mi2)

### SVG 2

En esta propiedad tendremos que seleccionar un objeto imagen Svg incluido en el proyecto o en proyectos heredados, que se corresponda con el fondo del interruptor-deslizador cuando el cursor del ratón pase por encima del mismo (**mouseover**).

![](/files/-M7D77xy8Hp68YYrvV7y)

### SVG 3

En esta propiedad tendremos que seleccionar un objeto imagen Svg incluido en el proyecto o en proyectos heredados, que se corresponda con el estado **apagado/off** del interruptor-deslizador.

![](/files/-M7D77xzvhwtx487m81U)

### SVG 4

En esta propiedad tendremos que seleccionar un objeto imagen Svg incluido en el proyecto o en proyectos heredados, que se corresponda con el estado **encendido/on** del interruptor-deslizador.

![](/files/-M7D77y-o2wC70e7bzg-)

### Reloj indicador Svg

Permite crear un control gráfico de tipo reloj indicador.

![](/files/-M7D77y0B193ETsB6cMG)

Al seleccionarlo se activarán las siguientes propiedades:

### SVG 1

En esta propiedad tendremos que seleccionar un objeto imagen Svg incluido en el proyecto o en proyectos heredados, que se corresponda con el **fondo** del reloj indicador.

![](/files/-M7D77y1fd89IVr5IAJ2)

### SVG 2

En esta propiedad tendremos que seleccionar un objeto imagen Svg incluido en el proyecto o en proyectos heredados, que se corresponda con la **sombra de la aguja** del reloj indicador.

![](/files/-M7D77y2y5V9cuRyScZ2)

### SVG 3

En esta propiedad tendremos que seleccionar un objeto imagen Svg incluido en el proyecto o en proyectos heredados, que se corresponda con la **aguja** del reloj indicador.

![](/files/-M7D77y3z33pHA0zI5Ie)

### SVG 4

En esta propiedad tendremos que seleccionar un objeto imagen Svg incluido en el proyecto o en proyectos heredados, que se corresponda con la **capa de superposición** del reloj indicador.

![](/files/-M7D77y4krtnkkUpkf5b)

### Origen x y Origen y

Coordenadas del punto de anclaje de la aguja.

### Mínimo y Máximo

Valores mínimo y máximo que contemplará el control.

### Ángulo inicio y Ángulo final

Ángulos inicial y final de la aguja del reloj indicador.


# Dispositivo serie

Este objeto permite establecer comunicaciones con dispositivos externos conectados al puerto serie desde una aplicación de Velneo. Para crear un objeto de este tipo seleccionar la opción **nuevo objeto/dispositivo serie** del menú **objetos** de Velneo vDevelop o a través de la galería de objetos.

{% hint style="info" %}
Este objeto es funcional en Windows, Linux y macOS.
{% endhint %}

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca al objeto dentro del proyecto. Este identificador será el que usemos para referenciarlo en otras propiedades de otros objetos.

Constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un objeto no puede haber duplicidad.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del objeto. Se usará para presentar información del objeto en otros objetos y en los inspectores.

Podemos definir una etiqueta por cada idioma presente en el proyecto.

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del objeto.

### Configuración WIN

Esta propiedad nos permite tanto establecer la configuración del dispositivo serie para sistemas operativos Windows así como probar si la comunicación con dicho dispositivo es o no correcta. Para ello pulsaremos el botón que aparece cuando situamos el cursor en esta propiedad, lo que provocará la apertura de una ventana, en la que los parámetros a configurar son:

#### Puerto

Que podrá ser un puerto comprendido entre COM1 y COM256. En el rango de puertos seleccionable encontraremos un rango de puertos con el prefijo .\\, que permite, en Windows, abrir puertos de serie COM superiores a COM9 y acceder a más dispositivos desde la misma máquina.

#### Baudios

Tendremos que escogerlos de entre una lista prefijada, cuyos valores mínimo y máximo son 110 y 256000, respectivamente.

#### DataBits

Bits de datos. Que podrá ser un valor comprendido entre 5 y 8.

#### Paridad

Cuyos valores posibles son:

* None.
* Even.
* Odd.
* Space.

#### StopBits

Bits de parada. Que podrá ser 1 ó 2.

#### FlowControl

Control de flujo. Cuyos valores posibles son:

* None.
* Xon/Xoff.
* Hardware.

### Configuración POSIX

Esta propiedad nos permite tanto establecer la configuración del dispositivo serie para sistemas operativos Linux/Mac OS así como probar si la comunicación con dicho dispositivo es o no correcta. Para ello pulsaremos el botón que aparece cuando situamos el cursor en esta propiedad, lo que provocará la apertura de una ventana, en la que habrá que configurar los parámetros estándar de puerto serie:

#### Puerto

Que podrá ser ttyS0 o ttyS1.

#### Baudios

Tendremos que escogerlos de entre una lista prefijada, cuyos valores mínimo y máximo son 50 y 115200, respectivamente.

#### DataBits

Bits de datos. Que podrá ser un valor comprendido entre 5 y 8.

#### Paridad

Cuyos valores posibles son:

* None.
* Even.
* Odd.
* Space.

#### StopBits

Bits de parada. Que podrá ser 1 ó 2.

#### FlowControl

Control de flujo. Cuyos valores posibles son:

* None.
* Xon/Xoff.
* Hardware.

### Timeout(segs)

Tiempo, en segundos, que quedará a la espera de una respuesta al ejecutarse un comando “Recibir”. Transcurrido ese tiempo, el contenido que haya transmitido el dispositivo será enviado a la aplicación de Velneo para ser procesado. Por ejemplo, si tenemos un timeout de 5 segundos y lanzamos un comando “ls” sobre un dispositivo con un comando “Enviar” y después ejecutamos el comando “Recibir”, puede asegurarse que el comando “Recibir” no finalizará hasta que hayan trascurrido los 5 segundos fijados.

Desde esa misma ventana el usuario también podrá probar si la comunicación con el dispositivo es o no correcta, para ello se pulsará el botón “Test”; al hacerlo se presentará una ventana en la que el usuario podrá establecer el codec a usar, escribir la cadena a enviar al dispositivo serie y pulsar el botón “Enviar”; si el dispositivo envía una respuesta, ésta será mostrada bajo el epígrafe “Recibido”.

Esta ventana nos será de gran utilidad pues nos permitirá comprobar en tiempo de diseño de la aplicación (sin necesidad de haber programado nada), si la configuración del puerto serie es correcta y es posible la comunicación con el dispositivo. Esta operación como paso previo a la programación del tráfico de entrada/salida es muy útil, ya que en caso de haya problemas al ejecutar un proyecto, nos permitirá descartar un problema de configuración, pudiendo centrarnos, por tanto, en la programación para solventar el problema.

Las propiedades Configuración WIN y Configuración POSIX permiten fijar la configuración para el puerto serie de manera totalmente independiente, según se ejecute la aplicación en un entorno Windows o Linux/Mac OS.

En el manejo de puertos serie, observamos que la configuración de Linux Y Mac OS, llamada POSIX es común, esto se debe a que ambos gestionan los puertos serie bajo este mismo estándar, siendo así compatibles.

No obstante es probable que aunque se pueda configurar de distinto modo según la plataforma Windows/POSIX, dicha configuración sea común a ambos si el dispositivo conectado es el mismo.

La interacción con el dispositivo serie deberá establecerse mediante procesos o funciones, usando comandos de instrucción de proceso de [Puerto serie.](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/comunicacion/puerto-serie)

Si queremos que la configuración definida en las propiedades de este objeto pueda ser modificada por el usuario final, podremos hacerlo desde un proceso o función, mediante el uso del comando de instrucción [Puerto serie: configurar dispositivo](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/comunicacion/puerto-serie#puerto-serie-configurar-dispositivo).

{% hint style="warning" %}
Con el fin de garantizar tanto la estabilidad como la seguridad de [Velneo vServer](/velneo-vserver/que-es-velneo-vserver) el acceso a dispositivos serie desde procesos ésta permitido solamente en [procesos ](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/procesos)ejecutados en primer o segundo [plano](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/procesos/procesos-1-2-y-3-plano-cuando-usar-cada-uno) (ejecución en cliente), no siendo posible hacerlo desde procesos ejecutados en tercer plano (en el servidor).
{% endhint %}


# Formulario

Un formulario es el objeto de [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) que permite introducir, modificar y ver los distintos campos de una ficha o registro de una [tabla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla) por medio de subobjetos denominados [**controles**](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario#controles). Para ello debe tener una tabla asociada de la que podrá presentar los registros.

![](/files/-M7D78AifONOIsaRsS2y)

Como **entrada** y **salida** el formulario tiene ficha de la tabla asociada.

También puede ser usado para inicializar valores que se usarán como contenidos iniciales en [búsquedas](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/busqueda).

**Sin origen**, es decir, sin tabla asociada podemos usar el formulario como menú tipo formulario pudiendo usar controles con contenido, lanzar opciones o editar [variables globales](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/variables-globales), mostrar [dibujos](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/dibujo), etc. Para crear un formulario seleccionar la opción **nuevo objeto/formulario** del menú **objetos** de Velneo vDevelop.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca un formulario dentro del proyecto de aplicación. Este identificador será el que usemos para referenciarlo en otras propiedades de otros [objetos](/velneo-vdevelop/proyectos-objetos-y-editores).

El **identificador** constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un formulario no puede haber duplicidad.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del formulario. Se usará para presentar información del formulario en objetos y en los [inspectores](/velneo-vdevelop/inspectores).

Podemos definir una etiqueta por cada idioma presente en el proyecto.

### Estilos

Podemos definir los estilos:

#### **Privado**

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

#### **Punto de inserción**

Permitirá establecer una relación de [herencia inversa ](/velneo-vdevelop/herencia)con un objeto de un proyecto que hereda el proyecto actual. La activación de este estilo hará que el formulario no pueda ser editado ya que su contenido será establecido en el proyecto heredado por éste. Ver el capítulo relativo a sub-objeto [inserción ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/insercion)para ampliar información al respecto. Un formulario con este estilo activado se distinguirá visualmente en el panel de proyectos por usar una tipografía cursiva en su identificador:

![](/files/-M7D78AkxTpBA6X5Oa7X)

En un formulario definido como punto de inserción no solamente se puede insertar un único formulario, sino que se pueden insertar n formularios, por lo tanto, este tipo de formularios solamente podrá ser usado en objetos que soporten multiplicidad, como puede ser el [separador formularios,](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/contenedores/separador-de-formularios) por ejemplo.

#### **Bloqueo duro**

Propiedad específica para modificación de fichas; no para altas. El sistema de bloqueos por defecto en formularios es el *bloqueo blando*, esto quiere decir que si dos usuarios editan la misma ficha, modifican y aceptan cambios, si no hay colisión (es decir, si han modificado [campos](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) diferentes) se fundirán las modificaciones de ambos. Si hay colisión, es decir, que modifican un mismo campo, el valor que mantendrá la ficha en ese campo será el del usuario haya guardado la ficha en último lugar. Por el contrario, el bloqueo duro implica que se bloqueará el registro editado en el formulario, provocando el inicio de una [transacción](/velneo-vadmin/monitorizacion#transacciones) y lo bloqueará en exclusiva en modo lectura/escritura hasta que finalice la transacción, por lo que no podrá ser modificado por otros usuarios mientras el formulario esté abierto. Es fundamental conocer las implicaciones derivadas del bloqueo duro, por lo que es aconsejable leer detenidamente el capítulo dedicado al [sistema de bloqueos](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/procesos/bloqueo-blando-vs-bloqueo-duro) de Velneo vServer.

{% hint style="warning" %}
Si usamos un formulario con bloqueo duro como dock el registro editado en el mismo permanecerá bloqueado todo el tiempo ya que, aunque se cierre el dock, el formulario sigue abierto pues cuando cerramos un dock no cerramos el objeto contenido en él sino que lo ocultamos.
{% endhint %}

#### **Sin barra de título (Sólo diálogos)**

Permite omitir la barra de título de la ventana. Solamente funcional en cuadros de diálogo. En el caso de Windows, debido a imposición del sistema operativo, dejará una pequeña banda blanca en la parte superior de la ventana de 6 píxels.

#### **Sin menú de sistema**

Permite omitir el menú de sistema de la ventana.

#### **Sin botón maximizar**

Permite ocultar el botón maximizar de la ventana.

#### **Sin botón minimizar**

Permite ocultar el botón minimizar de la ventana.

#### **Sin botón cerrar**

Permite ocultar el botón de cierre de la ventana.

En Linux, el funcionamiento en Linux de los botones maximizar, minimizar y cerrar en cuadro de diálogo dependen de la distribución y el gestor de ventanas. Por ejemplo, Ubuntu con el gestor Gnome no presenta estos controles, y sin embargo tiene otras funcionalidades.

#### Retardo señales de  hover

Este estilo nos permite aplicar un retraso de 200ms antes de emitir las señales de [hover: entrar](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/conexion-de-evento#hover-entrar) y [hover: salir](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/conexion-de-evento#hover-salir).

#### **Optimizado**

Si este estilo está desactivado, Cuando Se cargan formularios que contienen [campos](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/campo) de tipo objeto o campos de tablas enlazadas, fórmulas, etc. éstos se carga el objeto mientras se está construyendo el formulario, lo que puede ralentizar su apertura. Si se activa este estilo, el formulario será cargado de forma inmediata y esos campos serán cargados en segundo plano.

Si el formulario a su vez contiene otras vistas de datos (subformularios, rejillas, etc.) los cargará también de forma optimizada aunque no tengan activado este estilo.

{% hint style="warning" %}
Si tenemos activado este estilo e intentamos guardar cambios en el formulario cuando aún no se han cargado los datos, el sistema no dejará guardar la ficha y emitirá el mensaje: "Datos pendientes de cargar".
{% endhint %}

#### **Personalizable**

Si activamos este estilo, el objeto podrá ser reemplazado por otro del mismo tipo en tiempo de ejecución mediante un objeto reemplazo.

#### **Vista única**

Si activamos este estilo, al abrir un formulario sin origen&#x20;que se abre en modo vista, antes de abrirse el formulario&#x20;se comprueba si ya existe una instancia del mismo en la vista principal. En caso de que ya exista se convierte en la pestaña activa&#x20;y se cancela la creación del nuevo formulario.

Al abrir un formulario con origen&#x20;que se abre en modo vista, antes de abrirse el formulario&#x20;se comprueba si ya existe una instancia en la vista principal de ese formulario con ese registro. En caso de que ya exista se convierte en la pestaña activa&#x20;y se cancela la creación del nuevo formulario.

### Comentarios

Esta propiedad nos permite documentar el uso del formulario.

### Tabla asociada

Tabla de un [proyecto de datos](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-organizacion/proyecto-de-datos-1-carpetas-esquemas-tablas-e-indices-complejos) heredado cuyos registros van a ser creados, modificados o visualizados en el formulario.

### Alto

Longitud vertical en píxeles del formulario. Es la longitud con la que se presenta en edición y con la que por defecto se presente en ejecución, pudiendo el usuario redimensionar el formulario si así lo especificamos.

### Ancho

Longitud horizontal en píxeles del formulario. Es la longitud con la que se presenta en edición y con la que por defecto se presente en ejecución, pudiendo el usuario redimensionar el formulario si así lo especificamos.

### Siempre cuadro de diálogo

Los valores posibles son:

#### Verdadero

El formulario se presentará en forma modal, bloqueando el interfaz en primer plano.

#### Falso

El formulario se presentará en forma de vista, como una ventana más del interfaz, en función del sistema de ventanas seleccionado.

{% hint style="warning" %}
**Excepciones**: siempre se abrirán como cuadro de diálogo los formularios llamados desde proceso y desde otros cuadros de diálogo.
{% endhint %}

### Condición de activo

Permite condicionar que el formulario esté activo en base a una [fórmula](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula) que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello debemos pulsar el botón que aparece al editar esta propiedad y que nos abre el asistente.

### Título opcional

Permite definir el título del formulario por medio de una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello debemos pulsar el botón que aparece al editar esta propiedad y que nos abre el asistente.

### Icono

Permite definir el dibujo que se mostrará a modo de icono en la barra de título del formulario.

### Color de fondo

Color que presenta el fondo del formulario. En caso de que hayamos escogido una paleta de colores, el color asignado será el de **ventana**.

### Dibujo de fondo

Objeto dibujo que se presenta en el fondo del formulario.

### Aspecto de dibujo

En el caso de que hayamos seleccionado un objeto dibujo para que se presente como dibujo de fondo, podremos especificar la forma en que se presente:

#### **Original centrado**

El dibujo se muestra con el tamaño original centrado en el formulario.

#### **Estirar/encoger**

El dibujo se muestra ajustado al tamaño del formulario. Si el ancho y alto del dibujo no son proporcionales el dibujo se verá deformado si el tamaño del formulario no tiene la misma relación de aspecto.

#### **Proporcionar sin ampliar**

El dibujo se mostrará en su tamaño original o se reducirá de forma proporcionada para adaptarse al tamaño del control, en el caso que éste sea menor que el tamaño de la imagen.

#### Proporcionar

El dibujo se muestra a escala proporcional ajustado al tamaño del formulario, sin superar el tamaño de éste. Si el dibujo es pequeño y el formulario es grande se hará un zoom sobre el tamaño original de la imagen para adaptarla al formulario.

#### Mosaico

El dibujo se muestra con el tamaño original repetido horizontal y verticalmente las veces necesarias para rellenar por completo el fondo del formulario.

#### Original

El dibujo se muestra con el tamaño original, alineado en la parte superior izquierda del formulario.

### Timer (Milisegundos)

Es un reloj que permitirá ejecutar automáticamente uno o varios [manejadores de evento](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/manejador-de-evento) declarados en el formulario de forma periódica. En este parámetro se indicará el tiempo, en milisegundos, para cada iteración del timer. Si el valor es 0, querrá decir que no se activará el timer.

### Tipo de layout

Permite configurar el uso de [layouts](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/layout) para la distribución, organización y gestión del tamaño de los controles.

#### Ninguno

Está desactivada la distribución por medio de layouts.

#### Horizontal

Los layouts y controles que contiene el formulario se distribuyen horizontalmente.

#### Vertical

Los layouts y controles que contiene el formulario se distribuyen verticalmente.

#### Grid

Los layouts y controles que contiene el formulario se distribuyen como celdas en una rejilla.

### Alineamiento horizontal

Los layouts y controles que contiene el formulario se distribuyen horizontalmente en función de los valores posibles:

#### Izquierda

Los layouts y controles se distribuyen horizontalmente alineados hacia la izquierda.

#### Derecha

Los layouts y controles se distribuyen horizontalmente alineados hacia la derecha.

#### Centrado

Los layouts y controles se distribuyen horizontalmente centrados.

#### Justificado

Los layouts y controles se distribuyen horizontalmente justificados.

### Alineamiento vertical

Los layouts y controles que contiene el formulario se distribuyen verticalmente en función de los valores posibles:

#### Arriba

Los layouts y controles se distribuyen verticalmente alineados hacia arriba.

#### Abajo

Los layouts y controles se distribuyen verticalmente alineados hacia abajo.

#### Centrado

Los layouts y controles se distribuyen verticalmente centrados.

### Espaciado

Espacio de separación en píxeles entre los layouts y controles que se distribuyen en el formulario.

### Margen izquierdo

Espacio de separación en píxeles, en el margen izquierdo, de los controles incluidos en el formulario.

### Margen derecho

Espacio de separación en píxeles, en el margen derecho, de los controles incluidos en el formulario.

### Margen superior

Espacio de separación en píxeles, en el margen superior, de los controles incluidos en el formulario.

### Margen inferior

Espacio de separación en píxeles, en el margen inferior, de los controles incluidos en el formulario.

Si estamos editando un formulario en el editor de formularios, para editar sus propiedades bastará con que hagamos clic dentro del editor de formularios en cualquier punto fuera del área del formulario.

## Asistente para la creación de formularios

Cuando en un proyecto de aplicación creamos un formulario, se abrirá un asistente que nos facilitará su creación:

Las propiedades de este primer paso del asistente son:

### Tabla asociada

Podremos tanto seleccionar una tabla de un proyecto de datos heredado cuyos registros van a ser creados, modificados o visualizados en el formulario como seleccionar **ninguna**, si no queremos asociar el formulario a tabla alguna.

### Nombre (requerido)

Etiqueta alfanumérica que servirá como descriptor del formulario. Se usará para presentar información del formulario en objetos y en los inspectores. Podemos definir una etiqueta por cada idioma presente en el proyecto. Este dato será también usado para generar el identificador del objeto que va a ser creado.

En la parte central de este formulario podremos seleccionar una plantilla para distribuir los distintos controles que contendrá nuestro formulario. Si no queremos aplicar ningún tipo de plantilla seleccionaremos la llamada **vacía** (esto desactivará las propiedades siguientes); en caso contrario, seleccionaremos con un clic la deseada.

Los controles podrán ser distribuidos en los distintos bloques indicados en la plantilla seleccionada.

### Generar layouts

Activaremos esta opción si queremos que el formulario a crear contemple layouts.

### Bloque de botones

Activaremos esta opción si queremos que el formulario a crear contenga un bloque para situar botones.

### Posición

Si la opción anterior está activada, en esta indicaremos en qué posición será situado el bloque de botones. Los valores posibles son:

#### Abajo

El bloque de botones será creado en la parte inferior del formulario.

#### Derecha

El bloque de botones será creado en la parte derecha del formulario.

#### Izquierda

El bloque de botones será creado en la parte izquierda del formulario.

#### Arriba

El bloque de botones será creado en la parte superior del formulario.

Si hemos seleccionado la plantilla **vacía** el asistente finalizará, se creará el formulario vacío y será editado en el editor de formularios.

Si hemos seleccionado cualquier otro tipo de plantilla, pulsaremos el botón “siguiente” para ir al siguiente paso del asistente; donde tendremos que seleccionar los campos que irán en cada bloque que va a generarse en el formulario. Por cada bloque existirá una pestaña y en ella se indicarán los campos a incluir en el mismo. Además, si en el paso anterior del asistente hemos activado la propiedad Bloque de botones aparecerá también la pestaña correspondiente al mismo:

![](/files/-M7D78Anxr3EpGZfAv__)

Para añadir un campo o una selección de campos en un bloque seleccionaremos la pestaña correspondiente al bloque deseado y pulsaremos el botón ![](/files/-M7D78AoQlj5CUvCPIHV). Para añadir todos los campos de la tabla en una pestaña pulsaremos el botón ![](/files/-M7D78ApeMqMcPgKxWBU). En el primer caso se abrirá una ventana con la lista de campos de la tabla, con una casilla de verificación a la izquierda de cada uno. Activar la casilla de cada uno de los campos que queramos incluir en el bloque y pulsar el botón “Aceptar” de dicha ventana.

El orden en que se muestran los campos seleccionados será el orden en el que serán creados en el formulario. Podemos cambiar la posición de un campo usando los botones ![](/files/-M7D78AqnOw7cz8f_2eI)![](/files/-M7D78AxNzbtoio61FPe) de la toolbar incluida en la pestaña.

Podremos borrar un campo pulsando el botón ![](/files/-M7D787tu4HMVJcDkAKv).

A continuación podemos definir las siguientes propiedades:

Distribución: en esta propiedad seleccionaremos cuál va a ser la posición de las etiquetas con respecto a los controles de edición correspondientes. Los valores posibles son:

![](/files/-M7D78AtXKwydlJG4pwJ)

Estirar controles: si esta propiedad está activa, todos los controles de un bloque serán creados con la misma longitud; si está inactiva serán creados según el tipo y longitud del campo que editen.

Una vez establecido el contenido de cada bloque, si en el paso anterior del asistente hemos activado la propiedad Bloque de botones, accederemos a la pestaña Botones para configurar su apariencia.

El sistema por defecto asume la creación de dos botones, “Aceptar” y “Cancelar”, ambos ya programados con las funciones de grabación y cancelación de ficha, respectivamente. Si queremos añadir más botones, pulsaremos el botón ![](/files/-M7D78AxNzbtoio61FPe) de la barra de herramientas incluida dentro de esta pestaña. Al hacerlo, nos ofrecerá dos posibilidades:

Sin especificar: añadirá un botón genérico, es decir, sin ninguna función programada. Ese mismo tipo de botón también podremos obtenerlo pulsando directamente el botón ![](/files/-M7D78AvX7iBfu_qbaH_) de la toolbar incluida en esta pestaña.

Eliminar: añadirá un botón ya programado con la función que elimina la ficha editada.

El orden en que se muestran los botones será el orden en el que serán creados en el formulario. Podemos cambiar la posición de un botón usando los botones ![](/files/-M7D78AqnOw7cz8f_2eI)![](/files/-M7D78AxNzbtoio61FPe) de la toolbar incluida en la pestaña.

Podremos borrar un botón pulsando el botón ![](/files/-M7D787tu4HMVJcDkAKv).

Finalmente, seleccionaremos el modo en que el los botones serán alineados con respecto al formulario en la propiedad **alineamiento horizontal**:

* **Izquierda**: los botones sean alineados a la izquierda del bloque.
* **Derecha**: los botones sean alineados a la derecha del bloque.
* **Centrado**: los botones sean centrados dentro del bloque.
* **Justificado**: los botones sean justificados dentro del bloque.

Pulsar el botón “Finalizar” para terminar el asistente. Una vez hecho esto el formulario será añadido a nuestro proyecto y editado.

## Editor de formularios

[Velneo vDevelop ](/velneo-vdevelop/introduccion)incorpora un editor visual para facilitar la creación de un formulario. Para abrirlo bastará con hacer doble clic sobre un objeto de tipo formulario y será mostrado en el panel central de Velneo vDevelop.

En la parte izquierda del editor de formularios se incluye la barra de controles. Permite crear los distintos controles que formarán parte del formulario. Éstos se encuentra agrupados por tipo.

El comando ![](https://s3-eu-west-1.amazonaws.com/dl.velneo.com/es/productos/v7/ayuda/20/velneo_vdevelop/img/res_351.jpg)**Modo de edición** se usa para mover controles o cambiar su tamaño.

Para crear un control en un formulario seleccionar el comando adecuado de la barra de controles del editor de formularios o seleccionar la opción adecuada dentro del menú **objetos**, sub-menú **nuevo objeto**. Una vez seleccionado el control, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

El control será creado con un identificador por defecto y con unas dimensiones concretas, en función del tipo de control de que se trate. Al final de esta página encontrarás una [tabla](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario#tabla) donde, entre otra información, podrás ver el identificador por defecto que se asigna a cada control y sus dimensiones por defecto.

Para cambiar el tamaño de un control dentro de un formulario hacer un clic con el botón izquierdo del ratón sobre el mismo, esto hará que el control aparezca seleccionado y rodeado por una serie de cuadraditos rojos, llamados trackers, hacer clic sobre uno de ellos y, sin soltar el botón, arrastrarlo hasta la posición deseada y soltar:

![](/files/-M7D78AzH_HPboUl64gw)

También podremos modificar directamente el valor numérico de su tamaño (ancho/alto) en las propiedades del mismo.

Para eliminar un control en el formulario seleccionarlo con un clic del ratón dentro del editor del formulario y pulsar la tecla Supr.

Para mover un control dentro de un formulario hacer un clic con el botón izquierdo del ratón sobre el mismo y, sin soltar el botón, arrastrar hasta la posición deseada y soltar. También podremos modificar directamente el valor numérico de su posición X e Y en las propiedades del mismo.

En la parte superior del editor de formularios se incluye la barra de maquetación. Nos permite maquetar los distintos controles que se incluyan en el formulario. Los comandos que contiene son:

![](/files/-M7D78B-2PfH9fBaWWt0)**Alinea izquierda**: alinea los controles seleccionados por el borde izquierdo del control seleccionado en último lugar.

![](/files/-M7D78B0cvzthCqZ4Ej8) **Alinea derecha**: alinea los controles seleccionados por el borde derecho del control seleccionado en último lugar.

![](/files/-M7D78ATEQ8WWxonbwzo)**Alinea arriba**: alinea los controles seleccionados por el borde superior del control seleccionado en último lugar.

![](/files/-M7D78B21QGTh1OyQpdV)**Alinea abajo**: alinea los controles seleccionados por el borde inferior del control seleccionado en último lugar.

![](/files/-M7D78B30K4FgFJ0hc1G) **Reparto horizontal**: distribuye horizontalmente los controles seleccionados dejando la misma separación entre ellos.

![](/files/-M7D78B4AM3uDVi0Lfm8) **Reparto vertical**: distribuye verticalmente los controles seleccionados dejando la misma separación entre ellos.

![](/files/-M7D78AZnpIcwwuavxHW) **Adjuntar horizontal**: alinea los botones seleccionados horizontalmente con respecto al que haya sido seleccionado en último lugar.

![](/files/-M7D78A_p5EQr63PRxu4) **Adjuntar vertical**: alinea los botones seleccionados verticalmente con respecto al que haya sido seleccionado en último lugar.

![](/files/-M7D78B7Luz1F2ksEEfz) **Centrar horizontal**: centra horizontalmente el control o los controles seleccionados con el formulario.

![](/files/-M7D78AbjtDKtGhypGRf) **Centrar vertical**: centra verticalmente el control o los controles seleccionados con el formulario.

![](/files/-M7D78B9KE3NUAikDXF6) **Mismo ancho**: da el mismo ancho a los controles seleccionados de aquel que ha sido seleccionado en último lugar.

![](/files/-M7D78AdChlD7sZHW_GJ) **Mismo alto**: da la misma altura a los controles seleccionados de aquel que ha sido seleccionado en último lugar.

![](/files/-M7D78AeKxs9DAgZduWz) **Mismo tamaño**: da el mismo tamaño a los controles seleccionados de aquel que ha sido seleccionado en último lugar.

![](/files/-M7D78AfHRSkCQyyo4CC) **Cuadrícula**: permite activar o desactivar una rejilla de puntos en el formulario para facilitar la maquetación de controles. Los puntos que componen la rejilla están situados cada 10 píxels y se podrán tomar como referencia para la maquetación controles. Si la rejilla de puntos está activa, los controles que creemos en el formulario se ajustaría a la misma y tanto su posición como su tamaño serán múltiplos de 10. Lo mismo ocurrirá cuando los cambiemos de posición o los redimensionemos.

Al arrastrar los controles al editor de formularios que se ajusten posiciones y tamaños en función de la cuadrícula.

&#x20;![](/files/-MQlLBmDZ_YDuieIXTXm)**Mostrar dimensiones controles**: permite activar/desactivar que se muestren los bordes del control para que se muestre su tamaño real.

![](/files/-MQlMz51lqltHUO44ZQh)**Ordenar los controles para la tabulación**: esta opción permite ordenar los controles seleccionados de 1 en adelante.

Si no se seleccionan controles, ordena todos.

El algoritmo de ordenación que sigue es:

Se ordenan por la posición de X&#x20;en orden ascendente.

Si coincide el mismo X, se ordenan ascendentemente por Y.

Si coincide X e Y, se ordena DESCENDENTEMENTE por el alto del control. El más alto va primero.

Si coincide X, Y y altura, se ordena DESCENDENTEMENTE por anchura del control.&#x20;El más ancho va primero.

Si coincide X, Y, altura y anchura, primero se ponen los layouts.

Los layouts se ordenan igual que el resto de controles y con los mismos criterios.

![](/files/-MQlP3_K0EpCm48OIQ8J) **Mostrar y cambiar orden de tabulación**: al pulsar la opción, y mientras esté marcada, muestra en cada control un cuadro con el orden.&#x20;

![](/files/-MQlQ4z_iDLWmuGmMPbb)

Haciendo clic sobre el cuadro con el orden de tabulación, se puede ordenar, comenzando por el primer seleccionado.

Al pulsar de nuevo la opción, se desmarca y deja de mostrar las posiciones.

![](/files/-M7D78BDezV180VCWvsL) **Desactivar layouts en edición** (Alt + Shift + L): hay ocasiones en el que la selección de controles se hace difícil, por ejemplo:

* Cuando un layout que agrupa una serie de controles está después que éstos en el orden tab, si intentamos seleccionar un control lo que se selecciona es el layout.
* Cuando hacemos clic en una zona donde no hay controles pero que se encuentra dentro de un layout, este queda seleccionado.

Si activamos esta opción, desasctivaremos los layouts **en edición**, esto implica que no podrán ser seleccionados, lo que nos facilitará la selección de los controles que contengan. En ejecución seguirán siendo funcionales.

![](/files/-M7D78AeKxs9DAgZduWz) **Mostrar dimensiones controles**: permite activar o desactivar la visualización de los límites de los controles.

![](/files/-M7D78BF6m7h5IEBHQgE) **Aplicar layouts**: reorganiza el contenido del formulario en función de los layouts. A continuación vemos dos capturas de pantalla, la primera muestra el diseño del formulario en el editor antes de aplicar el layout y el segundo el diseño del formulario una vez aplicado:

![](/files/-M7D78BGgExfJKII7joM)

![](/files/-M7D78BHp3iqjXd2iOH2)

![](/files/-M7D78BIT7SEbLSktGrk) **Previsualizar**: muestra cómo será visualizado el formulario al ejecutar el proyecto.

Para seleccionar un control hacer un clic sobre él con el botón izquierdo del ratón. Una vez hecho esto, podremos editar sus propiedades en el panel de propiedades de Velneo vDevelop.

Para seleccionar dos o más controles mientras se mantiene pulsada la tecla Shift o Control hacer un clic sobre cada uno de los controles con el botón izquierdo del ratón. El último control seleccionado será el que se tome como referencia a la hora de ejecutar comandos de maquetación. Éste será destacado de forma diferente al resto de los controles seleccionados:

![](/files/-M7D78BJPYRvveePUP3x)

Para cambiar el control de referencia en una selección múltiple de controles bastará con hacer un clic con el botón izquierdo del ratón sobre el mismo mientras se mantiene pulsada la tecla Alt.

Si estando editando las propiedades de un subcontrol del formulario queremos editar las propiedades del formulario, bastará con situar el cursor en cualquier área vacía del editor de formularios o del propio formulario y hacer un clic con el botón derecho del ratón.

### Añadir campos al formulario

Esta funcionalidad nos ahorrará mucho tiempo a la hora de añadir campos a un formulario que ya ha sido creado, ya que permite añadir varios campos al formulario de una sola vez haciendo *drag & drop*.

Para ello no tenemos más que seleccionar en el [árbol de campos](/velneo-vdevelop/inspectores#arbol-de-campos) los campos a incluir en el formulario, arrastrarlos y soltarlos en el punto del formulario donde queremos añadirlos.

Por cada campo se creará una etiqueta ([nombre de campo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/nombre-de-campo)) y un [control de edición](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion) que será el específico para el tipo de campo de que se trate.

A su vez, cada control se creará con un identificador en base al tipo de control y el identificador del campo. Por ejemplo, el control [nombre de campo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/nombre-de-campo) de un campo ID numérico de una tabla maestra se generará con el identiificador **NOM\_ID**, y el control de [edición numérica](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-numerica) de ese mismo campo se llamará **NUM\_ID**.

Los controles se crearán a partir de la posición donde hayamos hecho el *drop* en modo *grid*, es decir, una fila por campo y dos columnas por fila, una con la etiqueta o otra con el control de edición. Todos alineados y con la misma separación entre ellos.

El comportamiento será distinto si **cuadrícula** está o no activada.

Si está activada la cuadrícula, los controles estarán ajustados a la misma y tanto su posición como su tamaño serán múltiplos de 10.

Si no está la cuadrícula activada, deja posiciones y tamaños del mismo modo que lo hace el [asistente](https://doc.velneo.com/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/pages/-M7D76n4jW2jygLQwKcW#asistente-para-la-creación-de-formularios) para la creación de formularios (no son múltiplos de 10 ni los tamaños de los controles ni sus posiciones).

Para seleccionar los campos en el árbol de campos:

Si queremos seleccionar un bloque continuo de campos lo que haremos será situar el foco en el primero de ellos y, con la tecla Shift pulsada, con las teclas de cursor arriba y abajo avanzar hasta el último campo que se quiere seleccionar.

Lo anterior también podemos hacerlo si hacemos clic con el ratón sobre el primer campo a seleccionar, pulsamos la techa Shift y, sin soltarla, hacemos clic con el ratón sobre el último campo a seleccionar.

Si queremos seleccionar campos alternos, entonces lo haremos manteniendo pulsada la tecla Control y haciendo clic con el ratón sobre cada campo a seleccionar.

Si tenemos seleccionado uno o varios campos y queremos seleccionar otro bloque, pulsar la tecla Control y la techa Shift de forma simultanea y, sin soltarlas, hacer clic sobre el primer campo a seleccionar y luego sobre el último. De este modo, el bloque seleccionado se añadirá a la selección.

Si arrastramos los campos al formulario en una posición en la que no hay espacio suficiente para meter los controles, se ampliará el tamaño formulario lo necesario para que puedan entrar en el mismo.

**A continuación dispones de una tabla donde se indican qué propiedades se establecerán a cada control según el tipo de campo:**

| Tipo de control           | Identificador de control | Identificador por defecto |       Ancho | Alto | Alineamiento horizontal | Alineamiento vetical | Ancho en layout | Alto en layout | Otras propiedades                                                                                                                                           |
| ------------------------- | ------------------------ | ------------------------- | ----------: | ---: | ----------------------- | -------------------- | --------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Texto estático            | TXT\_IDCAMPO             | TXT                       |         120 |   20 | Izquierda               | Centrado             | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Nombre de campo           | TXT\_IDCAMPO             | TXT                       |         120 |   20 | Izquierda               | Centrado             | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Visor html                | VIS\_HTM\_IDCAMPO        | VIS\_HTM                  |         240 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Dibujo                    | DIB\_IDCAMPO             | DIB                       |         120 |  120 | -                       | -                    | Fijo            | Fijo           | **Aspecto dibujo**: proporcionar                                                                                                                            |
| Imagen SVG                | IMG\_SVG\_IDCAMPO        | IMG\_SVG                  |         120 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Caja de grupo             | CAJ\_GRPNº               | CAJ\_GRP                  |         240 |  120 | Izquierda               | Arriba               | Por defecto     | Por defecto    | **Tipo de layout**: grid                                                                                                                                    |
| Menú arbolado             | ARBNº                    | ARB                       |         240 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Barra de progreso         | BAR\_PRONº               | BAR\_PRO                  |         120 |   20 | Izquierda               | Centrado             | Fijo            | Por defecto    | **Texto visible**: verdadero                                                                                                                                |
| Reloj                     | RELNº                    | REL                       |         120 |  120 | -                       | -                    | Fijo            | Fijo           | -                                                                                                                                                           |
| Manómetro                 | MANNº                    | MAN                       |         120 |  120 | -                       | -                    | Fijo            | Fijo           | -                                                                                                                                                           |
| Termómetro                | TERNº                    | TER                       |          60 |  240 | -                       | -                    | Fijo            | Fijo           | -                                                                                                                                                           |
| Edición alfabética        | ALF\_IDCAMPO             | ALF                       |         240 |   20 | Izquierda               | Centrado             | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Edición numérica          | NUM\_IDCAMPO             | NUM                       | 30 por byte |   20 | Derecha                 | Centrado             | Fijo            | Por defecto    | **Formato local**: local. **Tipo de botones**: ocultos                                                                                                      |
| DataCatcherEdit           | DAT\_CAT\_IDCAMPO        | DAT\_CAT                  |         120 |   20 | Izquierda               | Centrado             | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Objeto dibujo             | OBJ\_DIB\_IDCAMPO        | OBJ\_DIB                  |         120 |  120 | -                       | -                    | Fijo            | Fijo           | **Aspecto dibujo**: proporcionar                                                                                                                            |
| Edición fecha/hora        | FCH\_HOR\_IDCAMPO        | FCH\_HOR                  |         180 |   20 | Derecha                 | Centrado             | Fijo            | Por defecto    | **Opciones**: con calendario                                                                                                                                |
| Edición fecha             | FCH\_IDCAMPO             | FCH                       |         120 |   20 | Derecha                 | Centrado             | Fijo            | Por defecto    | **Opciones**: Con calendario                                                                                                                                |
| Edición hora              | HOR\_IDCAMPO             | HOR                       |         120 |   20 | Derecha                 | Centrado             | fijo            | Por defecto    | -                                                                                                                                                           |
| Caja de texo              | CAJ\_TXT\_IDCAMPO        | CAJ\_TXT                  |         240 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Caja de texto enriquecido | CAJ\_HTM\_IDCAMPO        | CAJ\_HTM                  |         240 |  120 | -                       | -                    | Por defecto     | Por defecto    | **Barra de herramientas**: iconos. **Estilos de texto**: verdadero. **Formato**: verdadero. **Alineación**: verdadero. **Numeración y viñetas**: verdadero. |
| Edición fórmula           | FOR\_IDCAMPO             | FOR                       |         240 |   20 | Izquierda               | Centrado             | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Edición senda fichero     | SND\_FICNº               | SND\_FIC                  |         240 |   20 | Izquierda               | Centrado             | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Edición senda directorio  | SND\_DIRNº               | SND\_DIR                  |         240 |   20 | Izquierda               | Centrado             | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Botón                     | BTNNº                    | BTN                       |         120 |   30 | -                       | -                    | Fijo            | Por defecto    | -                                                                                                                                                           |
| Botón de radio            | BTN\_RADNº               | BTN\_RAD                  |         120 |   20 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Botón de check            | BTN\_CHKNº               | BTN\_CHK                  |         120 |   20 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Combobox                  | COM\_BOXNº               | COM\_BOX                  |         120 |   20 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Listbox                   | LIS\_BOXNº               | LIS\_BOX                  |         240 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Deslizador                | DESNº                    | DES                       |         120 |   20 | -                       | -                    | -Fijo           | Por defecto    | -                                                                                                                                                           |
| Rueda                     | RUENº                    | RUE                       |         120 |   20 | -                       | -                    | Fijo            | Por defecto    | -                                                                                                                                                           |
| Dial                      | DIANº                    | DIA                       |         120 |  120 | -                       | -                    | Fijo            | Fijo           | -                                                                                                                                                           |
| Calendario                | CALNº                    | CAL                       |         240 |  180 | -                       | -                    | Fijo            | Fijo           |                                                                                                                                                             |
| Separador                 | SEPNº                    | SEP                       |         240 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Splitter                  | SPLNº                    | SPL                       |         240 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Pila de formularios       | PILNº                    | PIL                       |         240 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Caja de formularios       | CAJNº                    | CAJ                       |         240 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Area de scroll            | SCRNº                    | SCR                       |         240 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Vista de datos            | VISNº                    | VIS                       |         240 |  120 | -                       | -                    | Por defecto     | Por defecto    | **Modo de carga**: siempre que se muestra                                                                                                                   |
| Layout horizontal         | LAY\_HORNº               | LAY\_HOR                  |         240 |  120 | Izquierda               | Centrado             | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Layout vertical           | LAY\_VERNº               | LAY\_VER                  |         240 |  120 | Izquierda               | Arriba               | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Layout grid               | LAY\_GRDNº               | LAY\_GRD                  |         240 |  120 | Izquierda               | Arriba               | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Espaciador fijo           | ESPNº                    | ESP                       |         120 |   20 | Izquierda               | Centrado             | -               | -              | -                                                                                                                                                           |
| Expaciador expandible     | EXPNº                    | EXP                       |         120 |   20 | Izquierda               | Centrado             | -               | -              | -                                                                                                                                                           |
| Tree widget               | TRENº                    | TRE                       |         240 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Botón SVG                 | SVG\_BTNNº               | SVG\_BTN                  |         120 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Interruptor SVG           | SVG\_INTNº               | SVG\_INT                  |         120 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Swith SVG                 | SVG\_SWINº               | SVG\_SWI                  |         120 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |
| Reloj indicador SVG       | SVG\_RELNº               | SVG\_REL                  |         120 |  120 | -                       | -                    | Por defecto     | Por defecto    | -                                                                                                                                                           |

## Controles

Los formularios disponen de los siguientes tipos de controles:

* [Controles de visualización](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion).
* [Controles de edición](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion).
* [Controles de entrada](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-entrada).
* [Contenedores](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/contenedores).
* [Layouts](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/layout).
* [Tree widget](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/tree-widget).
* [Controles SVG](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-svg).
* [Fichas de extensión](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension).


# Controles de visualización

Se trata de controles específicos para la visualización (no edición) de información y son:

* [Texto estático](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/texto-estatico).
* [Nombre de campo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/nombre-de-campo).
* [Visor html](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/visor-html).
* [Dibujo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/dibujo-control).
* [Imagen SVG](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/imagen-svg-control).
* [Caja de grupo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/caja-de-grupo).
* [Menú arbolado](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/menu-arbolado).
* [Barra de progreso](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/barra-de-progreso).
* [Reloj](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/reloj).
* [Manómetro](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/manometro).
* [Termómetro](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-visualizacion/termometro).


# Texto estático

Control de **visualización** que permite incluir una etiqueta de texto en un formulario. Para crearlo seleccionar la opción **texto estático** de la barra de controles de información del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores ](/velneo-vdevelop/inspectores)y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control. Es el texto que se presentará al usuario final de la aplicación si no se ha establecido ningún valor en la propiedad **contenido**.

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **texto estático**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Condición de visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Condición activo

Permite especificar una condición que, si se cumple, hará que el control se muestre con el color que hayamos en la propiedad **color de primer plano** y, si no se cumple, se muestre en el color de la paleta usado para indicar inactividad. Ejemplo de texto estático activo:

![](/files/-M7D789djRUbrFs6i4yI)

Ejemplo de texto estático inactivo:

![](/files/-M7D789giv98BJ0qSlGB)

La condición se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Borde

Permite establecer el tipo de borde del control. Los valores posibles son:

#### Ninguno

El control no tendrá bordes.

#### Caja a nivel

El contenido de control estará enmarcado por una caja al mismo nivel que el formulario.

#### Caja hundido

El contenido del control estará enmarcado por una caja con efecto de hundido.

#### Caja elevado

El contenido del control estará enmarcado por una caja con efecto de elevado.

#### Panel a nivel

El contenido de control estará enmarcado por un panel al mismo nivel que el formulario.

#### Panel hundido

El contenido del control estará enmarcado por un panel con efecto de hundido.

#### Panel elevado

El contenido del control estará enmarcado por un panel con efecto de elevado.

#### Con estilo a nivel

El contenido de control estará enmarcado por el estilo de borde que use el [estilo visual aplicado](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-ver#estilos), al mismo nivel que el formulario.

#### Con estilo hundido

El contenido de control estará enmarcado por el estilo de borde que use el [estilo visual aplicado](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-ver#estilos), con efecto de hundido.

#### Con estilo elevado

El contenido de control estará enmarcado por el estilo de borde que use el [estilo visual aplicado](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-ver#estilos), con efecto de elevado.

### Tamaño del borde

Permite establecer el grosor en píxels del borde del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Contenido

Permite establecer el título que tendrá el control de cara al usuario final, éste se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad. Si no se especificada nada en esta propiedad, se usará como título de la caja el dato introducido en la propiedad [nombre](#nombre).

### Color de fondo

En esta propiedad seleccionaremos el color de fondo del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Color de primer plano

En esta propiedad seleccionaremos el color de primer plano del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad [color de fondo](#color-de-fondo).

### Fuente

Esta propiedad permite establecer la fuente que usará el control. Pulsar el botón que aparece al editar esta propiedad para abrir el [selector de fuentes](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes).

### Alineamiento horizontal

Permite configurar la forma en la que el texto del control entre los márgenes izquierdo y derecho del mismo. Los valores posibles son:

#### Izquierda

Alinea la parte izquierda del contenido con el margen izquierdo del control.

#### Derecha

Alinea la parte derecha del contenido con el margen derecho del control.

#### Centrado

Centra el contenido entre los márgenes izquierdo y redecho del control.

#### Justificado

En controles que disponen de la propiedad **multilíneas**, se alinea el contenido uniformemente a lo largo de los márgenes izquierdo y derecho del control.

### Alineamiento vertical

Permite configurar la forma en la que el texto del control será alineado entre los márgenes superior e inferior del mismo. Los valores posibles son:

#### Arriba

Alinea la parte superior del contenido con el margen superior del control.

#### Abajo

Alinea la parte inferior del contenido con el margen inferior del control.

#### Centrado

Alinea el contenido entre los másgenes superior e inferior del control.

### Multilíneas

Esta propiedad permite que el texto contenido en el control se muestre en varias líneas en caso de que no quepa en una sola. Un control multilíneas deberá tener un [alineamiento horizontal](#alineamiento-horizontal) a la **izquierda** y un [alineamiento vertical](#alineamiento-vertical) **superior**.

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los textos estáticos, por defecto, crecerán en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los textos estáticos, por defecto, no crecen en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

#### Proporcional

La altura del control crecerá para adaptarse a la altura del formulario.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu) declarado en el [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) o en cualquier proyecto [heredado.](/velneo-vdevelop/herencia)

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú declarado en el proyecto de aplicación o en cualquier proyecto heredado que queremos usar como menú de contexto del control.

### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension)declarada en el mismo.


# Nombre de campo

Control de **visualización** que sirve para visualizar la descripción de un [campo ](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos)en un formulario. Si se modifica la descripción del campo de la [tabla ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla)asociada al formulario, este control cambia automáticamente el texto para visualizar la nueva descripción.\
Para crearlo pulsar la opción “nombre de campo” de la barra de controles de información del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores](/velneo-vdevelop/inspectores) y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control.

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **nombre de campo**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Condición activo

Permite especificar una condición que, si se cumple, hará que el control se muestre con el color que hayamos en la propiedad **color de primer plano** y, si no se cumple, se muestre en el color de la paleta usado para indicar inactividad.

Ejemplo de nombre de campo activo:

![](/files/-M7D78A-noeKMG3APrro)

Ejemplo de nombre de campo inactivo:

![](/files/-M7D78A05SHB5rLYr3Ta)

La condición se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Borde

Permite establecer el tipo de borde del control. Los valores posibles son:

#### Ninguno

El control no tendrá bordes.

#### Caja a nivel

El contenido de control estará enmarcado por una caja al mismo nivel que el formulario.

#### Caja hundido

El contenido del control estará enmarcado por una caja con efecto de hundido.

#### Caja elevado

El contenido del control estará enmarcado por una caja con efecto de elevado.

#### Panel a nivel

El contenido de control estará enmarcado por un panel al mismo nivel que el formulario.

#### Panel hundido

El contenido del control estará enmarcado por un panel con efecto de hundido.

#### Panel elevado

El contenido del control estará enmarcado por un panel con efecto de elevado.

#### Con estilo a nivel

El contenido de control estará enmarcado por el estilo de borde que use el [estilo visual aplicado](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-ver#estilos), al mismo nivel que el formulario.

#### Con estilo hundido

El contenido de control estará enmarcado por el estilo de borde que use el [estilo visual aplicado](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-ver#estilos), con efecto de hundido.

#### Con estilo elevado

El contenido de control estará enmarcado por el estilo de borde que use el [estilo visual aplicado](/velneo-vdevelop/interfaz-de-velneo-vdevelop/menu-ver#estilos), con efecto de elevado.

### Tamaño del borde

Permite establecer el grosor en píxels del borde del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Color de fondo

En esta propiedad seleccionaremos el color de fondo del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y/o seleccionar otro color.

### Color de primer plano

En esta propiedad seleccionaremos el color de primer plano del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y/o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad **color de base**.

### Fuente

Esta propiedad permite establecer la fuente que usará el control. Pulsar el botón que aparece al editar esta propiedad para abrir el selector de fuentes.

### Alineamiento horizontal

Permite configurar la forma en la que el texto del control entre los márgenes izquierdo y derecho del mismo. Los valores posibles son:

#### Izquierda

Alinea la parte izquierda del contenido con el margen izquierdo del control.&#x20;

#### Derecha&#x20;

Alinea la parte derecha del contenido con el margen derecho del control.&#x20;

#### Centrado&#x20;

Centra el contenido entre los márgenes izquierdo y redecho del control.&#x20;

#### Justificado&#x20;

En controles que disponen de la propiedad **multilíneas**, se alinea el contenido uniformemente a lo largo de los márgenes izquierdo y derecho del control.

### Alineamiento vertical

Permite configurar la forma en la que el texto del control será alineado entre los márgenes superior e inferior del mismo. Los valores posibles son:

#### Arriba

Alinea la parte superior del contenido con el margen superior del control.

#### Abajo

Alinea la parte inferior del contenido con el margen inferior del control.

#### Centrado

Alinea el contenido entre los másgenes superior e inferior del control.

### Multilíneas

Permite hacer que el contenido sea visualizado en varias líneas en el caso de que la anchura del control sea insuficiente.

### Campo

Permite seleccionar el campo cuya descripción queremos mostrar en el control.

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### **Por defecto**

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de nombre de campo, por defecto, crecerán en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Máscara

Permite aplicar una máscara para formatear el texto.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de nombre de campo, por defecto, no crecen en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu) declarado en el [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) o en cualquier proyecto [heredado.](/velneo-vdevelop/herencia)

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú declarado en el proyecto de aplicación o en cualquier proyecto heredado que queremos usar como menú de contexto del control.

### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension)declarada en el mismo.


# Visor HTML

Control de **visualización** que permite incrustar una página web dentro de un formulario.

Este control usa un navegador basado en motor [Chromium](https://es.wikipedia.org/wiki/Chromium_%28navegador%29) versión 112.0.5615.213. Para crearlo pulsar la opción "Visor html" de la barra de controles de información del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los inspectores y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control.

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **visor HTML**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Seleccionable con Tab

Permite que el control sea accesible cuando use el tabulador o el Intro para moverse de un control a otro dentro del formulario.

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Condición activo

Permite especificar una condición para que el control sea funcional. La condición se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Borde

Permite establecer el tipo de borde del control. Los valores posibles son:

#### Ninguno

El control no tendrá bordes.

#### Caja a nivel

El contenido de control estará enmarcado por una caja al mismo nivel que el formulario.

#### Caja hundido

El contenido del control estará enmarcado por una caja con efecto de hundido.

#### Caja elevado

El contenido del control estará enmarcado por una caja con efecto de elevado.

#### Panel a nivel

El contenido de control estará enmarcado por un panel al mismo nivel que el formulario.

#### Panel hundido

El contenido del control estará enmarcado por un panel con efecto de hundido.

#### Panel elevado

El contenido del control estará enmarcado por un panel con efecto de elevado.

#### Con estilo a nivel

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, al mismo nivel que el formulario.

#### Con estilo hundido

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, con efecto de hundido.

#### Con estilo elevado

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, con efecto de elevado.

### Tamaño del borde

Permite establecer el grosor en píxels del borde del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Contenido

Permite establecer el contenido a editar en el control, podrá tratarse tanto de una **URL** (Ejemplo: `http://velneo.es` ) como de **código html**. Éste se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

Si el contenido es una URL, para asegurar un correcto funcionamiento, en la fórmula que establezcamos para componer la URL se recomienda anteponer e l esquema que proceda. Es decir, si se trata de una página web, anteponer el esquema **http\://** y, si se trata de la senda de un fichero en disco, anteponer el esquema **file:///**. Ejemplos:

`"https://velneo.com"`

`"file:///c:/imagenes/foto.png"`

No es recomendable usar un control de este tipo cuando su contenido sea URL en un formulario de salida de un casillero, ya que un casillero es solamente cargado al inicio. Por lo que cargará solamente los datos leídos directamente de la ficha pero no las urls.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo.

### Opciones

En esta propiedad indicaremos al sistema qué es lo que se va a mostrar en este control. Los valores posibles son:

#### **Contenido=Url**

El contenido del control será una URL (Ejemplo: `http://velneo.es` especificada en la propiedad **contenido**. Esta opción podría ser útil por ejemplo para poder incrustar la página web de un cliente en su ficha.

#### Contenido=Texto Html

La página será generada en base al código html que se haya establecido en la propiedad **contenido**. Esta opción podría ser útil por ejemplo para poder previsualizar una página si programamos un gestor de contenidos web.

### Barra de herramientas

Esta propiedad permite mostrar u ocultar una barra de navegación dentro del control. Si al control le activamos la barra de herramientas, en tiempo de ejecución podremos configurar las opciones de privacidad del visor:

![](/files/-M7D78eo7BG6v53hvuYa)

![](/files/-M7D78epTFx2iTFtHnG3)

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Este tipo de control, por defecto, crecerá en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout. Este es el valor recomendado cuando queremos que el control se adapte al espacio disponible en el formulario.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Este tipo de control, por defecto, no crece en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout. Este es el valor recomendado para este tipo de control. Este es el valor recomendado cuando queremos que el control se adapte al espacio disponible en el formulario.

### Tipo de menú de contexto

**Esta propiedad no es funcional en la versión actual.**

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu)declarado en el [proyecto de aplicación ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion)o en cualquier proyecto [heredado](/velneo-vdevelop/herencia).

### Menú de contexto

**Esta propiedad no es funcional en la versión actual.**

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú declarado en el proyecto de aplicación o en cualquier proyecto heredado que queremos usar como menú de contexto del control.

## Uso de SSL

Para que este control soporte protocolo https es necesario que en la máquina donde se ejecute Velneo vClient tenga instalado **OpenSSL**. En Windows las librerías necesarias (*ssleay32.dll*  \
&#x20;y *libeay32.dll*) se instalan junto con Velneo vClient, en el resto de los sistemas operativos se hace uso de las del propio sistema operativo.

## Uso de proxys

El control visor html podrá salir a Internet a través de un proxy. El visor html tomará la configuración del proxy de la configuración del sistema. Esto es válido para Windows y macOS, que lo tomarán del sistema y para Linux que lo tomará del sistema de ventanas correspondiente KDE o GNome.

## Caché

Este control genera una caché en memoria en la sesión de vClient que estamos ejeccutando. Una vez cerremos el vClient, la caché será borrada.

## Depuración

Para depurar en remoto el Visor HTML hay que usar estos parámetros:

`ejecutable --webEngineArgs --remote-debugging-port=<puerto>`

Después, desde Chrome, nos conectamos a `http://localhost:<puerto>` y podremos depurar de forma remota viendo errores y problemas encontrados como si estuviésemos navegando en Chrome.

## Notas

Desde el menú de contexto de este control podremos tanto imprimir su contenido como guardarlo en disco en formato pdf.

Si cargamos en este control una página que solicita permiso de uso de *features* como micrófono o cámara del dispositivo, guardará la selección del usuario para no volver a preguntar.

Si el usuario no permite el acceso al dispositivo, no se guardará nada y la próxima vez que se cargue la misma página en el control, volverá a pedir permiso.

Esta configuración se guardará por dominio, además de por usuario y aplicación.

No debemos usar este control cuando el contenido sea URL y el formulario sea el formulario de salida de un casillero si en éste usamos el comando [editar sobre el casillero (obsoleto)](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/casillero#editar-sobre-casillero-obsoleto). Si usamos el comando [editar sobre casillero optimizado](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/casillero#editar-sobre-casillero-obsoleto) sí podremos utilizarlo.

En sistemas operativos **Android** e **iOS**, no es funcional este control por motivos de licencia. En ese caso debemos usar el navegador en QML que usa el navegador del sistema o abrir la VRL en el navegador Web del sistema con el comando de instrucción de proceso [Abrir nueva pestaña en el navegador Web](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/sistema/ejecucion-web#abrir-nueva-pestana-en-navegador-web).

En este control los applets de Java no son soportados.

No está disponible la opción de ampliar o disminuir el tipo de letra.

No soporte plugins de NPAPI.

Si ejecutamos vClient vía RDP (Terminal Server, por ejemplo), para un correcto funcionamiento del control no se debe acceder al escritorio remoto con una profundidad de color inferior a 32 bits.

Con este control no son funcionales las señales de: gana foco, pierde foco, ratón: botón pulsado, ratón: botón soltado, ratón: botón doble clic, ratón: movimiento, tecla pulsada, y tecla soltada.

En el caso de que al visor se le pase directamente el **código html**, no se debe pasar código html con tamaño mayor de 512 Kb. El motivo es que el sistema, para establecer el html, internamente lo que hace es pasarlo como *data* de una url y una url tiene una limitación de 2MB. En el caso de que por programación queremos saber cuál será el tamaño de la URL que va a generar un código html concreto, lo que podemos hacer es usar el método \_encodeURIComponent \_de JavaScript y obtener su longitud. Por ejemplo, en un formulario tenemos una variable local llamada COD\_HTML que contiene el código html a cargar en el control. Para comprobar su tamaño podremos hacer lo siguiente:

`decodeURIComponent(theRegister.varToString("COD_HTML")).length;`

Para evitar esta limitación lo que se recomienda es no usar **código html** como contenido del control y en su lugar guardar el código en un fichero en disco y asignarlo como **URL** al control.

Este control es funcional en [Velneo Web](/velneo-vclient-web), pero para usarlo principalmente para la carga de scripts html o JavaScript almacenados en la bbdd (como en vERP, menú de Scripts), que se sirven desde el propio servidor.

No se pueden hacer llamadas a URLs externas, ya que para que el funcionamiento de Velneo Web, se necesitan cabeceras coop/coep, que restringen el tráfico de otros orígenes.

No se pueden hacer llamadas a urls no seguras (protocolo HTTP).

Por lo tanto, para mostrar URLs externas recomendamos usar el comando de instrucción de proceso [Abrir nueva pestaña en navegador Web](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/sistema/ejecucion-web#abrir-nueva-pestana-en-navegador-web).

No tiene disponibles las siguientes funcionalidades de interfaz:

* Botones de toolbar: Atrás, Adelante, Recargar, Detener.
* ComboBox de URL + botón "Cargar página".
* Menú contextual (clic botón derecho del ratón).
* Opción "Ver código fuente".
* Diálogo de Configuración.
* Diálogos de autenticación HTTP.
* Diálogos de autenticación Proxy.
* Barra de permisos (cámara, micro, etc.).
* Imprimir / Vista previa / Imprimir a PDF.
* Descargas de ficheros.

No tiene disponibles las [señales](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/sub-objetos-de-vistas-de-datos/conexion-de-evento#senal) específicas para este tipo de control (ni las nativas ni a través de la clase [VCWebView](/velneo-vdevelop/scripts/lenguajes/javascript/clases/vcwebview)):

* Link clicked
* Load finished
* Load progress
* Load started
* URL changed

No son funcionales las siguientes funciones de la clase [VCWebView](/velneo-vdevelop/scripts/lenguajes/javascript/clases/vcwebview):

* selectedText()
* setZoomFactor( Number factor )
* sourceCode()
* title()
* zoomFactor()
* back()
* forward()
* print( String printerName, Boolean bHighResolution )
* printToPdf( String szFileName )
* reload()
* stop()


# Dibujo

Control de **visualización** que permite incluir un [objeto ](/velneo-vdevelop/proyectos-objetos-y-editores)de tipo [dibujo](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/dibujo) en un formulario. Para crearlo pulsar la opción “dibujo” de la barra de controles de información del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores ](/velneo-vdevelop/inspectores)y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control. Es el texto que se presentará al usuario final de la aplicación para referenciar el control. Podemos definir una etiqueta por cada idioma presente en el [proyecto.](/velneo-vdevelop/proyectos-objetos-y-editores)

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **dibujo**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

## Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

## Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

## Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

## Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

## Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el proyecto.

## Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

## Borde

Permite establecer el tipo de borde del control. Los valores posibles son:

Ninguno

El control no tendrá bordes.

Caja a nivel

El contenido de control estará enmarcado por una caja al mismo nivel que el formulario.

Caja hundido

El contenido del control estará enmarcado por una caja con efecto de hundido.

Caja elevado

El contenido del control estará enmarcado por una caja con efecto de elevado.

Panel a nivel

El contenido de control estará enmarcado por un panel al mismo nivel que el formulario.

Panel hundido

El contenido del control estará enmarcado por un panel con efecto de hundido.

Panel elevado

El contenido del control estará enmarcado por un panel con efecto de elevado.

#### Con estilo a nivel

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, al mismo nivel que el formulario.

#### Con estilo hundido

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, con efecto de hundido.

#### Con estilo elevado

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, con efecto de elevado.

### Tamaño del borde

Permite establecer el grosor en píxels del borde del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Contenido

Esta propiedad estará visible cuando en la propiedad [Opciones](#opciones) hemos configurado como contenido *Contenido=Senda* o *Contenido=Binario*.

**Cuando en la propiedad** [**Opciones**](#opciones) **hemos configurado como contenido&#x20;*****Contenido=Senda***, en esta propiedad especificaremos la senda del archivo de imagen que queramos mostrar en el control.

Podemos cargar tanto un fichero de imagen guardado en disco como uno servido vía web.&#x20;

La senda de archivo de imagen deberá ir precedida del esquema **file:** si se trata de una senda de disco local y si se trata de una url, del esquema **http** o **https**.

La especificación de las sendas de disco han de seguir el [esquema de fichero URI](https://en.wikipedia.org/wiki/File_URI_scheme):

Para ficheros locales será:

file:///c:/path/file.ext

Para ubicaciones de red será:

file://nombrehost/path/file.ext

Esto es así porque para un fichero local se omite el nombre del host, pero no la barra oblicua (/):

file://nombrehost/c:/path/file.txt = file:///c:/path/file.ext

Ejemplos:

`"file:///" + sysCacheClientPath + "/progress.gif"`

`"https://velneo.es/ogo-scaled.png"`

**Cuando en la propiedad** [**Opciones**](#opciones) **hemos configurado como contenido&#x20;*****Contenido=Binario***, en esta propiedad tenemos que especificar el campo de tipo [objeto binario](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/campo#objeto) que contiene la imagen que queramos mostrar.

### Color de fondo

En esta propiedad seleccionaremos el color de fondo del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Color de primer plano

En esta propiedad seleccionaremos el color de primer plano del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Para imágenes que tengan color transparente. Esta propiedad permite aplicar un color opaco al color transparente del dibujo. Se tomará el color establecido en la propiedad [color de fondo](#color-de-fondo).

### Dibujo

Este control despliega una lista en la que se muestran todos los [dibujos](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/dibujo), tanto del proyecto actual como de los proyectos [heredados](/velneo-vdevelop/herencia). Seleccionaremos el que deseamos incluir en el formulario.

### Aspecto dibujo

Permite definir de qué forma será visualizado el dibujo dentro del área del control. Los valores posibles son:

#### Normal

El dibujo se presentará en su tamaño original, empezando a pintarse desde el borde superior izquierdo del control. Si éste es mayor que el tamaño del control, se verá truncado.

#### Escala

Cambiará el ancho y el alto del dibujo para adaptarlo a la altura y anchura del control. Si no es proporcional el alto y el ancho del dibujo a la altura y la anchura del control, el dibujo se verá deformado.

#### Escala proporcionado

El dibujo se ampliará o reducirá para adaptarse al tamaño del control, pero conservando siempre la proporción alto/ancho. Si el tamaño del control es mayor que el tamaño del dibujo, es posible que éste se vea distorsionado al estirarse para adaptarse al tamaño del control.

#### Escala proporcionado expandiendo

El dibujo se ampliará o reducirá para adaptarse al tamaño del control pero no de forma proporcional. Si el control no es redimensionado de forma proporcional al tamaño original del dibujo, su contenido quedará truncado.

#### Mosaico

El dibujo se presentará en su tamaño original pero repitiéndose horizontal y verticalmente a modo de mosaico hasta ocupar todo el área del control.

### Opciones

En esta propiedad podemos configurar si queremos mostrar un [dibujo](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/dibujo) declarado en el proyecto en curso o en algún proyecto heredado, un dibujo externo (un png, gif animado, jpg, etc.), o un campo de tipo [objeto binario](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/campo#objeto). Los valores posibles son:

#### Dibujo

Seleccionaremos esta opción cuando queramos mostrar un [dibujo](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/dibujo) declarado en el proyecto en curso o en algún proyecto heredado. En ese caso el dibujo a mostrar deberíamos seleccionarlo en la en la propiedad [Dibujo](#dibujo) del control.

#### Contenido=Senda

Permite establecer una URL (local o externa), que debemos especificar en la propiedad [Contenido](#contenido). Ver la explicación de dicha propiedad para ampliar información.

#### Contenido=Binario&#x20;

Permite establecer un campo de tipo [objeto binario](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/campo#objeto), que debemos especificar en la propiedad [Contenido](#contenido). Ver la explicación de dicha propiedad para ampliar información.

### Tipo de layout

Esta propiedad permite que el dibujo pueda actuar también como si de un [layout](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/layout) se tratase. En este parámetro, por tanto, podremos indicar si el dibujo va a ser o no un layout, en caso afirmativo, tendremos que especificar el [tipo de layout](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/layout#tipo) a aplicar (**horizontal**, **vertical** o **grid**).

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los dibujos, por defecto, crecerán en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del dibujo será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los dibujos, por defecto, crecerán en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del dibujo será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional:

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto menú declarado en el proyecto de aplicación o en cualquier proyecto heredado.

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú declarado en el proyecto de aplicación o en cualquier proyecto heredado que queremos usar como menú de contexto del control.


# Imagen SVG

Control de **visualización** que permite incluir un [objeto](/velneo-vdevelop/proyectos-objetos-y-editores) de tipo [Imagen Svg ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/imagen-svg)en un formulario. Para crearlo ejecutar la opción **imagen svg** de la barra de controles de información del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores](/velneo-vdevelop/inspectores) y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control. Es el texto que se presentará al usuario final de la aplicación para referenciar el control. Podemos definir una etiqueta por cada idioma presente en el [proyecto.](/velneo-vdevelop/proyectos-objetos-y-editores)

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **imagen Svg**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el proyecto.

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas.](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas) Para ello pulsar el botón que aparece al editar esta propiedad.

### Fondo opaco

Esta propiedad permite quitar la transparencia a la imagen Svg.

### Objeto

Este control despliega una lista en la que se muestran todos las imágenes Svg, tanto del proyecto actual como de los proyectos heredados. Seleccionaremos la que deseamos incluir en el formulario.

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los dibujos, por defecto, crecerán en anchura proporcionalmente a la anchura del formulario. &#x20;

#### Fijo

El ancho del dibujo será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los svg, por defecto, crecerán en altura proporcionalmente a la altura del formulario.&#x20;

#### Fijo

La altura del dibujo será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto menú declarado en el proyecto de aplicación o en cualquier proyecto heredado.

## Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.


# Caja de grupo

Control de **visualización** que crea una caja cuya finalidad es la de agrupar controles dentro de la misma. La caja además puede tener una etiqueta de texto para informar sobre el contenido de la misma. Para crearlo ejecutar la opción **caja de grupo** de la barra de controles de información del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores](/velneo-vdevelop/inspectores) y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control. Es el texto que se presentará al usuario final de la aplicación para referenciar el control. Podemos definir una etiqueta por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **caja de grupo**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el proyecto.

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

Si la caja de grupo va a enmarcar otros controles, la condición de visibilidad se aplicará a todo el conjunto, es decir, si no se cumple la condición de visibilidad se ocultará tanto la caja como los controles contenidos en ella.

### Condición activo

Permite especificar una condición que, si se cumple, hará que el control se muestre con el color que hayamos en la propiedad [color de primer plano](#color-de-primer-plano) y, si no se cumple, se muestre en el color de la paleta usado para indicar inactividad.

Ejemplo de caja de grupo activa:

![](/files/-M7D7B0g1ZPH8nGyKqF4)

Ejemplo de caja de grupo inactiva:

![](/files/-M7D7B0kbr1SUdy_jrFr)

La condición se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

Si la caja de grupo va a enmarcar otros controles, la condición de activo se aplicará a todo el conjunto, es decir, si no se cumple la condición de activo se desactivará tanto la caja como los controles contenidos en ella.

### Contenido

Permite establecer el título que tendrá la caja de cara al usuario final, éste se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad. Si no se especificada nada en esta propiedad, se usará como título de la caja el dato introducido en la propiedad **nombre**.

### Color de fondo

En esta propiedad seleccionaremos el color de fondo del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Color de primer plano

En esta propiedad seleccionaremos el color de primer plano del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Para imágenes que tengan color transparente. Esta propiedad permite aplicar un color opaco al color transparente del dibujo. Se tomará el color establecido en la propiedad [color de fondo](#color-de-fondo).

### Fuente

Esta propiedad permite establecer la fuente que usará el control. Pulsar el botón que aparece al editar esta propiedad para abrir el [selector de fuentes](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes).

### Alineamiento horizontal

Permite configurar la forma en la que el texto del control entre los márgenes izquierdo y derecho del mismo. Los valores posibles son:

#### Izquierda

Alinea la parte izquierda del contenido con el margen izquierdo del control.

#### Derecha

Alinea la parte derecha del contenido con el margen derecho del control.

#### Centrado

Centra el contenido entre los márgenes izquierdo y redecho del control.

#### Justificado

En controles que disponen de la propiedad multilíneas, se alinea el contenido uniformemente a lo largo de los márgenes izquierdo y derecho del control.

### Alineamiento vertical

Permite configurar la forma en la que el texto del control será alineado entre los márgenes superior e inferior del mismo. Los valores posibles son:

#### Arriba

Alinea la parte superior del contenido con el margen superior del control.

#### Abajo

Alinea la parte inferior del contenido con el margen inferior del control.

#### Centrado

Alinea el contenido entre los másgenes superior e inferior del control.

### Plano

Permite configurar el control para que sea mostrado como una caja (falso) o solamente como una línea horizontal (verdadero).

![](/files/-M7D7B0oWGqFa7u7kHjo)

### Tipo de layout

Dado que una caja de grupo es un control que suele ser usado para enmarcar uno o varios controle dentro de la misma, ésta puede actuar también como si de un [layout](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/layout) se tratase. En este parámetro, por tanto, podremos indicar si la caja de grupo va a ser o no un layout, en caso afirmativo, tendremos que especificar el [tipo de layout](#tipo-de-layout) a aplicar (horizontal, vertical o grid).

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Las cajas de grupo, por defecto, crecerán en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

## Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Las cajas de grupo, por defecto, crecerán en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu) declarado en el [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) o en cualquier proyecto [heredado](/velneo-vdevelop/herencia).

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.


# Menú arbolado

Control de **visualización** que muestra en un formulario el contenido de un objeto [menú](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu) a modo de árbol. Para crearlo ejecutar la opción **menú arbolado** de la barra de controles de información del editor de formulario, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores](/velneo-vdevelop/inspectores) y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control. Es el texto que se presentará al usuario final de la aplicación para referenciar el control. Podemos definir una etiqueta por cada idioma presente en el [proyecto.](/velneo-vdevelop/proyectos-objetos-y-editores)

### Estilos

Podemos definir los estilos siguientes:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

#### Simple-click dispara

Si este estilo está activado bastará con hacer un clic para disparar una acción del menú. Si este estilo está desactivado el usuario tendrá que hacer doble clic para disparar una acción del menú.

#### Solo una rama abierta

Si este estilo está activado, el árbol sólo permitirá una rama abierta. Esto quiere decir que, cuando abramos una rama, se cerrarán las otras automáticamente.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **menú arbolado**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el proyecto.

### Seleccionable con Tab

Permite que el control sea accesible cuando use el tabulador o el intro para moverse de un control a otro dentro del formulario.

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Condición activo

Permite especificar una condición para que el control sea funcional. La condición se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Color de primer plano

En esta propiedad seleccionaremos el color de primer plano del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Color de base

En esta propiedad seleccionaremos el color de base del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Color de texto

En esta propiedad seleccionaremos el color del texto del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Color de botón

En esta propiedad seleccionaremos el color de los botones del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Color texto de botón

En esta propiedad seleccionaremos el color del texto de los botones del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el color del control o aplicar un color opaco al mismo.

### Fuente

Esta propiedad permite establecer la fuente que usará el control. Pulsar el botón que aparece al editar esta propiedad para abrir el [selector de fuentes](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes).

### Barras de scroll

Esta propiedad permite configurar la visualización de las barras de scroll o de desplazamiento embebidas en el control. Los valores posibles son:

#### Automático

Las barras de scroll solamente se verán en el caso de que el tamaño del control no permita ver la totalidad de su contenido.

#### Nunca

Las barras de scroll nunca serán mostradas.

#### Siempre

Las barras de scroll aparecerán siempre.

### Objeto

Permite seleccionar el objeto menú a incrustar en el control. Podremos seleccionar cualquier menú declarado tanto en el proyecto actual como en un proyecto [heredado.](/velneo-vdevelop/herencia)

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Este tipo de control, por defecto, crece en anchura.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Este tipo de control, por defecto, crece en altura.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto.

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.

En ejecución, los nodos del árbol que tengan subramas, serán destacados en negrita.

En ejecución, Para disparar una acción del menú habrá que situarse sobre ella y pulsar la tecla Intro o hacer doble clic sobre la misma.


# Barra de progreso

Control de **visualización** que permite visualizar gráficamente el valor numérico de un campo o de una variable en tantos por ciento.

![](/files/-M7D78Z8f7rV8M_kFZBp)\
Para crearlo ejecutar la opción **barra de progreso** de la barra de controles de información del editor de formulario, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores](/velneo-vdevelop/inspectores) y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control. Es el texto que se presentará al usuario final de la aplicación si no se ha establecido ningún valor en la propiedad **contenido**.

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **barra de progreso**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Contenido

Permite establecer el contenido a editar en el control, éste se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad. Habitualmente el contenido será un [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) o una variable de tipo numérico.

### Color de fondo

En esta propiedad seleccionaremos el color de fondo del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Color de primer plano

En esta propiedad seleccionaremos el color de primer plano del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad **color de fondo**.

### Fuente

Esta propiedad permite establecer la fuente que usará el control. Pulsar el botón que aparece al editar esta propiedad para abrir el [selector de fuentes.](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes)

### Alineamiento horizontal

Permite configurar la forma en la que el texto del control entre los márgenes izquierdo y derecho del mismo. Los valores posibles son:

#### Izquierda

Alinea la parte izquierda del contenido con el margen izquierdo del control.

#### Derecha

Alinea la parte derecha del contenido con el margen derecho del control.

#### Centrado

Centra el contenido entre los márgenes izquierdo y redecho del control.

#### Justificado

En controles que disponen de la propiedad multilíneas, se alinea el contenido uniformemente a lo largo de los márgenes izquierdo y derecho del control.

### Alineamiento vertical

Permite configurar la forma en la que el texto del control será alineado entre los los márgenes superior e inferior del mismo. Los valores posibles son:

#### Arriba

Alinea la parte superior del contenido con el margen superior del control.

#### Abajo

Alinea la parte inferior del contenido con el margen inferior del control.

#### Centrado

Alinea el contenido entre los másgenes superior e inferior del control.

### Orientación

Para definir la disposición de la barra de progreso, que podrá ser **horizontal** o **vertical**.

### Texto visible

Permite hacer que en el control se visualice, además de la barra de progreso, el porcentaje en cifras.

### Mínimo y Máximo

Para que el sistema pueda calcular el porcentaje será necesario indicar cuáles serán los rangos mínimo y máximo que podrá tener el **contenido**.

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Las barras de progreso, por defecto, no crecen en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Las barras de progreso, por defecto, no crecen en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu)declarado en el [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) o en cualquier proyecto [heredado.](/velneo-vdevelop/herencia)

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.

### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension)declarada en el mismo.


# Reloj

Control de **visualización** que permite mostrar la hora del sistema en un reloj. Es un control de sólo lectura.

![](/files/-M7D77yxrLrptGm1T_aK)\
Para crearlo ejecutar la opción **reloj** de la barra de controles de información del editor de formulario, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores](/velneo-vdevelop/inspectores) y en las

propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control. Es el texto que se presentará al usuario final de la aplicación si no se ha establecido ningún valor en la propiedad **contenido**.

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **reloj**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Contenido

Este control toma como referencia la hora del sistema, si deseamos presentar la hora de una zona horaria diferente a la del sistema, en esta propiedad indicaremos, en horas, la diferencia horaria con respecto a la del sistema. Si la diferencia horaria es de 3 horas más, por ejemplo, el valor de esta propiedad será 3, si la diferencia horaria es de 2 horas menos con respecto a la del sistema, por ejemplo, el valor de esta propiedad será -2. Éste podremos establecerlo mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad. Habitualmente el contenido será un [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) o una [variable](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/variable) de tipo numérico.

### Color de base

En esta propiedad seleccionaremos el color de base del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Color de texto

En esta propiedad seleccionaremos el color del texto del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad [color de base](#color-de-base).

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Este control, por defecto, crece en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Este control, por defecto, crece en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu)declarado en el [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) o en cualquier proyecto [heredado.](/velneo-vdevelop/herencia)

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.

### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension)declarada en el mismo.


# Manómetro

Control de **visualización** que permite mostrar gráficamente el valor numérico de un [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) o de una [variable](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/variable) de tipo numérico. Es un control de sólo lectura.

![](/files/-M7D78Me1T5dQFOZzdEk)\
Para crearlo ejecutar la opción **manómetro** de la barra de controles de información del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores](/velneo-vdevelop/inspectores) y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control. Es el texto que se presentará al usuario final de la aplicación si no se ha establecido ningún valor en la propiedad **contenido**.

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **manómetro**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Contenido

Permite establecer el contenido a editar en el control, éste se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad. Habitualmente el contenido será un [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) o una [variable](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/variable) de tipo numérico.

### Color de base

En esta propiedad seleccionaremos el color de base del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad [color de fondo](#fondo-opaco).

### Mínimo y Máximo

Permite establecer los valores mínimo y máximo del manómetro.

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los manómetros, por defecto, crecen en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los manómetros, por defecto, crecen en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu) declarado en el [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) o en cualquier proyecto [heredado.](/velneo-vdevelop/herencia)

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.

### Valor nominal

Permite establecer el valor nominal dentro de la escala graduada del manómetro. Gráficamente, a partir de ese valor se pintará un sombreado verde en la escala graduada del control.

### Valor crítico

Permite establecer el valor crítico dentro de la escala graduada del manómetro. Gráficamente, a partir de ese valor se pintará un sombreado rojo en la escala graduada del control.

### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension)declarada en el mismo.


# Termómetro

Control de **visualización** que permite visualizar gráficamente el valor numérico de un [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) o de una [variable ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/variable)de tipo numérico. Es un control de sólo lectura.

![](/files/-M7D77cbYTe3aAimZed0)\
Para crearlo ejecutar la opción “termómetro” de la barra de controles de información del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores](/velneo-vdevelop/inspectores) y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control. Es el texto que se presentará al usuario final de la aplicación si no se ha establecido ningún valor en la propiedad **contenido**.

## Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **termómetro**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto.](/velneo-vdevelop/proyectos-objetos-y-editores)

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Contenido

Permite establecer el contenido a editar en el control, éste se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad. Habitualmente el contenido será un [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) o una [variable](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/variable) de tipo numérico.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad **color de fondo**.

### Mínimo y Máximo

Permite establecer los valores mínimo y máximo del termómetro.

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los\~valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Este control, por defecto, crece en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Este control, por defecto, crece en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu) declarado en el [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) o en cualquier proyecto [heredado.](/velneo-vdevelop/herencia)

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.

### Valor nominal

Permite establecer el valor nominal dentro de la escala graduada del termómetro. Gráficamente, a partir de ese valor cambiará el color del mercurio a verde.

### Valor crítico

Permite establecer el valor crítico dentro de la escala graduada del termómetro. Gráficamente, a partir de ese valor cambiará el color del mercurio a rojo.

### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension) declarada en el mismo.


# Controles de edición

Se trata de controles específicos para la introducción de información. Son:

* [Caja de texto](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/caja-de-texto).
* [Caja de texto enriquecido](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/caja-de-texto-enriquecido).
* [Data catcher edit](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/data-catcher-edit).
* [Edición alfabética](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-alfabetica).
* [Edición fecha](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-fecha).
* [Edición fecha-hora](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-fechahora).
* [Edición fórmula](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula).
* [Edición hora](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-hora).
* [Edición numérica](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-numerica).
* [Edición senda fichero](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-senda-fichero).
* [Edición senda directorio](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-senda-directorio).
* [Objeto dibujo](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/objeto-dibujo).


# Caja de texto

Control de **edición** específico para [campos](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) de tipo objeto texto. Para crearlo ejecutar la opción **caja de texto** de la barra de controles de edición del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.&#x20;

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores ](/velneo-vdevelop/inspectores)y en las

propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control.

### Estilos

Podemos definir los estilos siguientes:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

#### Retardo señal valueChanged

Si activamos este estilo, provocará que el envío de la señal de cambio en el valor del campo se posponga hasta finalizar la escritura, esperando para emitirla 500 milisegundos desde la última modificación realizada.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **caja de texto**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Seleccionable con Tab

Permite que el control sea accesible cuando use el tabulador o el intro para moverse de un control a otro dentro del formulario.

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Condición activo

Permite especificar una condición para que el control sea funcional. La condición se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Sólo lectura

Permite hacer que el contenido del control pueda ser visualizado pero no modificado.

### Color de primer plano

En esta propiedad seleccionaremos el color de primer plano del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y/o seleccionar otro color.

### Color de base

En esta propiedad seleccionaremos el color de fondo del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y/o seleccionar otro color.

### Color de texto

En esta propiedad seleccionaremos el color que tendrá el texto contenido en el control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Color de botón

En esta propiedad seleccionaremos el color que tendrán los botones contenidos en el control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad [color de base](#color-de-base).

### Fuente

Esta propiedad permite establecer la fuente que usará el control. Pulsar el botón que aparece al editar esta propiedad para abrir el [selector de fuentes](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes).

### Alineamiento vertical

Permite configurar la forma en la que el texto del control será alineado entre los los márgenes superior e inferior del mismo. Los valores posibles son:

#### Arriba

Alinea la parte superior del contenido con el margen superior del control.

#### Abajo

Alinea la parte inferior del contenido con el margen inferior del control.

#### Centrado

Alinea el contenido entre los másgenes superior e inferior del control.

### Barras de scroll

Esta propiedad permite configurar la visualización de las barras de scroll o de desplazamiento embebidas en el control. Los\
valores posibles son:

#### Automático

Las barras de scroll solamente se verán en el caso de que el tamaño del control no permita ver la totalidad de su contenido.

#### Nunca

Las barras de scroll nunca serán mostradas.

#### Siempre

Las barras de scroll aparecerán siempre.

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de caja de texto, por defecto, crecerán en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de caja de texto, por defecto, crecerán en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu) declarado en el [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) o en cualquier proyecto [heredado](/velneo-vdevelop/herencia).

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.

### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension)declarada en el mismo.


# Caja de texto enriquecido

Control de **edición** específico para [campos](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) de tipo objeto texto enriquecido.

![](/files/-M7D79Sx-PGhBzklSALg)

Para crearlo ejecutar la opción “caja de texto enriquecido” de la barra de controles de edición del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.&#x20;

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores](/velneo-vdevelop/inspectores) y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control.

### Estilos

Podemos definir los estilos siguientes:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

#### Retardo señal valueChanged

Si activamos este estilo, provocará que el envío de la señal de cambio en el valor del campo se posponga hasta finalizar la escritura, esperando para emitirla 500 milisegundos desde la última modificación realizada.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **caja de texto enriquecido**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Seleccionable con Tab

Permite que el control sea accesible cuando use el tabulador o el intro para moverse de un control a otro dentro del formulario.

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Condición activo

Permite especificar una condición para que el control sea funcional. La condición se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Sólo lectura

Permite hacer que el contenido del control pueda ser visualizado pero no modificado.

### Contenido

Permite establecer el contenido a editar en el control, en este caso podrá ser tanto un campo tipo de objeto texto enriquecido como cualquier fórmula que devuelva una cadena alfanumérica. Éste se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Color de primer plano

En esta propiedad seleccionaremos el color de primer plano del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y/o seleccionar otro color.

### Color de base

En esta propiedad seleccionaremos el color de fondo del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y/o seleccionar otro color.

### Color de texto

En esta propiedad seleccionaremos el color que tendrá el texto contenido en el control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Color de botón

En esta propiedad seleccionaremos el color que tendrán los botones contenidos en el control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad [color de base](#color-de-base).

### Fuente

Esta propiedad permite establecer la fuente que usará el control. Pulsar el botón que aparece al editar esta propiedad para abrir el [selector de fuentes](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes).

### Alineamiento vertical

Permite configurar la forma en la que el texto del control será alineado entre los los márgenes superior e inferior del mismo. Los valores posibles son:

#### Arriba

Alinea la parte superior del contenido con el margen superior del control.

#### Abajo

Alinea la parte inferior del contenido con el margen inferior del control.

#### Centrado

Alinea el contenido entre los másgenes superior e inferior del control.

### Barras de scroll

Esta propiedad permite configurar la visualización de las barras de scroll o de desplazamiento embebidas en el control. Los valores posibles son:

#### Automático

Las barras de scroll solamente se verán en el caso de que el tamaño del control no permita ver la totalidad de su contenido.

#### Nunca

Las barras de scroll nunca serán mostradas.

#### Siempre

Las barras de scroll aparecerán siempre.

### Barra de herramientas

Esta propiedad permite configurar la visualización de la barra de herramientas para la edición de texto embebida en el control. Los valores posibles son:

#### Ninguna

No se incluirá ninguna barra de herramientas.

#### Texto

Se incluirá la barra de herramientas y todos sus botones contendrán texto únicamente.

#### Iconos

Se incluirá la barra de herramientas y todos sus botones contendrán iconos únicamente.

#### Texto e iconos

Se incluirá la barra de herramientas y todos sus botones contendrán texto e iconos.

### Estilos de texto

Esta propiedad permite habilitar en la **barra de herramientas** los comandos de estilos de texto.

### **Formato**

Esta propiedad permite habilitar en la **barra de herramientas** los comandos de formato de texto.

### Alineación

Esta propiedad permite habilitar en la **barra de herramientas** los comandos de alineamiento de texto.

### Numeración y viñetas

Esta propiedad permite habilitar en la **barra de herramientas** los comandos para la creación de numeración y viñetas en el texto a editar.

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de caja de texto, por defecto, crecerán en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de caja de texto, por defecto, crecerán en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu) declarado en el [proyecto de aplicación ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion)o en cualquier proyecto [heredado](/velneo-vdevelop/herencia).

#### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.

#### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension)declarada en el mismo.

Si estamos editando un texto en un control de este tipo la pulsación de la tecla Intro lo que hará será añadir un salto de línea dentro del control, si queremos aceptar el formulario que contiene el control tendremos que pulsar la combinación de las teclas ctrl+intro.

Si estamos editando un texto en un control de este tipo, el tabulador pasará al siguiente control en el orden tab, si queremos insertar un carácter tabulador en el control usaremos la combinación de las teclas ctrl+tabulador.


# Data catcher edit

Control de **edición** que se usará principalmente para la edición del contenido de [campos ](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos)enlazados a tablas de datos maestras. Permite buscar en una tabla para devolver un dato de otra tabla. Por ejemplo: recorrer un plural para seleccionar un maestro.

Este control tiene la particularidad de que se muestra un contenido y se edita otro. Para crearlo ejecutar la opción **data catcher edit** de la barra de controles de edición del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores ](/velneo-vdevelop/inspectores)y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control.

### Estilos

Podemos definir los estilos siguientes:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

#### Retardo señal valueChanged

Si activamos este estilo, provocará que el envío de la señal de cambio en el valor del campo se posponga hasta finalizar la escritura, esperando para emitirla 500 milisegundos desde la última modificación realizada.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **data catcher edit**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto.](/velneo-vdevelop/proyectos-objetos-y-editores)

### Seleccionable con Tab

Permite que el control sea accesible cuando use el tabulador o el intro para moverse de un control a otro dentro del formulario.

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Condición activo

Permite especificar una condición para que el control sea funcional. La condición se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Sólo lectura

Permite hacer que el contenido del control pueda ser visualizado pero no modificado.

### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension)declarada en el mismo.

### Contenido

En esta propiedad declararemos el campo o variable que recogerá el dato seleccionado por el usuario. Este se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Color de base

En esta propiedad seleccionaremos el color de fondo del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y/o seleccionar otro color.

### Color de texto

En esta propiedad seleccionaremos el color que tendrá el texto contenido en el control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad **color de base**.

### Fuente

Esta propiedad permite establecer la fuente que usará el control. Pulsar el botón que aparece al editar esta propiedad para abrir el [selector de fuentes.](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes)

### Alineamiento horizontal

Permite configurar la forma en la que el texto del control entre los márgenes izquierdo y derecho del mismo. Los valores posibles son:

#### Izquierda

Alinea la parte izquierda del contenido con el margen izquierdo del control.

#### Derecha

Alinea la parte derecha del contenido con el margen derecho del control.

#### Centrado

Centra el contenido entre los márgenes izquierdo y redecho del control.

#### Justificado

En controles que disponen de la propiedad multilíneas, se alinea el contenido uniformemente a lo largo de los márgenes izquierdo y derecho del control.

### Alineamiento vertical

Permite configurar la forma en la que el texto del control será alineado entre los los márgenes superior e inferior del mismo. Los valores posibles son:

#### Arriba

Alinea la parte superior del contenido con el margen superior del control.

#### Abajo

Alinea la parte inferior del contenido con el margen inferior del control.

#### Centrado

Alinea el contenido entre los másgenes superior e inferior del control.

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de edición, por defecto, crecerán en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de edición, por defecto, no crecen en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu)declarado en el [proyecto de aplicación ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion)o en cualquier proyecto [heredado.](/velneo-vdevelop/herencia)

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.

### Tipo de menú de botón

Permite incluir dentro del control un botón que al pulsarlo desplegará el menú que se indicará en la propiedad siguiente. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de botón.

#### Botón izquierda

El botón será incluido a la izquierda del control.

#### Botón derecha

El botón será incluido a la derecha del control.

#### Botón oculto

El botón no será visible pero podrán dispararse las [acciones ](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/interfaz/acciones-comandos)contenidas en el menú asociado al mismo usando las teclas aceleradoras definidas en las mismas.

El icono que se usará en el botón será el asignado al objeto menú en sus propiedades y, en caso de no tener dibujo alguno asignado, se presentará un icono interno de la plataforma.

Es posible usar las mismas teclas aceleradoras en los menús incluidos en botones de distintos controles de un mismo formulario pues siempre se ejecutará la acción del control que tenga el foco.

En tiempo de ejecución para desplegar el menú a través del teclado usaremos la combinación de las teclas Shift + F4.

### Menú de botón

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado un valor distinto a **ninguno**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de botón del control.

### Autocompletar

Solamente válido para controles de edición de campos enlazados a una tabla maestra o de una tabla estática. Si esta propiedad está activada (verdadero) hará que en tiempo de ejecución si el usuario escribe en el control una cadena, transcurridos 500 milisegundos el programa presentará automáticamente el primer registro de la tabla maestra cuyo campo nombre comience por dicha cadena. La parte añadida quedará seleccionada, con lo que, si el usuario prosigue la escritura, la parte seleccionada será sustituida por los nuevos caracteres que el usuario escriba. Si se desea validar la primera palabra que aparece seleccionada, pulsar la combinación de las teclas Control + Cursor derecha.

Cuando tabulemos en un control de edición de maestro habiendo introducido una cadena antes de que se haya efectuado el autocompletado se atrapará el primer maestro que coincida con la cadena escrita.

En el caso de campos enlazados a maestro, para que esta propiedad sea funcional, es necesario que en el maestro exista un índice del campo que editemos en el formulario. El cómo se busquen las fichas del maestro a escribir dependerá de cómo tengamos declarado el índice NAME en la tabla maestra.

Cuando creamos una tabla maestra, el componente del índice NAME se crea convertido a alfa64. Eso es lo que hace que, al ejecutar el autocompletar, no sea “case sensitive”; ya que esta tabla de caracteres contempla mayúsculas solamente.

### Tipo de botones

Cuando en un control de este tipo editamos un campo de un maestro, el sistema incluye automáticamente unos botones arriba y abajo (microscrollers) que nos permitirán navegar por la tabla maestra desde el control. En esta propiedad podremos configurar el aspecto de esos botones. Los valores posibles son:

#### Arriba/abajo

Es el valor por defecto. El contenido de los botones será una flecha hacia arriba y otra hacia abajo, respectivamente.

#### Según estilo

Se usará el estilo que en el estilo visual seleccionado se aplique a los microscrollers.

#### Ocultos

No se mostrarán los microscrollers:

### Vista de datos de lista

Solamente válido para controles de edición de campos enlazados a una tabla de datos maestra. En este parámetro podremos especificar un objeto de lista (por ejemplo, una [rejilla](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/carga-de-registros-en-objetos-de-lista/rejillas)) del maestro enlazado. Esto hará que en ejecución el control se transforme en una lista desplegable, por lo que, podremos desplegarla para mostrar los registros del maestro enlazado y seleccionar uno.

### Modo de validar enlazado

Solamente válido para campos enlazados a tabla maestra o estática. Permite definir el modo en el que se validará la existencia del registro maestro al perder el foco el control de edición del campo ID o NAME del maestro. Los valores posibles son:

#### No validar

No se realizará validación alguna.

#### Validar permitiendo vacío

Si el dato introducido en el control no existe en la tabla enlazada no dejará moverse a otro control, o bien hasta que se borre el dato introducido, o bien hasta que se introduzca un dato válido.

#### Validar no permitiendo vacío

Si el dato introducido en el control no existe en la tabla enlazada no dejará moverse a otro control hasta que se introduzca un dato válido.

### Tabla apuntada

En esta propiedad seleccionaremos la tabla de búsqueda.

### Campo visible

En esta propiedad indicaremos qué es lo que vamos a mostrar en el control de la tabla apuntada.

### Asignar contenido

Mediante una fórmula resolveremos qué valor se va a asignar al campo seleccionado en la propiedad **contenido**.

### Contenido inicial

Valor que se va a mostrar como valor por defecto.

Este control admite subindexación.

Ejemplo básico: artículos y referencias: buscar en la tabla de referencias de artículos para atrapar un artículo.

Ejemplo complejo: mezclando data catcher edit y subindexación: artículos multi-idioma. Se trataría de tener una tabla de traducciones enlazada a una de artículos y a una de idiomas. Con este control podemos atrapar un artículo concreto recorriendo la tabla de sus traducciones a un idioma concreto.

## Subindexador

El subindexador es un sub-objeto de controles de edición de campos [enlazados ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace)a maestro. Permite realizar una búsqueda más selectiva en los mismos. Para ello se deberá hacer uso de un [índice ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice)de la tabla maestra compuesto en primer lugar por el campo o campos de la tabla maestra que condicionarán la búsqueda y en último término por el campo por el que se recorrerá la tabla maestra; el campo que se editará en el formulario.

Por ejemplo, supongamos que tenemos dos tablas enlazadas PAISES y PROVINCIAS y queremos que en un formulario de otra tabla histórica de ambas podamos, en un control de edición del campo NAME de la provincia, usando los microscrollers, ir recorriendo solamente las provincias del país seleccionado. Para ello deberíamos tener un índice en la tabla de PROVINCIAS compuesto por el campo enlazado a PAISES y por el campo NAME de la provincia:

![](/files/-M7D78VXADU7yOFPLHqE)

Para crear un sub-control de este tipo seleccionaremos el control edición en el formulario, pulsaremos el botón ![](/files/-M7D77ocPMhx7Ao1RnLW) de la barra de herramientas del panel de sub-objetos y, en el menú que se despliega, seleccionaremos la opción Subindexador. Sus propiedades son:

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca al [objeto ](/velneo-vdevelop/scripts/lenguajes/javascript/clases/objetos)dentro del proyecto. Este identificador será el que usemos para referenciarlo en otras propiedades de otros objetos.

Constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un objeto no puede haber duplicidad.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del objeto. Se usará para presentar información del objeto en otros objetos y en los [inspectores.](/velneo-vdevelop/inspectores)

Podemos definir una etiqueta por cada idioma presente en el proyecto.

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del objeto.

### Índice

Esta propiedad seleccionaremos el índice de la tabla enlazada que queremos usar para realizar la subindexación.

### Resolución de partes del índice

En esta propiedad resolveremos aquellos campos del índice seleccionado que usaremos para llevar a cabo la subindexación. Pulsar el botón que aparece al ganar el foco esta propiedad para resolverlos. Esto hará que se abra una ventana que contendrá todos los componentes del índice que debamos resolver, los resolveremos uno a uno mediante una [fórmula.](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula)

### Condición de activo

Permite especificar una condición para que el subindexador sea funcional. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas.](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas) Para ello pulsar el botón que aparece al editar esta propiedad. Si no se cumple la condición el control de edición del campo maestro funcionará de la forma habitual es decir, al usar los microescrollers del control de edición se recorrerá la tabla maestra completa. Lo habitual será usar como condición que el campos/variables usados para resolver los componentes de la subindexación tengan algún valor.

{% hint style="warning" %}
No se aconseja usar este tipo de control para editar campos de tipo numérico en el que hayamos establecido unos rangos máximo y mínimo, ya que este tipo de control no realiza esa validación de límites. En este caso es más aconsejable usar un control de tipo [edición numérica](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-numerica).
{% endhint %}


# Edición alfabética

Control de **edición** que se usará principalmente para la edición del contenido de [campos](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) o [variables](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/basicos/variables) alfanuméricas.

![](/files/-M7D78Nd0oOaMT4nF97H)

Este control no debe usarse para editar campos de [tipo Objeto](/velneo-vdevelop/proyectos-objetos-y-editores), ya que existen controles específicos para ellos.

Tampoco se aconseja usarlo en modo lectura/escritura para la introducción de campos de tipo booleanos, numéricos, fecha, hora y tiempo. Existen controles específicos para esos tipos de campo. Para crearlo ejecutar la opción **edición alfabética** de la barra de controles de edición del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores ](/velneo-vdevelop/inspectores)y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control.

### Estilos

Podemos definir los estilos siguientes:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

#### Retardo señal valueChanged

Si activamos este estilo, provocará que el envío de la señal de cambio en el valor del campo se posponga hasta finalizar la escritura, esperando para emitirla 500 milisegundos desde la última modificación realizada.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **edición**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario .Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario. Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Seleccionable con Tab

Permite que el control sea accesible cuando use el tabulador o el Intro para moverse de un control a otro dentro del formulario.

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas.](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas) Para ello pulsar el botón que aparece al editar esta propiedad.

### Condición activo

Permite especificar una condición para que el control sea funcional. La condición se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Sólo lectura

Permite hacer que el contenido del control pueda ser visualizado pero no modificado.

### Contenido

Permite establecer el contenido a editar en el control, éste se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Color de base

En esta propiedad seleccionaremos el color de fondo del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y/o seleccionar otro color.

### Color de texto

En esta propiedad seleccionaremos el color que tendrá el texto contenido en el control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad **color de base**.

### Fuente

Esta propiedad permite establecer la fuente que usará el control. Pulsar el botón que aparece al editar esta propiedad para abrir el [selector de fuentes](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes).

### Alineamiento horizontal

Permite configurar la forma en la que el texto del control entre los márgenes izquierdo y derecho del mismo. Los valores posibles son:

#### Izquierda

Alinea la parte izquierda del contenido con el margen izquierdo del control.

#### Derecha

Alinea la parte derecha del contenido con el margen derecho del control.

#### Centrado

Centra el contenido entre los márgenes izquierdo y redecho del control.

#### Justificado

En controles que disponen de la propiedad multilíneas, se alinea el contenido uniformemente a lo largo de los márgenes izquierdo y derecho del control.

Si el contenido de un control edición alfabética es más largo que su tamaño, no respeta la alineamiento horizontal en ejecución: el texto será alineado y justificado siempre a la derecha.

### Alineamiento vertical

Permite configurar la forma en la que el texto del control será alineado entre los los márgenes superior e inferior del mismo. Los valores posibles son:

#### Arriba

Alinea la parte superior del contenido con el margen superior del control.

#### Abajo

Alinea la parte inferior del contenido con el margen inferior del control.

#### Centrado

Alinea el contenido entre los másgenes superior e inferior del control.

### Contraseña

Permite hacer que el contenido de este control sea visualizado con asteriscos (\*).

### Máscara

Permite aplicar una máscara para formatear el texto. Se trata de una cadena de caracteres de máscara y separadores, opcionalmente seguidos por un punto y coma (;) y el carácter usado para los caracteres en blanco. Los caracteres en blanco son siempre quitados del texto tras la edición. Si usamos la máscara para entrada de datos, todos los caracteres usados a modo de separador serán guardados como parte de la cadena.

A continuación se muestran los caracteres que pueden ser usados en una máscara de entrada. Un espacio en blanco, el carácter por defecto para un carácter en blanco, es necesario en los casos en los que un carácter es permitido pero no requerido.

#### Máscaras para cadenas

| Carácter          | Explicación                                                                                                                                                                                                                          |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Espacio en blanco | Cualquier carácter                                                                                                                                                                                                                   |
| A                 | Carácter ASCII alfabético requerido, A-z, a-z                                                                                                                                                                                        |
| a                 | Carácter ASCII alfabético permitido pero no requerido                                                                                                                                                                                |
| N                 | Carácter ASCII alfanumérico requerido A-Z, a-z, 0-9                                                                                                                                                                                  |
| n                 | Carácter ASCII alfanumérico permitido pero no requerido A-Z, a-z, 0-9                                                                                                                                                                |
| X                 | Requerido cualquier carácter                                                                                                                                                                                                         |
| x                 | Cualquier carácter permitido, pero no requerido                                                                                                                                                                                      |
| 9                 | Dígito ASCII requerido 0-9                                                                                                                                                                                                           |
| 0                 | Dígito ASCII permitido pero no requerido 0-9                                                                                                                                                                                         |
| D                 | Dígito ASCII permitido 1-9                                                                                                                                                                                                           |
| d                 | Dígito ASCII permitido pero no requerido 1-9                                                                                                                                                                                         |
| #                 | Signo + o - permitido pero no requerido                                                                                                                                                                                              |
| H                 | Carácter hexadecimal requerido A-F, a-f, 0-9                                                                                                                                                                                         |
| h                 | Carácter hexadecimal permitido pero no requerido A-F, a-f, 0-9                                                                                                                                                                       |
| B                 | Carácter binario requerido 0-1                                                                                                                                                                                                       |
| b                 | Carácter binario permitido pero no requerido 0-1                                                                                                                                                                                     |
| >                 | Los siguientes caracteres irán en mayúsculas                                                                                                                                                                                         |
| <                 | Los siguientes caracteres irán en minúsculas                                                                                                                                                                                         |
| !                 | Finaliza la conversión de mayúsculas a minúsculas                                                                                                                                                                                    |
| \\                | Usar el carácter  con algún símbolo de los anteriores para ser usado como separador y no como cadena de formato. Ejemplo: Si en una cadena de formato escribimos \d la "d" no será tomada como cadena de formato sino como separador |

#### Ejemplos

Una máscara para escribir una IP podría ser: 000.000.000.000;\_ (los caracteres en blanco son \_). En ejecución el contenido del edit se mostraría como sigue:\
\_\_\_.\_\_\_.\_\_\_.\_\_\_

Y si lo editamos e introducimos el valor 127.0.0.1: 127.0\_\_.0\_\_.1\_\_ lo que se guarda en el campo es: 127.0.0.1 (despreciándose los caracteres en blanco, en este caso \_).

Una máscara para escribir un número de serie podría ser: >AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;# (Los caracteres en blanco son # y todos los caracteres alfabéticos son convertidos a mayúsculas (>).

#### Máscaras para horas

| Carácter | Explicación               |
| -------- | ------------------------- |
| h        | Hora (0-23, 1-12 AM/PM)   |
| hh       | Hora (00-23, 01-12 AM/PM) |
| H        | Hora (0-23)               |
| HH       | Hora (00-23)              |
| m        | Minutos (0-59)            |
| mm       | Minutos (00-59)           |
| s        | Segundos (0-59)           |
| ss       | Segundos (00-59)          |
| z        | (0-999)                   |
| AP       | Período (AM/PM)           |
| ap       | Período (am/pm)           |

#### Máscaras para fechas

| Carácter | Explicación                      |
| -------- | -------------------------------- |
| d        | Día del mes (1-31)               |
| dd       | Día del mes (01-31)              |
| ddd      | Día de la semana (Lun-Dom)       |
| dddd     | Día de la semana (Lunes-Domingo) |
| M        | Mes (1-12)                       |
| MM       | Mes (01-12)                      |
| MMM      | Mes (Ene-Dic)                    |
| MMMM     | Mes (Enero-Diciembre)            |
| yy       | Año (00-99)                      |
| yyyy     | Año (0000-9999)                  |

El resto de caracteres en la cadena de formato serán tratados como texto.

Las máscaras no están disponibles para campos enlazados a maestro.

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de edición, por defecto, crecerán en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de edición, por defecto, no crecen en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu) declarado en el [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) o en cualquier proyecto [heredado](/velneo-vdevelop/herencia).

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto [menú ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu)declarado en el [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) o en cualquier proyecto [heredado](/velneo-vdevelop/herencia) que queremos usar como menú de contexto del control.

### Tipo de menú de botón

Permite incluir dentro del control un botón que al pulsarlo desplegará el menú que se indicará en la propiedad siguiente. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de botón.

#### Botón izquierda

El botón será incluido a la izquierda del control.

#### Botón derecha

El botón será incluido a la derecha del control.

#### Botón oculto

El botón no será visible pero podrán dispararse las [acciones](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/accion) contenidas en el menú asociado al mismo usando las teclas aceleradoras definidas en las mismas.

El icono que se usará en el botón será el asignado al objeto menú en sus propiedades y, en caso de no tener dibujo alguno asignado, se presentará un icono por defecto de la plataforma.

Es posible usar las mismas teclas aceleradoras en los menús incluidos en botones de distintos controles de un mismo formulario pues siempre se ejecutará la acción del control que tenga el foco.

En tiempo de ejecución para desplegar el menú a través del teclado usaremos la combinación de las teclas Shift + F4.

### Menú de botón

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado un valor distinto a **ninguno**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de botón del control.

### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension)declarada en el mismo.

### Autocompletar

Solamente válido para controles de edición de campos enlazados a una tabla maestra o de una tabla estática. Si esta propiedad está activada (verdadero) hará que en tiempo de ejecución si el usuario escribe en el control una cadena, transcurridos 500 milisegundos el programa presentará automáticamente el primer registro de la tabla maestra cuyo campo nombre comience por dicha cadena. La parte añadida quedará seleccionada, con lo que, si el usuario prosigue la escritura, la parte seleccionada será sustituida por los nuevos caracteres que el usuario escriba. Si se desea validar la primera palabra que aparece seleccionada, pulsar la combinación de las teclas Control + Cursor derecha.

Cuando tabulemos en un control de edición de maestro habiendo introducido una cadena antes de que se haya efectuado el autocompletado se atrapará el primer maestro que coincida con la cadena escrita.

En el caso de campos enlazados a maestro, para que esta propiedad sea funcional, es necesario que en el maestro exista un índice del campo que editemos en el formulario. El cómo se busquen las fichas del maestro a escribir dependerá de cómo tengamos declarado el índice NAME en la tabla maestra.

Cuando creamos una tabla maestra, el componente del índice NAME se crea convertido a alfa64. Eso es lo que hace que, al ejecutar el autocompletar, no sea “case sensitive”; ya que esta tabla de caracteres contempla mayúsculas solamente.

### Modo de validar enlazado

Solamente válido para campos enlazados a tabla maestra o estática. Permite definir el modo en el que se validará la existencia del registro maestro al perder el foco el control de edición del campo ID o NAME del maestro. Los valores posibles son:

#### No validar

No se realizará validación alguna.

#### Validar permitiendo vacío

Si el dato introducido en el control no existe en la tabla enlazada no dejará moverse a otro control, o bien hasta que se borre el dato introducido, o bien hasta que se introduzca un dato válido.

#### Validar no permitiendo vacío

Si el dato introducido en el control no existe en la tabla enlazada no dejará moverse a otro control hasta que se introduzca un dato válido.

### Tipo de botones

Cuando en un control de este tipo editamos un campo de un maestro, el sistema incluye automáticamente unos botones arriba y abajo (microscrollers) que nos permitirán navegar por la tabla maestra desde el control. En esta propiedad podremos configurar el aspecto de esos botones. Los valores posibles son:

#### Arriba/abajo

Es el valor por defecto. El contenido de los botones será una flecha hacia arriba y otra hacia abajo, respectivamente.

#### Según estilo

Se usará el estilo que en el estilo visual seleccionado se aplique a los microscrollers.

#### Ocultos

No se mostrarán los microscrollers.

### Vista de datos de lista

Solamente válido para controles de edición de campos enlazados a una tabla de datos maestra. En este parámetro podremos especificar un objeto de lista (por ejemplo, una [rejilla](/velneo-vdevelop/buenas-practicas-de-programacion/buenas-practicas-de-rendimiento/carga-de-registros-en-objetos-de-lista/rejillas)) del maestro enlazado. Esto hará que en ejecución el control se transforme en una lista desplegable, por lo que, podremos desplegarla para mostrar los registros del maestro enlazado y seleccionar uno. Debemos tener en cuenta que el objeto de esta lista es la de seleccionar registros, por lo que se recomienda evitar el uso de rejillas que tengas asociados formularios de alta, baja y/o modificación, si lo hacemos, debemos ser conscientes de que el invocar a los formularios el foco no retornará al control; se perderá.

![](/files/-M7D78O-_UX4k0ukoxHZ)

## Subindexador

El subindexador es un sub-objeto de controles de edición de campos [enlazados](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/enlace) a maestro. Permite realizar una búsqueda más selectiva en los mismos. Para ello se deberá hacer uso de un [índice](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-datos/tabla/indice) de la tabla maestra compuesto en primer lugar por el campo o campos de la tabla maestra que condicionarán la búsqueda y en último término por el campo por el que se recorrerá la tabla maestra; el campo que se editará en el formulario.

Por ejemplo, supongamos que tenemos dos tablas enlazadas PAISES y PROVINCIAS y queremos que en un formulario de otra tabla histórica de ambas podamos, en un control de edición del campo NAME de la provincia, usando los microscrollers, ir recorriendo solamente las provincias del país seleccionado. Para ello deberíamos tener un índice en la tabla de PROVINCIAS compuesto por el campo enlazado a PAISES y por el campo NAME de la provincia:

![](/files/-M7D78VXADU7yOFPLHqE)

Para crear un sub-control de este tipo seleccionaremos el control edición en el formulario, pulsaremos el botón ![](/files/-M7D77ocPMhx7Ao1RnLW) de la barra de herramientas del panel de sub-objetos y, en el menú que se despliega, seleccionaremos la opción Subindexador. Sus propiedades son:

### Identificador

Etiqueta alfanumérica que identifica de forma unívoca al objeto dentro del proyecto. Este identificador será el que usemos para referenciarlo en otras propiedades de otros objetos.

El **identificador** constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un objeto no puede haber duplicidad.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del objeto. Se usará para presentar información del objeto en otros objetos

y en los inspectores.

Podemos definir una etiqueta por cada idioma presente en el proyecto.

### Estilos

Podemos definir el estilo siguiente:

#### Privado

Limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

### Comentarios

Esta propiedad nos permite documentar el uso del objeto.

### Índice

Esta propiedad seleccionaremos el índice de la tabla enlazada que queremos usar para realizar la subindexación.

### Resolución de partes del índice

En esta propiedad resolveremos aquellos campos del índice seleccionado que usaremos para llevar a cabo la subindexación. Pulsar el botón que aparece al ganar el foco esta propiedad para resolverlos. Esto hará que se abra una ventana que contendrá todos los componentes del índice que debamos resolver, los resolveremos uno a uno mediante una [fórmula](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula).

### Condición de activo

Permite especificar una condición para que el subindexador sea funcional. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas.](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas) Para ello pulsar el botón que aparece al editar esta propiedad. Si no se cumple la condición el control de edición del campo maestro funcionará de la forma habitual es decir, al usar los microescrollers del control de edición se recorrerá la tabla maestra completa. Lo habitual será usar como condición que el campos/variables usados para resolver los componentes de la subindexación tengan algún valor.

No se aconseja usar este tipo de control para editar campos de tipo numérico en el que hayamos establecido unos rangos máximo y mínimo, ya que este tipo de control no realiza esa validación de límites. En este caso es más aconsejable usar un control de tipo edición numérica.


# Edición fecha

Control de **edición** que se usará para la edición del contenido de un [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) o de una [variable](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/basicos/variables) de tipo fecha.

![](/files/-M7D79raCfd1REsD-J_T)\
Para crearlo ejecutar la opción **edición fecha** de la barra de controles de edición del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores](/velneo-vdevelop/inspectores) y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control.

### Estilos

Podemos definir los estilos siguientes:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

#### Retardo señal valueChanged

Si activamos este estilo, provocará que el envío de la señal de cambio en el valor del campo se posponga hasta finalizar la escritura, esperando para emitirla 500 milisegundos desde la última modificación realizada.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **edición fecha**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

#### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Seleccionable con Tab

Permite que el control sea accesible cuando use el tabulador o el intro para moverse de un control a otro dentro del formulario.

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Condición activo

Permite especificar una condición para que el control sea funcional. La condición se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Sólo lectura

Permite hacer que el contenido del control pueda ser visualizado pero no modificado.

### Borde

Permite establecer el tipo de borde del control. Los valores posibles son:

#### Ninguno

El control no tendrá bordes.

#### Caja a nivel

El contenido de control estará enmarcado por una caja al mismo nivel que el formulario.

#### Caja hundido

El contenido del control estará enmarcado por una caja con efecto de hundido.

#### Caja elevado

El contenido del control estará enmarcado por una caja con efecto de elevado.

#### Panel a nivel

El contenido de control estará enmarcado por un panel al mismo nivel que el formulario.

#### Panel hundido

El contenido del control estará enmarcado por un panel con efecto de hundido.

#### Panel elevado

El contenido del control estará enmarcado por un panel con efecto de elevado.

#### Con estilo a nivel

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, al mismo nivel que el formulario.

#### Con estilo hundido

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, con efecto de hundido.

#### Con estilo elevado

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, con efecto de elevado.

### Tamaño del borde

Permite establecer el grosor en píxels del borde del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Contenido

Permite establecer el contenido a editar en el control, éste se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas.](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas) Para ello pulsar el botón que aparece al editar esta propiedad.

### Color de base

En esta propiedad seleccionaremos el color de fondo del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y/o seleccionar otro color.

### Color de texto

En esta propiedad seleccionaremos el color que tendrá el texto contenido en el control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad [color de base](#color-de-base).

### Fuente

Esta propiedad permite establecer la fuente que usará el control. Pulsar el botón que aparece al editar esta propiedad para abrir el [selector de fuentes.](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes)

### Alineamiento horizontal

Permite configurar la forma en la que el texto del control entre los márgenes izquierdo y derecho del mismo. Los valores posibles son:

#### Izquierda

Alinea la parte izquierda del contenido con el margen izquierdo del control.

#### Derecha

Alinea la parte derecha del contenido con el margen derecho del control.

#### Centrado

Centra el contenido entre los márgenes izquierdo y redecho del control.

#### Justificado

En controles que disponen de la propiedad multilíneas, se alinea el contenido uniformemente a lo largo de los márgenes izquierdo y derecho del control.

### Alineamiento vertical

Permite configurar la forma en la que el texto del control será alineado entre los los márgenes superior e inferior del mismo. Los valores posibles son:

#### Arriba

Alinea la parte superior del contenido con el margen superior del control.

#### Abajo

Alinea la parte inferior del contenido con el margen inferior del control.

#### Centrado

Alinea el contenido entre los másgenes superior e inferior del control.

### Opciones

Permite definir si el control incluirá o no un botón para desplegar un calendario desde el que el usuario podrá seleccionar la fecha.

![](/files/-M7D79rleVi-3uPW9Wat)

Incluye las opciones siguientes:

#### Sin calendario

El control no tendrá calendario.

#### Con calendario

El usuario podrás desplegar el calendario haciendo clic en el botón embebido en el control.

#### Con calendario al ganar el foco

El calendario se desplegará automáticamente al ganar el foco el control.

### Condición para opciones

Esta propiedad estará visible si en la propiedad **opciones** hemos seleccionado la opción ***con calendario al ganar el foco***. Nos permitirá establecer una condición que si se cumple, desplegará el calendario al ganar el foco. Si no se cumple, no lo desplegará. La condición se establecerá mediante una [fórmula](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas).

### Máscara

Permite aplicar una máscara para formatear el texto. Las máscaras posibles son:

| Carácter | Explicación                                                                                                                                                                                                                            |
| -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| d        | Día del mes (1-31)                                                                                                                                                                                                                     |
| dd       | Día del mes (01-31)                                                                                                                                                                                                                    |
| ddd      | Día de la semana (lu.-do.)                                                                                                                                                                                                             |
| dddd     | Día de la semana (lunes-domingo)                                                                                                                                                                                                       |
| M        | Mes (1-12)                                                                                                                                                                                                                             |
| MM       | Mes (01-12)                                                                                                                                                                                                                            |
| MMM      | Mes (ene.-dic.)                                                                                                                                                                                                                        |
| MMMM     | Mes (enero-diciembre)                                                                                                                                                                                                                  |
| yy       | Año (00-99)                                                                                                                                                                                                                            |
| yyyy     | Año (0000-9999)                                                                                                                                                                                                                        |
| \\       | Usar el carácter  con algún símbolo de los anteriores para ser usado como separador y no como cadena de formato.Ejemplo: Si en una cadena de formato escribimos \d, la "d" no será tomada como cadena de formato, sino como separador. |

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de edición fecha, por defecto, crecerán en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

## Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de edición fecha, por defecto, no crecen en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu)declarado en el [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) o en cualquier proyecto [heredado](/velneo-vdevelop/herencia).

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.

### Tipo de menú de botón

Permite incluir dentro del control un botón que al pulsarlo desplegará el menú que se indicará en la propiedad siguiente. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de botón.

#### Botón izquierda

El botón será incluido a la izquierda del control.

#### Botón derecha

El botón será incluido a la derecha del control.

#### Botón oculto

El botón no será visible pero podrán dispararse las [acciones](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/interfaz/acciones-comandos) contenidas en el menú asociado al mismo usando las teclas aceleradoras definidas en las mismas.

El icono que se usará en el botón será el asignado al objeto menú en sus propiedades y, en caso de no tener dibujo alguno asignado, se presentará un icono interno de la plataforma.

Es posible usar las mismas teclas aceleradoras en los menús incluidos en botones de distintos controles de un mismo formulario pues siempre se ejecutará la acción del control que tenga el foco.

### Menú de botón

Este parámetro solamente estará disponible si en la propiedad anterior hemos seleccionado un valor distinto a **ninguno**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de botón del control.

### Modo de edición

En esta propiedad podemos configurar cómo queremos que se edite la fecha. Los valores posibles son:

#### Fecha

La fecha se introducirá en el formato de fecha del idioma en el que estemos ejecutando la aplicación, en tres bloques (ejemplo: dd/mm/aaaa).

#### Alfanumérico

Podremos escribir la fecha como una cadena y al perder foco el control será cuando se valida y cuando la cadena escrita se convierta en un dato de tipo fecha. Para conocer los formatos de edición disponibles haz clic [aquí](https://doc.velneo.com/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/pages/-M7D76tN6ulVZug4572Z#formatos-de-edición-disponibles).

### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension) declarada en el mismo.


# Edición fecha/hora

Control de **edición** que se usará principalmente para la edición del contenido de un [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) o de una [variable](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/basicos/variables) de tipo fecha y otro de tipo hora.

![](/files/-M7D7843IzSkXn8CkVyV)\
Para crearlo ejecutar la opción **edición fecha/hora** de la barra de controles de edición del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores](/velneo-vdevelop/inspectores) y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control.

### Estilos

Podemos definir los estilos siguientes:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

#### Retardo señal valueChanged

Si activamos este estilo, provocará que el envío de la señal de cambio en el valor del campo se posponga hasta finalizar la escritura, esperando para emitirla 500 milisegundos desde la última modificación realizada.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **edición Fecha/Hora**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Seleccionable con Tab

Permite que el control sea accesible cuando use el tabulador o el intro para moverse de un control a otro dentro del formulario.

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Condición activo

Permite especificar una condición para que el control sea funcional. La condición se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Sólo lectura

Permite hacer que el contenido del control pueda ser visualizado pero no modificado.

### Borde

Permite establecer el tipo de borde del control. Los valores posibles son:

#### Ninguno

El control no tendrá bordes.

#### Caja a nivel

El contenido de control estará enmarcado por una caja al mismo nivel que el formulario.

#### Caja hundido

El contenido del control estará enmarcado por una caja con efecto de hundido.

#### Caja elevado

El contenido del control estará enmarcado por una caja con efecto de elevado.

#### Panel a nivel

El contenido de control estará enmarcado por un panel al mismo nivel que el formulario.

#### Panel hundido

El contenido del control estará enmarcado por un panel con efecto de hundido.

#### Panel elevado

El contenido del control estará enmarcado por un panel con efecto de elevado.

#### Con estilo a nivel

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, al mismo nivel que el formulario.

#### Con estilo hundido

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, con efecto de hundido.

#### Con estilo elevado

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, con efecto de elevado.

### Tamaño del borde

Permite establecer el grosor en píxels del borde del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Contenido

Permite establecer el contenido a editar en el control, éste se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Color de base

En esta propiedad seleccionaremos el color de fondo del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y/o seleccionar otro color.

### Color de texto

En esta propiedad seleccionaremos el color que tendrá el texto contenido en el control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad [color de base](#color-de-base).

### Fuente

Esta propiedad permite establecer la fuente que usará el control. Pulsar el botón que aparece al editar esta propiedad para abrir el [selector de fuentes](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes).

### Alineamiento horizontal

Permite configurar la forma en la que el texto del control entre los márgenes izquierdo y derecho del mismo. Los valores posibles son:

#### Izquierda

Alinea la parte izquierda del contenido con el margen izquierdo del control.

#### Derecha

Alinea la parte derecha del contenido con el margen derecho del control.

#### Centrado

Centra el contenido entre los márgenes izquierdo y redecho del control.

#### Justificado

En controles que disponen de la propiedad multilíneas, se alinea el contenido uniformemente a lo largo de los márgenes izquierdo y derecho del control.

### Alineamiento vertical

Permite configurar la forma en la que el texto del control será alineado entre los los márgenes superior e inferior del mismo. Los valores posibles son:

#### Arriba

Alinea la parte superior del contenido con el margen superior del control.

#### Abajo

Alinea la parte inferior del contenido con el margen inferior del control.

#### Centrado

Alinea el contenido entre los másgenes superior e inferior del control.

### Opciones

Permite definir si el control incluirá o no un botón para desplegar un calendario desde el que el usuario podrá seleccionar una fecha.

### Máscara

Permite aplicar una máscara para formatear el texto. Las máscaras disponibles son:

#### Máscaras para fechas

| Carácter | Explicación                                                                                                                                                                                                                             |
| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| d        | Día del mes (1-31)                                                                                                                                                                                                                      |
| dd       | Día del mes (01-31)                                                                                                                                                                                                                     |
| ddd      | Día de la semana (lu.-do.)                                                                                                                                                                                                              |
| dddd     | Día de la semana (lunes-domingo)                                                                                                                                                                                                        |
| M        | Mes (1-12)                                                                                                                                                                                                                              |
| MM       | Mes (01-12)                                                                                                                                                                                                                             |
| MMM      | Mes (ene.-dic.)                                                                                                                                                                                                                         |
| MMMM     | Mes (enero-diciembre)                                                                                                                                                                                                                   |
| yy       | Año (00-99)                                                                                                                                                                                                                             |
| yyyy     | Año (0000-9999)                                                                                                                                                                                                                         |
| \\       | Usar el carácter  con algún símbolo de los anteriores para ser usado como separador y no como cadena de formato. Ejemplo: si en una cadena de formato escribimos \d, la "d" no será tomada como cadena de formato, sino como separador. |

#### Máscaras para horas

| Carácter | Explicación                                                                                                                                                                                                                             |
| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| h        | Hora (0-23, 1-12 AM/PM)                                                                                                                                                                                                                 |
| hh       | Hora (00-23, 01-12 AM/PM)                                                                                                                                                                                                               |
| H        | Hora (0-23)                                                                                                                                                                                                                             |
| HH       | Hora (00-23)                                                                                                                                                                                                                            |
| m        | Minutos (0-59)                                                                                                                                                                                                                          |
| mm       | Minutos (00-59)                                                                                                                                                                                                                         |
| s        | Segundos (0-59)                                                                                                                                                                                                                         |
| ss       | Segundos (00-59)                                                                                                                                                                                                                        |
| z        | (0-999)                                                                                                                                                                                                                                 |
| AP       | Período (AM/PM)                                                                                                                                                                                                                         |
| ap       | Período (am/pm)                                                                                                                                                                                                                         |
| \\       | Usar el carácter  con algún símbolo de los anteriores para ser usado como separador y no como cadena de formato. Ejemplo: si en una cadena de formato escribimos \d, la "d" no será tomada como cadena de formato, sino como separador. |

El resto de caracteres en la cadena de formato serán tratados como texto.

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de edición fecha/hora, por defecto, crecerán en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de edición fecha/hora, por defecto, no crecen en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu)declarado en el [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) o en cualquier proyecto [heredado](/velneo-vdevelop/herencia).

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.

### Tipo de menú de botón

Permite incluir dentro del control un botón que al pulsarlo desplegará el menú que se indicará en la propiedad siguiente. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de botón.

#### Botón izquierda

El botón será incluido a la izquierda del control.

#### Botón derecha

El botón será incluido a la derecha del control.

#### Botón oculto

El botón no será visible pero podrán dispararse las [acciones](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/interfaz/acciones-comandos) contenidas en el menú asociado al mismo usando las teclas aceleradoras definidas en las mismas.

El icono que se usará en el botón será el asignado al objeto menú en sus propiedades y, en caso de no tener dibujo alguno asignado, se presentará un icono interno de la plataforma.

Es posible usar las mismas teclas aceleradoras en los menús incluidos en botones de distintos controles de un mismo formulario pues siempre se ejecutará la acción del control que tenga el foco.

### Menú de botón

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado un valor distinto a **ninguno**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de botón del control.

### Modo de edición

Nos permite configurar cómo queremos editar la fecha. Los valores posibles son:

#### Fecha

La fecha se introducirá según el formato de fecha del idioma de ejecución, en tres bloques, ejemplo: dd/mm/yyyy. Este es el valor por defecto.

#### Alfanumérico

Permite escribir la fecha como una cadena y al perder el foco se validará la cadena y se convertirá en un dato de tipo fecha. Es un sistema muy versátil para la introducción de fechas. Haz clic [aquí](https://doc.velneo.com/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/pages/-M7D76tN6ulVZug4572Z#formatos-de-edición-disponibles) para conocer los formatos de edición dispomibles.

{% hint style="warning" %}
El modo de edición tipo alfanumérico el calendario no estará disponible.
{% endhint %}

### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension) declarada en el mismo.

{% hint style="info" %}
Por defecto, este control muestra la fecha completa (año, mes y día) y las horas y los minutos, no los segundos. En el caso de que queramos mostrar segundos, tendremos que aplicar una [máscara](https://doc.velneo.com/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/controles-de-edicion/pages/-M7D76nNS1M78ELIxsyu#máscara).
{% endhint %}


# Edición fórmula

Control de **edición** que se usará para la edición de un [campo ](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos)de tipo **objeto fórmula**.

![](/files/-M7D78Q3Ok5ntDXbsPgz)

Permitirá al usuario final definir una fórmula usando campos del maestro declarado en las propiedades del campo tipo objeto fórmula. El botón embebido en el control abrirá el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas) para facilitar al usuario su creación.

Para crearlo ejecutar la opción **edición fórmula** de la barra de controles de edición del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores](/velneo-vdevelop/inspectores) y en las propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control.

### Estilos

Podemos definir los estilos siguientes:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

#### Retardo señal valueChanged

Si activamos este estilo, provocará que el envío de la señal de cambio en el valor del campo se posponga hasta finalizar la escritura, esperando para emitirla 500 milisegundos desde la última modificación realizada.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **edición fórmula**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto](/velneo-vdevelop/proyectos-objetos-y-editores).

### Seleccionable con Tab

Permite que el control sea accesible cuando use el tabulador o el intro para moverse de un control a otro dentro del formulario.

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Condición activo

Permite especificar una condición para que el control sea funcional. La condición se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Sólo lectura

Permite hacer que el contenido del control pueda ser visualizado pero no modificado.

### Contenido

Permite establecer el contenido a editar en el control, éste se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad. El campo o variable a editar deberá ser de tipo alfabético.

### Color de base

En esta propiedad seleccionaremos el color de fondo del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y/o seleccionar otro color.

### Color de texto

En esta propiedad seleccionaremos el color que tendrá el texto contenido en el control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad [color de base](#color-de-base).

### Fuente

Esta propiedad permite establecer la fuente que usará el control. Pulsar el botón que aparece al editar esta propiedad para abrir el [selector de fuentes](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes).

### Alineamiento horizontal

Permite configurar la forma en la que el texto del control entre los márgenes izquierdo y derecho del mismo. Los valores posibles son:

#### Izquierda

Alinea la parte izquierda del contenido con el margen izquierdo del control.

#### Derecha

Alinea la parte derecha del contenido con el margen derecho del control.

#### Centrado

Centra el contenido entre los márgenes izquierdo y redecho del control.

#### Justificado

En controles que disponen de la propiedad multilíneas, se alinea el contenido uniformemente a lo largo de los márgenes izquierdo y derecho del control.

### Alineamiento vertical

Permite configurar la forma en la que el texto del control será alineado entre los los márgenes superior e inferior del mismo. Los valores posibles son:

#### Arriba

Alinea la parte superior del contenido con el margen superior del control.

#### Abajo

Alinea la parte inferior del contenido con el margen inferior del control.

#### Centrado

Alinea el contenido entre los másgenes superior e inferior del control.

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores

posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Este tipo de controles, por defecto, crecerán en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

* **Por defecto**: asume el comportamiento que tiene establecido el tipo de control en el sistema. Este tipo de controles, por defecto, no crecen en altura proporcionalmente a la altura del formulario.
* **Fijo**: la altura del control será fija, no variará para adaptarse a la altura del formulario.
* **Proporcional**: la altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu)declarado en el [proyecto de aplicación ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion)o en cualquier proyecto [heredado](/velneo-vdevelop/herencia).

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.

### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension)declarada en el mismo.

Si estamos editando un texto en un control de este tipo la pulsación de la tecla Intro lo que hará será añadir un salto de línea dentro del control, si queremos aceptar el formulario que contiene el control tendremos que pulsar la combinación de las teclas ctrl+intro.

Si estamos editando un texto en un control de este tipo, el tabulador pasará al siguiente control en el orden tab, si queremos insertar un carácter tabulador en el control usaremos la combinación de las teclas ctrl+tabulador.


# Edición hora

Control de **edición** que se usará para la edición del contenido de un [campo](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas/campos) o de una [variable](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/basicos/variables) de tipo hora.

![](/files/-M7D77zxWRCsN-OX-LTw)\
Para crearlo ejecutar la opción **edición hora** de la barra de controles de edición del editor de formularios, hacer un clic con el botón izquierdo del ratón dentro del área del formulario y, sin soltar el botón del ratón, arrastrarlo hacia abajo y hacia la derecha hasta obtener el tamaño deseado. Soltar el botón del ratón para finalizar la creación del control.

## Propiedades

### Identificador

Etiqueta alfanumérica que identifica al control. Este identificador será el que se usa para referenciarlo en los [inspectores ](/velneo-vdevelop/inspectores)y en las

propiedades de otros objetos.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del control.

### Estilos

Podemos definir los estilos siguientes:

#### Privado

Limita el acceso del usuario final al sub-objeto desde puntos donde no se haya programado el acceso al mismo.

#### Retardo señal valueChanged

Si activamos este estilo, provocará que el envío de la señal de cambio en el valor del campo se posponga hasta finalizar la escritura, esperando para emitirla 500 milisegundos desde la última modificación realizada.

### Comentarios

Esta propiedad nos permite documentar el uso del control.

### Tipo

Muestra el tipo de control de que se trata. En este caso es **edición hora**, aunque podremos modificarlo. Si modificamos el tipo de control perderemos las propiedades específicas de éste.

### Ancho

Muestra la anchura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Alto

Muestra la altura en píxels del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición X

Muestra la posición del control, en pixels, en el eje X (horizontal) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Posición Y

Muestra la posición del control, en pixels, en el eje Y (vertical) dentro del formulario.Es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Tooltip

Permite especificar un texto que se presentará al usuario final de la aplicación cuando pase el cursor del ratón sobre el control. Podemos definir un texto por cada idioma presente en el [proyecto.](/velneo-vdevelop/proyectos-objetos-y-editores)

### Seleccionable con Tab

Permite que el control sea accesible cuando use el tabulador o el intro para moverse de un control a otro dentro del formulario.

### Condición visible

Permite especificar una condición para que el control sea visible. La condición se establecerá mediante una fórmula que podremos escribir usando el [asistente para edición de fórmulas](/velneo-vdevelop/proyectos-objetos-y-editores/editores/asistente-de-formulas). Para ello pulsar el botón que aparece al editar esta propiedad.

### Condición activo

Permite especificar una condición para que el control sea funcional. La condición se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Sólo lectura

Permite hacer que el contenido del control pueda ser visualizado pero no modificado.

### Borde

Permite establecer el tipo de borde del control. Los valores posibles son:

#### Ninguno

El control no tendrá bordes.

#### Caja a nivel

El contenido de control estará enmarcado por una caja al mismo nivel que el formulario.

#### Caja hundido

El contenido del control estará enmarcado por una caja con efecto de hundido.

#### Caja elevado

El contenido del control estará enmarcado por una caja con efecto de elevado.

#### Panel a nivel

El contenido de control estará enmarcado por un panel al mismo nivel que el formulario.

#### Panel hundido

El contenido del control estará enmarcado por un panel con efecto de hundido.

#### Panel elevado

El contenido del control estará enmarcado por un panel con efecto de elevado.

#### Con estilo a nivel

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, al mismo nivel que el formulario.

#### Con estilo hundido

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, con efecto de hundido.

#### Con estilo elevado

El contenido de control estará enmarcado por el estilo de borde que use el estilo visual aplicado, con efecto de elevado.

### Tamaño del borde

Permite establecer el grosor en píxels del borde del control; es posible modificar su contenido o bien escribiendo directamente un número o bien usando los microscrollers: ![](/files/-M7D78EFqsxInNWKn8R2), que permiten aumentar/disminuir en una unidad el valor actual.

### Contenido

Permite establecer el contenido a editar en el control, éste se establecerá mediante una fórmula que podremos escribir usando el asistente para edición de fórmulas. Para ello pulsar el botón que aparece al editar esta propiedad.

### Color de base

En esta propiedad seleccionaremos el color de fondo del control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y/o seleccionar otro color.

### Color de texto

En esta propiedad seleccionaremos el color que tendrá el texto contenido en el control. Junto al nombre del color se presenta una muestra del mismo, pulsar sobre ella para editarlo y o seleccionar otro color.

### Fondo opaco

Esta propiedad permite hacer transparente el fondo del control o aplicar un color opaco al fondo del mismo. Se tomará el color establecido en la propiedad [color de base](#color-de-base).

### Fuente

Esta propiedad permite establecer la fuente que usará el control. Pulsar el botón que aparece al editar esta propiedad para abrir el [selector de fuentes](/velneo-vdevelop/proyectos-objetos-y-editores/editores/selector-de-fuentes).

### Alineamiento horizontal

Permite configurar la forma en la que el texto del control entre los márgenes izquierdo y derecho del mismo. Los valores posibles son:

#### Izquierda

Alinea la parte izquierda del contenido con el margen izquierdo del control.

#### Derecha

Alinea la parte derecha del contenido con el margen derecho del control.

#### Centrado

Centra el contenido entre los márgenes izquierdo y redecho del control.

#### Justificado

En controles que disponen de la propiedad multilíneas, se alinea el contenido uniformemente a lo largo de los márgenes izquierdo y derecho del control.

### Alineamiento vertical

Permite configurar la forma en la que el texto del control será alineado entre los los márgenes superior e inferior del mismo. Los valores posibles son:

#### Arriba

Alinea la parte superior del contenido con el margen superior del control.

#### Abajo

Alinea la parte inferior del contenido con el margen inferior del control.

#### Centrado

Alinea el contenido entre los másgenes superior e inferior del control.

### Máscara

Permite aplicar una máscara para formatear el texto. Las máscaras posibles son:

| Carácter | Explicación                                                                                                                                                                                                                             |
| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| h        | Hora (0-23, 1-12 AM/PM)                                                                                                                                                                                                                 |
| hh       | Hora (00-23, 01-12 AM/PM)                                                                                                                                                                                                               |
| H        | Hora (0-23)                                                                                                                                                                                                                             |
| HH       | Hora (00-23)                                                                                                                                                                                                                            |
| m        | Minutos (0-59)                                                                                                                                                                                                                          |
| mm       | Minutos (00-59)                                                                                                                                                                                                                         |
| s        | Segundos (0-59)                                                                                                                                                                                                                         |
| ss       | Segundos (00-59)                                                                                                                                                                                                                        |
| z        | (0-999)                                                                                                                                                                                                                                 |
| AP       | Período (AM/PM)                                                                                                                                                                                                                         |
| ap       | Período (am/pm)                                                                                                                                                                                                                         |
| \\       | Usar el carácter  con algún símbolo de los anteriores para ser usado como separador y no como cadena de formato. Ejemplo: si en una cadena de formato escribimos \d, la "d" no será tomada como cadena de formato, sino como separador. |

### Ancho en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de edición fecha, por defecto, crecerán en anchura proporcionalmente a la anchura del formulario.

#### Fijo

El ancho del control será fijo, no variará para adaptarse a la anchura del formulario.

#### Proporcional

El ancho del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

### Alto en layout

Permite establecer cómo se comportará el control dentro del layout. Los valores posibles son:

#### Por defecto

Asume el comportamiento que tiene establecido el tipo de control en el sistema. Los controles de edición fecha, por defecto, no crecen en altura proporcionalmente a la altura del formulario.

#### Fijo

La altura del control será fija, no variará para adaptarse a la altura del formulario.

#### Proporcional

La altura del control crecerá con el formulario siguiendo las mismas proporciones establecidas en el editor con respecto al resto de los controles del layout.

## Tipo de menú de contexto

Permite asignar un menú de contexto al control. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de contexto.

#### Por defecto

En ejecución se usará el menú de contexto por defecto del control. No todos los controles por defecto tienen menú de contexto.

#### Personalizado

Permite indicar que el control usará un objeto [menú](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/menu) declarado en el [proyecto de aplicación](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion) o en cualquier proyecto [heredado](/velneo-vdevelop/herencia).

### Menú de contexto

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado el valor **personalizado**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de contexto del control.

### Tipo de menú de botón

Permite incluir dentro del control un botón que al pulsarlo desplegará el menú que se indicará en la propiedad siguiente. Los valores posibles son:

#### Ninguno

En ejecución el control carecerá de menú de botón.

#### Botón izquierda

El botón será incluido a la izquierda del control.

#### Botón derecha

El botón será incluido a la derecha del control.

#### Botón oculto

El botón no será visible pero podrán dispararse las [acciones](/velneo-vdevelop/proyectos-objetos-y-editores/de-aplicacion-y-datos/proceso/interfaz/acciones-comandos) contenidas en el menú asociado al mismo usando las teclas aceleradoras definidas en las mismas.

El icono que se usará en el botón será el asignado al objeto menú en sus propiedades y, en caso de no tener dibujo alguno asignado, se presentará un icono interno de la plataforma.

Es posible usar las mismas teclas aceleradoras en los menús incluidos en botones de distintos controles de un mismo formulario pues siempre se ejecutará la acción del control que tenga el foco.

### Menú de botón

Este parámetro solamente estará disponible si en el parámetro anterior hemos seleccionado un valor distinto a **ninguno**. En él seleccionaremos el objeto menú proyecto de aplicación declarado en el heredado o en cualquier proyecto que queremos usar como menú de botón del control.

### Ficha extensión

Indica que lo que editaremos en el control no será un campo de la ficha asociada al formulario, sino de una [extensión de ficha ](/velneo-vdevelop/proyectos-objetos-y-editores/proyecto-de-aplicacion/formulario/fichas-de-extension)declarada en el mismo.




---

[Next Page](/llms-full.txt/1)

