Perfiles de Importación
Descripción
En general desde los sistemas podemos exportar información estructurada (p.ej. en archivos de texto delimitados por comas o archivos de Excel), lo que es una buena alternativa cuando deseamos hacer una migración de datos y evitar transcribir información de un sistema a otro . También es deseable permitir alternativas a teclear la información usando las pantallas del sistema, por ejemplo, cuando la información se repite cada mes con pequeñas variantes. En este caso podemos guardar un archivo de origen, copiarlo y hacer las modificaciones con una herramienta adecuada (p.ej. Excel) y luego importar la información al Q3.
Cada origen de datos que usamos para cargar información tiene una estructura definida que raramente cambia, por lo que guardamos el perfil en el sistema para usarlo cada vez que tengamos información que cargar. Para esto necesitamos configurar cada perfil en nuestro sistema para especificar cómo está estructurada la información, qué datos vienen, dónde los queremos guardar y qué sucede si la información que queremos cargar ya existe en el sistema. Para esto sirven los perfiles de importación, para definir la estructura de un origen de datos a importar al Q3, por ejemplo un estado de cuenta en formato CSV o un excel de ventas emitidas descargado de la Agencia Virtual SAT.
Tenemos entonces los siguientes conceptos:
Origen de datos |
El archivo de origen que queremos cargar al sistema. |
Destino de datos |
El tipo de documento que estamos cargando, p.ej. transacciones bancarias o compras. |
Perfil de Importación |
Estructura de un origen de datos y configuración de cómo cargarlo al destino de datos. |
Implementación
El método que usamos tiene el siguiente orden:
- Extraer: cargar desde el archivo a una tabla intermedia
- Transformar: validar, limpiar y enriquecer los datos en la tabla intermedia
- Cargar: guardar los datos transformados de la tabla intermedia a la(s) tabla(s) de destino
Los perfiles de importación se consideran configuración del sistema, por lo que son accesibles en los Parámetros Generales.
Cada perfil de importación tiene:
- Un mapeo de columnas de origen y destino para la extracción
- Una tabla intermedia según el destino
- Una lista de acciones con orden, descripción y el comando SQL a ejecutar en la tabla de destino
Puede existir cualquier cantidad de perfiles de importación, por defecto el sistema incluye los necesarios para la carga inicial o migración de datos para implementaciones.
La validación, transformación y carga se hace en el servidor, lo único que debe hacer la aplicación es cargar las líneas del archivo a la tabla intermedia.
Estos son los campos del perfil de importación y su uso:
Campo |
Descripción |
Descripción |
El nombre del perfil. |
Destino |
Lo que estamos importando, internamente se guardan en la tabla clases bajo 'importar.destinos' y la columna código de esa tabla es el nombre de la tabla intermedia. |
Tipo de archivo |
El tipo de archivo puede ser CSV, XLS o XLSX. |
Codificación |
Para archivos tipo CSV ya que los archivos de texto tiene una codificación específica, usualmente son UTF-8. |
Delimitador de columna |
Para archivos tipo CSV, es el delimitador de columna utilizado en cada línea del archivo. |
Delimitador de texto |
Para archivos tipo CSV, dentro de cada columna, cuando el valor de la columna incluye el caracter usado como delimitador de columna se delimita la columna con este caracter, p.ej. si el delimitador es una coma (,) y una línea tiene los campos: <col1>, Empresa, S.A., <col2> debería aparecer en el archivo de texto como: <col1>,"Empresa, S.A.",<col2> para evitar errores de lectura. En este caso el delimitador de columna es una coma (,) y el delimitador de texto es una doble comilla ("). |
Columnas por fila |
La cantidad total de columnas que tiene cada línea (o fila si es tipo excel), sirve para validar que todas las líneas vengan completas y sin datos adicionales. Aquí hay que poner la cantidad total de columnas que vienen aunque solo vayamos a importar algunas. |
Fila encabezado |
La línea/fila que trae los nombres de las columnas en el archivo a cargar, usualmente la número 1. |
Primera fila datos |
La línea/fila en la cual empiezan los datos, usualmente la número 2. |
Número de hoja |
Para archvios tipo XLS y XLSX, es el número de hoja a importar, la primera hoja del archivo es la 1. |
Estos son los campos de las columnas del perfil de importación y su uso:
Campo |
Descripción |
Destino |
El nombre de la columna de destino, este nombre es el comentario de la columna de la tabla intermedia en la base de datos. |
Índice columna origen |
La columna (comenzando con 1) de la columna de origen, esto lo usa el importador al cargar los datos del archivo a la tabla intermedia. |
Columna de origen |
El nombre de la columna de origen, esto sirve solamente como información adicional. |
Estos son los campos de las acciones del perfil de importación y su uso:
Campo |
Descripción |
Orden |
Para definir la secuencia de acciones, porque las acciones modifican los datos de la tabla intermedia incrementalmente. |
Descripción |
La descripción de la acción para referencia. |
Comando |
El comando SQL que modifica la tabla intermedia, limpiando, eliminando o enriqueciendo los datos antes de importarlos. El sistema agrega automáticamente a cada comando una cláusula WHERE/AND lote='< código lote >' La última acción debería ser un INSERT desde la tabla intermedia al destino e incluir el código del lote de operación |
Destinos de Perfiles de Importación
Para crear un nuevo destino hay que hacer lo siguiente:
- Crear una tabla intermedia que incluya todas las columnas que importaremos a las tablas de destino, esta nueva tabla debe heredar de la tabla importar.intermedia y debe estar ubicada en el esquema importar.
- Ponerle un comentario a todas las columnas de la tabla intermedia con un nombre descriptivo para el usuario, p.ej. si la columna se llama tipo_documento, el comentario sería Tipo Documento.
- Incluir el nuevo destino en la tabla clases y en el archivo sql/crear/clases.sql (buscar donde se insertan las clases con código 'importar.destinos'). La clase es 'importar.destinos', el código debe ser el nombre de la tabla (con esquema, p.ej. 'importar.transacciones'), y la descripción es como aparecerá en la lista de destinos en la interfaz gráfica, p.ej. 'Transacciones Bancarias'.
- Agregar un ítem al menú Importar en Operaciones y hacer que se active con el permiso de editar el destino, p.ej. si estamos importando Gastos, le pondríamos de etiqueta 'Gastos' al ítem y se debe activar con el permiso (7, Gastos).
Permisos
La premisa es: si tengo permiso para operar, tengo permiso para importar, p.ej. un usuario con el permiso de operar transacciones bancarias tendrá acceso a importar transacciones bancarias. Aparte, para poder editar perfiles de importación es necesario el permiso de parámetros generales. Por esto, todos los permisos necesarios ya existen, aquí está la lista:
id |
Nombre |
Tipo |
11 |
Parámetros Generales |
Administración |
17 |
Transacciones Bancarias |
Operación |
Clases .NET
Clase |
Carpetas |
Descripción |
PerfilImportacion |
gen/importar, src/importar |
Corresponde a importar.perfiles, incluye los métodos para leer los tipos de archivo a las tablas intermedias |
ColumnaPerfilImportacion |
gen/importar, src/importar | Corresponde a importar.perfiles_columnas |
AccionPerfilImportacion |
gen/importar, src/importar | Corresponde a importar.perfiles_acciones |
Objetos DB
Tipo |
Nombre |
Descripción |
Esquema |
importar |
Para agrupar todo lo de importar. |
Tabla |
importar.perfiles |
Para guardar los perfiles. |
Tabla |
importar.perfiles_acciones |
|
Tabla |
importar.perfiles_columnas |
|
Secuencia |
importar.perfiles_id_seq |
|
Secuencia |
importar.perfiles_columnas_id_seq |
|
Secuencia |
importar.perfiles_acciones_id_seq |
|
Tabla |
importar.intermedia |
Tiene las columnas necesarias para que cualquier tabla intermedia funcione correctamente. |
Tabla |
importar.transacciones |
La tabla intermedia para perfiles con destino de transacciones bancarias. |
Función |
importar.codigo_lote |
Genera el código del lote según la fecha, el usuario y el destino. Este código es importante para agrupar los datos en la tabla intermedia y luego en el destino. |
Función |
importar.crear_columnas |
Al crear un nuevo perfil de importación, esta función jala los nombres de columna y sus comentarios para insertarlos en la tabla importar.perfiles_columnas. |
Función | importar.duplicar_perfil |
Duplica el perfil recibido, incluyendo sus columnas y acciones. |
Función | importar.validar_y_cargar_lote |
Valida que el lote y el perfil estén correctos, luego ejecuta las acciones del perfil en la tabla intermedia. |
Errores DB
Código |
Descripción |
Q3005 |
Errores en importación |
Pantallas
Form |
Accesible desde |
Descripción |
Importar/PerfilesImportacion.vb | Parámetros Generales |
Para crear/editar/eliminar perfiles de importación |
Importar/EditarPerfilImportacion.vb |
Perfiles Importación |
|
Importar/EditarPerfilAccion.vb |
Editar Perfil Importación |
|
Importar/ImportarPerfil.vb |
Operación |
Sirve para importar cualquier perfil de importación, se configura con PerfilImportacion.Destinos |