Documentación de Velneo
30
30
  • Introducción
  • Velneo
    • Requerimientos de Velneo
    • Notas de la versión
    • Funcionalidades comunes a los componentes de Velneo
      • Instalación
      • Conexión con Velneo vServer
      • Cambiar el estilo de visualización
      • Ver u ocultar barras de herramientas
      • Mensajería interna entre usuarios
      • Soporte de alta resolución (HighDPI)
      • Carpetas de trabajo de los componentes de Velneo
      • Numeración de versiones de Velneo
      • Certificado de firma digital para componentes de Windows
    • Tipos de archivo generados por Velneo
    • Velneo Web
      • Plataformas y navegadores compatibles
      • Acceso a recursos del sistema
      • Siempre https
      • Funcionamiento de vatp por websocket
      • CORS para llamadas xmlhttprequest
  • Velneo vDevelop
    • ¿Qué es Velneo vDevelop?
    • Identificación de usuario
    • Interfaz de Velneo vDevelop
      • Menú Soluciones
      • Menú Proyectos
      • Menú Objetos
      • Menú Scripts
      • Menú Edición
      • Menú Ver
      • Menú Componentes
      • Menú Ayuda
    • Lista de teclas aceleradoras de Velneo vDevelop
    • Soluciones y proyectos
    • Control y edición de proyectos
    • Herencia
    • Inspectores
    • Proyectos objetos y editores
      • Proyecto de datos
      • Proyecto de aplicación
        • Crear CSS para aplicar a objetos en edición
      • Objeto
        • Refactorización automátca
      • Objetos de proyecto de datos
        • Indice complejo
        • Tabla
          • Actualización
          • Campo
          • Enlace
          • Indice
          • Plural
          • Traspaso de campo
          • Trigger
        • Tabla estática
        • Variable
      • Objetos de proyecto de aplicación
        • Acción
        • Alternador de lista
        • Arbol visor de tablas
        • Bloc de formularios
        • Casillero
        • Cesta
        • ComboView
        • Control SVG
        • Dispositivo serie
        • Formulario
          • Controles de visualización
            • Texto estático
            • Nombre de campo
            • Visor HTML
            • Dibujo
            • Imagen SVG
            • Caja de grupo
            • Menú arbolado
            • Barra de progreso
            • Reloj
            • Manómetro
            • Termómetro
          • Controles de edición
            • Caja de texto
            • Caja de texto enriquecido
            • Data catcher edit
            • Edición alfabética
            • Edición fecha
            • Edición fecha/hora
            • Edición fórmula
            • Edición hora
            • Edición numérica
            • Edición senda fichero
            • Edición senda directorio
            • Objeto dibujo
          • Controles de entrada
            • Botón
            • Botón de check
            • Botón de radio
            • Calendario
            • ComboBox
            • Deslizador
            • Dial
            • ListBox
            • Rueda
          • Contenedores
            • Área de scroll
            • Caja de formularios
            • Pila de formularios
            • Separador de formularios
            • Splitter
            • Vista de datos
          • Layout
          • Tree widget
          • Controles SVG
          • Extensión de ficha
        • Formulario QML
        • Gráfico
        • Imagen SVG
        • Impresora lógica
        • Informe
          • Editor de informes
          • Agrupamiento
          • Sección
          • Cálculo
        • Informe personalizable
          • Diseñando un informe personalizable básico
          • Diseño avanzado
          • Diseñando un informe personalizable
          • Añadiendo orígenes de datos
          • Añadiendo elementos al informe
          • Características avanzadas
          • Etiquetas
          • Asistente de scripts
          • Impresión de gráficos
          • Opciones html
        • ListView
        • Lista QML
        • Localizador
        • Marco
        • Menú
        • Multivista
        • Protocolo TCP-IP
        • Reemplazo
        • Rejilla
          • Propiedades de columna de rejilla
        • Rejilla avanzada
          • Propiedades de columna de rejilla avanzada
        • Toolbar
        • ViewFlow
        • Sub-objetos de vistas de datos
          • Conexión de evento
          • Drop
          • Inserción
          • Manejador de evento
      • Objetos comunes a proyecto de datos y de aplicación
        • Búsqueda
        • Cola
        • Constante
        • Dibujo
        • Esquema de tablas
        • Fichero adjunto
        • Función
        • Librería externa
        • Lupa
        • Proceso
          • Indice de comandos de instrucción de proceso
          • Comandos de base de datos
            • API
            • Bases de datos externas
            • Búsquedas
            • Campos (grupo de comandos)
            • Cestas
            • Fichas
            • Fichas seleccionadas
            • Listas
            • Tablas
            • Tubos
          • Básicos
            • Controles de flujo
            • Debug
            • Ejecución
            • Salida/retornos
            • Scripts (grupo de comandos)
            • Transacciones (comandos)
            • Variables
          • Comunicación
            • GPS
            • Internet
            • Protocolo TCP
            • Puerto serie
            • SDV
          • Interfaz
            • Acciones (comandos)
            • Control
              • Ejemplo de CSS
            • Diálogos
            • Formularios - comandos
            • Localizadores
            • Objeto - grupo de comandos
            • Ventana principal
            • Vista de datos - comandos
          • Sistema
            • Comandos de Sistema
            • Configuración
            • Directorios
            • Ficheros
        • Tubo de ficha
        • Tubo de lista
        • Variable local
      • Editores
        • Asistente de fórmulas
          • Operadores
          • Funciones estándar
            • Funciones API
            • Funciones básicas
            • Funciones de cadenas
              • Expresiones regulares
            • Funciones científicas
            • Funciones de Cliente-servidor
            • Funciones de color
            • Funciones de códigos
            • Funciones de directorios
            • Funciones de fechas
            • Funciones de ficha en curso
            • Funciones de horas
            • Funciones JSON
            • Funciones de Internet
            • Funciones de juegos de caracteres
              • Codecs
            • Funciones numéricas
            • Funciones de sistema
            • Funciones de tiempo
            • Funciones trigonométricas
          • Funciones de dll
          • Funciones de proceso
          • Funciones de campo
          • Campos
          • Constantes
          • Variables globales
          • Variables locales
          • Variables del sistema
          • Verificador de fórmulas
          • Conversión automática de datos
          • Introducción de datos literales
          • Secuencias de escape en cadenas de caracteres
          • Composición de sendas en fórmulas
          • Operar con datos de tipo fecha, hora y tiempo
        • Editor de imágenes
        • Selector de fuentes
    • Scripts
      • Lenguajes
        • JavaScript
          • Procesos JavaScript
          • Fórmulas JavaScript
          • Clases
            • Funciones globales
            • Objetos
            • VAbstractBrowser
            • VAbstractDataView
            • VAbstractListDataView
            • VAdvandedGridListDataView
            • VAlternatorListDataView
            • VApp
              • VApp: enumeraciones
              • VApp: ejemplos
            • VBoundFieldComboBox
            • VBoundFieldEdit
            • VBoundFieldEditBrowser
            • VBoundFieldListBox
            • VByteArray
            • VCheckBox
            • VClipboard
            • VClockWidget
            • VComboBox
            • VComboListDataView
            • VCoverFlowListDataView
            • VCWebView
            • VDataCatcherEdit
            • VDataCatcherEditBrowser
            • VDataView
            • VDataViewDialog
            • VDateEdit
            • VDateEditBrowser
            • VDateTimeEdit
            • VDateTimeEditBrowser
            • VDial
            • VDir
              • VDir: enumeraciones
            • VExtension
              • VExtension: enumeraciones
            • VFile
              • VFile: enumeraciones
            • VFileInfo
            • VFilePathEditBrowser
            • VFinder
            • VFont
              • VFont: enumeraciones
            • VFormBlockListDataView
            • VFormDataView
            • VFormulaEditBrowser
            • VGaugeWidget
            • VGPS
            • VGridListDataView
            • VGroupBox
            • VImage
            • VImageEdit
            • VImageWidget
            • VInstancesList
            • VInstance
            • VInstances
            • VItemRegisterPattern
            • VLabel
            • VLineEdit
            • VLineEditBrowser
            • VListBox
            • VListDataView
            • VLogin
            • VMainWindow
              • VMainWindow: enumeraciones
            • VMdiView
            • VMimeData
            • VMultiDataView
            • VNumberSpinBox
            • VNumberSpinBoxBrowser
            • VObjectInfo
              • VObjectInfo: enumeraciones
            • VObjectInstance
            • VProcess
            • VProgressBar
            • VProjectInfo
            • VPushButton
            • VQmlFormDataView
            • VQmlListDataView
            • VQmlListModel
            • VQuery
            • VRadioButton
            • VRegister
            • VRegisterList
            • VReportListDataView
            • VRequest
            • VResponse
            • VRoot
            • VScreen
            • VScrollArea
            • VServerAdmin
            • VSettings
            • VSlider
            • VSlotListDataView
            • VSolutionInfo
            • VSplitter
            • VSqlDatabase
            • VSSLCertificate
            • VSSLInfo
            • VSSLSessionCipher
            • VStackedWidget
            • VSvgButton
            • VSvgSlideSwitch
            • VSvgToggleSwitch
            • VSvgWidget
            • VSysInfo
              • VSysInfo: enumeraciones
            • VTableInfo
              • VTableInfo: enumeraciones
            • VTabWidget
            • VTextEdit
            • VTextFile
            • VThermometerWidget
            • VThumbWheel
            • VTimeEdit
            • VTimeEditBrowser
            • VToolBox
            • VTreeItem
            • VTreeItemRegister
            • VTreeListDataView
            • VTreeMenu
            • VTreeMultiTableListDataView
            • VTreeWidget
            • VUser
            • VUserGroup
            • VUserGroupList
            • VUserList
            • VXmlReader
            • VXmlWriter
            • Widget
            • XMLHttpRequest
        • QML
          • Tipos QML
          • Funciones específicas de QML
    • Depuración
      • Depuración de procesos de Velneo
      • Depuración de procesos JavaScript
      • Monitor de vClient
    • Extensiones de Velneo vDevelop
    • Acceso directo a una solución desde vDevelop
    • Buenas prácticas
      • Buenas prácticas de organización
        • Proyectos
        • Organización de carpetas
        • Proyecto de datos
        • Proyecto de aplicación
      • Buenas prácticas de codificación
        • Identificadores
        • Teclas aceleradoras
        • Documenta
        • Diseña los formularios como si no existiesen los layouts
      • Buenas prácticas de rendimiento
        • Arquitectura
          • Listas de registros
          • Lista de resultados de una búsqueda
          • Las cestas
          • Las variables globales
          • La caché de fichas
          • Programa en cloud
        • Formularios
          • Condiciones de visible y activo
          • Carga de subformularios en pestaña, caja o pila
        • Base de datos
          • Campos
          • Indices
          • Actualizaciones
          • Eventos de tabla o triggers
          • Variables globales y constantes
          • Tablas en memoria vs tablas en disco
          • Optimizar migraciones de datos
          • Búsquedas en el servidor ¿Cuándo y Cómo?
          • Campos fórmula vs campos en disco
          • Indices condicionados vs búsquedas complejas
          • ¿Cuándo usar tablas de extensión?
          • Indices de trozos y palabras
          • ¿Cuándo usar cada tipo de campo alfa?
        • Procesos y funciones y eventos
          • 1º, 2º, 3º y 4º plano ¿Cuándo usar cada uno?
          • Bloqueo blando vs bloqueo duro
          • Pasar información del cliente al servidor
          • ¿Cómo optimizar transacciones grandes?
          • ¿Cómo gestionar las transacciones?
          • Grabaciones optimizadas para el usuario
        • Carga de registros en objetos de lista
          • Rejillas
            • Campos punteros a singular
            • Totales
            • Condiciones de activo, visible y color en columna
            • Campos de tipo objeto
        • Conoce los límites
      • Imágenes
      • Buenas prácticas para el desarrollo en equipo
      • Modo mantenimiento
    • Análisis de bases de datos para aplicaciones de Velneo
      • Un centro de enseñanza
      • Facturas de un cliente
      • Repartos de obras de teatro
      • Galería de arte
      • Gestión de un colegio
      • Instalación de lunas para vehículos
      • Libros y autores
      • Tienda de discos
      • Últimos pedidos de un proveedor
      • Existencias por almacén y precios por cliente
      • Generación de tickets para un quiosco
      • Navegación por facturas
  • Velneo vDevelop Web
  • Velneo vAdmin
    • ¿Qué es Velneo vAdmin?
    • Gestión de usuarios
    • Gestión de aplicaciones
      • Soluciones
      • Instancias
      • Disco
    • Monitorización
      • Lista de comandos
    • Tareas
    • Acceso directo
    • Velneo vAdmin Web
  • Velneo vClient
    • ¿Qué es Velneo vClient?
    • Movilidad
    • Funcionalidades de Velneo vClient
      • Accesos directos y VRL
      • Cambiar idioma
      • Panel de procesos en 2º plano
      • Manejo de rejillas
        • Submenú de filtros
      • Uso de la rejilla avanzada
      • Manejo de cestas
      • Refrescos
      • Caché local
      • Edición de campos enlazados a maestro
      • Edición de campos de tipo fecha
      • Capturar imagen desde una cámara
      • Asignar impresoras lógicas
      • Actualización automática
      • Personalización de la ventana de conexión de Velneo vClient
      • Instalador personalizado de Velneo vClient
      • Ordenación de listas
  • Velneo vServer
    • ¿Qué es Velneo vServer?
    • Instalación y configuración
      • Activación de la licencia
      • Línea de comandos de Velneo vServer
      • Parámetros configurables de Velneo vServer
      • Estructura de directorios
    • Iniciar y detener Velneo vServer
    • Funcionalidades
      • Protocolo VATP
      • Protocolo VATPS
      • Multi-hilo
      • Integridad referencial
      • Refrescos terciarios
      • Sistema transaccional
      • Sistema de bloqueos
      • Tecnología bigkey
      • Hilo de control
    • Mensajes de log de sistema
    • vPacker
  • Velneo vInstallBuilder
    • ¿Qué es Velneo vInstallBuilder?
    • Configurar una instalación
    • Probar una instalación
    • Crear el instalable
    • Accesos directos
  • Velneo vModApache
    • ¿Qué es Velneo vModApache?
    • Instalación y configuración
    • Nomenclatura de objetos en urls
    • Uso de ficheros adjuntos
    • Caché local de Velneo vModApache
  • Velneo vDataClient
    • ¿Qué es Velneo vDataClient?
    • Iniciar Velneo vDataClient
    • Interfaz de Velneo vDataClient
    • Procesos
    • Utilidades
    • Acceso directo a una instancia de datos
    • Velneo vDataClient Web
  • Velneo vTranslator
    • ¿Qué es Velneo vTranslator?
    • Importación y exportación basada en XLIFF
    • Acceso directo a una solución
  • Velneo ODBC Driver
    • ¿Qué es velneo ODBC Driver?
    • Referencia de comandos SQL
  • Velneo vVersion
    • ¿Qué es Velneo vVersion?
  • Velneo vERP
    • ¿Qué es Velneo vERP?
    • Manual del programador
    • Documentación de la ApiRest
    • Novedades de la versión
  • Velneo vTutor
    • ¿Qué es vTutor?
    • Tutores de objetos básicos
      • Tutor de árboles visores de tablas arboladas
      • Tutor de búsquedas
      • Tutor de cestas
      • Tutor de formularios
      • Tutor de informes
      • Tutor de localizador básico
      • Tutor de marcos
      • Tutor de rejillas
      • Tutor de rejillas avanzadas
    • Tutores de objetos avanzados
      • Tutor de alternadores de lista
      • Tutor de comboview
      • Tutor de drag and drop
      • Tutor de eventos
      • Tutor de tablas de extensión y extensiones de ficha
      • Tutor de tubos de ficha y de lista
      • Tutor de grabación de fichas
      • Tutor de gráficos
      • Tutor de impresión de informes
      • Tutor de lupas
      • Tutor de protocolo TCP/IP
      • Tutor de reemplazo
    • Tutores de controles
      • Tutor de botones de menú
      • Tutor de controles SVG
      • Tutor de edición numérica
      • Tutor de visor html dinámico
      • Tutor de vistas de datos de lista
    • Tutores de procesos y manejadores de evento avanzados
      • Tutor de cambio de marco
      • Tutor de comandos de interfaz y acciones
      • Tutor de importación y exportación de ficheros ASCII
      • Tutor de portapapeles
      • Tutor de procesos
      • Tutor de SDV
    • Tutores de scripts
      • QML: hola mundo
      • QML: tutor básico
      • QML: tutor de vistas
      • Tutor de XMLHttpRequest (webServices)
  • Velneo cloud
    • ¿Qué es Velneo Cloud?
    • Panel de control vServer cloud
      • URC
      • vServer
      • Apache
      • SFTP
      • Usuarios
    • Copias de seguridad
    • Velneo cloud API
      • Uso de Velneo cloud API
    • Explorador de archivos cloud sFTP
    • TCP en Velneo cloud
    • Dominios de empresa y certificados
    • Velneo vModApache en cloud
    • SLA
    • Hora de los servidores en el cloud de Velneo
    • ¿Qué puedo hacer si tengo una incidencia en mi servidor cloud?
Con tecnología de GitBook
En esta página
  • ¿Son todos los campos Alfa igual de rápidos?
  • ¿Puedo usar campos de tipo tiempo para acumular horas, minutos y segundos?
  • ¿Cuándo debo utilizar campos de tipo fórmula?
  • ¿Cuándo es recomendable usar campos objeto texto?
  • Si tengo miles de objetos dibujo o texto ¿Los guardo en la base de datos?
  • Guarda el contenido de diferentes campos en un solo campo objeto texto
  • Contenidos iniciales
  • Minimiza las dependencias en contenidos iniciales
  • Cuidado con los contenidos iniciales que dependen de punteros a hermanos contiguos
  • Evita el uso de funciones largas o complejas en contenidos iniciales
  • Evita siempre que puedas el uso de contenido inicial JavaScript
  • En las importaciones de millones de registros optimiza el cálculo de contenidos iniciales

¿Te fue útil?

  1. Velneo vDevelop
  2. Buenas prácticas
  3. Buenas prácticas de rendimiento
  4. Base de datos

Campos

A continuación se detalla en una tabla el uso recomendado de campos de tipo alfabético.

  • Alfa 256: almacenar campos alfanuméricos permitiendo todo tipo de caracteres y longitud específica.

    Hay que tener en cuenta que aunque soporta hasta 65.535 caracteres no tiene mucho sentido guardar tanta información en un campo de este tipo, siendo recomendable usar campos objeto texto o texto enriquecido en su lugar.

  • Alfa 128: para guardar datos alfanuméricos como nombres, direcciones, etc.

    Hay que tener en cuenta que no soporta todos los caracteres ASCII por lo que debemos evitar usarlo para almacenar URLs o eMails por ejemplo, en ese caso es mejor usar el Alfa 256

    .

  • Alfa 64: para guardar datos alfanuméricos en mayúsculas independientemente de como los escriba el usuario. Se usa para guardar textos en mayúsculas, referencias o códigos que usan caracteres no soportados en los Alfa 40.

  • Alfa 40: muy recomendable para códigos alfanuméricos, referencias, código de barras, etc.

    Hay que tener en cuenta que el tamaño mínimo siempre debe ser múltiplo de 2 y que su contenido que se puede grabar en el campo será múltiplo de 3, es decir, que si quiero poner en un formulario un campo para guardar 4 caracteres este tipo de campo puede no ser óptimo.

  • Alfa Latin1: cuando el contenido del campo debamos enviarlo a un servicio o software externo que tenga ese requisito de codificación. También podemos resolver la codificación en el momento de la exportación, por este motivo no es habitual usar este tipo de campo.

  • Alfa UTF-16: cuando tengamos que incluir contenido en idiomas de doble byte como el Chino. Hay que tener en cuenta que estos campos ocupan el doble que uno normal, por lo tanto no debemos poner los campos de las tablas de este tipo si creemos que en el futuro instalaremos una versión para usuarios en Chino ya que estaremos perjudicando el tamaño de la base de datos y el rendimiento por algo que puede no llegar a concretarse nunca. Es preferible que llegado el momento hagamos el cambio de tipo de los campos ya que la refactorización automática hará que el cambio no produzca ninguna pérdida de datos.

¿Son todos los campos Alfa igual de rápidos?

No, realmente el campo Alfa 256 es el más rápido en su uso debido a que su contenido se procesa de forma directa, sin embargo los Alfa 128, Alfa 64 y Alfa 40 utilizan datos comprimidos a nivel de bits. Realmente el proceso de compresión y descompresión es muy rápido pero a la hora de realizar miles o millones de operaciones con cadenas es preferible el uso de campos Alfa 256.

¿Puedo usar campos de tipo tiempo para acumular horas, minutos y segundos?

Sí, esa es su función, pero debemos tener en cuenta que el campo admite hasta un máximo de 24 horas (un día), por lo tanto si queremos almacenar tiempo superior a un día debemos utilizar un campo numérico donde guardemos los segundos, minutos u horas según el caso y luego utilizar campos para convertir esos tiempos a horas:minutos:segundos.

¿Cuándo debo utilizar campos de tipo fórmula?

Los campos fórmula son muy recomendables para ahorrar espacio en el tamaño de registro, ya que su ocupación en disco es cero.

Debemos tener en cuenta que la fórmula se calcula allí donde se solicita el valor del campo, por ese motivo si vemos que queremos hacer un uso intensivo de ese campo en rejillas o si hay muchas dependencia de contenidos iniciales como puede ocurrir en tablas de estadísticas con acumulados mensuales (saldos, existencias, estadísticas, etc.) podemos optar por utilizar campos con persistencia en disco, que aunque ocupan espacio y aumentan el tamaño del registro, evitan el recálculo del dato ya que se calcula una única vez a través o bien del contenido inicial, de algún evento de tabla o directamente en código del objeto visual, y nos ahorra volver a calcular en el momento en que se muestra el datos en un informe, rejilla, formulario, etc.

