Ventana propiedades: Entrada-Salida ADO

Controles habituales  Conceptos básicos

Cuando el concepto actualmente seleccionado es del tipo Entrada-Salida ADO, al abrir la ventana de propiedades del conceptos de cualquiera de las formas posibles (mediante la opción Concepto > Ventana Propiedades o la de Concepto > Propiedades > Tipo Entrada-Salida ADO, o haciendo doble clic con el ratón sobre el icono de Tipo), se muestra esta ventana.

Se utiliza para tener diversas conexiones a archivos o bases de datos (se soportan todos los motores a los que se puede conectar mediante un driver ADO: Oracle, SQLserver, MySQL...) y realizar alguna de estas operaciones:
- una exportación de datos de la base actual a otra
- una importación
- una sincronización de datos entre ambas bases o archivos

Además de conexión a motores de BD, se puede conectar mediante un driver ADO a archivos XLS, CSV, TXT... para importar o exportar datos. ATENCIÓN, para analizar los campos y utilizar esta importación se debe tener el driver ADO, que conecta con Excel, u otra aplicación y será sensible a lo que permita la versión del driver

Para un sistema de importación más particular con un formato definido por la aplicación, se puede utilizar la ventana E/S XLS estructurado. En el caso más sencillo, con sólo poner datos en algunos campos, se pueden cargar millares de datos desde archivos externos en formato Access o Excel que son formatos de intercambio estándar de otras aplicaciones, para importarlos en la base de datos que necesitemos en muy poco tiempo.

Toda la funcionalidad demasiado específica y que no esté soportada para importar/exportar/sincronizar en esta ventana, se puede programar mediante código JavaScript, ya que existe una clase con métodos para manejar todos los datos de la ventana y realizar las funciones que sean necesarias.

Para sincronizar bases de datos de forma continua (no sólo importar o exportar puntualmente) recuerde que se puede automatizar la aplicación mediante el programa ingra_xjs.

Pestaña Tablas de la base:

Permite especificar en el campo Base actual el archivo de entrada o salida de datos (siempre vista la exportación/importación desde el punto de vista de la aplicación) mediante arrastrar y soltar sobre la pestaña.

Se admite también drag & drop en las líneas de la lista para permitir la ordenación manual de líneas que representan las tablas que se van a considerar como origen o destino del archivo ADO externo a la base actual con el que se conecta. Pulsando en el rótulo Base actual, que también es un botón, se abre un diálogo estándar localizando el directorio donde está la base o archivo a conectar (el camino que se encuentra en el campo puede ser relativo a al BD actual de la aplicación). El botón a la derecha Abre gestor de BD, permite abrir la base en su motor o con el programa asociado en el sistema.

Si se arrastra o teclea otro nombre distinto, la conexión cambia con lo que se releen las tablas y campos, y se pierden todas las definiciones sobre ellas. Para cambiar el nombre de archivo sin cambiar al conexión, se puede arrastrar el archivo sobre la ventana mientras se mantiene pulsada al tecla CONTROL.

IMPORTANTE: Las diversas conexiones pre-configuradas se encuentran en los archivos .CNX del directorio \macros\CNX, con el siguiente criterio: nombre de archivo fieado_<aaa>.cnx que es un archivo de texto, siendo el código 'aaa' las tres letras de la extensión del archivo a conectar. Se dan varias predeterminadas con la cadena de conexión para archivos MDB, XLS y CSV (que es el mismo que se utiliza para TXT). Para utilizar una cadena de cualquier otra extensión, a una base de datos en particular, que no es un archivo único con una extensión reconocible, basta con arrastrar el archivo .CNX que hagamos con la cadena de conexión sobre la ventana de E/S ADO, como si fuese un archivo de BD. Se dan varios ejemplos de conexión con el nombre: mi_base_<nombre_motor>.CNX

 

Campo Tabla, cuando se pone por primera vez una base actual, o se carga una configuración de la pestaña Configuraciones, muestra la lista de todas las tablas de BD, poniendo en las columnas Campos y Registros, el número de ambos en cada tabla.

