funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos,...

178
MANUAL DE PROGRAMACIÓN M ANUAL DEL DISTRIBUIDOR

Transcript of funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos,...

Page 1: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

MANUAL DE PROGRAMACIÓNMANUAL DEL DISTRIBUIDOR

Page 2: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

ContenidoINTRODUCCIÓN A LA PROGRAMACIÓN ERP....................................................4

Introducción................................................................................................4Requerimientos...........................................................................................4

Herramientas de desarrollo.....................................................................................................................4Cómo instalar una librería o control OCX..............................................................................................5

Metodología y estándares de desarrollo.....................................................5Nomenclatura de variables y funciones..................................................................................................6Nomenclatura de archivos.......................................................................................................................7Aspecto general de la aplicación.............................................................................................................8

Programación orientada a objetos............................................................12PREPARAR EL ENTORNO...............................................................................13

Máquina virtual.........................................................................................13Software necesario y licencias..................................................................13Ahora ERP.................................................................................................14Plantilla de proyectos................................................................................14Crear un proyecto a partir de la plantilla..................................................15

COMENZAR A PROGRAMAR NUESTRA APLICACIÓN......................................16Inicio de la aplicación................................................................................16Crear Proyecto de Inicio............................................................................16

Propiedades...........................................................................................................................................16Código...................................................................................................................................................22

Creación de un proceso externo...............................................................26Descripción...........................................................................................................................................26Propiedades del proyecto......................................................................................................................26Módulos, clases y formularios..............................................................................................................30Procesos................................................................................................................................................31Codificación de clases, módulos y formularios....................................................................................37Compilar el proyecto.............................................................................................................................45

OBJETOS EN EL SISTEMA..............................................................................46Introducción..............................................................................................46Definición de clases y objetos...................................................................46Relación Objeto – Objeto...........................................................................47Definición de propiedades.........................................................................47Creación de objetos..................................................................................47

Pasos para definir un nuevo objeto.......................................................................................................48Objetos del motor del sistema..................................................................49

Objeto Conexión...................................................................................................................................49Objeto OBJ............................................................................................................................................52Objeto Colecciones...............................................................................................................................53Objeto IItem..........................................................................................................................................55

Manejo de objetos.....................................................................................64Instanciar un nuevo objeto y completar sus propiedades......................................................................65

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 1

Page 3: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Recuperar un objeto existente y agregarle un hijo................................................................................65CONTROLES AHORA.....................................................................................67

Introducción..............................................................................................67Control EnlaceObjetos...............................................................................67

Propiedades...........................................................................................................................................68Métodos y funciones.............................................................................................................................68Ejemplo de cómo vincular un objeto al control EnlaceObjeto.............................................................69

Control TextoUsuario................................................................................71Propiedades...........................................................................................................................................72Eventos..................................................................................................................................................73

Control TextoMultilinea.............................................................................73Control LabelUsuario.................................................................................74

Propiedades...........................................................................................................................................74Eventos..................................................................................................................................................74

Control Botonera.......................................................................................74Propiedades...........................................................................................................................................75Eventos..................................................................................................................................................76Métodos y funciones.............................................................................................................................76Ejemplo de agregar un botón de tipo Combo:......................................................................................77

Control CheckBoxUser..............................................................................78Propiedades...........................................................................................................................................78Eventos..................................................................................................................................................79

Control cntMenuFormulario.......................................................................80Propiedades...........................................................................................................................................80Eventos..................................................................................................................................................81Métodos y funciones.............................................................................................................................81Ejemplo: Agregar menús desde formulario..........................................................................................82Ejemplo: Agregar menús desde tablas..................................................................................................83

Control ComboUsuarioMult.......................................................................85Propiedades...........................................................................................................................................85Eventos..................................................................................................................................................87

Control ComboUsuario..............................................................................87Propiedades...........................................................................................................................................87Eventos..................................................................................................................................................89Ejemplo:................................................................................................................................................90

Control CntTab..........................................................................................90Ejemplo de creación de un CntTab con 2 pestañas...............................................................................91

Control cntGridUsuario..............................................................................91Propiedades...........................................................................................................................................91Métodos y funciones.............................................................................................................................95Eventos..................................................................................................................................................98Objeto CampoGrid................................................................................................................................99Cosas importantes a tener en cuenta sobre los grids...........................................................................101Ejemplo ARRAY sin origen de datos y campos sustitución..............................................................101Ejemplo de grid sólo ARRAY usando Alias y campos calculados....................................................102Ejemplo de grid de sólo lectura con Alias y filtro WHERE...............................................................103Ejemplo de grid con colecciones y asistentes F3................................................................................104Ejemplo Grid con colecciones con cargando Objetos........................................................................105

Formulario de mantenimiento...........................................................106EJEMPLO: CREACIÓN DE UN OBJETO EN EL SISTEMA..................................108

Introducción............................................................................................108

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 2

Page 4: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Creación de tablas..................................................................................109Tabla ObjsPrueba................................................................................................................................109Tabla ObjsPrueba_Lineas...................................................................................................................110Definición de Propiedades..................................................................................................................111Definir el objeto en tabla.....................................................................................................................111Tabla Configurables............................................................................................................................112Triggers...............................................................................................................................................113Vistas...................................................................................................................................................114

Definir objeto en librería.........................................................................114Método ValoresPredeterminados().....................................................................................................122

Crear formulario del objeto.....................................................................122Controles.............................................................................................................................................122Código del formulario.........................................................................................................................126Crear ObjForms.cls.............................................................................................................................132

CONFECCIÓN DE FORMULARIOS.................................................................135Formularios.............................................................................................135

Dimensión y ubicación de controles:..................................................................................................135Redimensión automática:....................................................................................................................136

Controles de formulario:.........................................................................137Combo o Texto...................................................................................................................................137Fecha:..................................................................................................................................................137Hora:...................................................................................................................................................137Numérico:...........................................................................................................................................137Grid usuario:......................................................................................................................................137Botonera:.............................................................................................................................................140Menús:.................................................................................................................................................143

Añadir objetos nuevos dinámicamente a al colección de objetos...........144Uso......................................................................................................................................................145Funcionalidad......................................................................................................................................145

Funcionamiento CadenaDescrip..............................................................146F.A.Q..........................................................................................................147

Error del control Active x: No se puede cargar ‘C:\Plantilla\Externo\AhoraOCX.Ocx’--¿Desea continuar cargando el proyecto?......................147Error de compilación: No se puede encontrar el proyecto o la biblioteca................................................................................................................148

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 3

Page 5: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

INTRODUCCIÓN A LA PROGRAMACIÓN ERP.

Introducción Cuando programamos aplicaciones personalizadas basadas contra un sistema ERP, debemos tener en cuenta que sus desarrolladores utilizan un estándar conciso de programación, así como herramientas y controles personalizados. Primero deberemos preparar nuestro equipo con las herramientas básicas de desarrollo, y muchas veces cambiar nuestra forma de programar, adaptándonos a los estándares del fabricante. Esto último es importante a la hora de utilizar herramientas que nos proporcionan, que actúan según determinados parámetros, prefijos o sufijos incorporados al código o archivos que componen nuestros proyectos.

Requerimientos Herramientas de desarrollo.Para facilitar estas tareas, hemos desarrolado un punto llamado ‘PREPARAR EL ENTORNO’. Si va a trabajar con nuestra máquina virtual, le recomendamos que vaya a este punto y siga los puntos que se detallan en él.

Para comenzar a programar necesita tener instalado en su equipo las siguientes herramientas de desarrollo:

Entorno ERP de Ahora Soluciones. SQL Server 2005. Visual Basic 6.0 (SP 6). Crystal Reports 11.

Además deberán instalar librerías y controles tales como:

CEESIDll.dll ctSchedule.ocx gif89.dll MSOUTL.OLB NeroCom.dll PVCombo.ocx SQLDMO80.cnt SQLDMO.DLL Flex Grid 7 (ActiveX Controls). Sheridan Developers ToolKit (Active Listbar). Sheridan Developers ToolKit (Data Widget). True Grid 6. TrueDBGrid 6. Controles 3.0 Xtrem. Controles Infragistic NetAdvantage51.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 4

Page 6: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Para que su programa se integre correctamente con el ERP, necesitará incorporar los siguientes objetos a su proyecto:

Hooks.bas ConexionCargaLib.cls Constantes.bas

Cómo instalar una librería o control OCX.1. En primer lugar, deberá verificar que tiene permisos de

administrador en el equipo. Debe ser administrador del equipo para registrar una librería.

2. Copie el archivo con extensión DLL u OCX en la carpeta “c:\WINDOWS\system32”

3. Abra el menú Inicio y vaya a la opción “Ejecutar”. En la pantalla de ejecución escriba el comando REGSVR32, seguido de la ruta del archivo entre comillas, como marca el ejemplo:

El uso es: Regsvr32 [/u] [/s] <nombre del fichero>. Los parámetros opcionales [/u] [/s] significan lo siguiente:

[/u] - lo utilizamos cuando queremos "desregistrar" una DLL (o un .OCX) en vez de registrarlo. [/s] - modo "silencioso" - no despliega los mensajes durante la operación.

Metodología y estándares de desarrollo.Los estándares nos ayudan a desarrollar de forma rápida y comprensible para cualquier programador. Además de conseguir una lectura consistente de los códigos fuente, es importante mantener el mismo estilo de programación en todo el código. Intente escribir y dar formato a su código fuente de acuerdo al estándar, así será más sencillo que otras personas mantengan esos archivos, y más fácil copiar porciones de un código a otro.

Para programar aplicaciones integradas a un ERP como el de Ahora Soluciones, es estrictamente necesario adaptarse al estándar de desarrollo

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 5

Page 7: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

del mismo, ya que existen herramientas externas que nos pueden ayudar a resolver varios inconvenientes y que funcionan de acuerdo a un estándar. Nos ayudan, por ejemplo, a recompilar nuestros proyectos para que funcionen con una nueva versión del ERP.

Además de las normas básicas de codificación, como la indentación o la nomenclatura de variables, veremos también la manera de dar nombre a nuestros proyectos y clases. A continuación propondremos algunas, y otras se irán viendo a lo largo del manual o con ejemplos.

Nomenclatura de variables y funciones.Intente dar un nombre autoexplicativo a las funciones y sus variables e indentar el código para que se pueda leer claramente.

Ejemplo: Private function eliminarLineasConArticulosYCantRepetidas (aIdFactura As Long) as BooleanOn Error GoTo ElError

Dim lIdLinea As LongDim lObjLinea As ObjectDim lColLineasFactura As Collection….Set lColLineasFactura = dameLineasFactura (aIdFactura)For Each lObjLinea In lColLineasFactura

…..Next lObjLinea….

Exit FunctionElError:

MsgBox Err.Description, vbCritical, "Error en la aplicación X"End function

Llame a las variables locales con el prefijo “l” de local, a las variables en la cabecera del módulo con el prefijo “p”, a las variables constantes con el prefijo “c” y a las variables recibidas por parámetro con el prefijo “a”. De esta manera podrá identificar claramente a qué variable está haciendo referencia.

Evite en lo posible variables públicas o globales. Intente dividir el código de manera que no se encuentren funciones

extremadamente cargadas de líneas de código. Cuanto más corto es un procedimiento, más fácil es de entender y de depurar.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 6

Page 8: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Nomenclatura de archivos.Cuando creamos un nuevo proyecto, como por ejemplo uno de tipo DLL ActiveX, le llamaremos “[Empresa]Externo” y el archivo se llamará “[Empresa]Externo_[NombreProgramador].vbp”. En el momento de generar el proyecto y compilarlo, lo haremos sobre uno al que llamaremos “[Empresa]Externo_Compilar.vbp”. De esta manera, tendremos un solo proyecto al que reconoceremos al momento de compilar, y podremos diferenciarlo de aquellos en los que están trabajando los programadores.

Esta forma de trabajar puede cambiar en su entorno. Es sólo una de las muchas opciones existentes a la hora de nombrar archivos cuando se comparte código fuente.

Ejemplo:

Proyecto a compilar

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 7

Page 9: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Proyecto con el que trabaja el programador

Aspecto general de la aplicaciónUn elemento básico a tener en cuenta en todo desarrollo es la interfaz de usuario. El aspecto general de la aplicación debe ser uniforme. Intente mantener el aspecto general de su aplicación basándose en los formularios del ERP. Revise cuidadosamente la ortografía tanto en los elementos fijos en pantalla (botones, etiquetas, barras de título, etcétera) como en los mensajes de advertencia, error o confirmación. Debe cuidar también la navegación en pantalla ordenando la tabulación entre controles mediante la propiedad “TabIndex”.

Tenga en cuenta también, que sus formularios deben adaptarse a la mínima resolución de pantalla exigida en el ERP. En la versión 4.0 es de 1024x768 píxeles.

A continuación, se muestran ejemplos con los formularios más comunes en el entorno.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 8

Page 10: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Formulario de mantenimiento de tabla

Se compone de una barra de título, una tabla o grid y una barra con botones en la base de la ventana.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 9

Page 11: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Formulario con filtro

Se compone de un menú, una barra de título, un panel de filtro con los campos y los botones de filtrado, una o varias grids con los resultados obtenidos de la filtración, y la botonera en la base.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 10

Page 12: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Formulario de objeto

Se compone de una barra de menú, una barra de título, un panel con los datos de la cabecera del objeto, un grid con las líneas pertenecientes al objeto, y la barra de botones al pié.

Tablas

Siempre que cree una tabla en SQL, tenga en cuenta que, excepto las tablas de configurables, todas contienen al final 4 campos comunes:

Campo Tipo de datos Permite nulos Especificación de identidad

IdDoc T_Id_Doc:int NO SIInsertUpdate T_CEESI_Insert_Update:bi

tNO NO

Usuario T_CEESI_Usuario:varchar(20)

NO NO

FechaInsertUpdate

T_CEESI_Fecha_Sistema:datetime

NO NO

SIEMPRE QUE CREE UNA TABLA, ASEGÚRESE DE CREAR LOS CAMPOS MENCIONADOS, LOS CUALES DEBEN SER LOS ÚLTIMOS EN DECLARARSE. CUIDE LA INTEGRIDAD DE LOS DATOS CREANDO BORRADOS EN CASCADA Y TRIGGERS.

Muchas veces, sucede que tenemos definido un objeto con su tabla, y necesitamos agregar más campos. Para estos casos, lo correcto es crear una tabla anexa a la del objeto, donde especificaremos los nuevos campos. La tabla debe llamarse Conf_[Nombre de la tabla principal] y que ha de contener las mismas claves que la tabla principal y los campos que deseamos agregarle. NO DEFINA LOS CAMPOS IdDoc, InsertUpdate, Usuario

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 11

Page 13: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

y FechaInsertUpdate EN TABLAS CONFIGURABLES. Los campos configurables se crean en el Admon. [Vea el manual de ADMON]

Siempre que hablemos de campos que estén definidos en éstas tablas, los llamaremos campos configurables.

El motor del sistema y sus objetos manejarán los campos configurables de manera automática.

Programación orientada a objetosLa aplicación está desarrollada basándose en objetos, es decir, que quien realice un desarrollo contra el ERP de Ahora Soluciones, deberá tener conocimientos en lenguajes de programación orientada a objetos. Si bien Visual Basic 6.0 no es un lenguaje íntegramente orientado a objetos por carecer de conceptos como la herencia y el polimorfismo, nuestro equipo de desarrollo simuló una herencia utilizando una Interfaz. Es por esto que el motor de la base de datos se encuentra debidamente encapsulado, definiendo los métodos y funciones en objetos.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 12

Page 14: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

PREPARAR EL ENTORNO

Máquina virtualPara facilitar el desarrollo de módulos externos, hemos preparado una máquina virtual de Windows XP donde ya están instaladas tanto las librerías como el software necesario para poder desarrollar sus módulos externos.

Nuestra máquina está virtualizada con VirtualBox, por lo que, si no lo tiene instalado en su ordenador, deberá descargarlo e instalarlo antes de poder continuar. Descargue e instale el paquete necesario según el sistema operativo anfitrión. En la página web de VirtualBox hay documentación acerca de la configuración y uso de la máquina virtual.

Una vez tenga preparado Virtualbox instale el archivo .ova que le hemos facilitado. La configuración de la red dependerá de su organización.

Contacte con el personal de sistemas de su empresa si tiene alguna duda en este punto.

Software necesario y licenciasDebe tener en cuenta que, para poder usar la máquina de forma correcta, debe indicar sus propias licencias

Sistema operativo: Microsoft Windows XP Profesional SP3 Ahora ERP (la versión para la que quiera desarrollar) Software de desarrollo: SQL Server 2005. Visual Basic 6.0 (SP 6). Crystal Reports 11. Programa de compresión de archivos Controles de VB:

CEESIDll.dll ctSchedule.ocx gif89.dll MSOUTL.OLB NeroCom.dll PVCombo.ocx SQLDMO80.cnt SQLDMO.DLL Flex Grid 7 (ActiveX Controls). Sheridan Developers ToolKit (Active Listbar). Sheridan Developers ToolKit (Data Widget). True Grid 6. TrueDBGrid 6. Controles 3.0 Xtrem. Controles Infragistic NetAdvantage51.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 13

Page 15: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Instamos a comprar su propio software y controles, así como cambiar las licencias de la máquina.

Cabe indicar que la mejor opción para realizar sus propios desarrollos para distintas versiones de nuestra aplicación Ahora ERP consiste en tener una máquina virtual por versión. Habrá que tener instalado en cada una el MSI correspondiente a la versión para la que quiere programar, así como la plantilla correspondiente para cada versión. Otra opción es tener una única máquina virtual y en ella instalar o desinstalar el MSI para el que se vaya a programar cada vez, así como cambiar la versión de la plantilla de desarrollo cada vez. Sin embargo, esta última opción es más costosa de mantener y puede provocar errores si no cambia correctamente el MSI o la plantilla de desarrollo.

Ahora ERPPara evitar problemas con las rutas de las librerías de Ahora ERP, le recomendamos que lo instale en la siguiente ruta: C:\Ahora3\

En caso contrario, podrán surgir algunos problemas con las rutas de las referencias de su nuevo proyecto, que se solucionarían cambiando dichas referencias desde el proyecto de visual basic, como se indica en las F.A.Q.

Plantilla de proyectos Para facilitar el trabajo, hemos creado una plantilla de proyectos. Esta plantilla podría cambiar de una versión de Ahora ERP a otra, por lo que, antes de empezar a programar, le recomendamos que visite nuestro servidor de plantillas y compruebe que las versiones de la plantilla y del MSI instalado en la máquina virtual coinciden.Nuestra plantilla tiene la siguiente estructura:

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 14

Page 16: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Recomendamos guardar esta estructura de datos como plantilla y hacer una copia de la carpeta cada vez que tenga que hacer un proyecto nuevo, así como hacer una copia de seguridad por si en algún momento la sobrescribe poder recuperarla. En el peor de los casos, siempre puede volver a descargarla del servidor de plantillas.

Crear un proyecto a partir de la plantillaPara empezar a programar, necesitará abrir el archivo PlantillaExterno.vbp y comenzar a añadir su código.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 15

Page 17: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

COMENZAR A PROGRAMAR NUESTRA APLICACIÓN

Inicio de la aplicaciónUna vez preparado el entorno, podremos comenzar a desarrollar nuestra aplicación externa al ERP.

A continuación, explicaremos paso a paso la creación de un desarrollo externo. También veremos también los usos de las principales librerías que contiene el motor de la aplicación, así como sus métodos y funciones básicas necesarias para programar.

Crear Proyecto de InicioPropiedadesNuestro programa externo necesitará una aplicación de inicio que arranque el motor del sistema de gestión. Por tanto, el primer paso será crear un proyecto de inicio. Éste será común a todos los externos que utilice, por lo cual no es necesario que lo cree siempre. Si ya está creado, añádalo a su grupo de proyectos donde genere el desarrollo externo y establézcalo como inicial.

Puede usar nuestra plantilla para ello y saltarse este punto, aunque le recomendamos su lectura para comprender mejor la estructura de nuestros proyectos.

1. Abra Visual Basic 6.0.2. Cree un nuevo proyecto de tipo EXE ESTANDAR3. Complete las propiedades pestaña a pestaña, como se muestra

a continuación:

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 16

Page 18: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 17

Page 19: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 18

Page 20: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

4. Vaya al “Menú Proyecto Referencias” y seleccione las librerías necesarias como se muestra a continuación. Tenga en cuenta que las versiones de las librerías irán ascendiendo a medida que se vaya actualizando el ERP.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 19

Page 21: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

5. Vaya al “Menú Proyecto Componentes” y seleccione las librerías necesarias como se muestra a continuación.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 20

Page 22: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

6. Crear formulario de inicio.Cree un nuevo formulario, llámelo FrmMain e inserte un objeto SKinFramework.

7. A continuación cree un módulo y llámelo “Global” de manera que en el árbol de proyectos, el proyecto de inicio se vea de la siguiente manera:

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 21

Page 23: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

8. Por último, y antes de empezar a ver el código del formulario y del módulo, si dentro de su grupo de proyectos tiene más de uno, debe establecer el proyecto de inicio como inicial haciendo clic derecho y seleccionando la opción.

CódigoEn todos los módulos, clases y formularios conviene requerir la definición de variables, para un mejor control de código. Vaya a Menú Herramientas Opciones… y seleccione “Requerir declaración de variables”. Con esto se asegura de que, por defecto, se creen los módulos con la instrucción Option Explicit en la cabecera del módulo.

También establezca la opción Option Compare Text, para que las comparaciones de texto no contemplen mayúsculas y minúsculas.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 22

Page 24: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Formulario Principal:

A todos los formularios, les crearemos una instrucción pública llamada “Carga” donde definiremos los parámetros iniciales del mismo, y donde se establecerá el funcionamiento inicial y su apertura. Siempre que creemos un objeto de tipo formulario, lo llamaremos mediante su función “Carga”.

Como dijimos anteriormente, en el objeto del formulario pondremos un control SKinFramework que servirá para cargar el estilo visual personalizado de la aplicación.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 23

Page 25: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Función de inicio de formularios, lo aplicaremos como estándar en todos.

Clase Conexión, perteneciente a AhoraSistema.dll. Es la clase más usada, será nuestro manejador, ya que contiene las funciones más importantes para: Realizar consultas a la base de datos, crear objetos y colecciones y buscar objetos y colecciones.

Establece el estilo, la visualización personalizada del entorno. Debe especificar la ruta de la carpeta de estilos

Inicia el explorador de objetos. Observe que a través del obj. Conexión hacemos una llamada a un objeto a partir de su propiedad “IdLink”. El objeto se llama Ahora_Links, el cual tiene asociado un proceso, que es el que se ejecuta. (Más adelante explicaremos lo que son los nodos, los links y toda la gestión de objetos).

Cierra el entorno y establece la conexión a NULL

La función dameValorCampo nos devuelve un Variant con el campo solicitado en la instrucción SQL.La función VGetNumber convierte un variante en un Long. En la librería AhoraUtil podremos encontrar funciones de este estilo que nos facilitarán el trabajo.

Código del formulario principal:

A continuación haremos una breve presentación del código para presentar las clases de servicios más importantes del sistema.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 24

Page 26: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Conexión.Conecta lanza la pantalla de inicio que se encarga de establecer la conexión con la base de datos

Hace la llamada a nuestro formulario principal y le pasa la conexión establecida en la pantalla de inicio.

Código del módulo:

Terminaremos presentando el código del módulo global que inicia y lanza nuestra aplicación de gestión.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 25

Page 27: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Creación de un proceso externoDescripciónNuestro proyecto consistirá en la creación de un proceso que abrirá una pantalla con los artículos de un proveedor. Será accesible desde el menú de gestión. La pantalla tendrá un combo, un grid y una barra de botones. El combo deberá desplegar los proveedores del sistema y al seleccionar uno, el grid nos enseñará sus artículos. La barra de botones tendrá un botón de imprimir y otro de cerrar.

Propiedades del proyectoEmpezaremos creando un nuevo proyecto al que llamaremos PlantillaExterno. Incorporamos los componentes y referencias necesarios y configuramos las propiedades del proyecto como indican las imágenes.

Si va a utilizar la plantilla proporcionada correspondiente a la versión para la que vamos a programar, puede pasar directamente a procesos, aunque es recomendable que lea los puntos intermedios para conocer la estructura.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 26

Page 28: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 27

Page 29: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 28

Page 30: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 29

Page 31: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Control: EnlaceObjetosNombre: Titulo

Control: cntPanelNombre: pnlProveedor

Control: ComboUsuarioMultNombre: cboIdProveedor

Control: cntGridUsuarioNombre: grdArticulos

Control: cntBotoneraNombre: Botonera

Módulos, clases y formularios

Módulos

Incorporamos la última versión de Hooks (Hook.bas) y crearemos un módulo al que llamaremos Principal (Principal.bas), que se encargará básicamente de instanciar la conexión.

Formularios

Crearemos un nuevo formulario al que llamaremos frmControles (frmControles.frm).

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 30

Page 32: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Clases

Incorporaremos la última versión de ConexionCargaLib (ConexionCargaLib.cls) y crearemos una nueva clase llamada Procesos (Procesos.cls).

Cabe destacar que tanto Hooks.bas como ConexionCargaLib.cls deben ser siempre los mismos en todos los proyectos. Cuando reciba una nueva versión de Hooks o de ConexionCargaLib, actualice los proyectos y recompile las librerías para que vayan de acuerdo con la última versión del sistema.

Procesos

Introducción

Para crear un proceso, debemos saber cómo actúa el motor del sistema. Aprovecharemos el ejemplo actual para explicar algunos conceptos como proceso, link y nodo.

Nosotros queremos hacer un proceso que sea llamado desde un link en el árbol del “menú gestión”. Para ello necesitaremos crear una entrada o nodo en el árbol del menú, y un link en esta entrada para que llame a nuestro proceso (que estará contenido en nuestro proyecto de Visual Basic).

Árboles y Nodos

Un árbol es una estructura jerárquica de datos que imita la forma de un árbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se construye el árbol y puede tener cero o más nodos hijos conectados a él. Se dice que un nodo a es padre de un nodo b si existe un enlace desde a hasta b (en ese caso, también decimos que b es hijo de a). Sólo puede haber un único nodo sin padres, que llamaremos raíz. Un nodo que no tiene hijos se conoce como hoja. A los demás nodos (tienen padre y uno o varios hijos), se les conoce como rama.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 31

Page 33: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

EXPLORADOR

MENUMAIN

MNUGESTION

MNUARCHIVO

MNUADMINISTRA2

MNULISTADOS

MNUGESCLIENTES

MNUPRUEBA

MNUPRUEBA_CTRL

En nuestro caso, nuestro árbol será el árbol de menú de inicio, cuyo nodo padre (MENUMAIN) no es visible.

Tendremos que crear un nodo (MNUPRUEBA) que “cuelgue” de su padre (MNUGESTION) y otro nodo (MNUPRUEBA_CTRL) que cuelgue de MNUPREUBA.

Para gestionar nuestros árboles, tenemos tablas donde se crean y vinculan los nodos. Estas tablas son:

Ahora_Nodos: Tabla donde damos de alta los nodos Ahora_Nodos_Relacion: Tabla donde relacionamos el nodo con su nodo

padre.

Script de creación y colocación de un nodo en un árbol

Declare @Descrip varchar(50)Declare @MENUNuevo varchar(15)Declare @MENUPadre varchar(15)Declare @Orden intSET @MENUNuevo ='MNUPRUEBA'SET @Descrip='Plantilla Pruebas'SET @MENUPadre = 'MNUGESTION'

-- CREAR NODO MENU PRUEBAIF NOT EXISTS( SELECT IdDoc FROM Ahora_Nodos WHERE IdNodo=@MENUNuevo) INSERT INTO [Ahora_Nodos] ([IdNodo], [Activo],[Descrip], [Icono], [IdLink], [IdAhoraProceso], [Expandido], [Visible], [Enabled], [Destacado])VALUES (@MENUNuevo,1,@Descrip,123,NULL,NULL,0,1,1,0)ELSE PRINT 'Ya existe una entrada para el nodo '+ @MENUNuevo+'.'

IF NOT EXISTS (SELECT IdDoc FROM Ahora_Nodos_Relacion WHERE IdNodo=@MENUNuevo AND IdNodoPadre=@MENUPadre) BEGIN SELECT @Orden =Max(Orden)+1 FROM Ahora_Nodos_Relacion WHERE IdNodoPadre=@MENUPADRE INSERT INTO Ahora_Nodos_Relacion(IdNodo,IdNodoPadre,Orden) VALUES (@MENUNuevo,@MENUPadre, @Orden)ENDELSE

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 32

Page 34: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

PRINT 'Ya existe la relación para para el nodo ' + @MENUNuevo + ' padre ' + @MENUPadre + '.'GO

Una vez hayamos ejecutado este script, si abrimos el ERP y vamos a Menú / Gestión, veremos que se habrá creado una carpeta llamada “Plantilla Pruebas”. Sólo resta crear el proceso y el nodo que lo llame.

Recuerde que también puede crear los nodos en el ADMON de manera fácil y segura.

Links

Un Link es un objeto que establece una relación hacia otro objeto. Los Links se almacenan en la tabla Ahora_Links y hacen referencia a un objeto de una colección. Si un nodo de un árbol contiene un Link, al hacer clic sobre él, lo que hace es ejecutar el objeto relacionado, ya sea abriéndolo o (si es un proceso) ejecutándolo.

Tipos de proceso

Si queremos que una función pueda ser ejecutada desde cualquier otra librería, simplemente nos bastará con crear el objeto proceso en la base de datos, y el propio motor del ERP se encargará de ejecutarla cuando alguien la llame.

Para el sistema, un proceso es un objeto que describe un método o función pública almacenada en una clase de una librería. La librería debe estar incorporada al ERP y el proceso tiene que existir en la tabla Ahora_Procesos. Hay 4 tipos de procesos definidos, de los cuales nos interesan sólo 2:Procesos tipo 2 – Librería Rutinas

Son aquellos que existen en una librería y los ejecutamos directamente mediante CONEXION.AhoraProceso ().

Ejemplo:1. En nuestro proyecto de prueba, dentro de la clase Procesos,

creamos la siguiente función:

Option ExplicitOption Compare Text

Private Const cModuleName = "Procesos"

Public Function Mensaje(Optional aMensaje As String = "") As BooleanOn Error GoTo Error_ If aMensaje = "" Then MsgBox "Hello World", vbInformation Else MsgBox aMensaje, vbInformation End If

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 33

Page 35: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Mensaje = TrueEnd_: Exit FunctionError_: gCn.Tr.Trace TError, cModuleName, " HelloWorld", , Err.Description Resume End_End Function

Como se puede apreciar, la función Mensaje lo que hace es mostrar un MSGBOX con el texto que se recibe por parámetro.

2. Una vez hayamos creado la función Mensaje, creamos el objeto Proceso.:

Declare @IdAhoraProceso varchar(50)Declare @Libreria varchar(50)Declare @ClaseProc varchar(50)Declare @MetodoProc varchar(50)Declare @Descrip varchar(50)Declare @Observ varchar(250)SET @IdAhoraProceso='Plantilla_Mensaje'SET @Libreria='PlantillaExterno'SET @ClaseProc = 'Procesos'SET @MetodoProc='Mensaje'SET @Descrip='Mensaje'SET @Observ =''-- CREAR AHORA_PROCESOIF NOT EXISTS (SELECT IdDoc FROM [Ahora_Procesos] WHERE IdAhoraProceso=@IdAhoraProceso) INSERT INTO [Ahora_Procesos]([IdAhoraProceso] ,[Descrip], [IdTipo], [Libreria], [Clase], [Metodo],[IdLlamada], [RetornoTipo], [RetornoObjeto], [CheckParam], [Observaciones], [Macro])VALUES (@IdAhoraProceso, @Descrip,2, @Libreria, @ClaseProc ,@MetodoProc,1,NULL,0,'False', @Observ,0)ELSE PRINT 'Ya existe un proceso llamado ' + @IdAhoraProceso + '.'

3. Habiendo declarado la función y creado el objeto proceso, podremos hacer referencia a la función desde cualquier otra aplicación integrada en el ERP:

Option ExplicitOption Compare TextPublic gCn As Conexion

Public Function Prueba () As Boolean On Error GoTo Error_ Prueba = gCn.AhoraProceso("Plantilla_Mensaje", False, "Prueba") Exit FunctionError_: gCn.Tr.Trace TError, cModuleName, " Prueba ", , Err.Description Resume End_End Function

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 34

Page 36: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Proceso tipo 3 – Tipo Macro

Son aquellos que se ejecutan automáticamente, mediante un Link, al hacer clic en un nodo.Es el tipo de proceso que necesitaremos para nuestro ejemplo.

Script de creación de un proceso unido a un link y a un nodo que lo ejecuta.Declare @IdAhoraProceso varchar(50)Declare @Libreria varchar(50)Declare @ClaseProc varchar(50)Declare @MetodoProc varchar(50)Declare @Descrip varchar(50)Declare @Observ varchar(250)

Declare @MENUNuevo varchar(15)Declare @MENUPadre varchar(15)Declare @Orden intDeclare @IdTecla int

Declare @IdDoc t_Id_DocDeclare @IdLink int

SET @IdAhoraProceso='Plantilla_PruebaControles'SET @Libreria='PlantillaExterno'SET @ClaseProc = 'Procesos'SET @MetodoProc='PruebaControles'SET @Descrip='Prueba de Controles'SET @Observ =''

SET @MENUNuevo = 'MNUPRUEBA_CTRL'SET @MENUPadre = 'MNUPRUEBA'

-- CREAR AHORA_PROCESO (de tipo 3 ya que será llamado desde un link de Ahora_Macros'IF NOT EXISTS (SELECT IdDoc FROM [Ahora_Procesos] WHERE IdAhoraProceso=@IdAhoraProceso) INSERT INTO [Ahora_Procesos] ([IdAhoraProceso] , [Descrip], [IdTipo], [Libreria], [Clase], [Metodo], [IdLlamada], [RetornoTipo], [RetornoObjeto], [CheckParam], [Observaciones], [Macro]) VALUES (@IdAhoraProceso, @Descrip,3, @Libreria, @ClaseProc ,@MetodoProc,1,NULL,0,'False', @Observ,0)ELSE PRINT 'Ya existe un proceso llamado '+ @IdAhoraProceso +'.'

-- CREAR LINK QUE APUNTA AL AHORA_PROCESOSELECT @IdDoc=IdDoc FROM Ahora_Procesos WHERE IdAhoraProceso=@IdAhoraProcesoSELECT @IdLink=IsNull(Max(IdLink),0) + 1 From Ahora_Links

IF NOT EXISTS(SELECT IdDoc FROM [Ahora_Links] WHERE Descrip=@Descrip AND Coleccion='Ahora_Macros' AND IdDocObjeto=@IdDoc ) INSERT INTO [Ahora_Links]([IdLink],[Descrip],[Coleccion],[IdDocObjeto]) VALUES (@IdLink ,@Descrip,'Ahora_Macros',@IdDoc)ELSE BEGIN PRINT 'Ya existe un link llamado "'+ @Descrip +'" que apunte al proceso "' + @IdAhoraProceso +'" (IdDocObjeto ' +CAST(@IdDoc as varchar)+').'

SELECT @IdLink=IdLink FROM [Ahora_Links] WHERE Descrip=@Descrip AND Coleccion='Ahora_Macros' AND IdDocObjeto=@IdDoc

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 35

Page 37: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

PRINT 'IdLink = ' + CAST(@IdLink as varchar) END

-- CREAR NODO MENUIF NOT EXISTS( SELECT IdDoc FROM Ahora_Nodos WHERE IdNodo=@MENUNuevo) INSERT INTO [Ahora_Nodos]([IdNodo], [Activo], [Descrip], [Icono], [IdLink], [IdAhoraProceso], [Expandido], [Visible], [Enabled], [Destacado]) VALUES(@MENUNuevo,1,@Descrip,123,@IdLink,NULL,0,1,1,0)ELSE PRINT 'Ya existe una entrada para el nodo '+ @MENUNuevo +'.'

-- PONER NODO EN EL ARBOLIF NOT EXISTS (SELECT IdDoc FROM Ahora_Nodos_Relacion WHERE IdNodo=@MENUNuevo AND IdNodoPadre=@MENUPadre) BEGIN SELECT @Orden =ISNULL(Max(Orden),0)+1 FROM Ahora_Nodos_Relacion WHERE IdNodoPadre=@MENUPADRE

INSERT INTO Ahora_Nodos_Relacion(IdNodo,IdNodoPadre,Orden) VALUES (@MENUNuevo,@MENUPadre, @Orden)ENDELSE PRINT 'Ya existe la relación para para el nodo ' + @MENUNuevo + ' padre ' + @MENUPadre + '.'GO

Este script crea el nodo MNUPRUEBA_CTRL que cuelga de MNUPRUEBA. El nodo contiene un Link y el Link contiene el proceso Prueba_Controles. El proceso Prueba_Controles hace referencia a una función en la clase Procesos, que definiremos a continuación. Cuando hagamos clic en el nodo del árbol ejecutará nuestra función PruebaControles.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 36

Page 38: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Codificación de clases, módulos y formularios

Principal.bas

Es fundamental que tengamos definido este código en un módulo, ya que ConexionCargaLib hace referencia a éstas declaraciones. Aquí se define el objeto CONEXIÓN en nuestro proyecto y será visible desde toda la aplicación.

Option Explicit

Public gCn As Conexion

Public Sub EstableceConexion(aCon As Conexion) If Not gCn Is Nothing Then Exit Sub End If Set gCn = aCon ConectaOCX gCn, App.TitleEnd Sub

Public Sub DesestableceConexion() Set gCn = Nothing ConectaOCX Nothing, App.TitleEnd Sub

Procesos.cls

En esta clase crearemos todos los métodos y funciones públicas que se llamarán desde los procesos del sistema. Aquí tendremos que definir Pruebas_Controles, que será llamado desde el nodo que creamos anteriormente. Básicamente el proceso consiste en instanciar el formulario y llamar a su función carga ().

Option ExplicitOption Compare Text

Private Const cModuleName = "Procesos"

Public Function PruebaControles() As Boolean Dim lFrm As frmControles Dim lRes As BooleanOn Error GoTo Error_ lRes = gCn.AhoraProceso("Plantilla_Mensaje", False, "PRueBA") Set lFrm = New frmControles lFrm.Carga gCn.Sesion.MainFormEnd_: PruebaControles = True Set lFrm = Nothing Exit FunctionError_: gCn.Tr.Trace TError, cModuleName, " PruebaControles", , Err.Description Resume End_

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 37

Page 39: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

End Function

frmControles.frm

Función Form_Load ()

En el evento LOAD del formulario inicializaremos la botonera.

Option ExplicitOption Compare Text

Private Const cModuleName = "frmControles"

Private Sub Form_Load()On Error GoTo Error_ Botonera.SeguridadObjeto = eMenuImprimir Botonera.BotonesMantenimiento = eBotMant_Cerrar Botonera.HabilitaBotonesEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " Form_Load", , Err.Description Resume End_End Sub

La botonera tiene 2 grupos de botones predefinidos: botones SeguridadObjeto (Guardar, Nuevo, Eliminar, Imprimir y Asociados) y botones Mantenimiento (Aceptar, Cancelar, Cerrar).

La instrucción que damos es para que cargue el botón Imprimir y el botón Cerrar. La instrucción HabilitaBotones es para que aparezcan habilitados.

Función carga ()

Esta función es común en todos los formularios de la aplicación y se encarga de recibir los parámetros necesarios para mostrar la ventana. Inicializa parámetros y controles, y muestra el formulario. También cargamos los íconos del formulario y la barra de título.

Public Function Carga (Optional aPropietario As Object) As Boolean Me.Caption = "Prueba de controles" Me.Titulo.Caption = "Articulos de proveedor" Me.Icon = gCn.DameIcono(123) Set Me.Titulo.Icono = gCn.DameIcono(233) Me.Titulo.MuestraIcono = True cargarCombo CargaGrdArticulos gCn.Obj.FormShow Me, aPropietario Carga = TrueEnd Sub

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 38

Page 40: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

La función gcn.dameIcono () recibe un IdIcono de tipo Long y nos devuelve una imagen de la biblioteca de imágenes. Consulte la tabla Iconos para obtener la lista de Iconos disponibles.

La función gCn.Obj.FormShow () muestra la pantalla y establece la relación padre – hijo en los formularios. Es muy importante para el control de formularios modales.

Función cargaCombo ()

Se encarga de inicializar el combo cargando los datos de la tabla de proveedores. Este control tiene la particularidad de que puede estar ligado a otro combo, permitiendo así una búsqueda por 2 campos. En este caso, queremos que el primer combo muestre una lista (IdProveedor-Proveedor) ordenada por IdProveedor y que el segundo combo despliegue una lista (Proveedor-IdProveedor) ordenada por Proveedor.

Private Sub cargarCombo()On Error GoTo Error_ Dim lCampos(1 To 2) As String 'Matríz de campos Dim lCampos2(1 To 2) As String 'Matríz de campos Dim lTipos(1 To 2) As eTiposCol_Cbo Dim lWidth(1 To 2) As Single Dim n As Long With cboIdProveedor lCampos(1) = "IdProveedor" lCampos(2) = "Proveedor" lTipos(1) = eTiposCol_Texto lTipos(2) = eTiposCol_Texto lWidth(1) = 1200 lWidth(2) = 2500 .Configura 0, lCampos, lTipos, lWidth, 1, _ "SELECT IdProveedor,Proveedor FROM vCombo_Proveedores ORDER BY IdProveedor", _ "Select IdProveedor From Prov_Datos Where IdProveedor =@1" lCampos(1) = "Proveedor" lCampos(2) = "IdProveedor" lWidth(1) = 2500 lWidth(2) = 1200 ‘Creamos el segundo combo n = .AgregaCombo(lCampos, lTipos, lWidth, 2, _

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 39

Page 41: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

"SELECT Proveedor,IdProveedor FROM vCombo_Proveedores ORDER BY Proveedor", _ "Select IdProveedor From Prov_Datos Where IdProveedor =@0") .ColumnaEscalada = 1 .Resize End WithEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " Form_Load", , Err.Description Resume End_End Sub

Los combos pueden desplegar una lista de hasta 3 campos. Lo primero es definir una matriz con los campos que queremos mostrar en la lista. Luego asignamos a la matriz los nombres de los campos, que deben corresponderse con los nombres de columna de la sentencia SQL.

Necesitaremos también una matriz para especificar los anchos de columnas de la lista y los tipos de datos que contendrán. Cuando hacemos la llamada al método Configura() del combo, ya tendremos un combo en pantalla. A continuación se muestra el enunciado del método configura () del combo.

Sub Configura (aComboIndex As Integer, aCampos() As String, aTipos() As eTiposCol_Cbo, aAnchuras() As Single, aCActiva As Integer, aDescripcion As String, Optional aSustitucion As String = "")

El parámetro aDescripcion recibe una sentencia SQL, una consulta a la base de datos, con las columnas que queremos que se vean en la lista. Si solamente tenemos un combo, no sería necesario. El parámetro sustitución también es una sentencia SQL. Si sólo queremos mostrar un combo no es necesario pasarle el parámetro “aSustitucion”. Pero en nuestro caso, como vamos a vincular otro combo al primero, el nexo entre los dos controles es el campo sustitución. Cuando uno de ellos cambia de valor, el otro se actualiza según la SQL establecida. En nuestro caso es un “SELECT col1, col2 FROM tabla WHERE col1 = @n” donde n = número de columna del otro combo. El valor @n nos retorna el valor del registro seleccionado.

Cuando el combo 1 cambia, el combo 2 se actualiza con el valor de la columna 0 del primero, o sea IdProveedor.

Una vez configurado el primer combo, completamos los datos para el segundo y llamamos a la instrucción AgregaCombo (). Nos creará el segundo combo vinculado.Función Cargagrdarticulos ()

Inicializa el grid. Crea las columnas e indica la consulta que tiene que mostrar.

Private Sub CargaGrdArticulos(Optional aIdProveedor As String = "-1")On Error GoTo Error_ Dim lStrVista As String lStrVista = "(SELECT pa.IdProveedor, pa.IdArticulo, a.Descrip, a.IdDoc " & _ "FROM Prov_Articulos pa " & _

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 40

Page 42: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

"INNER JOIN Articulos a on " & _ "pa.IdArticulo = a.IdArticulo) Vista" With grdArticulos If Not .Preparada Then .Agregar = False .Editar = False .Eliminar = False .CargaObjetos = False .EditarPorObjeto = False .Grid.FetchRowStyle = False .Alias = "Vista" .AgregaColumna "IdArticulo", 1000, "IdArticulo" .AgregaColumna "Descrip", 3000, "Descripción"

.From = lStrVista .Orden = "" End If .Where = "WHERE Vista.IdProveedor = " & SqlString(aIdProveedor) 'sqlString me añade comillas .Refresca = True End WithEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " CargagrdArticulos", , Err.Description Resume End_End Sub

Primero definimos la vista (sentencia select, vista o tabla) en la que se va a basar el grid para mostrar los datos, será el origen de datos de la grid. Luego le indicamos los permisos de agregado, edición y eliminación. Las propiedades cargaObjeto y editarPorObjeto sólo se usan para cuando queremos que el origen de datos sea una colección de objetos. Pero no será nuestro caso.

La instrucción AgregaColumna recibe los parámetros de: Nombre de campo SELECT, Ancho y Nombre de columna, entre otros, que son los obligatorios para poder crear una columna en el grid

Una vez creadas las columnas, indicado el origen (From) y el WHERE, el grid formará su origen de datos, una consulta parecida a la siguiente (siaIdProveedor = ‘-1’):

SELECT Vista. Idarticulo, Vista. Descrip FROM (SELECT pa.IdProveedor, pa.IdArticulo, a.Descrip, a.IdDoc FROM Prov_Articulos pa INNER JOIN Articulos a on pa.IdArticulo = a.IdArticulo) Vista WHERE Vista.IdProveedor = ‘-1’

Es importante que, en los casos en los que creamos una vista en la propia select, le digamos al grid cuál será el Alias.

La primera vez que se ejecuta la función, la propiedad Preparada de la grid pasará a TRUE, con lo cual no volverá a entrar en el bloque de creación de columnas y sólo actualizará el WHERE de la consulta.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 41

Page 43: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Evento Change del combo

Cuando seleccionan un proveedor en el combo, hay que listar sus artículos. Hacemos invocamos CargaGrdArticulos y le pasamos el código de proveedor.

Private Sub cboIdProveedor_Change(aComboIndex As Integer) CargaGrdArticulos Me.cboIdProveedor.TextEnd Sub

Evento clic de la botonera

Cuando pulsen el botón Imprimir llamará a la función de imprimir, cuando pulse Cerrar cerrará el formulario.

Private Sub Botonera_ToolClicked (aTool As AhoraOCX.AhoraTool)On Error Resume Next Select Case aTool.Name Case cBotMant_Imprimir Call Imprimir Case cBotMant_Cerrar Unload Me End SelectEnd Sub

Imprimir un informePara imprimir el contenido del grid sólo tiene que llamar a la función imprimir del control:

Me.grdArticulos.Imprimir

Si quiere que al darle al botón Imprimir llame a un informe de Crystal Reports, el procedimiento cambia significativamente.

Cuando cree el listado de Crystal Reports debe guardarlo en una ruta especificada en el sistema. Puede averiguar la ruta yendo al menú Administración – Configuración – Parámetros de la aplicación. Una vez ahí, abra la ventana de parámetros dentro de la carpeta Configuración – Directorios – PathListados, o ejecutando la siguiente consulta a la base de datos:

SELECT Valor FROM CEESI_Configuracion WHERE Parametro = 'PATHLISTADOS'

Una vez esté guardado el report, hay que grabarlo en el sistema en la tabla CEESI_Listados. Tenga en cuenta que, cuando el report no esté vinculado a un objeto (Artículo, Proveedor, Albarán, etcétera) debe vincularlo al ObjetoGenerico.

A continuación pondremos nuestro report en el sistema mediante el siguiente script SQL.

DECLARE @Objeto VARCHAR(50)DECLARE @Listado VARCHAR(50)

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 42

Page 44: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

DECLARE @Descrip VARCHAR(255)DECLARE @Fichero VARCHAR(255)DECLARE @Formulario BITDECLARE @NomFormulario VARCHAR(50)SET @Objeto = 'ObjetoGenerico'SET @Listado = 'Articulos de proveedor'SET @Descrip = 'Pruebas'SET @Fichero = 'Pruebas\ReportPrueba.rpt'SET @Formulario = 1SET @NomFormulario = 'frmControles' IF NOT EXISTS ( SELECT IdDoc

FROM CEESI_Listados WHERE Objeto LIKE @Objeto

AND Listado LIKE @ListadoAND Descrip LIKE @DescripAND Fichero LIKE @FicheroAND Formulario = @FormularioAND NomFormulario LIKE @NomFormulario )

INSERT INTO CEESI_Listados( Objeto,Listado, Descrip, Fichero, Formulario,NomFormulario)

VALUES( @Objeto,@Listado,@Descrip,@Fichero,@Formulario,@NomFormulario)ELSE

PRINT 'Registro para el listado especificado ya existe'Y la función en el formulario quedaría de la siguiente manera:Public Function Imprimir() As Boolean Dim lSql As String Dim lObjGen As Object Dim lListado As StringOn Error GoTo Error_ lSql = Me.grdArticulos.Where ‘Obtiene el filtrado del grid lListado = "Articulos de proveedor" Set lObjGen = gCn.Obj.DameObjStr("ObjetoGenerico") ‘Instancia un objeto genérico. lObjGen.NomFormulario = Me.Name lObjGen.Imprimir lSql, lListado ‘Llama al evento imprimir del objeto.End_: Exit FunctionError_: gCn.Tr.Trace TError, cModuleName, " Imprimir ", , Err.Description Resume End_End Function

Evento Resize del Formulario

En Visual Basic 6, resulta un poco engorroso el programar las dimensiones de los controles cuando un formulario cambia su tamaño. Para ello hemos creado con algunos controles un sistema para aliviarnos la tediosa tarea de programar el evento Form_Resize ().

Los controles que funcionan automáticamente con el sistema Form_Autoresize, tienen unas propiedades especiales para inicializar en tiempo de diseño. Éstas son: ResizeEnabled, ResizeH, ResizeV, y en el caso de los Grids y Tabs, ResizeRestanteH y ResizeRestanteV.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 43

Page 45: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

1. Pondremos todos los controles que queremos que se ajusten automáticamente al tamaño del formulario con su propiedad ResizeEnabled=TRUE.

2. Imaginemos nuestro formulario como una cuadrícula donde en cada cuadro están los controles. En nuestro ejemplo tendremos todos los controles sobre la columna H0, pero si tuviésemos, por ejemplo, que poner otro panel a la derecha de pnlProveedor, lo pondríamos en H1-V1.

H0 H1 H2V0 TituloV1 pnlProveedorV2 grdArticulosV3 Botonera

Las propiedades de los controles quedarían de la siguiente manera:

ResizeEnabled

ResizeH

ResizeV

ResizeRestanteH

ResizeRestanteV

Titulo TRUE 0 0pnlProveedor TRUE 0 1 FALSE FALSEgrdArticulos TRUE 0 2 FALSE TRUEBotonera TRUE 0 3

La propiedad ResizeRestante será TRUE sólo para el control que debe crecer ocupando todo el espacio.

3. Programar el evento Form_Resize

Private Sub Form_Resize() On Error Resume Next Call Form_AutoResize(Me)End Sub

Compilar el proyecto1. Una vez terminado el proyecto, debemos asegurarnos que compile.

Presionamos CTRL+F5 para verificar que compila correctamente. 2. Abrimos solamente nuestro proyecto Plantilla_Externo y le damos a

Guardar como… creando un nuevo archivo PlantillaExterno_Compilar.vbp3. Compilamos la dll (Menú Archivo – Generar

Plantilla_Externo_Compilar.dll) generando el archivo PlantillaExterno.dll.4. Registramos la dll en los equipos que queremos que funcione (Debe ser

administrador del equipo)5. Copie el archivo con extensión DLL en la carpeta correspondiente.

Ejemplo: “C:\Ahora3\Lib”6. Haga clic en “Inicio” / “Ejecutar…” y en la pantalla de ejecución escriba

el comando REGSVR32 seguido de la ruta del archivo entre comillas.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 44

Page 46: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

El uso es: Regsvr32 [/u] [/s] <nombre del fichero>. Los parámetros opcionales [/u] [/s] significan lo siguiente: [/u] - lo utilizamos cuando queremos "desregistrar" una DLL (o

un .OCX) en vez de registrarlo. [/s] - modo "silencioso" - no despliega los mensajes durante la

operación.7. Ejemplo: Para un archivo llamado PlantillaExterno.dll en C:\Ahora3\Lib, se

recomienda desregistrarla y luego registrarla, para evitar errores, por lo que lo realizaremos en dos pasos.

8. REGSVR32 /u “C:\Ahora3\Lib \ PlantillaExterno.dll”9. REGSVR32 “C:\Ahora3\Lib \ PlantillaExterno.dll”

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 45

Page 47: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

OBJETOS EN EL SISTEMA

IntroducciónUn objeto en POO (Programación Orientada a Objetos) representa alguna entidad de la vida real, es decir, alguno de los objetos que pertenecen al negocio con que estamos trabajando o al problema con el que nos estamos enfrentando, y con los que podemos interactuar.

Podemos definir nuestro ERP como un gran buscador de objetos (Clientes, Proveedores, Pedidos, Albaranes, etcétera).

Si queremos que un objeto de una clase interactúe y sea accesible en el ERP debemos definirlo en tablas. Las tablas donde se definen y relacionan las clases son Objetos y Objetos_Objetos.

La mejor manera para crear nuestros objetos es desde el ADMON [Consultar Manual de ADMON y DDA].

Definición de clases y objetosToda clase que se defina debe tener asignada una tabla para sus objetos. Cada registro de su tabla corresponderá a un objeto. Las columnas o campos de la tabla corresponden a las características del objeto. Por ejemplo para la clase Cliente, existe una tabla Clientes_Datos donde sus campos (IdCliente, Cliente, RazónSocial, NIF, etc.) serán los atributos de los objetos, y cada registro de la tabla un Cliente o mejor dicho, un Objeto Cliente.

Para cada clase definida deberá también definir una clase que sea su Colección, su contenedor. Esto significa que para la clase Cliente existirá una clase Clientes de tipo Colección.

Para la Clase Cliente habrá definido un registro en la tabla Objetos. Para la Colección Clientes habrá definido un registro en la tabla Objetos

de tipo Colección y con HijoDefecto = ‘Cliente’.

EN DETERMINADAS CITAS Y MANUALES RELACIONADOS, TENGA EN CUENTA QUE MUCHAS VECES SE HABLA DE UN OBJETO CUANDO REALMENTE SE REFIERE A LA CLASE (O DEFINICIÓN DE OBJETO).

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 46

Page 48: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Pedido Linea de pedido1 n

Relación Objeto – Objeto“Un Pedido tiene Lineas de Pedido”.

Este tipo de relaciones se verán reflejadas en la tabla Objetos_Objetos donde Pedido será padre de Líneas de pedido.

En conclusión, para reflejar ésta relación debemos de tener: Tabla para los objetos Pedido. Tabla para los objetos Pedido_Linea. Clase Pedido. Clase Pedidos de tipo colección con HijoDefecto = ‘Pedido'. Clase Pedido_Linea. Clase Pedido_Lineas de tipo colección con HijoDefecto = ‘Pedido_Linea’. Relación PedidoContiene o es padre de Pedido_Lineas (tabla

Objetos_Objetos).

Definición de propiedadesTodo objeto tiene que tener definidas las propiedades de su tabla en la tabla Objetos_Propiedades. Es imprescindible para el funcionamiento del buscador. Además, desde esta tabla le podremos dar un orden a las propiedades, activarlas, desactivarlas, vincularles una cláusula SELECT, un formato, etc.

Creación de objetosTenemos cuatro formas de definir una Clase en el ERP:

1. Definirla en las tablas de objetos y dentro de una librería . Sus objetos, además de servir de contenedor de datos, contienen funciones específicas. Son los más complejos de programar.

2. Definirla sólo por tablas . Los objetos son simples contenedores de datos, aunque pueden tener asociado un formulario. No es necesario programar para crearlos ya que es posible hacerlo desde el ADMON. [Ver manual de dda]

3. Definirla sólo en una librería . Los objetos suelen utilizarse para resolver algoritmos complejos, no se guardan en tablas permanentes.

4. Definirla virtualmente . La clase y sus objetos se crean dinámicamente en código sin necesidad de declararlos en la tabla Objetos. Se utilizan para facilitar la actualización y el guardado de datos, manipulando los registros de una tabla cualquiera como si fueran objetos.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 47

Page 49: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Indica que será visible desde el buscador de objetos

Indica que se podrá crear un nuevo objeto de forma directa en el formulario principal

Si la clase está definida en una librería, indíquela

Antes de ponerse a definir objetos debe tener en cuenta cuántos pueden verse involucrados en el problema y definir su relación así como también saber quién va a tener acceso a ellos. Considere que debe configurar la seguridad de los objetos creados. Desde el ADMON podrá asignar quién puede tener acceso a los objetos de la Clase creada. Si tiene dudas revise el manual del ADMON y échele un vistazo al manual de DDA.

Pasos para definir un nuevo objeto(En este apartado, cuando hablemos de objeto nos referimos a su definición, la Clase)

Existe una funcionalidad en el ADMON, para definir tanto una colección como un objeto nuevo y que éste tenga el mismo tratamiento que los demás objetos de la aplicación.

1. Primero cree en SQL Server la tabla del objeto. No olvide agregar al final los campos IdDoc, InsertUpdate, Usuario y FechaInsertUpdate.

2. Vaya al programa ADMON y dentro de la sección de configuración elija el nodo Objetos. Al seleccionar cualquier objeto podremos ver su lista de propiedades (descripción, SQL, Librería, Menú…), y en la parte inferior tenemos el botón Nuevo, que necesitamos para crear el objetos y colecciones.

Al pulsarlo, accederemos al siguiente formulario:

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 48

Page 50: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Donde:

Objeto: Es el nombre del objeto que estamos creando. Debe de ser único.

Descripción: Es la descripción del objeto que verá el usuario en el explorador del objetos

Tabla: Tabla donde se almacenarán los datos del objeto. Para la creación del objeto esta tabla no hace falta que exista. La tabla hay que crearla manualmente a través del servidor SQL.

3. Una vez creado el objeto, en esa misma ventana tenemos todas las propiedades del objeto.

Es altamente recomendable, tanto para el objeto como para la colección, rellenar la propiedad [Cadena descripción objeto] con campos que existan en la tabla usando los corchetes para separa el texto literal de los campos. Ejemplo: [IdBaja]-[IdEmpleado]-[FechaBaja]- Motivo: - [Descrip]

Ésta información se guarda en la tabla Objetos.

Ya tiene definido su Objeto. Mas adelante encontrará un ejemplo de cómo programar su clase en una librería.

Objetos del motor del sistemaObjeto ConexiónEs una de las clases administradoras del ERP, por lo cual es instanciada una sola vez. A través de este objeto tendremos acceso a las funciones más importantes. Haremos un resumen de las más usadas.A través de este objeto accederemos también a las propiedades de la conexión tales como Delegación, Usuario, etcétera.Funciones de consulta

BDAActual

Descripción: Retorna la base de datos actual. Parámetros: -

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 49

Page 51: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Retorno: Cadena.

BuscarPropiedad

Descripción: Retorna el valor de un campo especificado dada una consulta SQL.

Parámetros: Propiedad, instrucción SQL. Retorno: Variant.

Existe

Descripción: Consulta si un dato existe en la tabla. Parámetros: Campo, valor y la tabla donde queremos buscar, instrucción

WHERE opcional. Retorno: Verdadero/Falso.

DameCamposSelect

Descripción: Retorna un array de cadena con los valores de la consulta SQL, sólo el primer registro.

Parámetros: instrucción SQL, array con los campos. Retorno: Verdadero/Falso.

ExisteSqlObj

Descripción: Consulta un Objeto de SQL (tabla, campo, procedimiento, desencadenador, etc.).

Parámetros: Nombre de objeto SQL. Retorno: Verdadero/Falso.

DameValorCampo

Descripción: Retorna un Variant con el valor del campo especificado. Parámetros: instrucción SQL, Nombre del campo. Retorno: Variant.

Funciones de ejecución

Actualizavalorcampo

Descripción: Actualiza el valor de un campo dado en los registros especificados en la consulta SQL.

Parámetros: instrucción SQL, la propiedad a modificar, el valor nuevo. Retorno: Verdadero/Falso.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 50

Page 52: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

EjecutaStore

Descripción: Ejecuta un procedimiento almacenado en SQL Server. Parámetros: Nombre de la store y una lista de parámetros en una matriz. Retorno: Verdadero/Falso.

EjecutaStoreCol

Descripción: Ejecuta un procedimiento almacenado en SQL Server devolviendo en la Collection los valores OUTPUT del procedimiento.

Parámetros: Nombre de la store y una Collection con los parámetros. Retorno: Verdadero/Falso.

EjecutaStoreResult

Descripción: Ejecuta un procedimiento almacenado en SQL Server devolviendo en una Matriz los valores que retorna. Muy útil cuando el procedimiento retorna una consulta.

Parámetros: Nombre de la store y una lista de parámetros en una matriz. Retorno: Recordset de tipo IRecordset.

ExecuteSql

Descripción: Ejecuta cualquier instrucción SQL que le pasemos. Parámetros: Instrucción SQL, descripción de Error (opcional), número de

error (opcional), Retorno: Verdadero/Falso.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 51

Page 53: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

AhoraProceso

Descripción: Ejecuta un proceso Ahora_Proceso. Parámetros: Nombre del proceso, parámetro de retorno, array con los

parámetros que pide el proceso. Retorno: Valor que retorna el proceso.

BeginTrans/CommitTrans/ RollbackTrans

Descripción: Inicia, confirma o deshace la transacción.

Objeto OBJEl objeto OBJ es un objeto encargado de administrar todos los objetos del sistema. Contiene una colección con todos los objetos definidos (colección de objetos de tipo Objeto). Con él, podremos también definir objetos simplemente indicándole un nombre único y la tabla a la que hace referencia (objeto virtual).OBJ es un objeto de tipo Objetos.Se accede a él mediante el objeto Conexión: CONEXION.OBJ

Funciones más importantes

Add

Descripción: Añade un nuevo objeto a la colección y, además, comprueba si el objeto es de reciente creación y lo añade a la base de datos.

Parámetros: Nombre de la clase (opcional). Retorno: Objeto.

DameColeccion

Descripción: Busca en la colección los que cumplan la condición. Si no encuentra ninguno, devuelve Nothing.

Parámetros: Nombre de la colección de objetos, Condición (puede ser un SELECT o una cláusula WHERE)

Retorno: Objeto “Colecciones”.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 52

Page 54: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

DameObjStr

Descripción: Retorna una nueva instancia de un objeto. Parámetros: Clase. Retorno: Objeto.

DameObjeto

Descripción: Retorna un objeto. Parámetros: Nombre de la colección de objetos, Condición (puede ser un

SELECT o una cláusula WHERE), indicar si se aplican los filtros, indicar si se presenta la colección si se encuentra más de un objeto que cumpla la condición.

Retorno: Objeto.

AñadirObjeto

Descripción: Crea una nueva clase sin necesidad de definirla en la tabla Objetos. Se utiliza para manipular los registros de una tabla como si fueran objetos.

Parámetros: Nombre de Objeto (Clase), Indicar si es Colección, Tabla, Hijo Defecto.

Retorno: Objeto.

FormShow

Descripción: controla la apertura de un formulario. Parámetros: Formulario a mostrar, Formulario Propietario.

Objeto ColeccionesColecciones es una colección de Objetos. Su manejo es similar al objeto Collection de Visual Basic.

Funciones más importantes

Add

Descripción: Añade un nuevo objeto a la colección y además comprueba si el objeto es de reciente creación y lo añade a la base de datos.

Parámetros: Objeto. Retorno: Objeto.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 53

Page 55: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Remove

Descripción: Elimina un Objeto de la colección pero no de la base de datos.

Parámetros: Objeto.

Delete

Descripción: Elimina un Objeto de la colección y de base de datos. Parámetros: Objeto. Retorno: Verdadero/Falso.

Count

Descripción: Retorna el número de objetos de la colección. Parámetros: Retorno: Número.

Colección

Descripción: Retorna una colección de objetos. Parámetros: Retorno: Collection.

Suma

Descripción: Recorre la todos los objetos de la colección y suma los valores de una propiedad.

Parámetros: Propiedad. Retorno: Número.

Refresh

Descripción: Vuelve a cargar los objetos que componen la colección. Parámetros: - Retorno: Verdadero/Falso.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 54

Page 56: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Update

Descripción: Actualiza los objetos de la colección en base de datos. Parámetros: - Retorno: Verdadero/Falso.

BuscarObjeto

Descripción: busca un objeto en la colección. Parámetros: Nombre de la propiedad, valor de la propiedad. Retorno: Objeto.

Objeto IItemTodos los objetos que se instancian en la aplicación heredan del objeto IItem. IItem se encarga de manipular el objeto para que pueda actualizarse, guardarse en su tabla y borrarse.

Como Visual Basic no maneja el concepto de herencia, ésta se ha simulado mediante una interfaz. Al crear la nueva clase en su librería implemente IItem y defina los métodos y funciones de la interfaz. Diremos que todo objeto que se instancie será un IItem.

Si usted desea que un objeto se comporte de manera diferente a como lo establece esta interfaz, cambie el contenido de las funciones definidas.

Propiedades

Propiedades

Descripción: Nos devuelve el valor de un campo del objeto. Parámetros: nombre del campo. Retorno: Variant.

Descripcion

Descripción: Retorna la descripción del objeto, ésta se forma según lo indicado al definir la clase.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 55

Page 57: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Padre

Descripción: si el objeto es hijo de otro, nos retorna el objeto de nivel superior.

Retorno: Objeto.

Tabla

Descripción: Retorna la tabla del objeto. Retorno: Cadena.

Métodos

Show

Descripción: Llama al método carga del formulario especificado. Parámetros: Propietario, Ventana Nueva (T/F), Modal (T/F).

Refresh

Descripción: Vuelve a cargar el objeto desde la base de datos actualizando los controles vinculados.

Update

Descripción: Comprueba que el formulario se haya completado correctamente y guarda el objeto.

Parámetros: devuelve error (Verdadero/Falso). Retorno: Verdadero/Falso.

Delete

Descripción: Elimina el objeto. Retorno: Verdadero/Falso.

Ejemplo de creación de una nueva clase que implementa la interfaz IItem.

1. Crear nuestro objeto (frmObjPrueba) y colección (frmObjsPrueba) en el ADMON.

2. Crear en nuestra librería un módulo de clase llamado frmObjPrueba.3. Pegar el siguiente Código en el módulo.

Option Explicit

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 56

Page 58: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Option Base 0Option Compare Text

Implements CapturadorImplements IItem

Private pItem As IItem

''Capturador para entregar el padrePrivate WithEvents ContainerSubObject As Capturador

Public Function Add() As IItem Set Add = pItem.Add()End Function

Public Sub AsignaClaves(lacoleccion As Collection) pItem.AsignaClaves lacoleccionEnd Sub

Public Property Get Campos(Cual As String) As Object Set Campos = pItem.Campos(Cual)End Property

Private Function Capturador_EventRaise(EventName As String, aObj As Variant) As Variant Dim lCap As Capturador Dim lBreak As Boolean On Error GoTo Error_ Select Case EventName Case Else lBreak = False #If debugmode Or DebugCallback Then Debug.Print EventName #End If End Select On Error Resume Next Set lCap = Padre If Not lCap Is Nothing And Not lBreak Then Capturador_EventRaise = lCap.EventRaise(EventName, aObj) End If Set lCap = Nothing Salir_: Exit FunctionError_: gCn.Tr.Trace TError, TypeName(Me), " Capturador_EventRaise", , Error$ Resume Salir_ ResumeEnd Function

Private Function Capturador_GetContainer() As Object Set Capturador_GetContainer = ContainerSubObject.GetContainerEnd Function

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 57

Page 59: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Public Function CargaObjAdicionales(Cual As Integer, Optional Otros As Object) As Boolean CargaObjAdicionales = pItem.CargaObjAdicionales(Cual, Otros)End Function

Private Sub Class_Initialize() Set pItem = gCn.Obj.DameItem(TypeName(Me)) pItem.Modificado = False ValoresPredeterminados Set ContainerSubObject = gCn.GetContainerSubObject(pItem) End Sub

Private Sub Class_Terminate() Set ContainerSubObject = Nothing Set pItem = Nothing End Sub

Public Property Get ClassDebugID() As Long ClassDebugID = pItem.ClassDebugIDEnd Property

Public Property Get Clave() As Variant Clave = pItem.ClaveEnd Property

Public Property Get Claves() As Collection Set Claves = pItem.ClavesEnd Property

Private Sub ContainerSubObject_DamePadre(ContainerObject As Object) Set ContainerObject = MeEnd Sub

Public Sub Data(Padre As Capturador, Vpropiedades As Collection, Optional Nuevo As Variant) pItem.Data Padre, Vpropiedades, NuevoEnd Sub

Public Function Delete() As Boolean Delete = pItem.DeleteEnd Function

Public Property Get Descripcion() As String Descripcion = gCn.Obj.GeneraDescripcion(Me)End Property

Public Property Let Disponible(Valor As Boolean) pItem.Disponible = ValorEnd Property

Public Property Get Disponible() As Boolean Disponible = pItem.DisponibleEnd Property

Public Property Get Entorno() As ObEntorno

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 58

Page 60: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Set Entorno = pItem.EntornoEnd Property

Public Property Get EsColeccion() As Boolean EsColeccion = pItem.EsColeccionEnd Property

Public Function Estado() As Integer Estado = 1End Function

Private Function IItem_Add() As AhoraSistema.IItem Set IItem_Add = Add()End Function

Private Sub IItem_AsignaClaves(lacoleccion As Collection) AsignaClaves lacoleccionEnd Sub

Private Property Get IItem_Campos(Cual As String) As AhoraSistema.CampoClave Set IItem_Campos = Campos(Cual)End Property

Private Function IItem_CargaObjAdicionales(Cual As Integer, Optional Otros As Object) As Boolean IItem_CargaObjAdicionales = CargaObjAdicionales(Cual, Otros)End Function

Private Property Get IItem_ClassDebugID() As Long IItem_ClassDebugID = ClassDebugIDEnd Property

Private Property Get IItem_Clave() As String IItem_Clave = ClaveEnd Property

Private Property Get IItem_Claves() As Collection Set IItem_Claves = ClavesEnd Property

Private Sub IItem_Data(Padre As AhoraSistema.Capturador, Vpropiedades As Collection, Optional Nuevo As Variant) Data Padre, Vpropiedades, NuevoEnd Sub

Private Function IItem_Delete(Optional aVerbose As Boolean = True) As Boolean IItem_Delete = Delete()End Function

Private Property Get IItem_Descripcion() As String IItem_Descripcion = DescripcionEnd Property

Private Property Let IItem_Disponible(RHS As Boolean) Disponible = RHSEnd Property

Private Property Get IItem_Disponible() As Boolean IItem_Disponible = Disponible

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 59

Page 61: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

End Property

Private Property Get IItem_Entorno() As AhoraSistema.ObEntorno Set IItem_Entorno = EntornoEnd Property

Private Property Get IItem_EsColeccion() As Boolean IItem_EsColeccion = EsColeccionEnd Property

Private Function IItem_Estado() As Integer IItem_Estado = EstadoEnd Function

Private Property Get IItem_Eventos() As AhoraSistema.IItem_Events Set IItem_Eventos = pItem.EventosEnd Property

Private Property Get IItem_Form() As Object ''Set IItem_Form = Pantalla Set IItem_Form = pItem.FormEnd Property

Private Sub IItem_Imprimir() ImprimirEnd Sub

Private Sub IItem_Menu() MenuEnd Sub

Private Property Let IItem_Modificado(RHS As Boolean) Modificado = RHSEnd Property

Private Property Get IItem_Modificado() As Boolean IItem_Modificado = ModificadoEnd Property

Private Property Let IItem_Nuevo(RHS As Boolean) Nuevo = RHSEnd Property

Private Property Get IItem_Nuevo() As Boolean IItem_Nuevo = NuevoEnd Property

Private Property Get IItem_Objeto() As Object Set IItem_Objeto = MeEnd Property

Private Property Get IItem_Objetos() As Collection Set IItem_Objetos = ObjetosEnd Property

Private Property Let IItem_ObjetosDisp(RHS As Boolean) pItem.ObjetosDisp = RHSEnd Property

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 60

Page 62: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Private Property Get IItem_ObjetosDisp() As Boolean IItem_ObjetosDisp = pItem.ObjetosDispEnd Property

Private Property Get IItem_OtrasPropiedades() As Collection Set IItem_OtrasPropiedades = pItem.OtrasPropiedadesEnd Property

Private Property Let IItem_Padre(RHS As Object) Padre = RHSEnd Property

Private Property Get IItem_Padre() As Object Set IItem_Padre = PadreEnd Property

Private Property Let IItem_Propiedades(Cual As String, RHS As Variant) Propiedades(Cual) = RHSEnd Property

Private Property Get IItem_Propiedades(Cual As String) As Variant IItem_Propiedades = Propiedades(Cual)End Property

Private Sub IItem_Refresh(Optional pantallaIgnorarErr As Boolean = True) Refresh pantallaIgnorarErrEnd Sub

Private Sub IItem_Show(Optional Propietario As Object, Optional ventanaNueva As Boolean = False, Optional aModal As Boolean = False) Show Propietario, ventanaNueva, aModalEnd Sub

Private Property Get IItem_SQL() As String IItem_SQL = sqlEnd Property

Private Property Get IItem_Tabla() As String IItem_Tabla = TablaEnd Property

Private Property Get IItem_TablaOtra() As String IItem_TablaOtra = pItem.TablaOtraEnd Property

Private Property Let IItem_Tipo(RHS As String) pItem.Tipo = RHSEnd Property

Private Property Get IItem_Tipo() As String IItem_Tipo = TipoEnd Property

Private Property Let IItem_UltimoNivel(RHS As Boolean) pItem.UltimoNivel = RHSEnd Property

Private Property Get IItem_UltimoNivel() As Boolean IItem_UltimoNivel = UltimoNivel

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 61

Page 63: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

End Property

Private Function IItem_Update(Optional PantallaError As Boolean = False, Optional refrescar As Boolean = True) As Boolean IItem_Update = Update(PantallaError, refrescar)End Function

Public Sub Imprimir() pItem.Entorno.Imprimir MeEnd Sub

Property Get Item() As AhoraSistema.IItem Set Item = MeEnd Property

Public Sub Menu() pItem.Entorno.VerMenu Me, "mnuObjeto"End Sub

Public Property Get Modificado() As Boolean Modificado = pItem.ModificadoEnd Property

Public Property Let Modificado(Estado As Boolean) pItem.Modificado = EstadoEnd Property

Public Property Get Nuevo() As Boolean Nuevo = pItem.NuevoEnd Property

Public Property Let Nuevo(Estado As Boolean) pItem.Nuevo = EstadoEnd Property

Public Property Get Objetos() As Object Set Objetos = pItem.ObjetosEnd Property

Public Function OtrasPropiedades() As Collection Set OtrasPropiedades = pItem.OtrasPropiedadesEnd Function

Public Property Let Padre(miPadre As Object) pItem.Padre = miPadreEnd Property

Public Property Get Padre() As Object Set Padre = pItem.PadreEnd Property

Public Property Get Propiedades(Cual As String) As Variant Propiedades = pItem.Propiedades(Cual)End Property

Public Property Let Propiedades(Cual As String, Valor As Variant) pItem.Propiedades(Cual) = ValorEnd Property

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 62

Page 64: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Public Sub Refresh(Optional pantallaIgnorarErr As Boolean = True) pItem.Refresh pantallaIgnorarErrEnd Sub

Public Sub Show(Optional Propietario As Object, Optional ventanaNueva As Boolean = False, Optional aModal As Boolean = False) ''Dim lFrm As Form ''Set lFrm = Propietario pItem.Show Propietario, ventanaNueva, aModalEnd Sub

Public Property Get sql() As String sql = pItem.sqlEnd Property

Public Property Get Tabla() As String Tabla = pItem.TablaEnd Property

Property Get Tipo() As String Tipo = TypeName(Me)End Property

Public Property Get UltimoNivel() As Boolean UltimoNivel = pItem.UltimoNivelEnd Property

Public Function Update(Optional PantallaError As Boolean = False, Optional refrescar As Boolean = True) As Boolean Update = pItem.Update(PantallaError, refrescar)End Function

Private Sub ValoresPredeterminados() '' Poner valores por defecto aquíEnd Sub

Manejo de objetosHemos visto cómo definir una nueva clase. A continuación veremos algún ejemplo de cómo instanciar un objeto de una clase, modificar sus propiedades, guardarlo, eliminarlo, etc.

Nuestro ejemplo será la clase Pedido.

Repasando lo visto anteriormente sabemos que:

Tenemos definida una clase Pedido y su colección Pedidos. Un pedido contiene Líneas de pedido, así que estará definida la clase

Pedido_Linea y Pedidos_Lineas. Definiremos también la relación PedidoPedidos_Lineas, con lo cual

sabemos que un pedido contiene una colección de líneas de pedido. La tabla donde se guardarán los pedidos se llama Pedidos_Cli_Cabecera y

algunos de sus campos son (IdPedido, IdEmpresa, SeriePedido, Fecha, IdCliente, etc.)

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 63

Page 65: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

La tabla donde se guardarán las líneas de pedido se llama Pedidos_Cli_Lineas y algunos de sus campos son (IdPedido, IdLinea, IdArticulo, Cantidad, Precio, etc.)

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 64

Page 66: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Instanciar un nuevo objeto y completar sus propiedades.

Imaginemos que queremos crear un nuevo pedido de la serie 8, ponerle la fecha de hoy, asignarle el cliente 0012, guardarlo y mostrarlo.

Observe que el objeto contiene una colección de propiedades, que son exactamente las mismas que la tabla del objeto.

Nos referiremos al objeto conexión como GCN.

Public Sub CrearObjPedido () On Error GoTo Error_ Dim lPedido As IItem Set lPedido = gCn.Obj.DameObjStr("Pedido")'Creamos el nuevo objeto Pedido 'Asignación de propiedades del objeto lPedido.Propiedades("SeriePedido") = 8 lPedido.Propiedades("Fecha") = Date lPedido.Propiedades("IdCliente") = "00012" If lPedido.Update Then 'se guarda el objeto en la tabla 'mostramos el objeto – se abre el formulario que tenga definido. lPedido.Show End IfEnd_: Exit SubError_: gCn.Tr.Trace TError, TypeName(Me), " CrearObjPedido", , Err.Description Resume End_ End Sub

En algunos objetos como el pedido no es necesario asignarle la clave (IdPedido) porque lo tiene programado en el objeto. Otros, en cambio, no se podrían actualizar si no se les asigna los campos obligatorios.

El evento SHOW del objeto buscará en la librería el formulario indicado al definir la clase (tabla Objetos) y ejecutará la función Carga() del formulario.

Recuperar un objeto existente y agregarle un hijo.Recuperaremos un objeto pedido cuyo IdPedido = 10101 y le agregaremos una línea de pedido.Cuando un objeto contiene otros, accedemos a ellos mediante su colección “objetos”. Por ejemplo: MiObjeto.Objetos(“nombreColección”)

Public Sub CrearObjPedidoConLineas () On Error GoTo Error_ Dim lPedido As IItem Dim lLinea As IItem

'Obtengo el objeto pedido Set lPedido = gCn.Obj.DameObjeto("Pedidos", "WHERE IdPedido = 10101")

'A la colección del pedido (lPedido.Objetos("Pedido_Lineas"))le agrego una nueva línea Set lLinea = lPedido.Objetos("Pedido_Lineas").Add 'Asignación de propiedades de la línea

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 65

Page 67: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

With lLinea .Propiedades("IdArticulo") = "010014" .Propiedades("Cantidad") = 5 .Propiedades("Precio_Euro") = 10 .Update End With If lPedido.Update Then lPedido.Show End IfEnd_: Exit SubError_: gCn.Tr.Trace TError, TypeName(Me), " CrearObjPedidoClin", , Err.Description Resume End_ End Sub

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 66

Page 68: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

CONTROLES AHORA

IntroducciónPara trabajar con los controles personalizados de AHORA (ahoraocx.ocx) en modo de diseño, necesita tener instaladas las herramientas de desarrollo mencionadas al inicio del manual. La mayoría de nuestros controles se pueden vincular directamente al objeto, teniendo en cuenta las opciones de seguridad y facilitando la actualización de los mismos en la base de datos. A continuación detallaremos las propiedades, eventos y métodos más importantes.

Control EnlaceObjetosAdemás de proveer, a modo gráfico, de una barra de título, tiene la capacidad de controlar un objeto. Le podemos vincular un objeto además de otros controles, de modo que, cuando actualicemos un campo en el formulario que esté relacionado con el objeto que contiene, actualizará directamente al objeto.

Existen 2 maneras de trabajar con este control: Modo título.El control es utilizado sólo para establecer un título o cabecera del formulario. Se emplea a menudo para formularios de mantenimiento directo de tablas o formularios de búsqueda.

Modo Objeto.El control es vinculado a un objeto y los demás controles que completan el formulario también. Se pueden establecer 2 tipos de vínculos:

o Síncrono : Cuando actualizamos un campo vinculado actualiza la propiedad el objeto que contiene.

o Asíncrono : Cuando actualizamos un campo vinculado no actualiza el objeto, sino que lo hace cuando se le dé la instrucción.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 67

Page 69: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

PropiedadesCaption

Descripción: Texto que aparecerá en pantalla. Si está vinculado a un objeto mostrará su descripción.

Tipo: Texto.

Icono

Descripción: Imagen que mostrará. Debe activarse la propiedad MuestraIcono. Si está vinculado a un objeto, automáticamente mostrará el ícono del objeto.

Tipo: StdPicture.

MuestraIcono

Descripción: Permite que se vea la imagen cargada. Tipo: Verdadero/Falso.

ObjGlobal

Descripción: Objeto que le vinculamos. Tipo: Objeto.

Sincrono

Descripción: Está activado por defecto. Permite que cuando se actualiza un control vinculado se actualice inmediatamente la propiedad del objeto.

Tipo: Verdadero/Falso.

Métodos y funciones.

Carga

Descripción: vincula el objeto al control. Parámetros: Objeto. Retorno: Verdadero/Falso.

Refresh

Descripción: Vuelve a cargar el objeto desde la base de datos actualizando los controles vinculados.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 68

Page 70: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Control: EnlaceObjeto Nombre: EObjeto

Control: TextoUsuario Nombre: FechaObjeto Origen: EObjetoPropiedad Objeto Origen: FechaTipo Dato: DateFormato: FechaCortaControl: cntBotonera

Nombre: Botonera

Actualiza

Descripción: Comprueba que el formulario se haya completado correctamente y guarda el objeto.

Parámetros: Devuelve error (Verdadero/Falso). Retorno: Verdadero/Falso.

Remove

Descripción: Elimina el objeto vinculado. Parámetros: Cerrar el formulario (True/False), crear objeto nuevo (T/F) Retorno: Verdadero/Falso.

Clear

Descripción: Borra el contenido de los controles enlazados. Parámetros: Actualiza objeto (Verdadero/Falso.)

Ejemplo de cómo vincular un objeto al control EnlaceObjetoVincularemos un pedido al formulario que tendrá un control EnlaceObjeto y un control TextoUsuario.Cuando cargue el formulario, recibirá un objeto Pedido y el mismo mostrará la propiedad Fecha del objeto.

Las propiedades de los controles las podemos definir por código (en tiempo de ejecución) o haciendo clic derecho en el control – Propiedades –

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 69

Page 71: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Una vez establecidas las propiedades de los controles iremos al código del formulario.En el método carga del formulario enlazaremos el objeto al control, y el resto lo hará automáticamente.

Option ExplicitOption Compare Text

Private Const cModuleName = "frmControlesObjeto"

Public Function Carga(elObjeto As IItem, Optional aPropietario As Object) As BooleanOn Error GoTo Error_ Hourglass True Load Me With EObjeto If Not .ObjGlobal Is Nothing Then If .Modificado Then If Not .Actualiza Then Carga = False GoTo End_ End If End If End If If Not elObjeto Is Nothing Then If .Carga(elObjeto) Then MsgBox "El objeto está cargado!" End If End If End With If aPropietario Is Nothing Then Set aPropietario = gCn.Sesion.MainForm End If gCn.Obj.FormShow Carga = TrueEnd_: Hourglass False Exit Function

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 70

Page 72: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Error_: gCn.Tr.Trace TError, cModuleName, " Carga", , Err.Description Carga = False Resume End_End Function

En el evento LOAD del formulario inicializaremos la botonera.

Private Sub Form_Load()On Error GoTo Error_ botonera.SeguridadObjeto = eMenuGuardar botonera.BotonesMantenimiento = eBotMant_Cerrar botonera.HabilitaBotonesEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " Form_Load", , Err.Description Resume End_End Sub

Cuando guardemos se actualizará el objeto de acuerdo con lo que hayamos modificado.Private Sub Botonera_ToolClicked(aTool As AhoraOCX.AhoraTool)On Error Resume Next Select Case aTool.Name Case cBotMant_Guardar If EObjeto.Actualiza(True) Then MsgBox "Objeto guardado con éxito", vbInformation, "Guardado" End If Case cBotMant_Cerrar Unload Me End SelectEnd Sub

Control TextoUsuarioEste control contiene una caja de texto unida a una etiqueta. De manera que, en un solo control, tendremos la opción de poner la caja de texto con su etiqueta. También, como vimos en el ejemplo anterior, el control es enlazable a EnlaceObjeto.

Al control le podremos indicar qué tipo de dato albergará y cómo debe mostrarlo, de modo que con él nos ahorraremos validaciones de formato. Si indicamos que el control es de tipo fecha, automáticamente mostrará un calendario para que el usuario seleccione la fecha cómodamente.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 71

Page 73: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

PropiedadesObjOrigen

Descripción: Indica el nombre del control EnlaceObjeto asignado. Tipo: Texto.

ObjPOrigen

Descripción: Es la propiedad del objeto (Ej. IdCliente, Nombre, Descripción, etc.).

Tipo: texto.

Necesario

Descripción: Indica que es necesario que se rellene. Tipo: Verdadero/Falso.

TipoDato

Descripción: Numérico, moneda, Date, String o NIF. Tipo: String.

Formato

Descripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos los decimales, si es fecha seleccionaremos si es fecha corta, etc.

Tipo: String.

CaptionVisible

Descripción: Indica si queremos visualizar la etiqueta del control. Tipo: Verdadero/Falso.

CaptionWidth

Descripción: Indicaremos el ancho de la etiqueta. Tipo: Número.

CaptionPosition

Descripción: Indicaremos la orientación de la etiqueta. Tipo: Número

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 72

Page 74: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

CaptionControl

Descripción: Pondremos el texto que queremos que aparezca en la etiqueta.

Tipo: Texto.

CaptionLink

Descripción: indicamos si queremos que la etiqueta se comporte como un enlace, al hacerle clic llamará al evento Caption_Click.

Tipo: Verdadero/Falso.

Eventos.Además de los eventos que suelen tener las cajas de texto, este control incorpora: Caption_Click: se dispara cuando hacemos clic en el label del control. AfterUpdate: se dispara después de modificar el dato contenido. BeforeUpdate: se dispara antes que se modifique el dato contenido.

Control TextoMultilinea.Es como el control TextoMultiusuario con la característica de ser multilínea.Se utiliza para los campos de descripción extensos.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 73

Page 75: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Control LabelUsuarioAdemás de comportarse como un control label normal, incorpora la propiedad Caption_Link que si está a TRUE simula un link, respondiendo al evento Caption_Click en el momento que el usuario hace clic en él.

Propiedades

CaptionLink

Descripción: indicamos si queremos que la etiqueta se comporte como un enlace, al hacerle clic llamará al evento Caption_Click.

Tipo: Verdadero/Falso.

EventosAdemás de los eventos que suelen tener las cajas de texto, este control incorpora: Caption_Click: se dispara cuando hacemos clic en el label del control.

Control BotoneraEl control dibuja una barra con botones. Los botones son objetos de tipo AhoraTool.

Tiene dos grupos de botones predefinidos: botones SeguridadObjeto (Guardar, Nuevo, Eliminar, Imprimir y Asociados) y botones Mantenimiento (Aceptar, Cancelar, Cerrar). Si no ponemos ninguna instrucción a la botonera, ésta cargará por defecto todos los botones. También tenemos la opción de agregar manualmente los botones, en tiempo de ejecución mediante la función Add.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 74

Page 76: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Propiedades

SeguridadObjeto

Son los botones que suelen usar en los formularios de objetos.

Descripción: Indicamos qué botón o botones del grupo SeguridadObjeto queremos mostrar.

Tipo: Entero. El orden es el siguiente:

- eMenuNinguno = 0- eMenuVer = 1- eMenuVer2 = 2- eMenuRefrescar = 4- eMenuAñadir = 8- eMenuBorrar = 16- eMenuImprimir = 32- eMenuEnviar = 64- eMenuGuardar = 128- eMenusTodos = eMenuVer + eMenuVer2 + eMenuRefrescar +

eMenuAñadir + eMenuBorrar + eMenuImprimir + eMenuEnviar + eMenuGuardar

BotonesMantenimiento

Son botones que suelen enseñar en formularios de mantenimiento de tabla.

Descripción: Indicamos qué botón o botones del grupo BotonesMantenimiento queremos mostrar.

Tipo: Entero. El orden es el siguiente:

- eBotMant_Ninguno = 0- eBotMant_Aceptar = 1- eBotMant_Cancelar = 2- eBotMant_AceptarCancelar = eBotMant_Aceptar +

eBotMant_Cancelar- eBotMant_Cerrar = 4- eBotMant_AceptarCerrar = eBotMant_Aceptar + eBotMant_Cerrar- eBotMant_CancelarCerrar = eBotMant_Cancelar + eBotMant_Cerrar- eBotMant_AceptarCancelarCerrar = eBotMant_Aceptar +

eBotMant_Cancelar + eBotMant_Cerrar

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 75

Page 77: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Resize

Descripción: Indica que el control se ajustará a la pantalla automáticamente (ver ejemplo).

Tipo: Verdadero/Falso

MetodoObjeto

Descripción: Es la manera que tenemos para indicarle al control cómo referenciar al objeto. Por ejemplo, si tenemos un control EnlaceObjeto llamado EObjeto le indicamos cómo llegar al objeto: “EObjeto.ObjGlobal”. De ésta manera la Botonera podrá habilitar/deshabilitar los botones según el estado del objeto.

Tipo: STRING.

Eventos ToolClicked(aTool As AhoraOCX.AhoraTool): se dispara cuando hacemos

clic en un botón de la botonera. El evento nos retorna el objeto botón al que le hicieron clic.

Métodos y funciones.

BotonAdd

Descripción: Agrega un botón a la botonera. Parámetros: Caption del Botón, Id (String), Tipo de botón, Nuevo Grupo. Retorno: Retorna el objeto AhoraTool creado. Los tipos de botones son:

- eTipo_Menu_Boton- eTipo_Menu_Check- eTipo_Menu_Combo- eTipo_Menu_Edit- eTipo_Menu_Menu

Si se le indica NuevoGrupo pondrá una línea divisoria que separará el botón de los anteriores.

ColTools

Descripción: Es la colección con los botones

HabilitaBotones

Descripción: Habilita los botones. Si tiene un objeto vinculado habilitará los botones de acuerdo a la seguridad que tenga asignada o al estado del

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 76

Page 78: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

objeto. La botonera sabe cuál es el objeto vinculado de acuerdo a la propiedad MetodoObjeto.

Retorno: Verdadero/Falso.

Boton

Descripción: nos retorna un botón de la botonera. Parámetros: Id del botón (string). Retorno: AhoraTool.Ejemplo de agregar un botón de tipo Combo:Private Sub Form_Load()On Error GoTo Error_ Botonera.BotonAdd "Cambiar Descuentos", "botCambiarDtos", , eTipo_Menu_Combo, True, eicoahora Botonera.BotonAdd "Cambiar Dto. &1", "botDescuento1", "botCambiarDtos", eTipo_Menu_Boton, True, eicoahora Botonera.BotonAdd "Cambiar Dto. &2", "botDescuento2", "botCambiarDtos", eTipo_Menu_Boton, , eicoahora

End_: Exit SubError_ gCn.Tr.Trace TError, cModuleName, " Form_Load", , Err.Description Resume End_End Sub

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 77

Page 79: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Control CheckBoxUserEste control se comporta como un check box convencional, con la ventaja de que se puede vincular a un objeto mediante el control EnlaceObjetos. También se puede acceder a sus propiedades especiales haciendo Clic derecho Propiedades.

Propiedades

ObjOrigen

Descripción: Indica el nombre del control EnlaceObjeto asignado. Tipo: Texto.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 78

Page 80: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

ObjPOrigen

Descripción: Es la propiedad del objeto (Ej. IdCliente, Nombre, Descripción, etc.).

Tipo: texto.

TipoDato

Descripción: Numérico, moneda, Date, String o NIF. Tipo: String.

CaptionVisible

Descripción: Indica si queremos visualizar la etiqueta del control. Tipo: Verdadero/Falso.

CaptionWidth

Descripción: Indicaremos el ancho de la etiqueta. Tipo: Número.

CaptionPosition

Descripción: Indicaremos la orientación de la etiqueta. Tipo: Número

CaptionControl

Descripción: Pondremos el texto que queremos que aparezca en la etiqueta.

Tipo: Texto.

Eventos. Contiene los eventos convencionales de este tipo de controles, como el

Click, KeyPress, etc.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 79

Page 81: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Control cntMenuFormulario.Control de menús del formulario. Se le pueden agregar botones de menú de forma manual (en tiempo de ejecución) o de forma estática (en la tabla Ahora_Menus).

Este control tiene la particularidad de cargar sus botones de acuerdo a los registros establecidos en la tabla Ahora_Menus. La mejor manera de manejar los menús es insertándolos en la tabla, ya que de ésta manera incrementamos la seguridad de acceso a las funciones del formulario. El control sólo permitirá la visualización de los botones del menú a los usuarios que lo tengan permitido. Desde el Admon podremos asignar la seguridad a los menús de los formularios.

Un ítem del menú puede tener asociado un Ahora_Proceso para ejecutarlo. De manera que, haciendo clic en el menú, se pueden ejecutar procesos de tipo Macro. Esto también se configura por tabla.

El funcionamiento de los menús es similar a los de un árbol con sus nodos. Cuando agregamos un botón (ítem) al menú debemos especificar cuál es su padre (cabecera o raíz). Si no se especifica lo tomará como cabecera del menú.

Ejemplo: Archivo (padre) – Salir (hijo) | Edición (Padre) – Copiar (Hijo) – Pegar (Hijo).

Recuerde que también puede crear los menús del formulario desde el ADMON.

Propiedades

ActivarScripts

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 80

Page 82: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Descripción: Activa/Desactiva la ejecución de scripts de los ítems del menú.

Tipo: True/False.

Eventos ToolClick(aTool As AhoraOCX.AhoraTool): se dispara cuando hacemos clic

en un botón del menú. El evento nos retorna el objeto botón al que le hicieron clic.

Métodos y funciones.

MenuItemAdd

Descripción: Agrega un botón al menú. Parámetros: Caption del Botón, Id (String), Tipo de botón, Padre (de qué

menú cuelga el botón si no se especifica se entiende que es Padre), Nuevo Grupo (línea separadora), ResId (idIcono), Before (si queremos colocarlo antes de otro botón especificamos el nombre del botón).

Retorno: Retorna el objeto AhoraTool creado. Los tipos de botones son:

- eTipo_Menu_Boton (Botón convencional)- eTipo_Menu_Check (botón de tipo check)- eTipo_Menu_Combo (sólo para el control Botonera)- eTipo_Menu_Edit (Botón con caja de texto para edición)- eTipo_Menu_Menu (Botón de tipo menú de cabecera)

Si se le indica NuevoGrupo pondrá una línea divisoria que separará el botón de los anteriores.

Ready

Descripción: (TRUE/FALSE) activa el control y lo muestra.

AñadeAcelerador

Descripción: Asigna una tecla rápida a un elemento del menú (las teclas están definidas en la tabla Ahora_Menus_teclas).

Tools

Descripción: Retorna una colección de objetos AhoraTools.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 81

Page 83: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

MenuFormulario()

Descripción: Si queremos que se carguen los menús desde tablas, le especificaremos los parámetros al control.

Parámetros: Librería (String), Nombre del Formulario (String)

Ejemplo: Agregar menús desde formulario.1. Siguiendo con el ejemplo, agregue a frmControles.frm un control

cntMenuFormulario y llámelo MenuMain.2. Pegue el código.

Private Sub Form_Load()On Error GoTo Error_ With Me.MenuMain‘ -creamos el menú Archivo .MenuItemAdd "Archivo", "mnuArchivo", "", eTipo_Menu_Menu .MenuItemAdd "Cerrar", "mnuCerrar", "mnuArchivo", eTipo_Menu_Boton, , , eIcoCerrar .MenuItemAdd "Mensaje", "mnuMensaje", "mnuArchivo", eTipo_Menu_Boton, , , eIcoAviso‘ -creamos el menú Ver .MenuItemAdd "Ver", "mnuVer", "", eTipo_Menu_Menu .MenuItemAdd "Cliente", "mnuVerCli", "mnuVer", eTipo_Menu_Boton, , , eIcoCliente .MenuItemAdd "Contacto", "menuVerContacto", "mnuVer", eTipo_Menu_Boton, , , eIcoContacto‘ -Deshabilitamos el botón. .Tools("menuVerContacto").Enabled = False ‘ -Activamos la barra de menús .Ready = True End WithEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " Form_Load", , Err.Description Resume End_End Sub

‘-Programamos el evento clickPrivate Sub MenuMain_ToolClick(aTool As AhoraOCX.AhoraTool) Select Case aTool.Name Case "mnuMensaje"

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 82

Page 84: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

MsgBox "¡HOLA!" Case "mnuCerrar" Unload Me End SelectEnd Sub

Ejemplo: Agregar menús desde tablasCrearemos un menú de cabecera llamado mnuArchivo y un submenú mnuCerrar que cierre la pantalla.

1. Siguiendo con el ejemplo, agregue a frmControles.frm un control cntMenuFormulario y llámelo MenuMain.

2. Ejecute el script de inserción de menús.3. En el formulario borre todo lo referente al menú y pegue el código

Visual Basic, en el evento LOAD o en el Carga.

Script de inserción en tablas de menú. Crea Menú “Archivo” y un submenú “Cerrar”.--***************************************************************--Menú ArchivoDECLARE @Libreria varchar(50)DECLARE @Formulario varchar(50)DECLARE @Orden INTDECLARE @Tipo INTDECLARE @Nombre Varchar(50)DECLARE @NomControlMenu Varchar(50)DECLARE @Caption Varchar(50)DECLARE @Padre Varchar(50)SET @Libreria = 'PlantillaExterno'SET @Formulario = 'frmControles'SET @NomControlMenu = 'MenuMain'SET @Nombre = 'mnuArchivo'SET @Tipo = 1 --Menu_MenuSET @Caption = '&Archivo'

--El orden nos indica la posición en el menú.SELECT @Orden = ISNULL(MAX(Orden),0) + 1 FROM Ahora_menus WHERE Libreria = @Libreria AND Formulario = @Formulario if exists (select * from ahora_menus where formulario = @Formulario and libreria = @Libreria and nombre = @Nombre)BEGIN

print 'ya existe ' + @Nombreend else begin

INSERT INTO Ahora_Menus

(Libreria,Formulario,Nombre,Tipo,IniciaGrupo,MenuPadre,Orden,Caption,Checked,[Enabled],Visible,Icono,Categoria,Sistema,OrdenBotonera,SeparadorBotonera,Estandar)

VALUES

(@Libreria,@Formulario,@Nombre,@Tipo,0,@Padre,@Orden,@Caption,0,1,1,NULL,'Externo',1,0,0,1)endGO

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 83

Page 85: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

--CERRARDECLARE @Libreria varchar(50)DECLARE @Formulario varchar(50)DECLARE @Orden INTDECLARE @Tipo INTDECLARE @Icono INTDECLARE @Nombre Varchar(50)DECLARE @NomControlMenu Varchar(50)DECLARE @Caption Varchar(50)DECLARE @Padre Varchar(50)SET @Libreria = 'PlantillaExterno'SET @Formulario = 'frmControles'SET @NomControlMenu = 'MenuMain'SET @Nombre = 'mnuCerrar'SET @Padre = 'mnuArchivo'SET @Tipo = 0 --Menu_BotonSET @Caption = '&Cerrar'SET @Icono = 1031

--El orden nos indica la posición en el menú.SELECT @Orden = ISNULL(MAX(Orden),0) + 1 FROM Ahora_menus WHERE Libreria = @Libreria AND Formulario = @Formulario if exists (select * from ahora_menus where formulario = @Formulario and libreria = @Libreria and nombre = @Nombre)BEGIN

print 'ya existe ' + @Nombreend else begin

INSERT INTO Ahora_Menus

(Libreria,Formulario,Nombre,Tipo,IniciaGrupo,MenuPadre,Orden,Caption,Checked,[Enabled],Visible,Icono,Categoria,Sistema,OrdenBotonera,SeparadorBotonera,Estandar)

VALUES

(@Libreria,@Formulario,@Nombre,@Tipo,0,@Padre,@Orden,@Caption,0,1,1,@Icono,'Externo',1,0,0,1)endGO--***************************************************************

En el formulario pegue el siguiente código.Private Sub Form_Load()On Error GoTo Error_ Me.MenuMain.MenuFormulario "PlantillaExterno", Me.Name Me.MenuMain.Ready = TrueEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " Form_Load", , Err.Description Resume End_End Sub

Private Sub MenuMain_ToolClick(aTool As AhoraOCX.AhoraTool) Select Case aTool.Name Case "mnuCerrar" Unload Me End Select

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 84

Page 86: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

End Sub

Recuerde que puede combinar la forma de insertar los ítems del menú por tablas y por código, pero si su intención es que el acceso a los menús tenga un control de seguridad, utilice siempre la inserción por tablas.

Para crear menús y/o asignarles seguridad de una manera fácil hágalo desde el ADMON. [Ver manual de ADMON]

Control ComboUsuarioMultEste control nos permite crear uno o varios combos vinculados pasándole solamente una consulta. La lista desplegable puede tener un máximo de tres columnas. Además, se puede vincular con un objeto a través del control EObjeto.

Para ver un ejemplo del control y su funcionamiento diríjase al ejemplo de función carga combo en este mismo manual.

Propiedades

ObjOrigen

Descripción: Indica el nombre del control EnlaceObjeto asignado. Tipo: Texto.

ObjPOrigen

Descripción: Es la propiedad del objeto (Ej. IdCliente, Nombre, Descripción, etc.).

Tipo: Texto.

Necesario

Descripción: Indica que es necesario que se rellene. Tipo: Verdadero/Falso.

TipoDato

Descripción: Numérico, Moneda, Date, String o NIF. Tipo: String.

Formato

Descripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 85

Page 87: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

los decimales, si es fecha seleccionaremos el formato (si es fecha corta…), etc.

Tipo: String.

CaptionVisible

Descripción: Indica si queremos visualizar la etiqueta del control. Tipo: Verdadero/Falso.

CaptionWidth

Descripción: Indicaremos el ancho de la etiqueta. Tipo: Número.

CaptionPosition

Descripción: Indicaremos la orientación de la etiqueta. Tipo: Número

CaptionControl

Descripción: Pondremos el texto que queremos que aparezca en la etiqueta.

Tipo: Texto.

CaptionLink

Descripción: Indicamos si queremos que la etiqueta se comporte como un enlace, al hacerle clic llamará al evento Caption_Click.

Tipo: Verdadero/Falso.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 86

Page 88: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Eventos.Además de los eventos que suelen tener las listas de este tipo, este control incorpora:

Caption_Click: Se dispara cuando hacemos clic en el label del control. AfterUpdate: Se dispara después de modificar el dato contenido. BeforeUpdate: Se dispara antes que se modifique el dato contenido.

Control ComboUsuarioMuy similar al anterior, pero con la desventaja de que es un solo control. No permite crear un conjunto de combos anidados. La lista desplegable puede tener un máximo de tres columnas. Además, se le puede vincular un objeto a través del control EObjeto.

La consulta que toma como origen de datos de la lista se especifica en la propiedad Descripcion

Propiedades

ObjOrigen

Descripción: Indica el nombre del control EnlaceObjeto asignado. Tipo: Texto.

ObjPOrigen

Descripción: Es la propiedad del objeto (Ej. IdCliente, Nombre, Descripción, etc.).

Tipo: Texto.

Necesario

Descripción: Indica que es necesario que se rellene. Tipo: Verdadero/Falso.

TipoDato

Descripción: Numérico, Moneda, Date, String o NIF. Tipo: String.

Formato

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 87

Page 89: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Descripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos los decimales, si es fecha seleccionaremos si es fecha corta, etcétera.

Tipo: String.

CaptionVisible

Descripción: Indica si queremos visualizar la etiqueta del control. Tipo: Verdadero/Falso.

CaptionWidth

Descripción: Indicaremos el ancho de la etiqueta. Tipo: Número.

CaptionPosition

Descripción: Indicaremos la orientación de la etiqueta. Tipo: Número

CaptionControl

Descripción: Pondremos el texto que queremos que aparezca en la etiqueta.

Tipo: Texto.

CaptionLink

Descripción: Indicamos si queremos que la etiqueta se comporte como un enlace, al hacerle clic llamará al evento Caption_Click.

Tipo: Verdadero/Falso.

Descripcion

Descripción: indicamos el origen de datos (una consulta SQL con las columnas que queremos mostrar). LA PRIMERA COLUMNA DE LA CONSULTA ES LA QUE SE VISUALIZARÁ EN EL CONTROL.

Tipo: String.

C1Anchura

Descripción: Indicamos el ancho de la columna 1. Tipo: Número.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 88

Page 90: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

C1Nombre

Descripción: Indicamos el nombre de la columna 1 que debe coincidir con el campo 1 de la consulta.

Tipo: String.

C1TipoDato

Descripción: Indica el tipo de datos de la columna. Tipo: Número.

LAS ÚLTIMAS 3 PROPIEDADES SE REPITEN PARA LAS COLUMNAS 2 Y 3. LA PRIMERA COLUMNA DEFINIDA ES LA QUE SE VISUALIZARÁ EN EL CONTROL.

CActiva

Descripción: Indica el número de columna que será tomada como principal. Puede visualizarse el dato de la columna 2, pero el dato de la primera columna es el que se capture en la propiedad Text del control.

Tipo: Número (1,2 ó 3).

Inicializa

Descripción: A través de ésta propiedad le indicamos en qué fila debe posicionarse, le asignamos un valor de la columna CActiva.

Tipo: Variant.

EventosAdemás de los eventos que suelen tener las listas de este tipo, este control incorpora:

Caption_Click: Se dispara cuando hacemos clic en el label del control. AfterUpdate: Se dispara después de modificar el dato contenido. BeforeUpdate: Se dispara antes que se modifique el dato contenido.

Ejemplo:1. Inserte en el formulario un control de tipo ComboUsuario2. Complete las propiedades como se muestran a continuación.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 89

Page 91: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Descripción:

SELECT IdFamilia,Descrip FROM Articulos_Familias ORDER BY IdFamilia.

3. Automáticamente, al cargar el formulario, el control desplegará la lista de familias de artículos.

RECUERDE QUE, SI DESEA QUE EL CAMPO QUE SE MUESTRE EN EL CONTROL SEA DESCRIP, EN VEZ DE IDFAMILIA, DEBE CAMBIAR EL ORDEN DE LAS COLUMNAS EN LA CONSULTA Y EN LA ESPECIFICACIÓN DE COLUMNAS.

Control CntTabEs un contenedor de controles CntPanel o SSPanel que se divide por pestañas.

Las pestañas se crean por código. A cada pestaña le asignaremos un control SSPanel o CntPanel.

Ejemplo de creación de un CntTab con 2 pestañas1. Ponga en el formulario 2 controles CntPanel y llámelos Pnl1 y

Pnl2.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 90

Page 92: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

2. Añada controles dentro de los controles CntPanel.3. Añada un control CntTab y llámelo MiTab.4. Pegue el siguiente código en la función carga o en el evento

LOAD del formulario.MiTab.InsertItem 0, "Panel 1", Pnl1.Hwnd, 1MiTab.InsertItem 1, "Panel 2", Pnl2.Hwnd, 1

En el método InsertItem, especifique un IdPestaña, el caption de la pestaña y el contenedor a asignar, el último parámetro corresponde a una imagen.

Si quiere deshabilitar una pestaña en particular lo hará de la siguiente forma:

MiTab.Item(0).Enabled = False

Control cntGridUsuarioSin duda es el control más complejo de los controles personalizados.

Cuando definimos una grid lo hacemos indicando un origen de datos (vista, tabla o colección de objetos) y definiendo sus columnas.

Hay varias maneras de trabajar con este control. Veamos unos cuantos ejemplos de cómo utilizarlo.

PropiedadesAgregar

Descripción: Indica si la grid permite agregar registros. Tipo: TRUE/FALSE.

Editar

Descripción: Indica si la grid permite editar registros. Tipo: TRUE/FALSE.

Eliminar

Descripción: Indica si la grid permite eliminar registros. Tipo: TRUE/FALSE.

EditarPorObjeto

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 91

Page 93: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Descripción: Los datos son editados mediante objetos. La grid instancia el objeto lo actualiza con los datos insertados y llama al método update del objeto. De esta forma permite guardar datos configurables.

Tipo: TRUE/FALSE.

CargaObjetos

Descripción: Si CargaObjetos = True, el origen de datos es la colección, si no, los datos se leen del FROM.

Tipo: TRUE/FALSE.

Colección

Descripción: Le pasaremos la colección de objetos como origen de datos. Para esto necesitamos EditarPorObjeto = TRUE.

Tipo: Colección

From

Descripción: Indica la tabla, vista o consulta que se utilizará como origen de datos. Intente siempre utilizar vistas o tablas directamente. Si desea emplear una consulta combinando tablas, debe especificar un Alias. Cuente con que el control hace un “SELECT columnas FROM” XXX. Especifique sólo el origen de datos.

Tipo: STRING.

Alias

Descripción: Si especificamos un FROM de tipo consulta empleando tablas combinadas, esta propiedad indicará a las columnas del grid el Alias de tabla por defecto.

Tipo: STRING. Ver ejemplo de grid usando alias.

Grid.FetchRowStyle

Descripción: Indica que, cuando se refresque la grid, se activará el evento GridFetchRowStyle. Se utiliza generalmente cuando necesitamos pintar las filas del grid de acuerdo a algún valor dado.

Tipo: TRUE/FALSE. Ver ejemplo FetchRowStyle.

TablaObjeto

Descripción: Especifica la tabla en la que se van a guardar los datos del grid. Un grid puede tener un origen de datos distinto a la tabla donde se

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 92

Page 94: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

almacena. Guardará todos los datos que coincidan con los campos de la grid.

Tipo: STRING

Where

Descripción: Cláusula WHERE completa para filtrar el origen de datos. Tipo: STRING

Orden

Descripción: Nombre de las columnas por las que queremos filtrar separadas por “,”.

Tipo: STRING

Preparada

Descripción: Devuelve TRUE cuando tiene columnas creadas. Se utiliza para saber si la grid ya ha sido inicializada.

Tipo: BOOLEAN.

SoloArray

Descripción: Si el valor es TRUE especifica que queremos trabajar sin que el grid actualice los datos en la tabla.

Tipo: BOOLEAN.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 93

Page 95: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Refresca

Descripción: Si el valor es TRUE especifica que se refresque el grid cada vez que se inserte/modifique/elimine un registro.

Tipo: BOOLEAN.

NoUsarIdDocs

Descripción: Cuando utilizamos un origen de datos que carece del campo IdDoc pondremos ésta propiedad a FALSE para que no dé error al actualizar, ya que el control necesita de un campo Identidad para realizar las actualizaciones. Use esta propiedad cuando quiera una grid en casos especiales de sólo consulta o sólo array.

Tipo: BOOLEAN.

ColumnaEscalada

Descripción: Establece la columna que debe crecer al maximizar el grid. ColumnaEscalada=”NombreColumna”

Tipo: STRING.

ArrayDB

Descripción: Array en el que se basa la grid. Tipo: XArrayDB.

ArrayValue (fila,columna)

Descripción: establece un valor dentro del array del grid. Tipo: VARIANT.

SQLSelect

Descripción: Instrucción SQL completa que toma el grid como origen de datos. Es la unión final de todas las instrucciones dadas (Columnas, FROM, WHERE, UNION)

Tipo: STRING.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 94

Page 96: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Campo (NombreCampo)

Descripción: Nos devuelve el objeto CampoGrid indicado. Tipo: CampoGrid.

Métodos y funciones

AgregaColumna()

Este método crea las columnas en el grid. Son objetos de tipo CampoGrid y accederemos a las columnas del grid mediante [NombreGrid].Campo (“NombreDeCampo”).

Los campos de grid son un objeto de AhoraSistema.dll con muchas propiedades y funciones especiales. Por ejemplo podremos hacer que un campo grid contenga un combo, asignarle un tipo de datos, un valor por defecto al cargar o una instrucción por defecto al guardarse.

Parámetros obligatorios: Campo (STRING): Especifica el nombre del campo del origen de datos. Ancho (LONG): Establece el ancho de la columna (en TWIPS). Descripción (STRING): Especifica el nombre de la cabecera de la

columna.

Parámetros Opcionales: Locked (BOOLEAN): Indica que el campo se bloquea y no se puede

modificar. Combo (STRING): Consulta SQL con los campos que queremos que

muestre el combo. El primer campo es el que quedará en la celda al seleccionar el dato de la lista y los restantes los que desplegará el combo. Ejemplo:

SELECT IdArticulo Art, IdArticulo, Descrip FROM Articulos

Si queremos que se quede la descripción lo haremos de la siguiente manera:

SELECT Descrip Desc, IdArticulo, Descrip FROM Articulos

La consulta también puede hacer referencia a un campo de la grid. Por ejemplo, si en el grid tenemos un campo IdFamilia y queremos que el combo nos muestre sólo los artículos de esa familia. Para hacer referencia a un campo de la grid, en la sentencia SELECT lo especificamos con “@nombrecampo”. Ejemplo:

SELECT IdArticulo Art, IdArticulo, Descrip FROM Articulos WHERE IdFamilia = @IdFamila

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 95

Page 97: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

RowRefreshCombo (BOOLEAN): Establece que se refresque el combo al cambiar de celda, siempre y cuando la consulta del combo dependa de otro campo (como en el ejemplo anterior).

Format (STRING): Indica el formato de visualización del campo. Ejemplo: "#,##0.000". Puede utilizar las constantes de formato contenidas en AhoraConstantes.dll como:

o cFmt_Num0 (sin decimales).o cFmt_Num1 (1 decimal).o cFmt_Num2 (2 decimales).o cFmt_Num3 (3 decimales).o cFmt_Num4 (4 decimales).o cFmt_Num5 (5 decimales).o cFmt_Num6 (6 decimales).o cFmt_Pts (Pesetas con 2 decimales).o cFmt_Date (Fecha convencional).o cFmt_DateM ("mm/dd/yyyy").o cFmt_DateInt ("yyyymmdd").o Etcetera.

Total (BOOLEAN): Indica si debe agregar un campo al final con la suma de los campos la columna.

Valores (STRING): Sentencia SQL que especifica el valor del combo que queremos que se vea en la celda. Por ejemplo, si quiero seleccionar del combo el IdArticulo y que éste se almacene en tabla, pero mostrar en pantalla (y en la misma celda) la descripción.

El combo quedaría de ésta manera:

SELECT IdArticulo Art, IdArticulo, Descrip FROM Articulos

Mientras que el parámetro valores sería:

SELECT IdArticulo, Descrip FROM Articulos

Así estaríamos guardando el IdArtículo seleccionado, pero en la celda se visualizaría la descripción.

EsResourceID (BOOLEAN): Indica que el valor del campo será un Icono. Con lo cual cargará en la celda la imagen correspondiente. Siempre depende de la propiedad valor. Por ejemplo, para cargar un Icono, la SELECT debería ser: “SELECT Objeto Obj, Objeto, Icono1 FROM Objetos”

ValorFiltro: OBSOLETO. NO USAR Obligado (BOOLEAN): Indica que el campo es obligatorio. Si el usuario no

lo completa, saldrá un mensaje advirtiendo ésto.

DatoEnCombo(campo,valor)

Busca un valor dado dentro del combo de un campo.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 96

Page 98: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

GetValue(nombreCampo)

Retorna el valor del campo dado de la fila activa.

GridClear

Borra el contenido de la grid.

LimpiaGrid

Borra el contenido de la grid y elimina las columnas creadas.

Imprimir

Imprime la grid.

MenuItemAdd

Inserta un botón en el menú popup de la grid. Es el mismo método de inserción de botones de menú y botonera. Cuando se presiona un botón POPUP del grid, se activa el evento MenuClick del Grid.

PasoExcel

Exporta a Excel el contenido de la grid.

Refrescar

Refresca la grid.

SetValue (Campo,Valor)

Modifica el campo por el valor dado, en la fila activa.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 97

Page 99: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

EventosLa mayoría de los eventos suelen tener un nombre autoexplicativo, y en su mayoría son los que suelen tener las grids estándar. A continuación se detallarán algunos eventos especiales.

MenuClick

Se dispara cuando hacemos clic en un botón del menú POPUP del grid.

GridLoad

Se dispara cuando se refresca la grid.La grid se refresca cuando:

- Llamamos al método refrescar.- Actualizamos un registro.

PropiedadValor

Cuando hace el GridLoad, por cada campo calculado (Campos que comienzan con @) se lanza el evento.

Ejemplo:

Imagine que tenemos dos campos calculados (@campo1 y @campo2) y necesitamos volver a calcularlos cada vez que se actualice un registro.

El evento nos proporciona el array de la grid, la propiedad o nombre del campo calculado, el valor del campo y la fila.

Private Sub cntGridOrdenes_PropiedadValor(aPropiedad As String, aValor As Variant, aArray As XArrayDBObject.XArrayDB, aRow As Long) Dim lSQL As String Dim lValor As String Select Case aPropiedad Case "@Campo1" IF CLong(aArray(aRow, pColOrdenes("CampoX").ColIndex))>0 THEN

aValor = (aArray(aRow, pColOrdenes("CampoY").ColIndex)) ELSE

aValor = 0 END IF Case "@Campo2", "@PeticionPres" If IsBlank(aValor) Then aValor = 0 End If End SelectEnd Sub

GridFetchRowStyle

Se activa cuando se refresca la grid y está activa la propiedad Grid.FetchRowStyle.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 98

Page 100: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Ejemplo

En este ejemplo, la grid tiene la propiedad GRID.FerchRowStile=TRUE.

Deseamos pintar de rojo las filas que tengan el campo color = 1.

Private Sub grdArticulos_GridFetchRowStyle(ByVal split As Integer, ByVal Bookmark As Variant, RowStyle As TrueDBGrid60.StyleDisp) With grdArticulos If .ArrayDb(Bookmark, .Grid.Columns("Color").ColIndex) = 1 Then RowStyle.ForeColor = vbRed End If End WithEnd Sub

Objeto CampoGridEs el campo, propiamente dicho del grid, es decir, donde se guardan las propiedades mencionadas en el método AgregaColumna () del grid. Accedemos a los objetos del grd de la forma [NombreGrid].Campo (NombreCampo).

Propiedades

Dijimos que el método AgregaColumna del grid lo que hacía era crear un objeto CampoGrid con las propiedades que solicita. Además de las nombradas anteriormente detallaremos algunas más.

Sustitucion

Descripción: Valor que tomará el campo cuando se actualice una celda de la misma fila. Ver ejemplo de grid con sustitución.

Tipo: STRING

Booleano

Descripción: Dibuja un control CheckBox. Tipo: BOOLEAN.

CampoFecha

Descripción: Establece un control Fecha para el campo. Tipo: BOOLEAN.

Métodos y Funciones.

AsignaAsistente

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 99

Page 101: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Descripción: Lanza un AhoraProceso llamado AhoraAsistente. Cuando se pulsa F3 despliega un formulario con filtro para buscar el dato. Este procedimiento sólo define el formulario, y va acompañado del método AssistAddField () que definirá las columnas de la grid del asistente. Vea el ejemplo de grid con asistente.

Parámetros Obligatorios- Icono (LONG): Número de Icono que queremos que aparezca en el

Form.- From (STRING): Instrucción SQL, origen de datos.- Where (STRING): Filtro SQL, puede ser una cadena vacía. - Order (STRING): Lista de campos a ordenar separados por comas.

Parámetros Opcionales- DataField(STRING): Nombre del campo grid. Si queremos que

aparezca en el campo del asistente.- Width(LONG): Ancho del formulario.- Heigth(LONG): Alto del formulario.

AssistAddField

Descripción: Método que define los campos de la grid del asistente F3. Parámetros Obligatorios

- Field (STRING): Nombre del campo que queremos que aparezca en el grid.

Parámetros Opcionales- Descrip(STRING): Descripción del campo.- Type(LONG): Tipo de dato (string, etc).- Size(LONG): Tamaño del campo.- Autosize (BOOLEAN): para que el tamaño se ajuste automáticamente.- DataField (BOOLEAN): Indica que es el campo que queremos que nos

retorne. Si no se especifica, el asistente nos devuelve el primero que declaremos.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 100

Page 102: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Cosas importantes a tener en cuenta sobre los grids Utilizan un array de tipo XArrayDB para manejarse. Se puede referenciar

mediante [NombreGrid].ArrayDB. Si queremos utilizar el grid sólo como un Array, sin que los cambios se

vean reflejados en tablas, debemos poner sus propiedades SoloArray = TRUE y Refresca = False.

Si la propiedad Refresca = TRUE el grid se refrescará siempre que se actualice un campo.

Si el grid permite insertar filas recuerde que puede controlar el valor de los campos a insertar mediante la propiedad Default del campo. Se utiliza frecuentemente para controlar la inserción de campos clave o campos incrementales. Ver ejemplo Formulario de mantenimiento.

Puede definir asistentes para los campos, de modo que al pulsar F3 en una celda con asistente le saldrá una pantalla de búsqueda. Vea el ejemplo de grid con asistentes F3.

Ejemplo ARRAY sin origen de datos y campos sustitución

- Cuando no se desea cargar datos en el grid, simplemente que el usuario los introduzca, no es necesario poner un origen de datos.

- Utilizaremos sustitución cuando se selecciona un artículo y queremos que se actualice el campo Descripción, y viceversa.

- Al insertar un nuevo registro queremos que el campo cantidad por defecto sea 1.

Private Sub CargaGrdArticulosConSust()'Crearemos un grid de sólo array para introducir artículos y cantidades'Seleccionaremos los artículos de un combo'Al seleccionar el artículo se actualzará la descripción y viceversa

On Error GoTo Error_ With grdArticulos If Not .Preparada Then .Agregar = True .Editar = True .Eliminar = True .CargaObjetos = False .EditarPorObjeto = False .Grid.FetchRowStyle = False 'Agregamos columna con formato numérico (Ver lib Ahora_Constantes) .AgregaColumna "Cantidad", 1000, "Cantidad", , , , cFmt_Num0 .AgregaColumna "IdArticulo", 1500, "Articulo", , _ "Select IdArticulo, IdArticulo, Descrip From Articulos" .AgregaColumna "Descrip", 2500, "Descripcion", , _ "Select Descrip, Descrip, IdArticulo From Articulos" .From = "" 'sin origen de datos porque los introducirá el usuario

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 101

Page 103: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

.Where = "" .Orden = "" 'Sustituciones .Campo("IdArticulo").Sustitucion = _ "SELECT IdArticulo FROM Articulos WHERE Descrip = @Descrip" .Campo("Descrip").Sustitucion = _ "SELECT Descrip FROM Articulos WHERE IdArticulo = @IdArticulo" .Campo("Cantidad").Default = 1

.SoloArray = False .Refresca = True End If .SoloArray = True .Refresca = False End WithEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " CargaGrd1", , Err.Description Resume End_End Sub

Ejemplo de grid sólo ARRAY usando Alias y campos calculados.En este ejemplo el grid es de sólo edición y sólo queremos que se refresque cuando se llame al método cargaGridSelecTarifas. Le pondremos un FROM porque queremos que cargue datos por defecto.

Private Sub cargaGridSelecTarifas()On Error GoTo Error_ With grdSelecTarifas If Not .Preparada Then .Agregar = False .Editar = True .Eliminar = False .CargaObjetos = False .Alias = "a" ‘Columna Marca (Columna Calculada) no existe en las tablas. ‘-Se especifica con @ .AgregaColumna "@Marca", 700, "Marca" .AgregaColumna "IdDelegacion", 1000, "Delegacion", True .AgregaColumna "IdLista", 500, "Lista", True .AgregaColumna "Descrip", 1000, "Descripción", True ‘-Establecemos el tipo de datos y la sustitución .Campo("@Marca").Booleano = True .Campo("@Marca").Sustitucion = "Select 0" .From = "(SELECT cc.IdDelegacion, lpc.IdLista, lpc.Descrip, lpc.IdDoc " & _ "FROM Listas_Precios_Cli lpc " & _ "INNER JOIN Ceesi_Configuracion cc ON " & _ "lpc.IdLista = cc.Valor WHERE cc.Parametro = 'LISTAPRECIOS_DEFECTO')a" ‘Queremos que sólo cargue tarifas para delegación actual. ‘GCN es el objeto conexión. .Where = " WHERE a.IdDelegacion = " & gCn.IdDelegacion .Orden = " IdDelegacion, IdLista" End If

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 102

Page 104: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

‘Cuando es un grid de solo Array el orden de refresco es el siguiente: si se cambia el orden da error .SoloArray = False .Refresca = True ‘-Hacemos el refresco 1 vez. .SoloArray = True .Refresca = False ‘-Dejamos la grid como sólo array. End WithEnd_:Exit SubError_: Tr.Trace TError, cModuleName, " CargaGrdSelecTarifas", , Err.Description Resume End_End Sub

Ejemplo de grid de sólo lectura con Alias y filtro WHERE.Private Sub CargaGrdArticulosDeProv(Optional aIdProveedor As String = "-1")‘--Cuando se llame a este procedimiento se aplicará el filtro WHERE‘--Y mostrará los artículos del proveedor especificado.On Error GoTo Error_ Dim lStrVista As String lStrVista = "(SELECT pa.IdProveedor, pa.IdArticulo, a.Descrip, a.IdDoc " & _ "FROM Prov_Articulos pa " & _ "INNER JOIN Articulos a on " & _ "pa.IdArticulo = a.IdArticulo) Vista" With grdArticulosDeProv If Not .Preparada Then .Agregar = False .Editar = False .Eliminar = False .CargaObjetos = False .EditarPorObjeto = False .Grid.FetchRowStyle = False .Alias = "Vista" .AgregaColumna "IdArticulo", 1000, "IdArticulo" .AgregaColumna "Descrip", 3000, "Descripción"

.From = lStrVista .Orden = "" End If .Where = "WHERE Vista.IdProveedor = " & SqlString(aIdProveedor) ‘--la func. sqlString me añade comillas .Refresca = True End WithEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " CargaGrdArticulosDeProv", , Err.Description Resume End_End Sub

Ejemplo de grid con colecciones y asistentes F3.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 103

Page 105: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Cuando la grid tiene la propiedad CargaObjeto=FALSE, al actualizar un registro significa que NO estamos actualizando el objeto. La grid no podrá contener los campos de la tabla configurables del objeto.

Private Sub gridLoad()On Error GoTo Error_ With GrdLineas If Not .Preparada Then .Agregar = True .Editar = True .Eliminar = True .CargaObjetos = False 'al estar a False necesitamos indicar la tabla donde guarda .EditarPorObjeto = True Set .Coleccion = EObjeto.ObjGlobal.Objetos("Trans_Prod_Lineas") .From = "Transformac_Lineas" .AgregaColumna "IdCodigo", 0, "IdCodigo" .AgregaColumna "IdLinea", 0, "IdLinea" .AgregaColumna "IdArticulo", 1875, "Id artículo", False, _

"SELECT IdArticulo, IdArticulo, Descrip FROM VCombo_Articulos Order By IdArticulo" .AgregaColumna "@Descrip", 1875, gCn.Traducir(734, "Descripción"), False, _

"SELECT Descrip, Descrip, IdArticulo FROM VCombo_Articulos Order By Descrip" .AgregaColumna "Unidades", 1000, "Unidades", , , , cFmt_Num2 .AgregaColumna "Precio", 1000, "Precio", , , , cFmt_Eur, , , , , True 'Sustituciones .Campo("IdArticulo").Sustitucion = _"SELECT IdArticulo FROM VCombo_Articulos WHERE Descrip = @@Descrip"

.Campo("@Descrip").Sustitucion = _"SELECT Descrip FROM VCombo_Articulos WHERE IdArticulo = @IdArticulo" 'Asistentes With .Campo("IdArticulo") .AsignaAsistente gCn.Obj.Objetos("Articulos").Entorno.Icono1, _"vCombo_Articulos", "", "IdArticulo", "IdArticulo", 8000, , False 'Campos del asistente .AssistAddField "IdArticulo", "Id Artículo", "String", 2000, , True .AssistAddField "Descrip", gCn.Traducir(734, "Descripción"), "String", 4500 End With With .Campo("@Descrip") .AsignaAsistente gCn.Obj.Objetos("Articulos").Entorno.Icono1, _"vCombo_Articulos", "", "Descrip", "Descrip", 8000, , False 'Campos del asistente .AssistAddField "Descrip", gCn.Traducir(734, "Descripción"), "String", 4500 .AssistAddField "IdArticulo", "Id Artículo", "String", 2000, , True End With .ColumnaEscalada = "@Descrip" End If Set .Coleccion = EObjeto.ObjGlobal.Objetos("Trans_Prod_Lineas") If Not pObjeto.Propiedades("IdCodigo") = 0 Then .Where = "WHERE IdCodigo = " & EObjeto.ObjGlobal.Propiedades("IdCodigo"))

Else .Where = "WHERE 1 = 0" End If .Refresca = True End With

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 104

Page 106: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

End_: Exit SubError_: GCn.Tr.Trace TError, cModuleName, " gridLoad", , Err.Description Resume End_End Sub

Ejemplo Grid con colecciones con cargando ObjetosCuando la grid tiene la propiedad CargaObjeto=TRUE, al actualizamos un registro significa que estamos actualizando el objeto. Si el objeto tiene campos configurables (por lo tanto una tabla Conf_[Objeto]) éstos se actualizarán si están reflejados en la grid.

Private Sub GridLoad_Lineas(aFp As FormaPago)On Error GoTo Error_ With grdLineas If Not aFp.Nuevo Then If Not .Preparada Then .CargaObjetos = False .EditarPorObjeto = True Set .Coleccion = aFp.Objetos("FormaPago_Lineas") .AgregaColumna "IdLinea", 500, gCn.Traducir(24619, "Nº"), True .AgregaColumna "IdTipoEfecto", 1500, gCn.Traducir(913, "Tipo"), , _

"Select Tipo, Descrip From Efectos_Tipos Order By Descrip", True, , , _

"Select Tipo, Descrip From Efectos_Tipos Order By Descrip" .AgregaColumna "Descrip", 2000, gCn.Traducir(734, "Descripción") .AgregaColumna "Porcentaje", 800, "%", , , , cFmt_Num2, True .AgregaColumna "NumVencimientos", 800, gCn.Traducir(4414, "Venc"), , , , cFmt_Num0 .AgregaColumna "PrimerVencimiento", 600, gCn.Traducir(4415, "1ª Venc"), , , , cFmt_Num0 .AgregaColumna "Periodo", 800, gCn.Traducir(4416, "Período"), , , , cFmt_Num0 With .Combo("IdTipoEfecto") .ListField = .Columns(1).DataField .DataField = .Columns(0).DataField End With .Refresca = True Else Set .Coleccion = aFp.Objetos("FormaPago_Lineas") End If Me.grdLineas.Visible = True Else grdLineas.Visible = False End If End WithSalir_:Exit SubError_: Gcn.Tr.Trace TError, cFormName, " GridLoad_Lineas", , Err.Description Resume Salir_End Sub

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 105

Page 107: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Formulario de mantenimientoMuchas veces necesitamos hacer un mantenimiento sobre alguna tabla utilizando un formulario simple con una grid. Para esto tenemos una manera sencilla de crearlo automáticamente utilizando un código sencillo.

Sabiendo definir una grid, podremos hacer uso de ésta gran ayuda.

Para acceder al formulario de mantenimiento necesitamos la librería AhoraAsistentes.dll. Puede observar que la función lo que hace es instanciar el formulario de mantenimiento y configurar su grid.

La función carga:

Public sub Mantenimiento(Optional aObj AS Object = Nothing)On Error GoTo Errores Dim lFrm As IMantenimiento ’—Definimos el formulario Set lFrm = NewFrmMantenimiento(gCn)’—instanciamos el formulario pasándole la conexión. gCn es la conexión With lFrm.Grid("GrdMantenimiento")’—Creamos el grid pasándole por parámetro el nombre .Agregar = True .Editar = True .Eliminar = True .CargaObjetos = False .EditarPorObjeto = False .Grid.HeadLines = 2 .AgregaColumna "IdRevTipoInteres", 1200, "IdRevision" .AgregaColumna "Descrip",1300,"Descripción", , , , , , , , ,True .AgregaColumna "Meses", 800, "Meses" ’—Así, al insertar un nuevo registro, agregue el último ID+1 .Campo("IdRevTipoInteres").Default = "Select IsNull(Max(IdRevTipoInteres),0) +1 As Nuevo From Intereses_Revisiones" .ColumnaEscalada = "Descrip" .From = "Intereses_Revisiones" .Orden = "IdRevTipoInteres" .Refresca = True End With lFrm.Form.Caption = "Mantenimiento de revisiones" lFrm.carga aObj, True, eBotMant_Cerrar Set lFrm = Nothing Exit subErrores: gCn.Tr.Trace TError, cModuleName, " Mantenimiento ", , Err.DescriptionEnd sub

Llamando a la función, obtendremos un formulario con un grid de mantenimiento de tabla.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 106

Page 108: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

EJEMPLO: CREACIÓN DE UN OBJETO EN EL SISTEMA

IntroducciónVamos a crear un objeto ObjPrueba que sea accesible desde el explorador de objetos.Las propiedades del objeto serán: Numero, Descrip e IdCliente.

El objeto tendrá asociadas líneas con artículos.

Las propiedades de sus líneas serán: Numero (Numero del ObjPrueba), IdArticulo y Cantidad.

Se definirá también una tabla de campos configurables para el objeto.

La tabla se llamará Conf_ObjsPrueba y definirá los campos: Telefono2 e IdEmpleado.

El formulario tendrá una cabecera con el número de objeto y su descripción y 2 fichas. Una con los datos estándar y otra con los campos configurables. Tendrá una grid donde se crearán sus líneas.

Acceso desde buscador de objetos.

Formulario.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 107

Page 109: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Creación de tablasTabla ObjsPruebaIF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjsPrueba]') AND type in (N'U')) DROP TABLE ObjsPruebago

CREATE TABLE [dbo].[ObjsPrueba]([Numero] [int] NOT NULL,[Descrip] [varchar](250) NOT NULL,[Fecha] [dbo].[T_Fecha_Corta] NULL,[IdCliente] t_id_cliente null,[IdDoc] [dbo].[T_Id_Doc] IDENTITY(1,1) NOT NULL,[InsertUpdate] [dbo].[T_CEESI_Insert_Update] NOT NULL,[Usuario] [dbo].[T_CEESI_Usuario] NOT NULL,[FechaInsertUpdate] [dbo].[T_CEESI_Fecha_Sistema] NOT NULL,

CONSTRAINT [PK_ObjsPrueba] PRIMARY KEY CLUSTERED ([Numero] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]Zpermisos ObjsPrueba –-Asignamos permisos a la tablaGO

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 108

Page 110: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Tabla ObjsPrueba_LineasLos registros de ésta tabla existirán siempre que exista el registro en la tabla ObjPruebas. Por lo tanto, debemos hacer que se actualice y elimine en cascada. Si se borra la referencia en ObjsPrueba, se debe eliminar el registro ObjsPrueba_Lineas.

IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ObjsPrueba_Lineas]') AND parent_object_id = OBJECT_ID(N'[dbo].[ObjsPrueba_Lineas]')) ALTER TABLE [dbo].[ObjsPrueba_Lineas] DROP CONSTRAINT [FK_ObjsPrueba_Lineas]GOIF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ObjsPrueba_Lineas]') AND type in (N'U')) DROP TABLE ObjsPrueba_LineasGOCREATE TABLE [ObjsPrueba_Lineas]( Numero int not null, IdArticulo t_id_articulo, Cantidad smallint not null, [IdDoc] [dbo].[T_Id_Doc] IDENTITY(1,1) NOT NULL, [InsertUpdate] [dbo].[T_CEESI_Insert_Update] NOT NULL, [Usuario] [dbo].[T_CEESI_Usuario] NOT NULL, [FechaInsertUpdate] [dbo].[T_CEESI_Fecha_Sistema] NOT NULL, CONSTRAINT [PK_ObjsPrueba_Lineas] PRIMARY KEY CLUSTERED ( [Numero] ASC, IdArticulo ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]

ALTER TABLE [dbo].ObjsPrueba_Lineas WITH CHECK ADD CONSTRAINT [FK_ObjsPrueba_Lineas] FOREIGN KEY([Numero]) REFERENCES [dbo].[ObjsPrueba] ([Numero]) ON UPDATE CASCADE ON DELETE CASCADEZpermisos ObjsPrueba_Lineas –-Asignamos permisos a la tablaGO

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 109

Page 111: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Definición de Propiedades--Objetos_PropiedadesDELETE FROM Objetos_Propiedades WHERE Objeto='ObjsPrueba'goINSERT INTO Objetos_Propiedades(Objeto,Propiedad,Descrip,Seleccion,Orden,Visible,Locked,Obligado,Substitucion,Width,Defecto,Formato)VALUES('ObjsPrueba','Numero','Número',null,null,1,0,0,null,1000,null,null)

INSERT INTO Objetos_Propiedades(Objeto,Propiedad,Descrip,Seleccion,Orden,Visible,Locked,Obligado,Substitucion,Width,Defecto,Formato)VALUES('ObjsPrueba','Descrip','Descripción',null,null,1,0,0,null,1000,null,null)

INSERT INTO Objetos_Propiedades(Objeto,Propiedad,Descrip,Seleccion,Orden,Visible,Locked,Obligado,Substitucion,Width,Defecto,Formato)VALUES('ObjsPrueba','Fecha','Fecha',null,null,1,0,0,null,1000,null,null)GO

Definir el objeto en tablaDefinimos el objeto y su colección. Lo mejor es hacerlo desde el Admon.En el ejemplo anterior lo hemos definido desde el ADMON, a continuación mostramos cómo definirlo por sentencias SQL. No le indicaremos la tabla de campos configurables, haremos el ejemplo desde el ADMON.

DELETE FROM Objetos WHERE Objeto='ObjsPrueba' or Objeto='ObjPrueba' or Objeto='ObjPrueba_Lineas' or Objeto='ObjPrueba_Linea' GO

-- ObjetoINSERT INTO Objetos(Objeto,Coleccion,Icono1,Icono2,Icono3,Raiz,Descrip,SQL,FiltroDefecto,HijoDefecto,PermiteFiltros,Orden,FormAsociado, Limita,Menu,CadenaDescrip,Expandir,Ejercicio,Sistema,Activo,AltaDirecta,IdTipoDef,Tabla,TablaOtra,EdicionGrid,Libreria, ObjetoEventos,IdClasificacion)VALUES( 'ObjPrueba',0,102,102,102,0,'Objeto de prueba','SELECT * FROM ObjsPrueba','SELECT * FROM ObjsPrueba', null,0,null,'ObjFormObjPrueba', 0,0,'[Numero]-[Descrip]',1,0,0,1,1,null,'ObjsPrueba', null,null,'PlantillaExterno',null,5)GO

--ColeciónINSERT INTO Objetos(Objeto,Coleccion,Icono1,Icono2,Icono3,Raiz,Descrip,SQL,FiltroDefecto,HijoDefecto,PermiteFiltros,Orden,FormAsociado, Limita,Menu,CadenaDescrip,Expandir,Ejercicio,Sistema,Activo,AltaDirecta,IdTipoDef,Tabla,TablaOtra,EdicionGrid,Libreria, ObjetoEventos,IdClasificacion)

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 110

Page 112: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

VALUES ('ObjsPrueba',1,102,102,102,1,'Objetos de Prueba(Col)','SELECT * FROM ObjsPrueba','SELECT * FROM ObjsPrueba','ObjPrueba',0,null,null, 100,16,'[Numero]-[Descrip]',1,0,0,1,1,null,'ObjsPrueba',null,null,'PlantillaExterno',null,5)GO

Tabla ConfigurablesLa crearemos desde el ADMON. Debe estar definido el objeto en la tabla Objetos_Objetos.

1. Abra el ADMON2. Vaya a Objetos y en la ficha de objetos seleccione “Objeto de

Pueba” y en el campo Tabla campos configurables escriba Conf_Objs_Prueba y pulse el botón Guardar. Se creará la tabla de configurables.

3. Vaya a Campos Configurables y añada las propiedades como muestra la siguiente imagen.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 111

Page 113: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Ya tenemos definido el objeto por tablas.

TriggersCuando se crea un objeto hay que crear el registro en la tabla de configurables.

IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[ObjsPrueba_ITrig]')) DROP TRIGGER [dbo].[ObjsPrueba_ITrig]go

CREATE TRIGGER [dbo].[ObjsPrueba_ITrig] ON [dbo].[ObjsPrueba] FOR INSERT AS IF @@ROWCOUNT<>0 BEGIN ---------------------------------------------------------- -- Inserto un registro en CAMPOS CONFIGURABLES ---------------------------------------------------------- INSERT INTO Conf_ObjsPrueba ([Numero]) SELECT [Numero] FROM Inserted EndGo

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 112

Page 114: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

VistasCreamos la vista para el grid.

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[VObjsPrueba_Lineas]') AND type in (N'V')) drop view VObjsPrueba_LineasGOcreate view VObjsPrueba_Lineas as SELECT o.Numero, o.IdArticulo,a.Descrip, o.Cantidad, o.IdDoc FROM [ObjsPrueba_Lineas] o left join Articulos a on o.IdArticulo = a.IdArticuloGOzpermisos VObjsPrueba_Lineas

Definir objeto en libreríaEn nuestro proyecto de pruebas PlantillaExterno, cree un nuevo módulo de clase llamado ObjPrueba (ObjPrueba.cls)

Vamos a implementar la herencia con el objeto IItem.

Pegue el siguiente código.

Option ExplicitOption Base 0Option Compare Text

Implements CapturadorImplements IItem

‘El IItem en que se base el ObjetoPrivate pItem As IItem

‘Capturador para entregar el padrePrivate WithEvents ContainerSubObject As Capturador

Public Function Add() As IItem Set Add = pItem.Add()End Function

Public Sub AsignaClaves(lacoleccion As Collection) pItem.AsignaClaves lacoleccionEnd Sub

Public Property Get Campos(Cual As String) As Object Set Campos = pItem.Campos(Cual)End Property

Private Function Capturador_EventRaise(EventName As String, aObj As Variant) As Variant Dim lCap As Capturador Dim lBreak As Boolean On Error GoTo Error_ Select Case EventName Case Else

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 113

Page 115: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

lBreak = False #If debugmode Or DebugCallback Then Debug.Print EventName #End If End Select On Error Resume Next Set lCap = Padre If Not lCap Is Nothing And Not lBreak Then Capturador_EventRaise = lCap.EventRaise(EventName, aObj) End If Set lCap = Nothing Salir_: Exit FunctionError_: gCn.Tr.Trace TError, TypeName(Me), " Capturador_EventRaise", , Error$ Resume Salir_ ResumeEnd Function

Private Function Capturador_GetContainer() As Object Set Capturador_GetContainer = ContainerSubObject.GetContainerEnd Function

Public Function CargaObjAdicionales(Cual As Integer, Optional Otros As Object) As Boolean CargaObjAdicionales = pItem.CargaObjAdicionales(Cual, Otros)End Function

Private Sub Class_Initialize() Set pItem = gCn.Obj.DameItem(TypeName(Me)) pItem.Modificado = False ValoresPredeterminados Set ContainerSubObject = gCn.GetContainerSubObject(pItem) End Sub

Private Sub Class_Terminate() Set ContainerSubObject = Nothing Set pItem = Nothing End Sub

Public Property Get ClassDebugID() As Long ClassDebugID = pItem.ClassDebugIDEnd Property

Public Property Get Clave() As Variant Clave = pItem.ClaveEnd Property

Public Property Get Claves() As Collection Set Claves = pItem.ClavesEnd Property

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 114

Page 116: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Private Sub ContainerSubObject_DamePadre(ContainerObject As Object) Set ContainerObject = MeEnd Sub

Public Sub Data(Padre As Capturador, Vpropiedades As Collection, Optional Nuevo As Variant) pItem.Data Padre, Vpropiedades, NuevoEnd Sub

Public Function Delete() As Boolean Delete = pItem.DeleteEnd Function

Public Property Get Descripcion() As String Descripcion = gCn.Obj.GeneraDescripcion(Me)End Property

Public Property Let Disponible(Valor As Boolean) pItem.Disponible = ValorEnd Property

Public Property Get Disponible() As Boolean Disponible = pItem.DisponibleEnd Property

Public Property Get Entorno() As ObEntorno Set Entorno = pItem.EntornoEnd Property

Public Property Get EsColeccion() As Boolean EsColeccion = pItem.EsColeccionEnd Property

Public Function Estado() As Integer Estado = 1End Function

Private Function IItem_Add() As AhoraSistema.IItem Set IItem_Add = Add()End Function

Private Sub IItem_AsignaClaves(lacoleccion As Collection) AsignaClaves lacoleccionEnd Sub

Private Property Get IItem_Campos(Cual As String) As AhoraSistema.CampoClave Set IItem_Campos = Campos(Cual)End Property

Private Function IItem_CargaObjAdicionales(Cual As Integer, Optional Otros As Object) As Boolean IItem_CargaObjAdicionales = CargaObjAdicionales(Cual, Otros)End Function

Private Property Get IItem_ClassDebugID() As Long IItem_ClassDebugID = ClassDebugIDEnd Property

Private Property Get IItem_Clave() As String

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 115

Page 117: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

IItem_Clave = ClaveEnd Property

Private Property Get IItem_Claves() As Collection Set IItem_Claves = ClavesEnd Property

Private Sub IItem_Data(Padre As AhoraSistema.Capturador, Vpropiedades As Collection, Optional Nuevo As Variant) Data Padre, Vpropiedades, NuevoEnd Sub

Private Function IItem_Delete(Optional aVerbose As Boolean = True) As Boolean IItem_Delete = Delete()End Function

Private Property Get IItem_Descripcion() As String IItem_Descripcion = DescripcionEnd Property

Private Property Let IItem_Disponible(RHS As Boolean) Disponible = RHSEnd Property

Private Property Get IItem_Disponible() As Boolean IItem_Disponible = DisponibleEnd Property

Private Property Get IItem_Entorno() As AhoraSistema.ObEntorno Set IItem_Entorno = EntornoEnd Property

Private Property Get IItem_EsColeccion() As Boolean IItem_EsColeccion = EsColeccionEnd Property

Private Function IItem_Estado() As Integer IItem_Estado = EstadoEnd Function

Private Property Get IItem_Eventos() As AhoraSistema.IItem_Events Set IItem_Eventos = pItem.EventosEnd Property

Private Property Get IItem_Form() As Object ‘‘Set IItem_Form = Pantalla Set IItem_Form = pItem.FormEnd Property

Private Sub IItem_Imprimir() ImprimirEnd Sub

Private Sub IItem_Menu() MenuEnd Sub

Private Property Let IItem_Modificado(RHS As Boolean) Modificado = RHS

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 116

Page 118: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

End Property

Private Property Get IItem_Modificado() As Boolean IItem_Modificado = ModificadoEnd Property

Private Property Let IItem_Nuevo(RHS As Boolean) Nuevo = RHSEnd Property

Private Property Get IItem_Nuevo() As Boolean IItem_Nuevo = NuevoEnd Property

Private Property Get IItem_Objeto() As Object Set IItem_Objeto = MeEnd Property

Private Property Get IItem_Objetos() As Collection Set IItem_Objetos = ObjetosEnd Property

Private Property Let IItem_ObjetosDisp(RHS As Boolean) pItem.ObjetosDisp = RHSEnd Property

Private Property Get IItem_ObjetosDisp() As Boolean IItem_ObjetosDisp = pItem.ObjetosDispEnd Property

Private Property Get IItem_OtrasPropiedades() As Collection Set IItem_OtrasPropiedades = pItem.OtrasPropiedadesEnd Property

Private Property Let IItem_Padre(RHS As Object) Padre = RHSEnd Property

Private Property Get IItem_Padre() As Object Set IItem_Padre = PadreEnd Property

Private Property Let IItem_Propiedades(Cual As String, RHS As Variant) Propiedades(Cual) = RHSEnd Property

Private Property Get IItem_Propiedades(Cual As String) As Variant IItem_Propiedades = Propiedades(Cual)End Property

Private Sub IItem_Refresh(Optional pantallaIgnorarErr As Boolean = True) Refresh pantallaIgnorarErrEnd Sub

Private Sub IItem_Show(Optional Propietario As Object, Optional ventanaNueva As Boolean = False, Optional aModal As Boolean = False) Show Propietario, ventanaNueva, aModalEnd Sub

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 117

Page 119: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Private Property Get IItem_SQL() As String IItem_SQL = sqlEnd Property

Private Property Get IItem_Tabla() As String IItem_Tabla = TablaEnd Property

Private Property Get IItem_TablaOtra() As String IItem_TablaOtra = pItem.TablaOtraEnd Property

Private Property Let IItem_Tipo(RHS As String) pItem.Tipo = RHSEnd Property

Private Property Get IItem_Tipo() As String IItem_Tipo = TipoEnd Property

Private Property Let IItem_UltimoNivel(RHS As Boolean) pItem.UltimoNivel = RHSEnd Property

Private Property Get IItem_UltimoNivel() As Boolean IItem_UltimoNivel = UltimoNivelEnd Property

Private Function IItem_Update(Optional PantallaError As Boolean = False, Optional refrescar As Boolean = True) As Boolean IItem_Update = Update(PantallaError, refrescar)End Function

Public Sub Imprimir() pItem.Entorno.Imprimir MeEnd Sub

Property Get Item() As AhoraSistema.IItem Set Item = MeEnd Property

Public Sub Menu() pItem.Entorno.VerMenu Me, "mnuObjeto"End Sub

Public Property Get Modificado() As Boolean Modificado = pItem.ModificadoEnd Property

Public Property Let Modificado(Estado As Boolean) pItem.Modificado = EstadoEnd Property

Public Property Get Nuevo() As Boolean Nuevo = pItem.NuevoEnd Property

Public Property Let Nuevo(Estado As Boolean) pItem.Nuevo = Estado

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 118

Page 120: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

End Property

Public Property Get Objetos() As Object Set Objetos = pItem.ObjetosEnd Property

Public Function OtrasPropiedades() As Collection Set OtrasPropiedades = pItem.OtrasPropiedadesEnd Function

Public Property Let Padre(miPadre As Object) pItem.Padre = miPadreEnd Property

Public Property Get Padre() As Object Set Padre = pItem.PadreEnd Property

Public Property Get Propiedades(Cual As String) As Variant Propiedades = pItem.Propiedades(Cual)End Property

Public Property Let Propiedades(Cual As String, Valor As Variant) pItem.Propiedades(Cual) = ValorEnd Property

Public Sub Refresh(Optional pantallaIgnorarErr As Boolean = True) pItem.Refresh pantallaIgnorarErrEnd Sub

Public Sub Show(Optional Propietario As Object, Optional ventanaNueva As Boolean = False, Optional aModal As Boolean = False) ‘Dim lFrm As Form ‘Set lFrm = Propietario pItem.Show Propietario, ventanaNueva, aModalEnd Sub

Public Property Get sql() As String sql = pItem.sqlEnd Property

Public Property Get Tabla() As String Tabla = pItem.TablaEnd Property

Property Get Tipo() As String Tipo = TypeName(Me)End Property

Public Property Get UltimoNivel() As Boolean UltimoNivel = pItem.UltimoNivelEnd Property

Public Function Update(Optional PantallaError As Boolean = False, Optional refrescar As Boolean = True) As Boolean Update = pItem.Update(PantallaError, refrescar)End Function

Private Sub ValoresPredeterminados()

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 119

Page 121: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

‘ Poner valores por defecto aquíEnd Sub

El objeto creado diremos que hereda de IItem. Los métodos definidos para el objeto son los estándar, si desea que alguna función o método del objeto se comporte de manera distinta, sólo tiene que modificarlo. Por ejemplo, si desea que cuando se cree un objeto, se carguen valores predeterminados, sólo debe programar el método ValoresPredeterminados(). Si queremos que el objeto cree automáticamente un ID, modificaremos la función Update asignando un valor a la propiedad antes de guardarse.

Método ValoresPredeterminados().Queremos que cuando se cree un objeto nuevo, se cargue la fecha del día por defecto. Procedemos a modificar el método ObjPrueba.cls.

Private Sub ValoresPredeterminados() ‘ Poner valores por defecto aquí Me.Propiedades (“Fecha”) = DateEnd Sub

Así como personalizamos este método, podemos hacer lo mismo con otros, y definir nuevas funciones para nuestro objeto.

Crear formulario del objetoControles1 - Cree un nuevo formulario frmObjPrueba (frmObjPrueba.frm).Inserte los siguientes controles: cntMenuFormulario (mnuMain). EnlaceObjeto (EObjeto). cntPanel (FraDatos)

Dentro de FraDatos insertar:o TextoUsuario (Numero)o TextoMultulinea (Descrip)

cntTab (TabDatos). CntGridUsuario (grdLineas) SSPanel (panDatos)

Dentro de panDatos insertar:o TextoUsuario (Fecha)o ComboUsuario (IdCliente)

SSPanel (panConfig) modificando la propiedad Autosize = 3-ChildToPanelDentro de panConfig insertar:

o cntPropiedades (cntPropConfig) cntBotonera (Botonera)

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 120

Page 122: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

2 - Vincular controles al enlace objeto y asigne las siguientes propiedades:

Propiedades del control EObjeto: ResizeH=0 ResizeV=1 ResizeEnabled = TRUE

Propiedades del control fraDatos: ResizeH=1 ResizeV=2 ResizeEnabled = TRUE

Propiedades del control TabDatos: ResizeH=2 ResizeV=2 ResizeEnabled = TRUE ResizeRestanteH = TRUE ResizeRestanteV= FALSE

Propiedades del control Número: Clic derecho en el control Número para acceder a las

propiedades del control. Complete los datos como muestra la imagen:

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 121

Page 123: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

CaptionControl = Número CaptionVisible = TRUE CaptionWidth = 1000

Propiedades del control Descrip: Clic derecho en el control Descrip para acceder a las

propiedades del control. Complete los datos como muestra la imagen

CaptionControl = Descripción. CaptionVisible = TRUE CaptionWidth = 3400 CaptionPosition = 1 – eCaptionPositionTop

Propiedades del control Fecha: Clic derecho en el control Fecha para acceder a las

propiedades del control. Complete los datos como muestra la imagen:

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 122

Page 124: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

CaptionControl = Fecha. CaptionVisible = TRUE CaptionWidth = 1000

Propiedades del control IdCliente: Clic derecho en el control IdCliente para acceder a las

propiedades del control.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 123

Page 125: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Complete los datos como muestran las imágenes:

CaptionControl = IdCliente. CaptionVisible = TRUE CaptionWidth = 1000

Propiedades del control Botonera: ResizeH=0 ResizeV=10 ResizeEnabled = TRUE

Código del formulario.Option ExplicitOption Compare Text

Private Const cModuleName = "frmObjPrueba"

'Numerar los tabsPrivate Enum TabEnum eTabDatos = 0 eTabConfigurablesEnd Enum

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 124

Page 126: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Public Function Carga(elObjeto As IItem, Optional aPropietario As Object) As BooleanOn Error GoTo Error_ 'Función Carga Hourglass True Load Me With EObjeto If Not .ObjGlobal Is Nothing Then If .Modificado Then If Not .Actualiza Then Carga = False GoTo End_ End If End If End If If Not elObjeto Is Nothing Then If .Carga(elObjeto) Then Call CargaGrdLineas Call CargaOtrasPropiedades(elObjeto) End If End If End With If aPropietario Is Nothing Then Set aPropietario = gCn.Sesion.MainForm End If gCn.Obj.FormShow Me, aPropietario Carga = True

End_: Hourglass False Exit FunctionError_: gCn.Tr.Trace TError, cModuleName, " Carga", , Err.Description Carga = False Resume End_End Function

Private Sub CargaGrdLineas()On Error GoTo Error_ With grdLineas If Not .Preparada Then .Agregar = True .Editar = True .Eliminar = True .CargaObjetos = False .EditarPorObjeto = True .EditarPorObjetoyVista = True .Configurable = True Set .Coleccion = EObjeto.ObjGlobal.Objetos("ObjPrueba_Lineas") .From = "VObjsPrueba_Lineas"

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 125

Page 127: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

.AgregaColumna "Numero", 0, "Numero" .AgregaColumna "IdArticulo", 2000, "Id Artículo", , "SELECT IdArticulo Id_Articulo,IdArticulo,Descrip from Varticulos_maquinas" .AgregaColumna "Descrip", 5000, "Descrip" .AgregaColumna "Cantidad", 1000, "Cantidad" .Orden = "IdDoc" End If .Where = "WHERE Numero=" & SqlNumero(EObjeto.ObjGlobal.Propiedades("Numero")) .RefrescaSinLoad = True .refrescar .Enabled = Not EObjeto.ObjGlobal.Nuevo End WithEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " CargaGrdLineas", , Err.Description Resume End_ ResumeEnd Sub

Private Sub Botonera_ToolClicked(aTool As AhoraOCX.AhoraTool)On Error GoTo Error_ Select Case aTool.Name Case cBotMant_Guardar Call Guardar Case cBotMant_Eliminar Call Eliminar Case cBotMant_Imprimir Call Imprimir Case cBotMant_Nuevo Call Nuevo Case cBotMant_Cerrar Call Cerrar End SelectEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " Botonera_ToolClicked", , Err.Description Resume End_End Sub

Private Sub Form_Load()On Error GoTo Error_

Botonera.SeguridadObjeto = eMenuAñadir + eMenuGuardar + eMenuBorrar Botonera.BotonesMantenimiento = eBotMant_Cerrar Botonera.HabilitaBotones TabDatos.InsertItem 0, "Datos", panDatos.Hwnd, 1 TabDatos.InsertItem 1, "Configurables", panConfig.Hwnd, 1 mnuMain.MenuItemAdd "&Archivo", "mnuArchivo", "", eTipo_Menu_Menu mnuMain.MenuItemAdd "&Hola", "mnuHola", "mnuArchivo", eTipo_Menu_Boton, , , eicoahora mnuMain.MenuItemAdd "&Cerrar", "mnuCerrar", "mnuArchivo", eTipo_Menu_Boton, True mnuMain.Ready = TrueEnd_:

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 126

Page 128: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Exit SubError_: gCn.Tr.Trace TError, cModuleName, " Form_Load", , Err.Description Resume End_ End Sub

Private Sub Form_Resize()On Error Resume Next Form_AutoResize MeEnd Sub

Private Sub Guardar()On Error GoTo Error_ Hourglass True With EObjeto If .Actualiza(False) Then Call CargaGrdLineas Call CargaOtrasPropiedades(Me.EObjeto.ObjGlobal) Else Hourglass False Exit Sub End If End With EObjeto.Refresh

End_: Hourglass False Exit SubError_: gCn.Tr.Trace TError, cModuleName, " BotGuardar_Click", , Err.Description Resume End_End Sub

Private Sub Cerrar() Unload MeEnd Sub

Private Sub Eliminar() Dim lObj As IItemOn Error GoTo Error_ Hourglass True If EObjeto.Remove Then Set lObj = EObjeto.ObjGlobal lObj.Show End If Hourglass FalseEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " Eliminar", , Err.Description Resume End_End Sub

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 127

Page 129: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Private Sub Imprimir() On Error Resume Next Hourglass True EObjeto.ObjGlobal.Imprimir Hourglass FalseEnd Sub

Private Sub Nuevo() Dim lItem As IItem On Error GoTo Error_ With EObjeto If .Modificado Then If Not .Actualiza Then Exit Sub End If End If Hourglass True 'crea un nuevo objeto Set lItem = .ObjGlobal.Add End With lItem.Show End_: Hourglass False Exit SubError_: gCn.Tr.Trace TError, cModuleName, " BotNuevo_Click", , Err.Description Resume End_End Sub

Private Sub CargaOtrasPropiedades(aObjeto As IItem)'Cargar el grid de propiedades del objetoOn Error GoTo Error_ If aObjeto.Nuevo Then 'Tiene que existir el objeto en tabla para poder modificar sus propiedades TabDatos.Item(eTabConfigurables).Enabled = False cntPropConfig.Carga aObjeto Else TabDatos.Item(eTabConfigurables).Enabled = True cntPropConfig.Carga aObjeto End IfEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " CargaOtrosPropiedades", , Err.Description Resume End_

End Sub

Private Sub Form_Unload(Cancel As Integer)'Si cierra el formulario controlar si se ha modificado el objeto. Dim lMsg As StringOn Error GoTo Error_

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 128

Page 130: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

With EObjeto If .Modificado Then lMsg = "Los datos de la cabecera del contrato han sido modificados. ¿Desea guardar los cambios?" If MsgBox(lMsg, vbYesNo + vbQuestion + vbDefaultButton1, "Contratos...") = vbYes Then If Not .Actualiza(True) Then Cancel = True Exit Sub End If End If End If End WithEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " Form_Unload", , Err.Description Resume End_End Sub

Private Sub mnuMain_ToolClick(aTool As AhoraOCX.AhoraTool)On Error GoTo Error_ Select Case aTool.Name Case "mnuHola" MsgBox "Hola", vbExclamation Case "mnuCerrar" Call Cerrar End SelectEnd_: Exit SubError_: gCn.Tr.Trace TError, cModuleName, " mnuMain_ToolClick", , Err.Description Resume End_End Sub

Crear ObjForms.clsPara que el sistema gestione correctamente los formularios de los objetos, debe crear la clase ObjForms (ObjForms.cls) y un proceso de llamada al formulario.

Al definir el objeto pondremos como Formulario Asociado el IdAhoraProcceso (en este caso es ObjFormObjPrueba).

En la clase ObjForms definimos el proceso que llama al formulario correspondiente.El sistema llamará al ahora proceso y devolverá el formulario.

Proceso:

-- AhoraProceso para poder obtener el formulario del objeto ObjPruebaDELETE FROM [Ahora_Procesos] where [IdAhoraProceso]='ObjFormObjPrueba'GOINSERT INTO [Ahora_Procesos]([IdAhoraProceso],[Descrip],[IdTipo],[Libreria],[Clase],[Metodo],[IdLlamada],[RetornoTipo],[RetornoObjeto], [CheckParam],[Observaciones],[Macro],[Net])

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 129

Page 131: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

VALUES('ObjFormObjPrueba','ObjFormObjPrueba',4,'PlantillaExterno','ObjForms','DameFrmObjPrueba',1,'Object',1, 0,NULL,0,0)GO

Código Objforms.Cls

Option ExplicitOption Compare Text

Private Const cModuleName = "ObjForms"

Public Function DameFrmObjPrueba(Optional aNuevo As Boolean) As Object Set DameFrmObjPrueba = DameObjForm("frmObjPrueba", aNuevo)End Function

Private Function DameObjForm(aFormName As String, Optional aNuevo As Boolean) As Object Dim lNuevo As Boolean On Error Resume Next

If Not aNuevo Then If IsLoaded(aFormName) Then Set DameObjForm = SelectForm(aFormName) End If If DameObjForm Is Nothing Then Select Case UCase(aFormName) Case UCase("frmObjPrueba") Set DameObjForm = New frmObjPrueba Case Else End Select End IfEnd Function

Private Function IsLoaded(ByVal frmName As String) As Boolean Dim Form As FormOn Error GoTo Error_ IsLoaded = False For Each Form In Forms If Form.Name = frmName Then IsLoaded = True Exit Function End If Next End_: Exit FunctionError_: gCn.Tr.Trace TError, cModuleName, " IsLoaded", , Err.Description Resume End_End Function

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 130

Page 132: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Private Function SelectForm(frmName As String, Optional GetFirst As Boolean = False) As Form Dim lForm As Form On Error GoTo Error_ For Each lForm In Forms If lForm.Name = frmName Then If lForm.Visible Then Set SelectForm = lForm If GetFirst Then Exit Function Else Set SelectForm = lForm SelectForm.Show If GetFirst Then Exit Function End If End If Next End_: Exit FunctionError_: gCn.Tr.Trace TError, cModuleName, " SelectForm", , Err.Description Resume End_End Function

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 131

Page 133: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

CONFECCIÓN DE FORMULARIOSEl objetivo de este apartado es definir cómo se deben diseñar los distintos formularios para que todos tengan el mismo estilo. Se va a definir como debe ser el aspecto y las funcionalidades comunes a todos ellos.

FormulariosDimensión y ubicación de controles:Todos los formularios que se realicen deben ser redimensionables.

Criterios de dimensión y ubicación:

De acuerdo con la imagen, se han definido una serie de constantes públicas que estandarizan la ubicación y distancia de los controles entre sí dentro de un formulario, son:

cResTituloTop: 15cResTituloLats *: 0cResTituloBottom: 15cResGeneralSepV: 30cResGeneralSepH: 15cResGeneralSepLats *: 30cResBotoneraTop: 15cResBotoneraLats *: 0cResBotoneraBottom: 0

Salvo excepción, todos los formularios deben tener un Titulo (EObjeto) y una Botonera (cntBotonera).

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 132

Page 134: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

* Se aplica tanto por la izquierda como por la derecha.

Redimensión automática:Se ha diseñado un “sistema de redimensión automática” para formularios y controles que progresivamente si irá ampliando hasta lograr un sistema 99% automatizado.

Características:

1) Se utiliza:Private Sub Form_Resize() On Error Resume Next Form_AutoResize MeEnd Sub

2) Los controles preparados para ello son:barMenus (No tiene propiedades para ello pero se gestiona)EnlaceObjetoscntPanelcntGridUsuariocntTabcntFiltroUsuariocntStatusBarcntBotonera

3) Las propiedades de los controles para aplicarla:ResizeEnabled: (True/False) Indica si el control efectuará autodimensión.ResizeV: (0...n) Indica el orden vertical de colocación de arriba a abajo.ResizeH: (0...n) Para una misma ubicación vertical, indica el orden horizontal de colocación de izquierda a derecha.

4) Una serie de controles deben tener la posibilidad de “redimensionarse al restante”, es decir, a la dimensión del formulario o contenedor padre menos la suma de las dimensiones de todos los demás controles. Estos son:cntPanelcntGridUsuariocntTabY las propiedades que lo permiten son:ResizeRestanteV: (True/False)ResizeRestanteH: (True/False)

5) Algunos controles están preparados para ajustar los controles que puedan contener, son:cntPanel con la propiedad: ResizeInterior: (True/False)

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 133

Page 135: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Controles de formulario:Combo o TextoTodos los combos de usuario en todos los formularios deben tener las siguientes funcionalidades con las teclas.

F3: Si la combo (o texto) tiene Link-> Asistente, lo lanza. La combo o texto debe tener la propiedad CaptionLink=TRUE

May+F2 : Abre el Zoom con el contenido del campo. F5: Refresca la combo Doble Click :Si la combo tiene un objeto lo muestra,

Fecha: F3: Abre el formulario Calendario y deben tener la propiedad

CaptionLink =TrueSiempre debe tener formato “dd/mm/yyyy” a no ser que lleve fecha y hora que será “dd/mm/yyyy hh:mm:ss”

Hora:

El control debe aceptar 5 o 7 caracteres y se debe de comprobar que una vez formateado corresponde con: hh:mm o hh:mm:ss.

Numérico:

Debe ir alineado a la derecha y formateado.

Grid usuario:

Combos:

1. Las columnas que tienen combos pueden tener o no búsqueda sensitiva. Es una propiedad (grid.campo(“IdArticulo”).BuscaSense = True )

2. Si no tiene búsqueda sensitiva, al abrir la combo se cargan todos los registros.

3. Si la columna tiene la propiedad de refresco de combo en cada línea, esta propiedad se recalcula cada vez que se abre la combo: Se calcula el número de registros de la combo:Existe un parámetro: MAXCOMBOITEMS. Si este parámetro está a 0, no se tendrá en cuenta.Si el nº de registros supera MAXCOMBOITEMS, entonces sólo se mostrarán lo que especifique el parámetro LIMITADOSCOMBOITEMS.

4. Para configurar las combos: Combo: Select de la combo

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 134

Page 136: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

ComboRefresh: Booleano, indica si la combo se refresca al cambiar de registro.

ComboInner: Tiene el formato “Vista;CampoEnlace;CampoOrden” o “Vista;CampoEnlace”

ComboWhere: Puede llevar campos referentes al mismo registro (como en la sustitución,ej: @IdPedido )

Ejemplo: Combo: “SELECT IdArticulo,IdArticulo IdArt ,Descrip

FROM vCombo_Articulos ComboRefresh: True ComboInner: “vCombo_Materiales;IdArticulo;IdArticulo” ComboWhere: “IdArticulo IN (SELECT IdArticulo FROM

Pedidos_cli_Lineas WHERE Idpedido=@IdPedido )”

5. Además debemos poder acceder al objeto mediante Doble Click

AL IGUAL QUE EN LA PARTE SUPERIOR, LOS CAMPOS, DEPENDIENDO DEL TIPO DE DATOS, DEBEN LLEVAR LAS MISMAS REGLAS DE FORMATO QUE SE ESPECIFICAN ARRIBA.

IMPORTANTE:

Las Grids que tengan combos de artículos tienen funcionalidad con las teclas:

F3: que abre el asistente normal de artículos

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 135

Page 137: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

F2: que abre el formulario siguiente,

Hay que asegurarse que en todos los formularios en los que se pueda insertar más de un artículo en la rejilla salga este formulario mediante la tecla F2.

May+F2: al igual que en los controles de cabecera, si pulsamos May+F2 debería salir el formulario de Zoom con el contenido del campo en el que estamos.

Headtip: Los campos tienen la propiedad headtip para establecer el tip que queremos que aparezca cuando ponemos el ratón en la cabecera. Si no se establece nada saldrá el mensaje de “Hacer clic para ordenar…”Caption

Para manejar el caption hay tres propiedades: MuestraCaption, ConcatenaCaption y CaptionBase

Si MuestraCaption es false no se muestra nada

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 136

Page 138: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Si ConcatenaCaption =True: Se pone en el caption: El CaptionBase & [Número de registros]

Si ConcatenaCaption =False: Se pone en el caption: El CaptionBase

Si la grid es de objetos: se añade la descripción de la colección

Edición por objetos

Si se EditaPorObjetos (=True) y se activa también EditarPorObjetoyVista a True, entonces la lectura de los campos se hará de la vista que pone en el campo EdicionGrid de la tabla Objetos en el registro de la colección. Si no se ha configurado esta vista se leerá (From) de la tabla o vista que especifique el código.

Procesos asociados a los menús

El tool que devuelve el menú, tiene un IdAhoraProceso. Si se especifica, al pulsar el menú de la grid se lanza el proceso con un primer parámetro la grid, y de segundo una colección de parámetros que lleva como último parámetro el iddoc de la línea y si no hay 0.

Si se quieren rellenar más parámetros tendrá que ser en el gridmousedown y establecer una collection con los parámetros que se quieran en lToolMenu.ColParametrosProceso.

CntReport:

Si queremos pintar con colores las líneas del cntReport en la vista de la colección tiene que haber un campo llamado exactamente ColorObj que contendrá el código del color de esa línea.

Botonera:Formularios de objetos:

Todos los formularios de objetos deben tener necesariamente: Guardar: guarda si se ha modificado Nuevo : deja preparado el formulario para una nueva entrada Eliminar: Elimina el objeto cargado Imprimir: Para imprimir los listados asociados a la colección Asociados: sólo sale si el objeto tiene objetos asociados

(objetos_objetos) Notas: Sólo sale si el objeto tiene una tabla de notas Cerrar: Cierra el formulario

Ejemplo de formulario de objeto:

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 137

Page 139: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Formularios de mantenimientos sencillos:

Éstos suelen tener únicamente el botón cerrar:

Formularios con marcados de registros:

Los formularios en los que aparecen una o más grids para seleccionar registros deberían llevar:

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 138

Page 140: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Marcar Todos Desmarcar Todos Marcar Grid Activa (sólo si hay más de una grid) Desmarcar Grid Activa (solo si hay más de una grid) Cerrar

Ejemplo:

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 139

Page 141: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

En este caso está en el menú, pero debería estar en la botonera.

Menús:Teclas aceleradoras en menús de formulario.

En la tabla Ahora_Menus y en la tabla Ceesi_Menus (para procesos de objeto) se ha incluido un nuevo campo: IdTecla

Hace referencia a la tabla Ahora_Menus_Teclas que tiene la siguiente estructura:

IdTecla ClaveCtrl Booleano que indica si hay que pulsar CtrlShift Booleano que indica si hay que pulsar ShiftAlt Booleano que indica si hay que pulsar AltFuncion Booleano que indica si es una tecla de funciónValor Si es función el número : 1,8,12..

Si no un carácter : T

Ejemplos:

IdTecla Ctrl Shift Alt Funcion ValorF10: 1 False False False True 10CTRL+A 2 True False False False A

Restricción AHORA_MENUS

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 140

Page 142: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

La tabla Ahora_Menus tiene el campo “Estandar” de tipo bit, que estará activo para todos los menús base de la aplicación.

Los menús con este campo activo no podrán borrarse ni editar sus campos librería, formulario, nombre, estandar y el campo tipo si esta en “tipo=2”. (Implementado en Triggers)

Estos cambios son realizados para evitar que, por error o desconocimiento, se modifiquen datos de esta tabla pudiendo causar errores en la aplicación por uso de dichos menús en el código.

Seguridad

La seguridad de los menús de los formularios (Ahora_Menus) controla la visibilidad o no del menú, pero siempre se carga en el formulario. Por tanto, si el código lo hace visible se verá, diga lo que diga la seguridad. Por eso es conveniente en código habilitarlos/deshabilitarlos...

Hay dos formas para ocultar/mostrar un menú desde su configuración (ADMON)

1. En el campo Seguridad se guarda el nombre de un objeto o colección. Si este objeto o colección no tienen permisos de Show para el usuario entonces el menú no se visualiza.

2. Seguridad por grupos (Como los listados). Inicialmente todos los menús tienen como grupo de seguridad el

grupo ‘GRUPOAHORA’. De hecho el trigger de Insert de Ahora_Menus inserta este grupo en Ahora_Seguridad_Entidades_Asignación.

Desde el admon., podemos modificar los grupos asociados al menú. Si pertenece a algún grupo la sesión del usuario podrá ver el menú.

Añadir objetos nuevos dinámicamente a al colección de objetos

Se ha añadido una funcionalidad en AhoraSistema.Objeto. Esta función se llama AñadirObjeto.

Public Function AñadirObjeto(aNombreObjeto As String, Optional aEsColeccion As Boolean = False, Optional aTabla As String = "", Optional aHijoDefecto As String = "") As Objeto

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 141

Page 143: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

UsoSupongamos que queremos tratar una tabla/vista como si fuera un Objeto pero no tenemos creados todos los registros necesarios en la BD, ni los queremos tener.

Los motivos podrían ser que se quiere guardar a través de stores para tener mayor control sobre él, o que le quieren añadir permisos, o que, simplemente, se busca poder manejarlo como si fuera un objeto (para evitar escribir én código instrucciones de INSERT, UPDATE o DELETE). Los objetos se actualizan y borran a través de sus stores si las encuentran o, en caso contrario, saben actualizar/borrar su tabla.

Como parámetros, se han añadido los básicos, pero, como la función devuelve el Objeto, podemos seguir configurándolo, ya que las propiedades del Objeto son los campos de la tabla Objetos.

FuncionalidadVamos a ver un ejemplo con la tabla CEESI_Procesos_Arbol.En la BD existen las stores pCEESI_Procesos_Arbol_I, pCEESI_Procesos_Arbol_U y pCEESI_Procesos_Arbol_D pero no existe ningún registro en la tabla Objetos que maneje esta tabla.Para poder utilizar CEESI_Procesos_Arbol como si fuera un objeto se usaría la instrucción:

gCn.Obj.AñadirObjeto "CEESI_Procesos_Arbol"

Como la tabla se llama igual, no hay que establecer más parámetros. Con esta intrucción podríamos ejecutar código como el siguiente:

Dim lItem As IItem

Set lItem = gCn.Obj.DameObjStr("CEESI_Procesos_Arbol")lItem.Propiedades("IdArbolPadre") = aNodePadrelItem.Propiedades("DescripcionArbol") = aTitulolItem.Update

Para recuperar objetos, debemos añadir la colección a Objetos con:

gCn.Obj.AñadirObjeto "CEESI_Procesos_Arboles", True, "CEESI_Procesos_Arbol", "CEESI_Procesos_Arbol"

Así podemos recuperar objetos de la manera habitual:

Dim lItem As IItemSet lItem = gCn.Obj.DameObjeto("CEESI_Procesos_Arboles", "Where IdArbol=1")

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 142

Page 144: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

Funcionamiento CadenaDescripEn la Tabla Objetos, en el campo CadenaDescrip podemos especificar un patrón para la descripción del objeto.

Cuando se establece en una colección: Los campos entre [] o entre {} deben ser campos de la vista de la colección.

Cuando se establece en un objeto: Los campos entre [] o entre {} deben ser campos del objeto o si empieza por SELECT, puede ser una consulta basada, o no, en propiedades del objeto. La utilización de corchetes o llaves es indiferente salvo en el caso en el que se aniden que deben ser diferentes.

Ejemplo:

Colección Facturas (Sql: SELECT * FROM vFacturas_Cli_Cab)CadenaDescrip = Factura [NumFactura] del cliente [Cliente]

Objeto Factura: (Sql:SELECT * From Facturas_cli_Cab)CadenaDescrip=Factura [NumFactura] del cliente {Select Cliente FROM Clientes_Datos WHERE Idcliente=[IdCliente]}

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 143

Page 145: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

F.A.Q.

A continuación, se detallan varios mensajes, tanto de error como de advertencia, que pueden aparecer durante el desarrollo, así como una propuesta para solucionarlo.

Error del control Active x: No se puede cargar ‘C:\Plantilla\Externo\AhoraOCX.Ocx’--¿Desea continuar cargando el proyecto?

Error del control Active X:

Para solucionar este error, seleccione Sí, y, una vez cargado el proyecto, realice los siguientes pasos

1. Proyecto Componentes

2.

3. En la siguiente ventana, seleccione, en la lista de controles, la versión para la que va a desarrollar. Si su versión no estuviera en esta lista, haga clic en Examinar y busque el archivo AhoraOCX.Ocx en la carpeta Lib de

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 144

Page 146: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

su aplicación Ahora ERP.

4. Haga clic en Aceptar y, para comprobar que los cambios funcionan, guarde su proyecto, ciérrelo y vuélvalo a abrir.

Error de compilación: No se puede encontrar el proyecto o la biblioteca

Error al compilar

Para solucionar este error, pulse en Aceptar y realice los siguientes pasos:

1. Se abrirá automáticamente la siguiente ventana(si desea volver a abrirla manualmente, haga click en Proyecto referencias):

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 145

Page 147: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos

2. Fíjese que en la lista de referencias disponibles hay algunas marcadas con ‘FALTA’. Esto nos indica que dichas referencias no están correctamente vinculadas. Esto es debido a que no está utilizando la misma versión de MSI y de plantilla. Asegúrese de usar la misma versión.

MANUAL DE PROGRAMACIÓN | PLATAFORMA ENTERPRISE PÁGINA | 146

Page 148: funcionalidad.ahora.es 0/Manual... · Web viewDescripción: Para el tipo de dato que pongamos, tendremos una lista de formatos para seleccionar, en el caso del tipo numérico seleccionaremos