¿Cuándo es recomendable usar campos objeto texto?

Los campos objeto tienen una ocupación en el registro de 8 bytes en los que se almacena la referencia al primer bloque de 512 bytes del contenedor de objetos. En el contender todos los contenidos sean texto, imágenes o ficheros se almacenan en celdas de 512 bytes, cuando un objeto ocupa más de 512 bytes va ocupando más celdas de este tamaño hasta almacenarse en su totalidad, todas las celdas de un objeto quedan relacionadas e indexadas para un rápido acceso.

Por lo tanto tenemos que tener claro que si vamos a almacenar un texto con un tamaño fijo menor de 512 bytes, a priori podríamos pensar que un campo alfabético será más recomendable, sin embargo eso dependerá del número de registros que estén ocupados. Si por ejemplo creamos un campo de 100 bytes que solo es ocupado en el 10% de los registros de una tabla que tiene 1.000.000 de registros, estaríamos ocupando 100 MB de disco de los que el 90% estaría vacío. Sin embargo, si usamos un campo objeto tendríamos 8 MB de ocupación de los 8 bytes del campo más 100.000 celdas de 512 bytes lo que daría un total de 520 MB, es decir, la mitad de ocupación en disco más la ventaja de que el registros es 92 bytes más ligero. Aunque no supone ningún inconveniente tenemos que tener claro que la carga de objetos se realiza en hilos secundarios ya que no viaja con la información del registro.

Otra característica muy interesante de la base de datos de Velneo es que puedes indexar por trozos y/o palabras los campos objeto texto y objeto texto enriquecido (en este caso la base de datos se encarga de eliminar las etiquetas HTML de la indexación). Esta es una característica muy potente, aunque hay que gestionarla bien ya que la indexación de textos largos pueden generar millones de entradas en el índice de los contenedores.

Existen diferentes circunstancias en las que el uso de objeto texto nos va a ayudar a optimizar la ocupación de espacio en la base de datos, y por lo tanto el rendimiento en ejecución de nuestra aplicación.

  • Cuando la ocupación de registros es baja, por ejemplo <10% para tamaños de >100 bytes.

  • Para evitar crear campos alfabéticos muy grandes (>100 bytes).

  • Para almacenar contenido variable que puede ser de miles de KB o cientos de MB.

  • Para evitar la creación de campos adicionales configurables. Se explica más abajo.

  • Para almacenar contenido HTML usa el objeto texto enriquecido.

Si tengo miles de objetos dibujo o texto ¿Los guardo en la base de datos?

Aunque los objetos texto son muy cómodos de usar si lo que queremos almacenar es una gran cantidad de información como puede ser el caso de un gestor de documental en el que podremos almacenar cientos de miles de documentos de gran tamaño, el mejor planteamiento puede ser no utilizar campos objeto y en su lugar almacenar de forma externa los ficheros guardando en un campo del registro la senda o URL de acceso a dicho fichero.

Hacerlo de forma externa nos permite mayor flexibilidad a la hora de almacenar los ficheros clasificados y organizados en disco por carpetas, a la vez que minimiza el tamaño de nuestra base de datos lo que facilita su gestión y reindexación.

El único hándicap en este caso es que perdemos la posibilidad de indexar por trozos o palabras los textos, aunque se pueden usar alternativas como almacenar solo palabras claves en un objeto texto del registro que nos facilite la localización del fichero sin engordar nuestra base de datos con su contenido.

Guarda el contenido de diferentes campos en un solo campo objeto texto

En ocasiones hay aplicaciones muy configurables que permiten a los clientes finales o usuarios añadir campos personalizados en algunas tablas. La base de Velneo es estática en cuanto a su definición, es decir, no podemos cambiar en tiempo de ejecución la estructura de una tabla añadiendo nuevos campos.

Para poder simular los campos personalizables se podría pensar en dejar creados, por ejemplo 3 campos alfabéticos de 50 caracteres, 3 campos numéricos y 3 campos de tipo fecha. Además de poco práctico ya que en un momento dado el usuario podría necesitar 4 campos de un determinado tipo y ninguno del resto supone un gran desperdicio de espacio en disco con múltiples campos vacíos.

En su lugar de puede optar por usar un campo objeto texto en el que almacenemos los contenidos de todos los campos con algún tipo de separador, por ejemplo:

  • Formato XML. <nombre campo>Contenido del campo</nombre campo>

  • Formato JSON. { "nombre campo" : "contenido campo" }

  • Formato CSV. En la primer línea los nombres de campo “nombre campo 1"|"nombre campo 2"|"nombre campo 3" y en la 2ª línea los datos "contenido campo 1"|"contenido campo 2"|"contenido campo 3"

  • Salto de línea. El nombre del campo estaría configurado en un campo objeto texto a nivel de aplicación o empresa y el contenido de los se guarda cada uno en una línea añadiendo un salto de línea después del dato.

De esta forma podemos almacenar múltiples valores en un único campo objeto texto. Evidentemente hay un trabajo de programación adicional para poder visualizar esta información de forma dinámica en un formulario o rejilla (usando una tabla en memoria, por ejemplo). Además, la indexación por los valores de estos campos de forma individual resulta más compleja.

Contenidos iniciales

Los contenidos iniciales de los campos se evalúan cuando damos el alta de un registro y cuando hacemos modificaciones de los datos del registro. Es un gran recurso para el programador y debemos usarlo con cuidado para no abusar de sus bondades perjudicando el rendimiento de nuestra aplicación.

Minimiza las dependencias en contenidos iniciales

Una de las grandes ventajas es que el valor de un campo se calcula automáticamente en base al de otros campos. Esta característica es buena siempre y cuando no abusemos de ella, es decir, si tenemos una tabla con cientos de campos y creamos unos contenidos iniciales muy dependientes entre sí de tal forma que cualquier cambio en un campo produzca el recálculo de muchas decenas o incluso un centenar de contenidos iniciales en otros campos podemos detectar lentitud en nuestra aplicación. Para evitar estos casos excepcionales podemos renunciar al contenido inicial y hacer los cálculos bien en el objeto visual en 1º plano o también en los triggers anterior al alta o modificación, evitando que se recalculen de forma constante y en su lugar conseguir que los cálculos solo se realicen una vez.

Cuidado con los contenidos iniciales que dependen de punteros a hermanos contiguos

Cuando usamos hermanos contiguos en los contenidos iniciales debemos tener la precaución de evitar cálculos en cascada incontrolados. En principio esto no debería de producirse con contenidos iniciales ya que solo afectan al registro en curso, sin embargo sí que tenemos que tenerlo en cuenta si en lugar de un campo con persistencia en disco y contenido inicial usamos un campo fórmula que utiliza un campo obtenido a través de un puntero a un hermano contiguo, ya que en ese caso si el campo del registro apuntado a su vez es una fórmula que tira del hermano contiguo lo que estamos provocando es que el cálculo de un campo realiza lecturas y cálculos en un número de registros incontrolado que puede dar lugar a cálculos de miles de registros.

Para evitar estas circunstancias es preferible usar campos con persistencia en disco y contenidos iniciales o cuyo valor se calcula una única vez en un evento de tabla o proceso. Aunque tenemos mayor ocupación en disco a cambio obtener un mejor rendimiento de la aplicación.

Evita el uso de funciones largas o complejas en contenidos iniciales

Si tenemos una función que realiza un cálculo complejo que, por ejemplo requiere la lectura de múltiples registros, y usamos esta función en contenidos iniciales de campos debemos revisar que no afecta al rendimiento. Hay que tener en cuenta que los contenidos iniciales aunque están definidos en la tabla no siempre se ejecutan en el servidor, al dar el alta desde un formulario se ejecutan en 1º plano, y en el caso comentado puede producir lentitud en la apertura del formulario o la aparición del icono de espera cuando se esté ejecutando el cálculo del valor del campo.

Si además, a la función se le pasan como parámetros valores de otros campos, podemos encontrarnos con que la función se ejecuta múltiples veces al estar en un contenido inicial, para evitar esta circunstancia debemos evitar su uso en un contenido inicial moviendo la ejecución de la función a los eventos de tabla anterior a alta y modificación, o si la aplicación lo permite directamente en el objeto visual como puede un formulario de edición.

Evita siempre que puedas el uso de contenido inicial JavaScript

En los contenidos iniciales de los campos de una tabla podemos utilizar fórmulas de código Velneo y también fórmulas JavaScript. Debemos saber que cada vez que se ejecuta una fórmula JavaScript es necesario lanzar un motor de ejecución y alimentarlo con las clases generales para que disponga de la información del entorno, aunque esta operación es rápida en términos generales es lo suficientemente lenta como para notar retardo respecto al cálculo de fórmulas de código Velneo, por lo tanto debemos usar fórmulas JavaScript con la precaución de saber que solo se calculará una vez.

Si tenemos varios campos que necesitamos calcular con una fórmula JavaScript podemos optimizarlo no usando la fórmula en el contenido inicial y en su lugar ejecutarla en los eventos de tabla anterior al alta y modificación lanzando un proceso de código JavaScript de origen ficha. De esta forma aseguramos que se ejecute una única vez y además podemos calcular el valor de múltiples campos en el mismo script con lo que optimizar todos los cálculos en una única ejecución del motor de JavaScript.

En las importaciones de millones de registros optimiza el cálculo de contenidos iniciales

Cuando estamos importando miles o incluso millones de registros en las tabla Velneo es habitual que los datos que estamos importando no requieran que se disparen los contenidos iniciales ya que nos llegan calculados.

Con el fin de optimizar la importación, debemos sustituir el uso del comando de instrucción “Modificar campo” por el comando de instrucción “Modificar campo solamente” que se encarga de modificar el valor del campo pero evitando que se disparen los contenidos iniciales. Si en algún momento necesitamos que se ejecuten los contenidos iniciales podremos forzarlo ejecutando el comando de instrucción “Calcula campos dependientes”, este comando se puede ejecutar múltiples veces antes de grabar el registro.

Última actualización hace 4 años

¿Te fue útil?