Pulsando el botón al pie Analiza tablas, se recorre TODA la base de datos conectada y se muestra una estadística de datos que se ve para cada campo en la pestaña Campos. También se puede lanzar individualmente por cada tabla, desde esa pestaña.

El botón Analiza tablas, realiza bajo petición la misma función que al abrir la base por primera vez, para actualizar los datos si han cambiado campos, tablas, tipos de datos, etc. Esta función se ve afectada por los dos conmutadores de la subpestaña Opciones> Chequea / analiza: No crear tablas si no existen y No crear campos si no existen, permite ignorar los nuevos, si queremos leer modificaciones de las tablas o campos con los que estamos trabajando, sin que se altere la estructura con nuevas tablas o campos. 

 

Para realizar una lectura de datos sobre la BD de la aplicación (importación) o volcar los datos de la misma (exportación), tenemos que hacer una correspondencia de tablas y campos de una a otra, mediante el siguiente campo:

En el campo Correspondencia, se pone el nombre de cada tabla de la base de la aplicación, con el formato que se especifica en la subpestaña Sintaxis correspondencia:
-- Se admite un código de tabla como 'doc' o 'con'; si en la pestaña Tablas no se especifica nada, cada campo será de esta tabla.
- Si se especifica un campo tras la tabla, como ', siempre indicará un campo que apunta a un identificador de tabla ROT para clasificaciones (como viacar.via).
- Si cualquier código lleva un guión delante (-), se ignora la línea como si fuese un comentario.
- Se pueden especificar varias líneas con el campo Tabla igual, que tengan distintas correspondencias o condiciones. Al copiar un código bajo otro, se copian todos los datos de la anterior, para que sea más fácil modificarlos.

En los campos Condición tabla y Condición correspondencia, se pueden especificar filtro para que el recorrido de la tabla origen y/o destino no sean completos; cada condición sería el código SQL que va tras el WHERE de una cláusula SELECT. Por ejemplo:

Modo Tabla CCond tabla Corresp Cond Corresp Propósito
Exportar GSER GGSER_CODIGO between 140000 and 160000 via codalt between 140000 and 160000 Selecciona los códigos alternativos (campo codalt) de la BD actual entre 140000 y 160000 del destino, y sólo omodificará los registros cuyo campo GSER_CODIGO está también entre esos valores.
Exportar sincronizando GPAR   esp ide<1000000 Selecciona los conceptos con ide< 1000000 en la tabla de espacios y la exporta completa a la tabla GPAR de la BD de conexión. Si está activo el conmutador Borra registros [...] se eliminarán del destino los que no existan en la BD actual

En las subpestaña Opciones se encuentra un selector con tres modos excluyentes FUNDAMENTAL para el funcionamiento de esta ventana, ya que determina si toda la información de las dos primeras pestañas es de entrada o de salida de la aplicación.

- Modo Exporta (sin sincronizar, necesita destino vacío) - Sirve para exportar en bruto, sin tener en cuanta los datos destino
- Modo Exporta (sincronizando el primer campo de cada tabla) - Exporta datos de la BD actual, permitiendo seleccionar sólo parte de las tablas origen, modificando sólo parte de las tablas destino (mediante condiciones). Además está optimizado para modificar a nivel de campo sólo los que hayan cambiado en el destino.
- Modo Importa (sincronizando el campo 'cod') - Igual que exporta sincronizando pero tomando como origen la base conectada y como destino la BD actual en la aplicación Ingra.

Los tres modificadores que hay bajo el modo (Crea [...], Reescribe[...] y Borra[...]) actúan sobre los dos modos de sincronización (exporta e importa) para permitir o no la creación, modificación de campos y eliminación de registros en el destino, dependiendo del origen. El último modificador, además en el modo exportación sin sincronizar, limpia las tablas destino dejándolas sin registros, antes de hacer el volcado (lo que es equivalente a lo que se hace cuando se sincroniza). Esta operación de borrado se intenta hacer, ya que en una BD se pueden eliminar todos los registros, pero por ejemplo en una hoja Excel o un archivo de texto (al que también se puede conectar) no se puede hacer.

IMPORTANTE: otra particularidad de Excel es que los datos en las columnas (equivalentes a campos) tienen que ser homogéneos en tipo, si se encuentra una celda de texto en una columna numérica, la importación no funcionará.

Se permite insertar líneas en blanco sin dato en la columna Tabla, que harán de separador para diversos grupos de tablas. En la columna Comentario, las notas en estas líneas aparecerán en negrita.

Pestaña Campos de la tabla:

La lista desplegable muestra la tabla sobre la que se ha hecho doble clic en la pestaña anterior, y permite seleccionar cualquiera (en el caso de un libro Excel, por ejemplo, se mostrarán todas las hojas). A la derecha se muestra el número de registros o líneas del archivo.

Atajos de interface en esta pestaña:

· Con el botón derecho del ratón, en cualquier línea de la lista, desde la pestaña Tablas se llega a la de Base de datos, como atajo para no tener que pinchar en las pestañas.

· Con los botones Siguiente/Anterior (teclas F1/F2, como habitualmente), se puede navegar por la lista de tablas sin desplegar la lista.

Debajo está la lista con los nombres de Campos con el Tipo que muestre el sistema de BD o formato de archivo (se añade detrás el texto 'Req' de Requerido, cuando en el campo no se admiten valores nulos), y en la columna Correspondencia se pondrá el campo de BD Ingra en el que habrá que escribir el valor del archivo (si es una importación) o el campo del que se tomará el valor para ponerlo en el campo externo (si es exportación).

El campo Correspondencia admite la sintaxis explicada en la subpestaña Sintaxis correspondencia:

- Nombre_campo, si es de la tabla que le corresponde en la pestaña anterior, sino, 'tabla.campo' en la base Ingra. IMPORTANTE: Se admite la sobrecarga de referencias a campos de tabla CON y tabla de Tipo al trabajar con una de Clase (como con el SQL sobrecargado), es decir, se puede acceder al los campos tip o res de un concepto de clase MAT, sólo con el nombre de campo.
- Detrás de un espacio en blanco tras el campo, se admiten modificadores que potencian las operaciones que se van a realizar con el dato recibido. Se puede utilizar el rótulo de una referencia a la tabla ROT, en vez del código cuando se accede a una clasificación, crear conceptos con la referencia si no existen, rellenar códigos numéricos por la izquierda con ceros...
- Una variable detrás del símbolo mayor '>', cuyo resultado se asigna para cada registro, mediante el código Javascript de la subpestaña Javascript registro. Para cada registro o línea de la tabla actual, se tienen al ejecutar código JavaScript las variables: ide (identificador del concepto actual), bas (objeto base actual), y lin (línea que se está recorriendo de la configuración de la tabla actual).

Por ejemplo:
var PK_en_kms= bas.via.pk2(ide)/1000
var abuelo= bas.con.cod(bas.con.padi(bas.con.padi(ide)))

Al importar, el código de la subpestaña Javascript Registro se ejecuta después de leer el campo externo, para asignar la variable. Al exportar, el código javascript se ejecuta justo antes de cada línea, para asignar la variable que se va a escribir.

Cada campo puede llevar un Comentario descriptivo a al derecha y se pueden introducir líneas en blanco para separar grupos de campos, con sus comentarios, como en las tablas.

La subpestaña Análisis campo es equivalente en formato lista al campo Análisis de cada línea, en el que aparecen los elementos seguidos. Es la más interesante para ver los campos clasificados, los que son numéricos o no, los únicos, los que están vacíos o casi, etc. La notación es: una cadena de texto por cada valor distinto, en la que se muestra entre corchete '[]' el nº de apariciones de un dato en la tabla, y detrás cuál es el dato -de mayor a menor frecuencia de aparición-. NOTA: Al importar campos de tipo lista, el dato que se ve es el identificador del valor de la lista dentro de la tabla ROT de clasificaciones.

La subpestaña Datos tabla muestra los datos como un visor de columnas no nulas, lo que es muy útil para formatos con lectura farragosa (como los textos delimitados por tabuladores o comas) o para los que no se pueden ver directamente, como las tablas de Oracle o SQL server.

Botones al pie:

El botón Prueba al pie de la ventana junto a Ejecuta, muestran un log de las operaciones de que realizan, sin releer o reescribir el archivo externo.

Cuando se trata de importar, a no ser que se simule en script un identificador, no se puede probar, porque no hay ide de registro.

 

Resumen de operaciones posibles:

PARA IMPORTAR: el primer paso es leer las tablas y campos del archivo conectado. Esto se automáticamente la primera vez, y bajo demanda con Chequea tablas. Con Analiza tablas (una vez cargada la estructura de tablas y campos) en las columnas Campos y Registros se mostrarán los datos recogidos del archivo. En la pestaña Tablas, campo Análisis, o bien en la subpestaña Tablas> Análisis campo, se mostrarán los datos de cada campo, para estudiar la correspondencia, si hay que ignorarlos, el tipo de dato (lista clasificada, texto...)

Esto nos permite identificar rápidamente los campos que sólo tienen ceros o nulos, los que tienen pocos datos que se repiten muchas veces (serán listas), los que son de texto, fecha... Al hacer Analiza tablas en la pestaña Base de datos, se hace el de todas las tablas.
El cualquier momento se puede guardar la configuración actual de toda la ventana, con un código y nombre en la pestaña Configuraciones. Al cerrar la ventana siempre se guarda el último estado en la configuración de defecto con código DEF.

Tras el análisis se especifica la correspondencia de los campos deseados, y se ordenan las líneas de tablas y campos de la forma más conveniente. Luego se puede pulsar Prueba o EJECUTA para realizar el intercambio de datos.

PARA EXPORTAR: tendremos creado el archivo con las tablas y campos que vamos a sacar de Ingrid (ya que no se crean tablas ni campos con estos procesos), y la Correspondencia contiene en cada tabla y campo los datos de la base actual en el archivo conectado.

PARA SINCRONIZAR: se trata de una exportación en la que en vez de borrar las tablas (si se indica con el modo correspondiente) y volcar los datos recorriendo los registros de las tablas de la BD Ingra y copiándolos todos, se leen los registros destino para comparar si hay campos cambiados (en cuyo caso se graba sólo el campo modificado) y se dan de alta los registros destino o se eliminan con las condiciones y modos indicados.

COMENTARIOS AVANZADOS y posibilidades especiales: se pueden presentar distintos casos menos habituales que se ilustran a continuación:

* Cargar datos en tabla rcc.- como esta tabla no tiene código que haría de correspondencia, se deben poner todos los campos como referencias a variables de forma que se ejecute el script, no de error, y se puedan utilizar todos los datos que necesitemos de la tabla (en el caso de una importación). Ejemplo: si tenemos una tabla que relaciona dos códigos que serán conceptos, y los recogemos en dos variables >a y >b, podemos cargarlos en RCC con código Javascript como:

i= bas.con.busca(5, 3, a) // obra
j= bas.con.busca(5, 2, b) // proveedor
if (i && j) bas.rcc.creasino (i,j);

* Cargar datos en campos de clasificaciones.- lo habitual al cargar clasificaciones es utilizar el modificador 'c' crear (a no ser que interese partir de una plantilla de valores y no incorporar los que no coincidan), y a veces el 'r' indicando que el valor que se carga es la descripción del rótulo y no el código.

* Cargar referencia forzando tipo y/o clase destino.- por ejemplo en el caso de ascendientes, si en un campo tenemos números de comunidades autónomas con el formato 3, 7, 10... podemos cargarlos como espacios ascendientes con la correspondencia: padi l1:31 t2, es decir fuerza a conceptos de tipo 31 y clase 1, añadiendo un cero por delante a los códigos.

* Convertir 4 campos en valores de una lista.- tomando varios campos (booleanos en el siguiente ejemplo) que son excluyentes entre sí, podemos componer los valores de un único campo lista:
 

* Cargar datos en múltiples tablas incluidas líneas de documentos.- el siguiente código es bastante interesante: utiliza un borrado en cada ejecución, ya que las líneas de documento, como no tienen identificador, se irían añadiendo y duplicando en cada carga. Aquí con una sola tabla se dan de alta conceptos de tipo documento, obra, proveedor... y se relacionan con líneas de documentos: