¿Tubos?…¿y eso qué es? (y iii)

Veamos con un ejemplo real la diferencia de actuación de los tubos de lista y de ficha.

Supongamos una aplicación en la que hacemos albaranes y facturas con una estructura de tablas como la siguiente.

Esquema de tablasHe puesto las tablas de cabeceras de albaranes y de facturas como submaestra de años para aprovechar su código como contador y así que comience a contar en 1 en cada año ( ver articulo )

Así mismo las lineas son a su vez submaestras de las cabeceras correspondientes.

Los campos que tenemos en las tablas cabeceras son practicamente los mismo en una y en otra tabla , al igual que ocurre con los campos de las tablas lineas.

Hagamos ahora los objetos visuales que nos permitirán facturar un albarán.

El proceso general para hacerlo sérá: tenemos una ficha de Cabecera de Albarán de la que

cuelgan sus históricos Lineas de Albarán. Tomaremos los datos de la CAlbarán y los pasaremos a un ficha de CFacturas. Una vez hecho esto, he de recorrer las lineas de LAlbaranes para hacer lo mismo, es decir, llevarlas a LFacturas pero indicándoles a dichas lineas a qué CFactura pertenecen. Para ello usaremos dos métodos. El primero mediante dos tubos de ficha y el segundo con un tubo de ficha y otro de lista.

Método 1: dos tubos de ficha

Crearemos primero el tubo de ficha para pasar datos desde una Cabecera de Albarán a una Cabecera de factura

Tubo de cabecera

Vemos que los capilares que usamos son pocos, no  utilizamos todos los campos, sólamente los que son necesarios para definir la factura al final del tubo, el cliente, el año y el almacén, en caso de ser multialmacén. El resto de los campos de CFactura, se “rellenarán” o bien por contenidos iniciales de los mismos o bien mediante actualizaciones desde las lineas

Después creamos el tubo de ficha para las lineas en el que usaré dos capilares, el puntero al Artículo y la cantidad de unidades vendidas.

El proceso para facturar un único albarán será el siguiente.

Proceso en el que ser realiza la facturación de un albarán.

Con lo que obtenemos la factura con sus lineas correspondientes.

Método dos: un tubo de ficha para las cabeceras y un tubo de lista para las lineas

Creamos el tubo de lista desde LAlbaranes a LFacturas, con los mismos capilares que los usados en el tubo de ficha. Los cambios irán en el proceso de facturación que se lanza desde la ficha de CAlbarán

Facturación

Observar que en el post del primer tubo, ya no uso los Set para guardar valores en varialbles locales sino la instrucción de proceso

Guardar ficha, lo que nos permitirá usar un Tubo de lista con inducción. Esta inducción nos permite indicar a todas y cada una de las lineas de factura que se van creando a la salida del tubo de lista a qué ficha de maestro( CFactura) pertenecen.

La inducción hace que cada línea de la factura apunte a la misma cabecera, es decir, introduce el código del registro de la cabecera de la factura en el campo enlazado de los registros de Líneas de Factura.

Cualquiera de los dos métodos es válido. El primero, con tubo de ficha en las lineas, nos permite modificar los registros de salida del tubo, en cambio el tubo de lista no lo permite.

En el caso de tener que facturar varios albaranes en una única factura, podríamos hacer un proceso con origen lista de CAlbaranes para poder lanzarlo como una opción desde una toolbar en una  búsqueda de albaranes presentada en una rejilla multiselección, para ejecutarlo contra los seleccionados. Dividiremos así mismo el proceso en dos. En el primero, ordenamos la lista por Cliente para luego multipartirlo por ese mismo campo. Con ello logramos una “minilista” con cada todos los albaranes de un cliente, y por cada una de esas minilistas, ejecutamos el proceso que los factura.

Proceso llamador

Proceso llamado en el que se realiza la facturación de la minilista de los albaranes de un único cliente. Este proceso se repetirá por cada una de las multiparticiones que se obtengan en el proceso llamador.

¿Tubos?… ¿y eso qué es? (ii)

Les toca el turno ahora a los tubos de lista. Antes hemos visto que los tubos en general producen altas en una tabla de destino tomando datos de una tabla origen. En el caso de los tubos de lista, además, tanto el origen como el destino pueden ser no tablas de nuestra aplicación sino bases de datos externas.

Tubo de lista

Cuando en la galería de objetos escogemos un tubo de lista nos encontramos con este cuadro de diálogo. En él podemos ver las características esenciales de un tubo de lista:

Estilos:

Privado: Si se activa esta opción el tubo solamente podrá ser disparado desde donde el programador indique, si está desactivado el usuario final podrá dispararlo desde cualquier lista de la tabla de datos de origen del tubo. Hemos de tener en cuenta que en ejecución, cuando tenemos en pantalla una lista resultado de una búsqueda en la barra de Herramientas la opción Procesos, nos aparece un desplegable en el que podremos lanzar tubos o procesos SI NO ESTÁN MARCADOS COMO PRIVADOS
No indexar y hacer regen al final: Si se trata de un Tubo de importación, de puede activar o desactivar esta opción. Reduce enormemente el tiempo de duración de la importación de datos. Primero realiza la importación de datos y posteriormente regenera los índices de tabla de destino.  Antes de ejecutar un tubo de importación con esta opción activada, es aconsejable borrar previamente los registros de la tabla de datos de destino (la de Velneo) o que esta contenga muy pocos registros, pues esta opción ni comprueba los campos código ni lo indexa hasta que no se hayan importado todos los registros. Velneo recomienda  no utilizar nunca esta opción en el caso de que la tabla de destino tenga definido el contenido del campo código como Siguiente al último, pues, al no indexarse los registros al ejecutar el tubo, todos los registros importados quedarán con el mismo código. De hecho es siempre aconsejable que la importación la hagamos previamente a un tabla intermedia, no a la tabla definitiva, para evitar problemas. Una vez que hacemos todas las comprobaciones, con un nuevo tubo de lista pero esta vez interno, nos llevamos los datos de la intermedia  a la definitiva.

Usar contenido inicial campos destino: Si se activa esta opción al generarse los registros se dispararán los contenidos iniciales definidos en los campos de la tabla de datos de destino. Es aconsejable por tanto no crear en el tubo capilares para los campos de la tabla de destino que tengan establecido un contenido inicial.
Usar código automático en destino: Este estilo solamente estará activo cuando se haya desactivado el estilo anterior (usar contenido inicial campos destino). En el caso de que la tabla de destino sea maestra, es decir, que tenga definido un campo CODIGO y, si su contenido inicial es Siguiente al último, habrá que activar este estilo para que la codificación de los registros de la tabla de sea automática. Si este estilo está desactivado y el código se pasa en un capilar, si en la tabla de destino existe algún registro con el mismo código, el registro no será dado de alta.

Usar actualizaciones en destino: Si la tabla de datos de destino tiene definidas actualizaciones, si se activa esta opción al generarse los registros éstas serán disparadas, si no, no.

Además los flujos de la informacion pueden ser internos, de importación o de exportación. He de confesar que tanto el In-com Serie como el Out-com Serie no los he usado nunca, pero tengo entendido que son un primer intento de comunicación mediante puerto serie, antes de que ese objeto visual concreto se desarrollara.

En los casos de flujo Interno, es decir, cuando el origen y el destino son tablas de Velneo, es posible hacer un alta de ficha en un maestro de la tabla destino. Señalando la opción ¿Dar alta?, se activan las listas desplegables Maestro,  Formulario, y Formulario visualización final salida tubo. En la primera se elige la tabla maestra donde se desea realizar el alta. En la segunda se elige el formulario para el alta. En la tercera se indica el formulario donde se puede ver el resultado final del tubo.

La casilla de verificación ¿Pedir? se utiliza para declarar el formulario mediante el cual se puede introducir un valor fijo en uno o en varios campos de todas las fichas de destino.

La forma de crear los capilares es idéntica a la de los tubos de ficha.

 Una diferecia fundamental a la hora de elegir entre recorrer una lista para lanzar un tubo de ficha por cada uno de los registros o cargar una lista y lanzar un tubo de lista estriba en que a la salida del tubo de lista no podemos hacer nada en los registros recién dados de alta, es decir, en el tubo de lista no hay Pre y Post como en el de ficha. A veces esto puede ser una ventaja y otras no, eso depende del gusto de cada uno. Particularmente, cuando necesito hacer traspasos masivos uso el de lista pero en la mayoría de los procesos, prefiero los tubos de ficha pues me permiten un mayor control sobre la salida del tubo, en el Pre puedo modificar campos, por ejemplo. Pero esto debe tomarse no como una recomendación ha tener en cuenta, sino como un simple gusto personal o manía, llamadlo como querais.

En el siguiente artículo, veremos dos procesos de facturación de albaranes, uno con tubos de lista y otros con tubos de ficha.

A %d blogueros les gusta esto: