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
  • Conociendo por dentro vERP
  • ¿Por qué vERP tiene todos los objetos de datos y de aplicación en un proyecto ?
  • ¿Cómo están organizados los objetos del proyecto de datos?
  • ¿Cómo están organizados los objetos del proyecto de aplicación?
  • ¿Por qué se usan abreviaturas en los identificadores de los objetos?
  • Uso de layouts
  • ¿Por qué los identificadores de los controles están todo renombrados respecto al asistente?
  • Hay alguna recomendación sobre el uso de imágenes en mis aplicaciones?
  • Programando sobre vERP
  • ¿Cómo crear una solución personalizada para mi cliente sin tocar vERP?
  • ¿Puedo tener una solución sectorial y otra solución para cada cliente de ese sector?
  • ¿Qué objetos básicos debo copiar a mi solución que hereda de vERP?
  • ¿Dónde hay puntos de inserción?
  • ¿Cuándo usar puntos de inserción y cuándo es mejor usar personalización de objetos?
  • ¿Cómo condicionar las pestañas insertadas en un formulario?
  • ¿Cómo personalizar un formulario que no esté en un separador de pestañas?
  • ¿Cuándo es conveniente usar tablas de extensión?
  • ¿Cómo implementar tablas de extensión?
  • ¿Cómo debo crear un formulario que combine datos de la tabla de extensión y su maestra?
  • Configurando vERP
  • ¿Para qué sirve que la tabla empresas sea arbolada?
  • ¿Cómo puedo gestionar el cambio de empresa en tiempo de ejecución?
  • ¿Cómo se gestionan los permisos?
  • Permisos por grupo de usuarios
  • ¿Cómo puedo llevarme los permisos de mi servidor a otro servidor?
  • ¿Cómo puedo cambiar las CSS que vienen por defecto?
  • ¿Cómo puedo aplicar una CSS específica en un formulario?
  • ¿Cómo personalizar la barra de menú?
  • ¿Cómo personalizar un menú?
  • ¿Dónde se guardan las personalizaciones de menú?
  • ¿Cómo usar la herramienta de personalización de formularios y rejillas?
  • ¿Qué puedo hacer con la personalización mediante script?
  • ¿Dónde se guardan las personalizaciones de formularios y rejillas?
  • Informes vERP
  • ¿Dónde se guardan los informes?
  • ¿Cómo puedo añadir nuevos informes?
  • ¿Cómo generar los documentos en pdf?

¿Te fue útil?

  1. Velneo vERP

Manual del programador

Última actualización hace 4 años

¿Te fue útil?

Conociendo por dentro vERP

¿Por qué vERP tiene todos los objetos de datos y de aplicación en un proyecto ?

Por simplicidad: es mucho más sencillo instanciar, heredar, comprender y localizar los objetos.

Además, todos los objetos están organizados en carpetas por módulos o funcionalidad. Esto facilita la posibilidad de separar una parte del proyecto en otro distinto, ya que podríamos copiar las carpetas específicas teniendo luego que copiar aquellas partes comunes que están integradas como pueden ser las tablas maestras y las diferentes configuraciones de vERP.

¿Cómo están organizados los objetos del proyecto de datos?

Están organizados por tipo de objeto, asimismo, dentro de la carpeta están organizados por módulo, y las listas de objetos se ordenan alfabéticamente.

En este criterio se aplican algunas excepciones que son: existe una carpeta específica para

  • Las tablas de configuración

  • Las tablas de maestros

Además, las búsquedas y las constantes están junto al proceso que las usa.

¿Cómo están organizados los objetos del proyecto de aplicación?

En primer lugar están organizados por módulos y sub-módulos, y dentro de esas carpetas por menús.

Los objetos están encarpetados siempre en dos carpetas distintas

1) Objetos de interfaz (color púrpura), por este orden:

  1. Formularios.

  2. Multivistas.

  3. Rejillas.

Dentro de ese orden, los objetos están ordenados alfabéticamente.

Se añadirá además una carpeta con los objetos que se usen en botón menú de alguno de los formularios.

2) Objetos de ejecución (amarillo)

  1. Búsquedas.

  2. Localizadores.

  3. Procesos.

2) Acciones, toolbars y menús (color verde).

¿Por qué se usan abreviaturas en los identificadores de los objetos?

Las nomenclaturas alcanzan a todos los ámbitos de la programación ya que es conveniente tener reglas para nombrar de forma clara y precisa desde una carpeta del disco donde almacenaremos nuestro solución hasta la variable local más insignificante.

Una buena nomenclatura proporciona grandes beneficios:

  • Facilita la comprensión clara del concepto.

  • Evita ambigüedades.

  • Facilita la organización.

  • Facilita la localización: los identificadores se ven completos en propiedades, además cuando son compuestos, se ven acortados también.

  • Facilita el mantenimiento.

  • Permite la comprensión de otros desarrolladores.

  • Reduce el tamaño de los identificadores, por lo tanto se ve reducido el tamaño global del código.

Las tablas siempre terminan con una letra que las identifica con el módulo al que pertenecen, por tanto, lo mismo sus objetos, así se sabe fielmente qué es nombre de objeto y qué es nombre de la tabla origen.

Siempre se usan prefijos para identificar los objetos, así:

  • El prefijo de un objeto con origen tabla, es la propia tabla.

  • El prefijo nunca es el tipo de objeto, es decir una búsqueda no empieza por BUS

  • Cuando un objeto usa a otros el id. contiene tras el prefijo la segunda parte que lo describe. Por ejemplo los subformularios.

Uso de layouts

Se recomienda siempre el uso de layouts en todos los formularios.

Los márgenes del layout general del formulario son:

  • Izquierdo: 0

  • Derecho: 20

  • Superior: 20

  • Inferior: 20

  • Espaciado: 20

Normalmente existe uno para el título de formulario (con el id. LAY_TIT), otro para detalle (con el id. LAY_DET) y otro para el pie de botones (con el id. LAY_BTN).

Los márgenes de estos layouts son:

  • Izquierdo: 10

  • Derecho: -1

  • Superior: -1

  • Inferior: -1

  • Espaciado: 10

Siempre que exista necesidad de un layout para agrupar unos controles concretos, éste se identificará con el nombre del campo o campos que agrupa. Y en dicho caso los márgenes serán:

  • Izquierdo: 10

  • Derecho: -1

  • Superior: -1

  • Inferior: -1

  • Espaciado: -1

¿Por qué los identificadores de los controles están todo renombrados respecto al asistente?

Los controles de edición de un campo, sea cual sea el tipo de campo, siempre tienen como identificador el mismo que el campo. En caso de que tengan una etiqueta de texto, ésta será igual que el campo con el prefijo TXT delante.

Esto hace que sean sencillos de identificar el control durante la edición del objeto y además cuando está utilizando la herramienta de personalización de formulario o rejilla, el localizarlos para ocultarlos o mostrarlos es muy sencillo.

Hay alguna recomendación sobre el uso de imágenes en mis aplicaciones?

Las imágenes deberán estar optimizadas para ocupar el espacio mínimo imprescindible.

Se recomienda usar una paleta de colores lo más reducida posible, sin pérdida de calidad.

Para usar un fondo de imagen, si es color sólido debe ser pequeña y ampliará todo el área.

Este tipo de recomendaciones le ayudarán a desplegar su aplicación en cloud con éxito.

Programando sobre vERP

¿Cómo crear una solución personalizada para mi cliente sin tocar vERP?

Heredando vERP.

Puedes crear una solución nueva, con un proyecto de aplicación solamente o añadiendo también un proyecto de datos. En el mismo asistente de creación de la solución, podrás escoger los proyectos a heredar.

Gracias a que vERP está en un sólo proyecto de datos y otro de aplicación, simplemente heredando éstos, tendrás acceso a todos los módulos de la solución.

Importante: siempre cree sus proyectos nuevos con alias para poder utilizar la herramienta de personalización de objetos, pues es una propiedad imprescindible para este fin.

¿Puedo tener una solución sectorial y otra solución para cada cliente de ese sector?

Sí.

Puedes crear tantos niveles de herencia como necesites, pero siempre buscando un equilibrio entre dividir en funcionalidades, y no perder la agilidad que da tener todo localizado en un proyecto.

Ten en cuenta que los proyectos sólo pueden utilizar sus propios objetos y los de los proyectos que hereden, nunca se podrán usar objetos entre proyectos “hermanos”. No obstante, siempre existe la posibilidad de mover un objeto a un proyecto que esté heredado, pasando a ser visible por todos los que estén heredando ese último.

¿Qué objetos básicos debo copiar a mi solución que hereda de vERP?

Te recomendamos que copies al menos el marco Autoexec. Éste contiene:

  • Icono de la aplicación

  • Formulario principal

  • Menú principal

  • Dock izquierdo

  • Manejador de evento pre-ini

  • Manejador de evento post-ini

Cuando copias el marco de vERP a tu proyecto de aplicación, por defecto sigue usando los mismos objetos, pero puedes crear objetos nuevos y llamarlos desde el marco nuevo, logrando así un mayor detalle de personalización. No obstante, ten en cuenta que los procesos que son llamados en los manejadores de evento son necesarios para la carga de variables y configuraciones para el funcionamiento normal de la aplicación.

Si además deseas personalizar gráficamente tu aplicación, copia estos tres objetos:

  • Marco AUTOEXEC

  • Icono APP_ICO

  • Formulario INI_ERP

Copiando los tres a la vez y pegándolos en el nuevo proyecto de aplicación, ya el marco usará los objetos. Después desde el nuevo proyecto podrán ser modificados según cada caso.

¿Dónde hay puntos de inserción?

Se han creado acciones de tipo Inserción para ser utilizadas en los proyectos que hereden vERP_2_app. Cuando se crea una acción nueva en un proyecto que hereda vERP, se deberá crear además un sub-objeto inserción, que llama a su vez a la acción que está en el núcleo de vERP, siempre y cuando tenga el mismo origen, ya sea de tabla o no.

Están creadas en todas las toolbars de rejillas.

¿Cuándo usar puntos de inserción y cuándo es mejor usar personalización de objetos?

La personalización de objetos siempre se puede usar añadiendo nuevos subformularios a las pestañas, modificando acciones que se lanzan etc.

Por otro lado, si ya tiene desarrollos realizados utilizando la herencia inversa con los puntos de inserción proporcionados en el núcleo de vERP, podrá seguir utilizando este sistema sin realizar cambios.

Otro caso en que el deberá utilizar puntos de inserción es en el caso de un formulario insertado que tenga una extensión de ficha y desea que aparezca siempre la opción en la pestaña de gestionar el alta y baja del registro extendido.

¿Cómo condicionar las pestañas insertadas en un formulario?

Con la herramienta de personalización se puede añadir una pestaña a un separador para un grupo de usuarios en exclusiva.

Pero si lo que se pide es que sea condicionada en función de un campo del registro, en el formulario personalizado que se quiere insertar, añadir la conexión de evento PRE_INI Pre-inicializando, y en el manejador de ese evento PRE_INI se hacen las comprobaciones y en caso de que no cumplirse, utilizar el comando Set retorno = NO.

¿Cómo personalizar un formulario que no esté en un separador de pestañas?

En dicho caso lo que deberá hacer es sustituir el objeto completo.

Deberá programar el nuevo objeto en su propio proyecto de aplicación de su solución, fuera de vERP

A continuación, deberá sustituir el uso de ese formulario por el nuevo mediante la personalización de objetos.

Si se trata de un formulario que es lanzado desde una opción de menú, deberá sustituir la opción de menú completa y los objetos que ésta use. Podrá copiar todos esos objetos (normalmente se localizarán en la misma carpeta) y a continuación pegarlos en el proyecto personalizado.

¿Cuándo es conveniente usar tablas de extensión?

Cuando se necesita ampliar campos a una tabla de vERP pero sin realizar modificaciones sobre dicha tabla directamente. De esta forma cuando aparezca una nueva versión o revisión de vERP podremos actualizarla sin perder los cambios realizados ya que estos permanecerán en la tabla de extensión.

En definitiva, ampliamos las información y funcionalidad de vERP respetando su código fuente y sin necesidad de realizar cambios en nuestro código ante la aparición de nuevas versiones.

¿Cómo implementar tablas de extensión?

Desde vDevelop, deberá tener creado el proyecto de aplicación de su propia solución, que herede vERP. En el menú ❖ Objetos la opción ➜ Nuevo objeto ➜ Tabla le permitirá lanzar el asistente de creación de tablas

¿Cómo debo crear un formulario que combine datos de la tabla de extensión y su maestra?

Existen dos posibilidades:

  1. El origen del formulario es la tabla padre y se crea un subobjeto “Extensión de ficha” en modo campo puntero a la tabla de extensión (se usa el campo automático que crea Velneo en la tabla padre) o en el modo proceso con un proceso de origen de ficha de la tabla padre y destino ficha de la tabla de extensión.

  2. El origen del formulario es la tabla de extensión y se crear un subobjeto “Extensión de ficha” en modo campo puntero a la tabla padre (se usa el campo ID) o en el modo proceso con un proceso de origen de ficha de la tabla de extensión y destino ficha de la tabla padre.

Ambos casos funcionan bien siempre que configuremos correctamente las propiedades de alta, baja y modificación de ficha principal.

Para el caso A los valores más habituales son 10 (no se marca el previo), 5 (Sí se marca el previo) y 10 (No se marca el previo).

Para el caso B los valores más habituales son 11 (Sí se marca el previo), 4 (No se marca el previo), 11 (Sí se marca el previo).

En caso de usar el modo proceso es responsabilidad del programador crear en dicho proceso la ficha de la extensión de ficha del formulario, ya que de esta forma cuando se muestra el formulario ya existe el registro y se puede editar.

Actualmente, si queremos usar menú de botón en los campos puntero a maestro de registro de la “extensión de ficha” del formulario, tendremos que usar la opción B para que funcionen correctamente las acciones de menú de localizar, crear o editar maestro. La opción A no está operativa actualmente y se encuentra registrada como un bug a resolver en futuras versiones.

Configurando vERP

¿Para qué sirve que la tabla empresas sea arbolada?

El hecho de que la tabla sea arbolada le da la posibilidad de generar tantas divisiones y sub-divisiones como sea necesario en la empresa “real”.

Puede crear divisiones de Grupo-Empresa-Delegación-Departamento-División e incluso teniendo una empresa por usuario, dando acceso independiente a cada usuario. Aún así, si un usuario tiene acceso a una rama superior de la empresa, podrá ver todas las sub-ramas de la misma, porque cada documento está grabado en la rama desde la que fue creado.

Veamos un ejemplo:

El acceso a cada empresa se da por usuario, de modo que un usuario puede tener acceso a una rama de las inferiores y sólo verá los documentos de esa, o si tiene acceso a una rama superior podrá ver los de esa empresa y las sub-ramas de la misma.

Las búsquedas de documentos por el índice de empresa, se realizan entre límites, siendo el límite inicial la empresa a la que ha accedido inicialmente (se pide en la entrada a vERP), y para el límite final es concatenado con “ZZZZZZ” para así englobar las subramas.

¿Cómo puedo gestionar el cambio de empresa en tiempo de ejecución?

Cuando en la instalación existe configurada más de una empresa, es posible que desee realizar el cambio de empresa a gestionar pero sin salir de la aplicación.

Desde el menú ❖ Supervisor ➜ Utilidades ➜ Seleccionar empresa de trabajo.

La acción que lanza esta opción es EMP_M_SEL, si se desea se puede insertar en otro punto si el usuario no es supervisor y no tiene acceso a la opción de la barra de menú.

¿Cómo se gestionan los permisos?

Todos los permisos en vERP se gestionan en base al diccionario de permisos que contiene simplemente una etiqueta y una descripción.

Este diccionario de permisos es pre-cargado en la aplicación. Podrá verlo desde el menú ❖ Supervisor ➜ Diccionario permisos.

El sistema de permisos integrado en vERP persigue estos objetivos:

  1. Abstracto para que pueda ser utilizado en una gran variedad de funcionalidades.

  2. Flexible para facilitar la integración de permisos de las aplicaciones que heredan vERP.

  3. Sencillo de implementar por parte del programador.

  4. Sencillo de utilizar por parte del usuario. Que sólo sean necesarios definir las excepciones para que requiera la menor configuración posible de permisos

Permisos por grupo de usuarios

Accesible desde el menú ❖ Supervisor ➜ Grupo de usuarios.

Los permisos se gestionan a nivel de grupos de usuario, no a nivel de usuario individual. Un usuario puede pertenecer a múltiples grupos de usuarios y asumirá los permisos de todos sus grupos.

El diccionario de permisos es muy sencillo de definir. Tan sólo requiere una etiqueta y una descripción. Es importante tener en cuenta que lo mejor es definir la etiqueta en base al criterio de excepción.

Por ejemplo, si todos los usuarios van a tener acceso al menú de países, y sólo a unos determinados usuarios no queremos darles acceso al mismo, lo lógico es definir la etiqueta con el valor de la excepción, es decir, verp.menu.pai.no De esta forma conseguimos que la configuración de los permisos en los grupos de usuario sea realmente sencilla.

Además hay que tener en cuenta que se pueden crear tantos grupos de usuario como nos interese y cada usuario puede pertenecer a múltiples grupos de usuario, siendo sus permisos la suma de todos los permisos (de autorización o de negación de autorización) asignados a los grupos de usuarios que tenga asignados.

El diccionario de permisos

El diccionario de permisos es muy sencillo de definir. Tan sólo requiere una etiqueta y una descripción.

Es importante tener en cuenta que lo mejor es definir la etiqueta en base al criterio de excepción.

Por ejemplo, si todos los usuarios van a tener acceso al menú de países, y sólo a unos determinados usuarios no queremos darles acceso al mismo, lo lógico es definir la etiqueta con el valor de la excepción, es decir, verp.menu.pai.no

De esta forma conseguimos que la configuración de los permisos en los grupos de usuario sea realmente sencilla.

Además hay que tener en cuenta que se pueden crear tantos grupos de usuario como nos interese y cada usuario puede pertenecer a múltiples grupos de usuario, siendo sus permisos la suma de todos los permisos (de autorización o de negación de autorización) asignados a los grupos de usuarios que tenga asignados.

La función PRM_USR

El objeto que más uso tendrá en el nuevo sistema de permisos es la función PRM_USR que se utiliza. La función incluye documentación de los parámetros de entrada y de los posibles valores de retorno.

Si por ejemplo existe en el diccionario la etiqueta verp.mant.auditoria.no y ejecutamos la función fun:PRM_USR@Usuarios.dat("verp.mant.auditoria.no")

  • Si alguno de los grupos del usuario tiene asignado el permiso nos devolverá un “1”

  • Si ninguno de los grupos del usuario tiene asignado el permiso nos devolverá un “0”

Si por ejemplo existe en el diccionario la etiqueta vconta.cta.clt:430,431,435 y ejecutamos la función fun:PRM_USR@Usuarios.dat("vconta.cta.clt:")

  • Si alguno de los grupos del usuario tiene asignado el permiso nos devolverá “430,431,435”

  • Si ninguno de los grupos del usuario tiene asignado el permiso nos devolverá un “0”

Ejemplo de control de opciones de menú

Ejemplo de control al abrir un formulario (evento de pre_inicializado)

¿Cómo puedo llevarme los permisos de mi servidor a otro servidor?

En la barra de menú ❖ Supervisor ➜ Diccionario de permisos, es posible importar y exportar el diccionario de permisos mediante ficheros planos para enviar a otros servidores u otras instancias.

¿Cómo puedo cambiar las CSS que vienen por defecto?

En la barra de menú ❖ Supervisor ➜ CSS.

Ahí están los registros de CSS que se aplican por defecto en vERP. Podrá cambiar y personalizar el aspecto de su aplicación cambiando ahí el Script correspondiente, lo que sí deberá mantener de forma fija la etiqueta creada por defecto, que es AUTOEXEC o MEN_APP_ERP.

¿Cómo puedo aplicar una CSS específica en un formulario?

Si es un formulario personalizado que está en su propio proyecto deberá utilizar el comando “Interfaz: establecer hoja de estilo CSS” en el manejador de evento que se lance con señal post-inicializado.

La fórmula texto de la hoja de estilo CSS puede ser indicada de forma fija en el manejador de evento o bien mediante una etiqueta de texto de uno de los registros de la tabla CSS_W que están accesibles desde el menú ❖ Supervisor ➜ CSS.

Si se trata de aplicar una CSS en un formulario del núcleo, puede aplicar una personalización de script para los formularios del núcleo sin modificarlos.

¿Cómo personalizar la barra de menú?

El acceso a las distintas opciones de la barra de menú se puede controlar mediante el Diccionario de permisos.

En el menú ❖ Supervisor ➜ Grupos de usuarios, puede crear un grupo al que va a restringir el acceso a las distintas opciones que puede localizar buscando por las etiquetas “barra menú” en la utilidad de “Permisos sin asignar” del grupo.

¿Cómo personalizar un menú?

En el menú ❖ Supervisor ➜ Opciones de menú están pre-configuradas las opciones del menú del dock izquierdo y en cada una de ellas el objeto a ejecutar, que es un proceso del proyecto:

  • En la primera pestaña se configura el nombre e icono de la opción de menú.

  • En la segunda pestaña se configura el objeto a ejecutar, de qué proyecto es, el tipo de objeto (acción, proceso o menú) y a continuación podrá localizar los objetos entre los disponibles del proyecto que se cargarán si todo está configurado. Es imprescindible para esto que el proyecto tenga Alias configurado.

  • En la tercera pestaña se configuran los permisos de acceso a dicha opción del menú. Si marcar el check de “Todos los grupos de usuarios”, podrá escoger debajo si lo desea algún objeto a excluir. Si no marca el check, seleccione en la rejilla los grupos concretos que pueden acceder.

¿Dónde se guardan las personalizaciones de menú?

Se guardan en la tabla PRS_MEN_W.

¿Cómo usar la herramienta de personalización de formularios y rejillas?

Se han añadido las opciones de personalización en todas las rejillas y formularios. Esta opción le permitirá configurar totalmente dichos objetos:

  • Ocultar o desactivar controles en formularios

  • Ocultar columnas en rejillas

  • Ocultar, añadir o sustituir un subformulario, ya sea del proyecto actual o de uno heredado

  • Ejecutar un script

Todo ello podrá hacerlo de forma general para todos los usuarios, o por usuario (inclusión o excepción), además de forma sencilla e intuitiva. Próximamente se podrá hacer por grupos de usuario.

Veamos a continuación algunos ejemplos en imágenes, de lo sencillo que es configurar y el potencial de la herramienta:

En la imagen se muestra un ejemplo de personalización de ocultar controles en formulario de artículos (en este caso se oculta la referencia, tanto el edit como la etiqueta de título del campo).

En la imagen se muestra un ejemplo de personalización de ocultar columnas de rejilla`.

En la imagen se muestra un ejemplo de personalización de sustitución de subformulario por uno de un proyecto que hereda vERP.

Realmente las posibilidades son tantas como casos se vaya encontrando al instalar vERP en sus clientes finales, podrá simplificar la configuración de sus proyectos, personalizar al máximo todos los formularios de su aplicación, sus permisos de acceso a distintas opciones o campos, etc.

¿Qué puedo hacer con la personalización mediante script?

Se puede hacer prácticamente de todo…

El código javascript de la personalización se ejecuta en el manejador de evento pos-ini de los formularios. Se puede añadir sub-formularios, sustituir pestañas, css, etc.

¿Dónde se guardan las personalizaciones de formularios y rejillas?

Se guardan en la tabla PRS_OBJ_W.

Informes vERP

¿Dónde se guardan los informes?

Se guardan en la tabla INF_DEF_W.

En ejecución puede acceder desde el menú ❖ Supervisor ➜ Definición de informes.

¿Cómo puedo añadir nuevos informes?

Podrá crear nuevos informes desde el menú ➜ Definición de informes siguiendo los mismos pasos que en la aplicación vReport.

A continuación, para realizar las llamadas directas a los mismos, deberá realizarlo desde un proyecto de aplicación propio que herede vERP:

1º Cree un proceso que cargue la definición de informe por la etiqueta (identificador) de informe nuevo que ha creado.

¿Cómo generar los documentos en pdf?

Desde el proyecto de aplicación propio que hereda vERP_2_app, deberá crear un proceso con origen ficha, igual al manejador BTN_OPC_PRT que encontrará en un formulario de documento, por ejemplo VTA_PRE_G. Ahí existe un comando "Informe externo: imprimir…" que deberá sustituir por el comando “Informe externo: exportar a fichero” indicando el parámetro pdf en el tipo de fichero.

A continuación deberá crear una acción que llame a ese proceso. Esa acción tendrá como sub-objeto la inserción VTA_PRE_G_OPC_INS_FIN. Este tipo de inserción lo podrá encontrar en todos los documentos.

Solo podemos crear de extensión contra tablas padre que sean del tipo maestro normal con clave numérica o maestro normal con clave arbolada. No debemos crear nunca tablas de extensión contra tablas de tipo submaestro ni histórico, aunque el editor lo permita.

Puede obtener más información de este tipo de tablas consultando el .

2º Cree una acción que llame al proceso anterior y que tenga como sub-objeto una en vERP_2_app.

tablas
el artículo de la ayuda en velneo.es
inserción de las que existen predefinidas