Campo
Última actualización
Última actualización
Un campo es un subobjeto del objeto 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 .
Para crear un campo enlazado a maestro pulsaremos la opción . Para crear un campo enlazado a tabla estática pulsaremos la opción .
Las propiedades de un campo son:
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.
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.
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 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, 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.
Etiqueta alfanumérica que servirá como descriptor del campo. Se usará para presentar información del campo en objetos e inspectores. Podemos definir una etiqueta por cada idioma presente en el proyecto.
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..
Esta propiedad nos permite documentar el uso del campo.
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 disponibles son:
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.
Si hemos definido que el campo es enlazado y la tabla enlazada es de tipo submaestro, mostrará el campo padre de la tabla.
Si hemos definido que el campo es enlazado y la tabla enlazada es de tipo tabla estática, seleccionaremos la tabla estática enlazada.
Si hemos definido que el campo es enlazado y el tipo de 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.
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.
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á.
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 que permite calcular la posición del registro que queremos apuntar.
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, que podrá ser:
Es decir, con el mismo valor que el definido en la resolución para ese componente.
Con un valor mayor o igual que el definido en la resolución.
Con un valor igual o menor que el definido en la resolución.
Con un valor mayor que el definido.
Con un valor menor que el definido.
Con el valor que se encuentre en la primera posición del índice.
Con un valor que se encuentre en la última posición del índice.
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.
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.
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:
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.
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.
Alfa 128
Se usa para almacenar datos en los que se desprecien los espacios en blanco iniciales y finales. Permite almacenar textos en minúsuculas, 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).
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.
Usado para datos numéricos. El rango máximo del campo es 10 bytes (Del 0 al 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
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 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.
Permite introducir horas en formato HH:MM:SS. No almacena milisegundos.
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.
Este tipo de campo internamente lo que guarda es el tiempo transcurrido en segundos desde el 01-01-1970 00:00:00, teniendo en cuenta la zona horaria en la que se guarda el dato. Cuando leemos esa información Velneo la presenta en formato local de la máquina donde la estemos leyendo, teniendo en cuenta esa diferencia horaria.
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, puedes aplicar una máscara. En otros lugares, podemos aplicarle la función de fórmulas dateTimeToString().
Si convertimos un dato de tipo tiempo a número con la función de fórmulas stringToNumber, obtendremos un timestamp de UNX. Ejemplo:
stringToNumber(#TMP)
Es un campo lógico que permite definir el contenido como 1 ó 0 (Sí o No).
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 de Velneo (no admite 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. Hemos de definir la tabla enlazada de la que se alimentará la fórmula. Puede ser la tabla en curso u otra tabla. En tiempo de ejecución dispondremos del asistente de fórmulas para su definición, teniendo acceso a través del mismo a los campos de la tabla enlazada, variables, constantes, etc. El rango máximo del campo es 65535 bytes (65535 caracteres).
El cálculo de la fórmula establecida podremos obtenerlo a través de otra fórmula o contenido inicial mediante el uso de la función de campo calcDynamicFormula().
En este tipo de campo no se pueden seleccionar tablas de tipo histórico ya que éstas no pueden ser enlazadas.
El límite máximo de un contenedor es 36^5 = 60.466.176 de objetos de cada tipo de objeto.
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. Si como idioma de vClient usamos sistema tomará la configuración establecida en el sistema operativo, si configuramos otro idioma de los que trae la plataforma por defecto (Español o Inglés) tomará la configuración que QT tenga establecida por defecto para ese idioma (no es posible modificarla), que sigue el estándar Unicode Common Locale Data Repository (http://cldr.unicode.org/\.
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.
Las propiedades comunes de los campos son las siguientes:
Número de bytes que define el rango del campo.
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.
Define si el campo de tipo numérico tiene signo.
Rango límite mínimo válido para la entrada de valores.
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.
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. Puede ser una constante, el identificador de un campo, una variable global o una variable 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.
Expresión fórmula usada para calcular los campos de tipo fórmula.
No debemos usar funciones en contenidos iniciales de campos ni en fórmulas de campos de tipo fórmula.
Las tablas de caracteres para los distintos tipos de campo alfabéticos propios son:
Los códigos Unicode de los caracteres de las distintas tablas de caracteres propias son: