1 de Octubre de 2000 Vol.1 No.2

Automatización COM en PROGRESS

Mtro. en C. Alejandro Botello Castillo

Palabras Clave : Automatización, controles ActiveX, OLE, COM.

Resumen

La automatización de aplicaciones habilitan al usuario a simplificar en un solo paso las acciones que realiza habitualmente, así como a guiar la entrada de información con pantallas prediseñadas para reducir el riesgo de errores comunes. Este trabajo presenta una forma de automatización construida con el sistema manejador de bases de datos Progress y con la tecnología del Modelo de Objetos Componentes (Component Object Model, COM) de Microsoft, para la realización de reportes y transferencias de datos en una aplicación personalizada.

[English]

Artículo

Una de las tecnologías más innovadoras para la plataforma Windows, ha sido la Incrustación y Enlace de Objetos (OLE, Object Linking and Embeding), desarrollada por Microsoft y la cual permite que las aplicaciones tengan la posibilidad de ejecución de otras aplicaciones dentro de su misma interfaz gráfica, sin tener que salir de la aplicación que inició la solicitud, mediante el paradigma de la orientación a objetos. En este ambiente, a la aplicación que realiza la llamada a algún servicio se le conoce como cliente y la aplicación que realiza el servicio, es el servidor, de forma que la información entre éstos queda vinculada; esto es, si algún dato cambia en el servidor, automáticamente se reflejará esta modificación en el cliente.

La automatización (antes llamada automatización OLE) es una de las características del Modelo de Objetos Componentes (COM, Component Object Model) de Microsoft, una tecnología estándar en la industria, usada por las aplicaciones para revelar sus objetos a las herramientas de desarrollo, lenguajes de macros y otras aplicaciones que sean compatibles con la automatización. Por ejemplo, una aplicación de hojas de cálculo puede mostrar una hoja de cálculo, un diagrama, celda o rango de celdas, cada una como un tipo diferente de objeto. Un procesador de textos puede revelar objetos como una aplicación, un documento, un párrafo, una frase, un marcador o una selección.

Un control ActiveX (OCX) es un componente reusable construido mediante COM, que permite extender la funcionalidad y la interfaz gráfica de una aplicación. La automatización ActiveX permite a una aplicación (el Controlador de automatización) manejar a otra aplicación (el Servidor de automatización), a través de objetos COM (objetos de automatización) proporcionados por el Servidor de automatización. Un objeto de automatización representa un empaquetamiento para la funcionalidad del servidor y un punto de conexión del Controlador de automatización hacia el Servidor de automatización. Esta funcionalidad puede incluir varias capacidades, desde el intercambio de datos entre dos aplicaciones, hasta el control total de la aplicación servidora por el controlador.

PROGRESS soporta la automatización ActiveX como Controlador de automatización. Esto permite que sea posible escribir código para una aplicación en 4GL, que se conecte y maneje los objetos de automatización en algún Servidor de automatización. Esto se hace creando una conexión a un objeto de automatización y haciendo referencia a sus propiedades y métodos.

PROGRESS viene con un número de ejemplos de aplicaciones de automatización, que se instalan en el subdirectorio %DLC%\src\samples\ActiveX. Cada subdirectorio contiene varios archivos para una sola aplicación de ejemplo. Uno de los ejemplos más representativos, es una aplicación que permite enlazar las ventas de una base de datos en PROGRESS y crear una gráfica de barras en Excel. El archivo se llama oleauto.p.

Si bien este ejemplo muestra con claridad cómo es posible establecer la automatización con Excel, hay ocasiones en que es necesario realizar algo parecido desde otro servidor de automatización de Office 97, como Word o Access, sin que actualmente exista algún ejemplo o guía para este tipo de aplicaciones. En las siguientes secciones se explicará cómo es posible emplear la automatización en estos servidores, con un caso práctico desarrollado para una aplicación comercial.

Observación: Aunque este documento se presenta como guía para la automatización, sólo se aplica para la codificación mediante el 4GL de PROGRESS 8.2 y posterior. Para el desarrollo mediante el User Interface Builder (UIB) de PROGRESS, refiérase al manual PROGRESS External Program Interfaces en el capítulo 9 "ActiveX Control Container Support".

1. Creación y uso de variables tipo COM

Al igual que con las variables handlers de tipo WIDGET, PROGRESS define un tipo de hadler para el manejo de objetos COM, el handler de componentes COM-HANDLE, el cual llevará el registro de la conexión entre el Controlador y el Servidor de automatización. Los mecanismos entre los objetos COM y los widgets son parecidos, ya que sus métodos y propiedades son accesados mediante este handler.

Para tener acceso a un componente COM, es necesario instanciar una variable handler de tipo componente, con la instrucción:


DEFINE VARIABLE hCOMobject AS COM-HANDLE.

que crea una variable de tipo handler componente. Para accesar a los métodos de este objeto componente, se emplea la siguiente sintaxis:


[ NO-RETURN-VALUE ]
COMhdl-expresion :Referencia-Nombre-Metodo

En donde Referencia-Nombre-Metodo especifica el llamado a un método de un objeto COM que puede regresar o no un valor. COMhdl-expresion es una expresión que regresa un handle componente al objeto COM que posee el método especificado en Referencia-Nombre-Metodo. La opción de NO-RETURN-VALUE es requerida para aquellos métodos que no presenten un valor de retorno.

Para accesar o modificar las propiedades de un objeto COM, se emplea la siguiente sintaxis:


COMhdl-expresion :Referencia-Nombre-Propiedad

en donde Referencia-Nombre-Propiedad especifica una propiedad de un objeto COM. COMhdl-expresion es una expresión que regresa un handler componente al objeto COM, que posee la propiedad especificada por Referencia-Nombre-Propiedad.

Para cada método o propiedad es necesario tener una expresión COM handler, que regrese un valor de handler componente, expresado con la sintaxis:


COMhandle [ : Referencia-Nombre-Metodo | Referencia-Nombre-Propiedad ] ...

COMhandle es una variable COM-HANDLE. (Note que el primer elemento de una expresión de handler componente debe ser una variable COM-HANDLE). Un handler componente puede encadenar tantas referencias a métodos y propiedades que sean requeridas para regresar un handler a un objeto COM.

Cuando se llama a un método de un objeto COM, es necesario pasar los argumentos, en caso de que los necesite, de la siguiente forma:


Nombre-Metodo
( { [ OUTPUT | INPUT-OUTPUT ]

Nombre-Metodo es el nombre del método del objeto COM. expresion es una expresión válida en PROGRESS, que se puede pasar como parámetro al método. TipoDato es uno de los diversos especificadores de tipo. Las opciones de modo OUTPUT e INPUT-OUTPUT especifican cómo el parámetro del método es usado. parametro-nulo es cualquier cantidad de espacios en blanco, indicando que el parámetro es opcional y se omite.

Cuando se ha terminado de emplear una variable COM-HANDLE, se deberá liberar de memoria mediante la sentencia:


RELEASE OBJECT hCOMObject.

Con estas definiciones ya es posible comenzar a codificar en el 4GL de PROGRESS para la automatización COM. En las siguientes secciones se tratarán los ejemplos prácticos en que aplicó la automatización.

[Nota]

2. Automatización en Word

Aunque PROGRESS cuenta con una herramienta para realizar reportes (Report Builder), a veces es necesario tener un mayor control de la salida y la presentación de los datos en el reporte. La siguiente aplicación emplea una tabla maestra con los datos de la unidad revisora, el número de revisión y la unidad revisada, y una tabla de detalle donde se muestra la información de descripción, fechas de solicitud y entrega, y el nombre y firma del responsable, con sus iniciales.

Ya que el formato del oficio no varía, sólo los datos, es más práctico crear una plantilla de Word y reemplazar la información enviada desde PROGRESS. La plantilla de este oficio es como se muestra en la figura1 y se almacena en el subdirectorio de instalación de Office, en la carpeta de plantillas. De la tabla AutEstimado, se toman los campos Unilog - la cual tiene un join hacia la tabla AuUniLog para obtener la unidad lógica -, Folio y CveUnidad. Para cada Folio se tiene una serie de detalles dados por la tabla AuInfSol en los campos InfSol, FechaSol y FechaEnt. Las iniciales son capturadas al momento en una variable iniciales.

El modelo COM permite que cada ítem de una aplicación esté definido como un objeto, y pueda ser configurado mediante sus propiedades y ejecutados sus métodos. Para Word, los objetos son: la aplicación en sí, los documentos, las secciones, las páginas, los rangos de líneas, los párrafos , las columnas, renglones y celdas de una tabla, hasta los caracteres individuales, por decir algunos importantes. Para conocer las propiedades, métodos y constantes que Word ofrece, se emplea el Visual Basic para Aplicaciones (VBA), que ya viene integrado en cada aplicación del Office 97 y que está disponible en el menú Herramientas/Macro/Editor de Visual Basic (Alt + F11), en el cual se encuentra el Examinador de Objetos (menú Ver/Examinador de Objetos o F2), mostrando toda la información de los objetos que es posible manejar en Word, como muestra la figura 2. Si desea más información, consulte el manual del Programador de Office 97 o la ayuda en línea de VBA.

Ahora falta determinar la forma en que Word reconoce que es necesaria una actualización de datos, desde el Controlador de automatización al documento actual. La forma en que Word hace esto es mediante los marcadores (bookmarks), que son marcas que se pueden hacer a un documento para ir a ese punto más rápidamente o para hacer sustituciones de información requerida (por ejemplo, la fecha actual). Para insertar un marcador, se escribe algún texto identificador del marcador y se selecciona (sobreilumina); después se elige del menú Insertar la opción Marcador, la cual presenta el cuadro de diálogo de la figura 3, el cual pide un nombre para el marcador (el cual puede ser el mismo que el texto identificador) y se elige agregar. De esta forma queda definido el marcador para posteriores referencias a él. En la figura 1 se han creado los marcadores unidad, revision, unidad_2, desc1, fsol y fent, que aparecen encerrados entre corchetes (para poder visualizar los marcadores, se tiene que elegir el menú Herramientas/Opciones y seleccionar el separador Ver, y activar la casilla Marcadores) y que se emplearán para la automatización con PROGRESS.

Ya creada la plantilla en Word, ahora se codifica para hacer las llamadas a los objetos de Word desde el 4GL de PROGRESS. Desde cualquier parte de algún frame en el que se esté trabajando, se creará un botón que, al momento de oprimirse, iniciará toda la automatización. En la sección de Triggers del botón creado, se escribirá el código siguiente (se numeran las líneas de código para la explicación detallada posterior).

La funcionalidad del botón comienza definiendo las variables internas que necesitará, entre ellas, la variable Word tipo COM-HANDLE (línea 14). El inicio de la conexión con el Servidor de automatización se declara con la sentencia CREATE (línea 21), que inicia una instancia de Word. La línea 22 configura a Word para que sea visible.

Ya que se tiene la conexión con el servidor, se comienza la transferencia de datos del renglón actual de un objeto browse de PROGRESS, buscando el valor del registro a una variable tipo RECID, definida en el browse anterior (línea 24). Como el renglón mostrado en el browse es el que se compara en el FIND, la única vez que habrá un error de registro no encontrado es cuando la tabla esté vacía. Ahora ya se tiene el valor del registro actual y se indica a Word que abra un documento nuevo, tomando como base la plantilla creada anteriormente y con nombre, en este caso, de caurt_pl.dot (deberá estar en el subdirectorio de instalación de Office/Plantillas, si no, se deberá escribir la ruta completa), mediante el método Add. Ya teniendo el documento abierto, busca el valor de la unidad lógica de la tabla de catálogo AuUniLog y extrae el nombre correspondiente (línea 26), para llamar al procedimiento Remplazo (línea 27), el cual busca el nombre del marcador especificado en el primer argumento y lo reemplaza con el valor del campo especificado en el segundo argumento. El tercer argumento indica si el reemplazo es en mayúsculas (valor 1) o no (valor 0). El código del procedimiento Remplazo se muestra en el listado 2 y funciona de la siguiente manera: el primer parámetro toma el nombre del marcador previamente definido en la plantilla y va hacia él mediante el método GoTo (línea 12). Una vez que lo encuentra, lo selecciona con el método Select (línea 13) y reemplaza el valor del argumento 2 mediante el método TypeText (línea 16). El cambio a mayúsculas se trata en las líneas 14 y 15, preguntando por el valor lógico del tercer parámetro y utilizando la función CAPS() de PROGRESS. Para la creación del procedimiento, se deberá elegir la sección Procedures y el botón New, escribiendo el nombre Remplazo, como se muestra en la figura 4.

Regresando el listado 1, se aplica el procedimiento Remplazo para los marcadores revisión, unidad_2 e iniciales (líneas 29-31). Ahora es necesario llenar la tabla (en Word) con la información de detalle de la tabla AuInfSol, de la siguiente manera: primeramente se selecciona el marcador desc1, que está dentro de la tabla, con el método GoTo (línea 32). Después se hace un FIND en cada registro que cumpla con el criterio (AuInfSol.revision = AutEstimado.Folio). Como de antemano no se sabe cuántos registros resultarán de esta búsqueda, se tienen que crear renglones en la tabla de forma dinámica, creando marcadores en dichos renglones para acomodar los registros resultantes. Se define una variable contador para tener una identificación del número de renglones añadidos. Para el primer registro resultante, no cumple la condición de las líneas 38-46 y ejecuta el procedimiento de reemplazo de las líneas 47-49. El primer argumento de la función de reemplazo es el valor de las variables descriptor, fechasol y fechaent, construidas con las cadenas "desc", "fsol" y "fent", respectivamente, más el valor del actual del contador. Esto da como resultado los valores desc1, fsol1 y fent1 para el primer renglón y es como están definidos en la plantilla (ver figura 1). Pero para el segundo registro de resultados, la comprobación del IF (línea 38) es cierta y entra al bloque. Como actualmente se está en el primer renglón de la tabla, se emplean los métodos MoveDown (línea 39), para ir al segundo renglón; SelectRow (línea 40), para seleccionar el renglón completo; InsertRow (línea 41), para crear un nuevo renglón, y MoveLeft (línea 42), para posicionarse en la primera celda del renglón recién creado. En este momento estamos en la posición tal como en el primer registro, pero sin los marcadores para los demás registros de resultado, que son creados mediante el procedimiento CreaMarcador, tomando como parámetro el valor de la variables que contiene el nombre del marcador a crear (líneas 43-45). El código del procedimiento CreaMarcador se detalla en el listado 3, y funciona como sigue: con el método MoveRight (línea 7) seleccionamos la celda actual (el tercer parámetro indica si se desea sólo mover o moverse seleccionado el texto); entonces se crea un nuevo marcador con el método Add del objeto Bookmarks (línea 8), indicando el nombre del nuevo marcador como el valor del argumento marcador, para la selección hecha anteriormente, y finalmente pasa a la celda derecha siguiente con MoveRight (línea 9). Al terminar estará creado el marcador en el documento actual.

Creados los marcadores, se continúa con el ciclo del programa, reemplazando los marcadores con los valores del registro actual y actualizando el valor del contador. Note que en la línea 47, el valor del segundo parámetro está compuesto por el valor del contador, más un punto y espacio, y el valor del campo InfSol, esto con el fin de que cada renglón esté numerado como lo requiere el oficio. Al terminar con el último registro, y regresando al listado 1, nos movemos al inicio del documento con GoTo (línea 52), para realizar la corrección ortográfica mediante el método CheckSpelling (línea 53). Al terminar la revisión ortográfica, se ejecuta la impresión del documento actual con PrintOut (línea 54) y se guarda el archivo con SaveAs (línea 57). El nombre del archivo estará dado por el valor de la variable nom_arch (línea 55) y se guardará en el directorio especificado con el método ChangeFileOpenDirectory (línea 56). Finalmente, se termina la aplicación Servidor de automatización mediante el método Quit (línea 59) y se libera el handler COM (línea 60).

Cabe mencionar que como el procedimiento es automatizado, si se cancela la revisión ortográfica, la impresión o el salvado del archivo, se continuará con la siguiente sección de código. En caso de que ocurra un error serio del sistema, por ejemplo, que no esté conectada la impresora o no se pueda guardar el archivo, se presentará un mensaje de error y se detendrá el funcionamiento del programa, con resultados hasta ahora impredecibles.

Todo el código mostrado para la automatización no contiene una verificación de tratamiento de errores, pero es posible añadir la cláusula NO-ERROR al final de cada sentencia y tratar el error mediante un bloque ON ERROR.

3. Automatización en Excel

Ya que Excel cuanta con capacidades de manejo de bases de datos, parece extraño que se desee hacer algún tipo de automatización con PROGRESS. Sin embargo, hay situaciones, como en el presente ejemplo, en las que es necesario el uso de tal para evitar el hacer los procesos a mano. Lo que se pretende es abrir varios archivos formateados de Excel (ver el ejemplo de archivo de la figura 5) y leer los datos que contiene, para exportarlos hacia una tabla en PROGRESS y desde allí, hacer un consolidado de todos los archivos importados.

Sin embargo, no hay una utilería en Excel ni en PROGRESS que permita este intercambio nativo transparentemente (una opción sería realizar el proceso mediante ODBC, pero se presupone que no se cuenta con el controlador para ODBC para PROGRESS), de tal forma que es necesario que los datos de Excel sean exportados a un tipo de formato compatible para la importación en PROGRESS. Se hicieron pruebas y el formato que se eligió fue el de valores separados por comas (CSV, Comma Separeted Values), por presentar menos problemas de conversión entre aplicaciones.

Para hacer el programa menos difícil de manejar para el usuario, se inicia el proceso mediante un cuadro de diálogo, en donde el usuario elige el nombre del archivo en Excel que desee importar en PROGRESS, como muestra la figura 6.

Al oprimir el botón con el ícono de la carpeta, se muestra el cuadro de diálogo estándar de Windows para abrir un archivo. El archivo elegido se pasa como cadena de caracteres al código 4GL para su tratamiento. Al oprimir el botón Importar, comienza el proceso definido en el código del listado 4.

Para manejar la automatización en Excel es necesario definir las variables handler COM (líneas 10-16) y las demás requeridas por el procedimiento (líneas 17-23). En la línea 24 se establece la conexión con la aplicación y en la 25 se le indica a la aplicación que no sea visible durante el proceso. La variable archivo es la cadena resultante del cuadro de diálogo para abrir el archivo de Excel, y en caso de que sea nula, se despliega un mensaje de advertencia al usuario (líneas 26-28). En las líneas 30 a 32 se hace la división de la ruta y el nombre del archivo (sin extensión) para almacenarlos en la variables ruta y nombre_arch, respectivamente. La automatización comienza en la línea 33, en donde se llama al método Open del Objeto Excel para abrir el archivo especificado por el valor de la variable archivo. Posteriormente, se crea un handler para una hoja de trabajo (línea 34) y de esta hoja se selecciona la celda A1.

Un problema que se presenta es que no existe uniformidad en el formato de las hojas de cálculo; es decir, algunas difieren en la celda que contiene el primer valor de la base de datos, algunas tienen columnas vacías entre las columnas de datos, hay renglones de encabezados mezclados entre los renglones de datos, etc. Para estos problemas la única solución es crear una plantilla para que cada departamento envíe la hoja de cálculo en un formato estándar, pero esto cae fuera del alcance de la programación del módulo. Es necesario saber exactamente cuál es la región válida de la base de datos y desechar la información restante. Por fortuna, existe un método del objeto Range, CurrentRegion (línea 36), el cual analiza por sí solo los valores a partir de una celda pivote y selecciona el rango que parece contener la información válida de una base de datos (realmente este método evita mucha programación y es una fortuna que estuviera implementado, además que es rápido y preciso). Se seleccionó como celda pivote la A12 (después de ver varias hojas y checar que por lo menos los datos comienzan en esta celda) y la región resultante se guarda en un objeto Range nombrado referencia. Posteriormente este rango se selecciona (método Select), se copia (método Copy) y se crea una nueva hoja de cálculo limpia (método Add), para pegar el rango que contiene los valores de la base de datos (método PasteSpecial) y activar la celda A1 (método Activate) de la hoja actual (líneas 37-43).

Como el método CurrentRegion incluye en el rango los encabezados de los valores, hay aún renglones con información "sucia", por lo que es necesario eliminarla. Habilitamos la variable bandera a cierto (línea 44) e iniciamos un ciclo preguntando si en cada renglón, a partir de A1, existe el valor 1,00 ó 1.00, que es un valor de la columna Número Consecutivo y es único e identificable. Si no existe ese valor, se elimina la columna con el método Delete (línea 51) y se continúa hasta que se encuentra el valor deseado, para finalizar el ciclo (líneas 45-52). En este momento ya tenemos la base de datos "limpia", con sólo valores y sin encabezados. Se selecciona nuevamente la región de datos válida con el método CurrentRegion a otro objeto Range (referencia2) y se eliminan los formatos (alineación, negritas, cuadriculado, etc.) con el método ClearFormats (líneas 53-55). Finalmente, se exporta el archivo a tipo texto delimitado por comas, mediante el método SaveAs (línea 56), especificando el valor de la variable nombre_arch más la extensión ".txt". La propiedad DisplayAlerts se establece a falso (línea 57) para prevenir que Excel muestre un cuadro de diálogo, para confirmar que se desea salvar el archivo en ese formato (que ya se realizó) y se termina Excel con el método Quit (línea 58).

En este punto termina la interacción con Excel y se abre el archivo creado para importarlo a la tabla compras en PROGRESS, mediante la sentencia INPUT FROM (línea 61). La importación comienza en la línea 62, con un ciclo que crea un registro limpio (línea 63) de la tabla compras, y lee cada línea del archivo de texto, indicando que están separados por comas, para almacenar cada valor en las columnas respectivas (línea 64). A cada ciclo se incrementa la cuenta de los registros leídos (línea 65).

Cuando termina la lectura, y si no hay algún error, se cierra el archivo mediante INPUT CLOSE (línea 67) y se envía un mensaje al usuario indicando el número de registros importados. El procedimiento termina limpiando el valor en pantalla del archivo seleccionado para importar (línea 69) y liberando todos los handler COM creados para la automatización (líneas 70-76).

Es importante tomar muy en consideración las notas indicadas en el listado 4 (línea 6) con respecto al tratamiento de errores que pudieran surgir. La sentencia IMPORT es muy rígida en el aspecto de que hace bien su trabajo, pero no permite un poco de control de validación al usuario. Este tratamiento de errores queda abierta al usuario con el fin de implementar su estrategia de corrección de errores para resolver sus necesidades. Consulte el manual Programming HandBook de PROGRESS o la ayuda en línea para conocer los métodos de validación de información y manejo de errores.

4. Automatización en Access

El ejemplo mostrado a continuación tiene la misma funcionalidad que el anterior: abrir un tabla en Access, exportarla en formato de texto y leerla en una tabla en PROGRESS. En la figura 7 se muestra la interfaz presentada al usuario para este proceso.

Cuando el usuario seleccione el botón con el ícono de la carpeta, se muestra el cuadro de diálogo estándar de Windows para abrir un archivo, del cual se seleccionará la base de datos de Access (contenida en un archivo con extensión .mdb). Hay que aclarar que este procedimiento está construido de forma muy "cerrada", es decir, que dentro del código hay secciones personalizadas, con el nombre de las tablas y columnas tal y como están definidas en las bases de datos. Esto impide que la aplicación sea genérica, permitiendo la lectura de los datos de cualquier tabla de Access; si es necesario hacer un cambio en el esquema de estas tablas, también es indispensable modificar la rutina de importación.

El código del listado 5 es el que permite el intercambio de datos desde Access hacia PROGRESS.

Como se ha realizado en los otros ejemplos, el listado inicia declarando las variables locales y la variable Access de tipo COM handler para la automatización (líneas 9-12). Se crea una instancia de Access mediante la sentencia CREATE (línea 14) y se indica que no sea visible al usuario (línea 15). En caso de que no se haya elegido un archivo, el bloque de las líneas 16-18 muestra un mensaje al usuario. Las líneas 20-22 separan el nombre del archivo y la ruta de la variable archivo. Se inicia la interacción con Access cuando se llama al método OpenCurrentDatabase (línea 23) con el nombre del archivo del paso anterior. Si se logra abrir la base de datos, se debe verificar cuál ha sido abierta; esto se comprueba en las líneas 24, 27 y 32. Para cada base de datos, según el número de tablas que se desean exportar, se ejecuta el procedimiento exporta (líneas 25 y 28-30). Este procedimiento, cuyo código se muestra en el listado 6, toma como parámetros el nombre de la tabla que se desea abrir y la ruta en donde se almacenará el archivo exportado. El método OpenTable abre la tabla especificada mediante el valor de la variable tabla (línea 8) y el método TransferText realiza la exportación de la tabla completa hacia el formato de texto delimitado por comas (línea 9).

Una vez que se ha realizado la exportación, se cierra la base de datos mediante el método CloseCurrentDatabase (línea 35) y termina la instancia de Access con el método Quit (línea 36). Ya sólo resta hacer la importación línea por línea del archivo exportado mediante la sentencia IMPORT para la tabla correspondiente en PROGRESS (líneas 38-47, 48-55, 56-61 y 62-68). Si el archivo abierto fue nsegop, entonces se hace la conexión a la tabla nsegop mediante la sentencia CONNECT (línea 39). La sentencia INPUT FROM abre el archivo especificado (línea 40) como argumento y se inicia el ciclo de lectura por líneas con las sentencias CREATE (línea 42), que crea un registro en blanco y con la sentencia IMPORT (línea 43), que lee una línea del archivo y la empata con los campos especificados. La sentencia INPUT CLOSE (línea 45) cierra el archivo de importación y la sentencia DISCONNECT (línea 46) realiza la desconexión de la base de datos. Como se observa, para las líneas 48-68, los procesos son los mismos que los anteriormente descritos. Si la transferencia es exitosa, o si la base de datos no es la adecuada, se le indica al usuario con un mensaje (líneas 71 y 73). Finalmente se limpia el valor del nombre del archivo (línea 74) y se libera el handler para la automatización (línea 75).

Al igual que en el ejemplo de Excel, se deberá establecer una estrategia de comprobación de errores que se puedan presentar. Los mismos comentarios son aplicables a este ejemplo.



[Nota]. Si es necesaria más información acerca de las herramientas disponibles y las técnicas para el uso de la tecnología COM y ActiveX, refiérase al manual External Program Interfaces, que tiene varios capítulos que tocan este tema, o a la ayuda en línea desde PROGRESS.

Conclusiones

La automatización COM dentro de PROGRESS presenta una enorme ventaja al aplicar las tecnologías para el intercambio de información entre varias aplicaciones que se ejecuten dentro del ambiente Windows. Sin embargo, se debe analizar si es necesario establecer esta comunicación, ya que pudieran efectuarse las misma tareas con alguna otra herramienta que proporcione PROGRESS (tal como ReportBuilder, RESULTS, etc.). Otro factor a considerar es la velocidad de respuesta que tendrá la aplicación, ya que el intercambio de mensajes entre objetos COM presenta una latencia que degrada el rendimiento en general. Si es posible, establezca un solo objeto que realice todo el proceso, y si ya no lo está ocupando, desconéctelo. La opción de hacer no visible a la aplicación servidora de automatización (mediante el atributo Visible a falso), incrementa un poco la velocidad de la comunicación. Claro está que si se tiene una máquina poderosa, el factor de rendimiento no será de consideración.

Bibliografía

PROGRESS External Program Interfaces. No. versión 8 [Documentación impresa].

PROGRESS User Interface Builder. No. 8 [Documentación impresa].

PROGRESS User Interface Builder. No. 8 [Ayuda en línea].

Sitio web. http://www.prlgress.com.

Office 97 Examinador de objetos incluido en Visual Basic for Applications. [Ayuda en línea].

Visual Basic for Application incluido en Office 97. [Ayuda en línea].

Sitio web. http://www.microsoft.com/COM.


[ Este número ]



Dirección General de Servicios de Cómputo Académico-UNAM
Ciudad Universitaria, M
éxico D.F.