Velneo: panta rei. Desde mi perspectiva

Febrero 25, 2008

vDeveloper: vayamos por partes (y vi). Recapitulación.

Archivado en: General, Inicio, Tablas — Agustin @ 12:03 am

Como componente final de las tablas tenemos las actualizaciones. Una actualización no permite modificar registros de otras tablas con las que estemos unidos mediante un puntero a singular,es decir, puedo modificar registros de tablas a las que apunte mediante un puntero a maestro, un puntero indirecto o un hermano contiguo.

Su mayor potencia reside en su autorecálculo. Me explico. Supongamos que mediante una actualización, voy llevando a un campo de la tabla Cabeceras de facturas el número de artículos que voy vendiendo. Cada vez que introduzco una linea y pongo las unidades vendidas, al dar de alta la linea se lanza la actualización y me aumenta el contador. Pues bien, si de nuevo entro en la linea y cambio el valor de las unidades, la actualización se rehace, deshace la actualización con el anteriro valor y la rehace con el nuevo. Pero si por alguna causa, borramos una linea, también se recalcula la actualización Y SIN TENER QUE ESCRIBIR NI UNA SOLA LINEA DE CODIGO.

Con  un ejemplo práctico veremos la potencia que encierran las actualizaciones. Supongamos una aplicación para hacer albaranes de venta. Vendemos artículos que tienen un stockaje de almacén y que pueden ir grabados con distintos tipos de IVA. Además queremos llevar en una tabla el IVA repercutido por meses de los distintos tipos de IVA por separado. 

TABLA TIPO TABLA DE DATOS PADRE
CLIENTES Maestro normal con clave numérica -
ARTICULOS Maestro normal con clave numérica -
ALBARANES VENTAS Maestro normal con clave numérica -
LÍNEAS ALBARANES VENTAS Sub Maestro ALBARANES VENTAS
FACTURAS Maestro normal con clave numérica -
LINEAS FACTURAS Sub Maestro FACTURAS

AÑOS. mestra normal con clave numérica

IVA ACUMUALDO. Histórica de Años
A las tablas se han añadido los siguientes campos:

Tabla de ARTICULOS:
IDENTIFICADOR PVP NOMBRE P.V.P. TIPO Numérico LONGITUD 3
IDENTIFICADOR IVA NOMBRE I.VA. TIPO Numérico LONGITUD 1 RANGO MÁXIMO 99 CONT. INI $IVA1$
IDENTIFICADOR PVP-SIN-IVA NOMBRE PVP sin IVA TIPO Fórmula Numérica
FÓRMULA fRedondear( 100 * %PVP% / (100+%IVA%),2 )
IDENTIFICADOR STOCK  NOMBRE Stock TIPO Numérico LONGITUD 2 SIGNO Activado

Tabla de ALBARANES VENTAS:
IDENTIFICADOR FECHA NOMBRE Fecha TIPO Fecha CONTENIDO INICIAL fHoy ()
IDENTIFICADOR NLINEAS NOMBRE Número de líneas TIPO NuméricoLONGITUD 2
Declaramos tres bases imponibles (una por cada tipo de IVA):

IDENTIFICADOR BASE1 NOMBRE Base Imponible 1ª TIPO Numérico LONGITUD 4 SIGNO Activado
IDENTIFICADOR IVA1 NOMBRE I.VA. 1º TIPO Numérico LONGITUD 1 RANGO MÁXIMO 99 CONT INI $IVA1$
Declaramos también otros dos IVA’s más.
IDENTIFICADOR IMP-IVA1 NOMBRE Importe I.V.A. 1º TIPO Fórmula NuméricaSIGNO Activado
FÓRMULA fRedondear(fPorcentaje(%BASE1%,%IVA1% ) )
fPorcentaje (Valor, porcentaje), devuelve el número resultante de aplicar el porcentaje al valor.

Declaramos otros dos campos para calcular el Importe de IVA 2º y del IVA 3º, respectivamente de igual forma que el anterior

IDENTIFICADOR TOTAL NOMBRE TotalTIPO Fórmula NuméricaSIGNO Activado
FÓRMULA %BASE1%+%BASE2%+%BASE3%+ %IMP-IVA1%+%IMP-IVA2%+%IMP-IVA3%
IDENTIFICADOR FACTURADO NOMBRE ¿Facturado?TIPO Booleano (Sí / No) CONTENIDO INICIAL 0
Tabla de LINEAS ALBARANES VENTAS:
IDENTIFICADOR CANTIDAD NOMBRE Cantidad TIPO Numérico LONGITUD 2
IDENTIFICADOR PVP NOMBRE P.V.P. TIPO Numérico LONGITUD 3 CONTENIDO INICIAL %ARTICULOS.PVP%
IDENTIFICADOR IVA NOMBRE % I.V.A. TIPO Numérico LONGITUD 1 CONTENIDO INICIAL %ARTICULOS.IVA%
IDENTIFICADOR IMPORTE-SIN-IVA NOMBRE Importe sin Iva TIPO Fórmula numérica SIGNO Activado
FÓRMULA %CANTIDAD% * %PVP%
IDENTIFICADOR IMPORTE-DEL-IVA NOMBRE Importe del Iva TIPO Fórmula numérica SIGNO Activado
FÓRMULA fRedondear(fPorcentaje(%IMPORTE-SIN-IVA%, %IVA%))
IDENTIFICADOR IMPORTE+IVA NOMBRE Importe con Iva TIPO Fórmula numérica SIGNO Activado
FÓRMULA %IMPORTE-SIN-IVA%+%IMPORTE-DEL-IVA%
La tabla FACTURAS tiene la misma estructura que la de ALBARANES VENTAS, a excepción de los campos NLINEAS y FACTURADO, que no los tiene.

TABLA AÑOS: nos quedamos con el campo código y borramos el campo nombre y los índices NOMBRE, PALABRAS Y TROZOS. Esta tabla, en la que sólo vamos a llevar los años, podemos cargarla de datos con un proceso llamado desde el AUTOEXEC-ON-INIT que tendrá la siguiente estructuraGenera los años

TABLA IVAREPERCUTIDO. Tendrá los campos

TRIMESTRE 1 IVA1: numérico , longitud 4 con 2 decimales y signo

TRIMESTRE 2 IVA1: numérico , longitud 4 con 2 decimales y signo

TRIMESTRE 3 IVA1: numérico , longitud 4 con 2 decimales y signo

TRIMESTRE 4 IVA1: numérico , longitud 4 con 2 decimales y signo

En estos campos llevaremos los IVAS repercutidos por trimestre, para las bases imponibles que correspondan al IVA del tipo 1.  Para los otros tipos de IVAS no tenemos más que hacer otros tantos campos del mismo tipo que el anterior, cuatro por cada tipo

La estructura de tablas queda como sigue

Esquema de tablasPara tener guardados los valores de los IVAS usaremos tres varialbles globales en disco, de tipo numérico y con longitud 3 y dos decimales.

Para guardar los datos generales de la empresa tenemos dos opciones, o bien usar también variables globales en disco en las que iremos guardando los datos de la empresa, como razón social, NIF, domicilio, código postal, población …. así como un objeto visual tipo dibujo para el logo de la empresa usado en los albaranes o las facturas u otra opción que suelo usar y que es crear una tabla llamada CONFIGURACION en la que se crean los diferentes campos que necesite para definir los datos generales de la empresa, incluidos uno o varios campos objeto dibujo en los que guardar distintos logos.

Con ella, nos evitamos tener que tocar con le vDeveloper un objeto dibujo si la empresa cambia de logo, por ejemplo. Para usarla desde las tablas de las cabeceras de Albaranes o Facturas, simplemente, hacemos un puntero a maestro en cada una de ellas a la tabla configuración, con lo que tenemos acceso a todos los campos sobre todo a la hora de imprimir los informes.

Para rellenar inicalmente los valores de la única ficha de esta tabla, podemos lanzár un proceso llamado desde el AUTOEXEC-ON -INIT que tenga las siguientes lineas

Proceso de configuracionEn este mismo proceso podríamos controlar si se ha dado valor a al menos una de las variables globales donde se guardan los IVAS y mostrar el formulario de Configuración en el que tendremos los controles de edición de las variables.

Al mismo nivel que Cargar lista->CONF…..                     

añadimos

if $IVA-1$=0

cargar lista , CONFIGURACION, CODIO

seleccionar ficha por posición->1

modificar ficha seleccionada con formulario, CONFIGURACION

Vayamos con las primeras actualizaciones. Desde la tabla de Lineas de facturas haremos actualizaciones a los campos donde guardamos las distintas bases imponibles, dependiendo del valor del IVA que se aplique al artículo de la linea. Para ello vamos a la carpeta de actualizaciones e insertamos una nueva. Toda actualización necesita un puntero a una ficha para poder actualizar un valor de la tabla apuntada con un valor de un campo de la tabla origen. En este caso, tenemos el puntero a maestro desde la tabla Lineas de Facturas a la tabla Cabeceras. Usaremos este puntero para actualizar las tres bases imponibles, dependiendo del tipo de IVA que se haya usado para la linea.

Actualización a MaestroPara ello usaremo la fórmula condición para modificar. En el caso editado de la base 1, si el iva de la lineas es igual al guardado en la variable IVA 1 lanzaremos la actualización, modificando el campo BASE1, del modo acumular ( sumar a lo que ya había ) lo que está guardado en el campo IMPORTE SIN IVA.

Para el resto de los campos BASE, lo único que variará será la condición de modificación además del campo a modificar.

Si borramos, o modificamos una linea afectando el valor del campo IMPORTE SIN IVA la actualización, ella sóla y sin programar nada más, se encargará de corregir los datos anteriores y salvaguardar los nuevos

Hagamos ahora una actualización a través de un puntero a tabla de datos indirecta real

En la tabla Cabeceras de Facturas creamos un puntero indirecto a la tabla IVAS Repercutidos a través del índice de clave única AÑOS  de esta última tabla, resolviendo el AÑO del origen que el AÑO del destino, y activando el flag Dar de alta si no existe por si es la primera factura de un año determinado que introducimos y por tanto en la tabla IVAS Repercutidos aún no hay creado un registro para ese año.

Puntero

Sólo nos queda lanzar una nueva actualización a través de este puntero para que nos lleve los ivas repercutidos en los trimestres adecuados de cada año.

 Para ello creamos una nueva actualización a través del puntero indirecto.La haremos para el primer trimeste del IVA 1.

La condición será que el trimestre de la fecha sea el 1 y actualizaremos el campo TRIMESTRE 1 IVA 1 con lo que haya guardado en el campo IMP-IVA 1  de la tabla Cabeceras de facturas.

Lo mismo haremos ,cambiano la condición para los diferentes trimestes e IVAS.

Podríamos también hacerlo para los doce meses de cada año. Sólo tenemos que hacer 12 campos por IVA y montar las actualizaciones de la misma forma.

 

Actualizar por puntero indirecto

Si tenemos también implementada a parte de compras en nuestra aplicación, podríamos llevar el IVA soportado en la misma tabla y llevar desde la Cabecera de Facturas de Compra todos los IVAs soportados por trimestre o por meses de cada año, y a la vez un campo fórmula en el que nos calculara la diferencia entre el soportado y el repercutido.

Como hemos visto, con las actualizaciones y los punteros y sin escribir ni una sola linea de código, hemos hecho toda la labor, todo en la parte izquiera del vDeveloper. Combinando toda la potencia de los componentes de las tablas con un buen análisis del problema, tenemos el 90% de la aplicación hecha, a falta de hacer los objetos visuales y de resolver cosas que Velneo no tiene implementadas de forma tan directa pero que haremos con los procesos.

Actualizacion puntero indirecto

Febrero 20, 2008

vDeveloper: vayamos por partes (v)

Archivado en: General, Inicio, Tablas — Agustin @ 10:28 am

El tercer elemento de una tabla son los triggers o eventos de tablas.

Con ellos vamos a poder lanzar procesos que se ejecutarán siempre con origen una ficha de una tabla. Van a sernos muy útiles a la hora de hacer comprobaciones, de modificar valores de campos dependiendo de las condiciones que establezcamos…. además se dá la ventaja de que tenemos la seguridad de que siempre se ejecutan pues no dependen de una pérdida de foco o de que el usuario haya pulsado un determinado botón.

Los eventos de tablas o triggers son de tres tipos: anteriores a , internos a y posteriores a.  A su vez se pueden lanzar desde tres sitios distintos: en un alta, en una modificación y en una baja. Por lo tanto, mezclando ambas cosas tendremos nueve maneras o formas de lanzarlos

Tipos de triggers ¿En qué orden son lanzados los triggers?

1. Trigger anterior

2.La acción asociada: alta, modificación o baja

3. Trigger interno

4. Actualizaciones, que veremos a continuación

5. Trigger posterior.

A la hora de usar los triggers debemos de tener en cuenta varias particularidades: en la versión C/S no incluir  nada que implique la intervención del usuario, por ejemplo, visualizar un mensaje, mostrar un formulario, una pregunta, petición de un dato, etc. El motivo es que este tipo de operaciones se llevan a cabo en el Servidor, por lo que el mensaje o el formulario no serían presentados en el Cliente, sino en el propio Servidor. Si en un evento de tabla se incluyese algo que implicase la intervención del usuario, será obviado por el Servidor. Sólo en los triggers anteriores a se pueden cambiar valores de campos de las fichas , si ponemos una instrucción de proceso “modificar campo” ésta sólo se ejecutará si el trigger es anterior a.

Febrero 4, 2008

Búsquedas en Velneo: un ejemplo sencillo.

Archivado en: General, Inicio, Objetos visuales — Agustin @ 12:48 pm

A partir de una pregunta aparecida en el foro Oficial de Velneo intentaré explicar cómo hacer búsquedas sencillas con el vDeveloper.

Según expliqué aquí , los índices de una tabla nos permiten tener los datos indexados por varios criterios para luego poder acceder a esos registros mediante las búsquedas.

Supongamos un ejemplo muy sencillo. Tenemos una tabla de Facturas en la que hemos creado dos índices, el índice Código, el propio de Velneo con su característica de clave única y alimentado por el campo Código siguiente al último  y un índice Fecha aceptar repetidas y alimentado por el campo fecha de la Factura.

Vamos a hacer un objeo visual búsqueda en el que mediante un formulario de petición de datos, busquemos una factura concreta por su código. La metodología a seguir, sea cual sea el índice a utilizar es más o menos siempre la misma:

1. Creamos una variable global en la que introducir el dato concreto a buscar. En nuestro caso es el código, de tipo numérico, luego nuestra variable será de tipo numérico, con la misma longitud de rando o superior al campo código y con persistencia en memoria independiente de cada tarea en segundo plano. La llamaremos  FACTURA  ($FACTURA$)

2. Creamos un Formulario para Búsquedas en la tabla Facturas, y en él pondremos un texto estático “Factura a buscar” y un control de edición al que le asignaremos la variable $FACTURA$

3. Creamos una búsqueda de la tabla Facturas, índice Código, forma de búsqueda parte izquierda de la clave, contenido inicial del campo la variable $FACTURAS$

4 Formulario inicial de la búsqueda: el que acabamos de crear.

 busqueda.jpg

Nos quedaría crear una opción de menú con la que lanzar la búsqueda. En ejecución se nos presentará el formulario para pedirnos el código de la factura a buscar y nos devolverá una rejilla con la factura encontrada.

Añadámosle una funcionalidad más a la búsqueda. Supongamos que me interesa usar el mismo formulario para buscar también las facturas entre dos fechas determinadas. Para que nos valga para ambas búsquedas a la vez, usaremos una característica de los índices en las búsquedas que es la condición activa.

Sigamos los mismos pasos.

1.Creamos dos variables globales tipo fecha $Fecha ini$ y $Fecha fin$

2. En el formulario especial para búsquedas ponemos dos controles de edición para poder dar valores a ambas variables fecha.

3. A la búsqueda le añadimos un nuevo índice con mezcla cruzar, fecha, forma de búsqueda entre límites, límite inicial $Fecha ini$ y límite final $Fecha fin$. La mezcla cruzar nos permite concatenar varios índices en una sola búsqueda. Si los indices están cruzados, la lista mostrada será la que compartan ambos criterios de búsqueda. Es como un Y booleao, los que cumplen un criterio Y los que cumplen el otro.

cruzada.jpg

Usemos en el índice Fechas la condición de activo. Dicha condición al evaluarse su fórmula, hace que la búsqueda por ese índice se realice o no. Es decir si le ponemos una condición y se cumple, realizará la búsqueda con la mezcla que le hayamos indicado y de la forma que hayamos establecido. Lo más lógico en nuestro caso es que se realice entre fechas si se les dan valores a las dos variables globales    ( fCampoVacio( $FECHA-INI$)=0 ) & ( fCampoVacio( $FECHA-FIN$ )=0 ).

Lo mismo podríamos hacer para condicionar la búsqueda por el código  $FACTURA$ ! 0

Debemos por tanto forzar un contenido inicial a las variables cuando abramos el formulario de búsqueda, poner a cero $FACTURA$  y como vacías las dos fechas. Para ello , creamos un proceso con origen ficha de la tabla Factura. Sus tres lineas serán.

proceso.jpg

Tened en cuenta, que cuando se crea un proceso por primera vez, para que los camios se guarden, hay que salir por el icono de la puerta  , no cerrando con la X la ventana del proceso .

Por último nos posicionamos en el formulario especial para búsqueda y con la combinación Alt+Intro accedemos a su cuadro de propiedades y escogeremos este proceso como Proceso a ejecutar al crearse el formulario.

alcrearse.jpg

Ya tenemos hecha la búsqueda. Si queremos ir añadiendo índices a la misma, sólo tenemos que realizar los pasos y condicionar o no su uso, así como inicializando las variables en el proceso de apertura del formulario.

« Entradas más recientesEntradas más antiguas »

Blog de WordPress.com.