ene 20

PRE y POST al botón Aceptar de un formulario

Posted in ejercicios, trucos, tutores

Aqui os dejo un enlace al hilo relacionado con este artículo.

http://velneo.es/foros/topic/interfaz-aceptar-1

Para los que venimos de V6, en ocasiones se echa de menos los eventos PRE y POST a la pulsación del botón aceptar de un formulario:

En V7 no tenemos esta opción, o al menos no tal como la conociamos.

En V7 podemos crear uno objeto Formulario con un botón Aceptar y en las propiedades del botón, le indicamos el Comando “Aceptar”, esto funcionaria correctamente y guardaria los cambios de la ficha cerrando despues el formulario, pero a cambio de la sencillez, no podemos ejecutar ninguna sentencia ni antes, ni después de guardar la ficha.

Si necesitamos ejecutar algún evento PRE o POST al cerrar el formulario, debemos realizarlo de la siguiente forma:

Creamos un evento “EVENTO_ACEPTAR” en el formulario, que no es otra cosa que un proceso interno al formulario y que solo puede ser ejecutado desde ese objeto, y en el evento, indicamos las siguientes instrucciones:

  1. Sentencias del PRE …. (escribimos todas las sentencias que queramos ejecutar antes de guardar la ficha)
  2. Interfaz: Guardar ficha en alta o modificacion … (aqui es donde se guardan los cambios del registro en la base de datos)
  3. Sentencias del POST … (aqui ya no podemos modificar campos de la tabla, pero podemos ejecutar otras sentencias)
  4. Interfaz: Aceptar … (Cierra el formulario)

Tras la ejecución del comando “Interfaz: Aceptar” ya no se ejecuta nada, pero tampoco tiene mucho sentido, si debemos mostrar algún mensaje o realizar alguna operación, debemos hacerlo en las posiciones 1 (PRE) o 3 (POST).

Para cualquier duda, podeis dejar un comentario.

PDF Printer    Enviar artculo en formato PDF   
comments: 1 »
oct 7

Cálculos acumulados en la cabecera de página

Posted in ejercicios, foro, utilidades

Se dice, se comenta, se rumorea ….

Que no es posible incluir los acumulados de los importes de una página, al inicio de la página siguiente.

Eso es, lo que pretendemos es incluir un “Suma y sigue …” al inicio de cada página del informe, y surgen un problema en el calculo de los acumulados en las variables que utilizamos para la impresión de dichos importes.

A raíz de aqui, buscamos una solución sencilla que nos resuelva el problema:

y parte de esa solución esta en duplicar las variables y los calculos necesarios para los acumulados.

Asi es, puesto que tenemos dos variables PIE_DEB (para el acumulado del debe) y PIE_HAB (para el acumulado del haber) y que son las que utilizamos en el pie de página del informes (y estos cálculos los hace correctamente).

He decidido que necesitariamos otras 2 variables (aunque en la imagen solo se ve una de ellas) CAB_DEB (para el suma y sigue del Debe) y CAB_HAB (para el suma y sigue del Haber).

Y hasta aqui, no hay diferencias sustanciales en nuestro informe, salvo por el hecho de usar 4 variables en vez de 2.

El informe ya tenia 2 “Cálculos” PIE_DEB y PIE_HAB para realizar las operaciones con las variables PIE_DEB y PIE_HAB respectivamente, y las propiedades en cada uno de ellos para sumar en Modo: Acumulado y en Fórmula, el importe (#IMP_DEBE o #IMP_HABER) de cada una de las columnas.

Con esto, ya conseguimos que aparezcan las sumas en el pie de página correctamente …

Ahora, falta realizar los Cáculos para que aparezca el “Suma y sigue …” en la cabecera de cada página, antes de la primera línea de la página.

Y para eso creamos 2 nuevos Cálculos, uno llamado CAB_DEB y otro llamado CAB_HAB y en ellos usamos las propiedades Modo: Absoluto y en Fórmula, indicamos la diferencia entre el importe de la variable acumulada del pie de pagina anterior y el importe de la linea: PIE_DEB-#IMP_DEBE para la primera columna y PIE_HAB-#IMP_HABER para la segunda.

Y despues de realizar las pruebas con un informe con varias páginas de registros, he podido comprobar que funciona correctamente.

PDF Printer    Enviar artculo en formato PDF   
comments: Comentarios desactivados en Cálculos acumulados en la cabecera de página
sep 6

Sumar horas

Posted in ejercicios

Un compañero del foro solicita una función para sumar horas en este hilo, y en la versión actual no está, pero ¿quién la necesita?

Algo tan sencillo lo podemos crear nosotros mismos.

Una pequeña ayuda, y en solo 4 pasos tendremos la función terminada y en ejecución:

  • Crea una funcion y define en ella las siguientes variables, todas de tipo numérico excepto la última que es la que usaremos para retornar el resultado.

  • Ahora vamos a definir el proceso para realizar la suma, en el, lo unico que debemos hacer es sumar las horas totales, por otro lado sumar los minutos, y despues comprobar si la suma de los minutos supera los 59, en cuyo caso aumentamos una hora y disminuimos los minutos correspondientes. Y finalizamos retornando el resultado en la variable de texto, para enviar horas y min. al mismo tiempo.

  • Y para finalizar la función, definimos el orden de los parametros que debe recibir la función al ser llamada. Primero la hora y los minutos del tiempo 1 y luego la hora y los minutos del tiempo 2.

  • La función ya está terminada, ahora solo queda llamarla desde donde sea necesario, pasandole como parametros las Horas y Minutos que queremos sumar

Sencillo, y funcionando en menos de 5 min.

Claro que podriamos tener la necesidad de sumar mas de 2 tiempos y aparentemente la función no esta preparada, pero os aseguro que podriamos sumar todos los tiempos que queramos sin necesidad de modificar esta función.

Pero eso ya os lo dejo para pensar.

PDF Creator    Enviar artculo en formato PDF   
comments: 1 »
feb 3

Guia V7: ejemplos

Posted in ejercicios, tutores

Conjunto de ejemplos y utilidades para empezar a desarrollar con V7

Si sabeis de algún enlace interesante, podeis indicarmelo y actualizaré este post.

Recomendaciones a tener en cuenta:
Nomenclatura de objetos:

La documentación:

Sobre los componentes de la herramienta:

Ejemplos sencillos:
Ejemplo básicos para iniciación al desarrollo con V7:

Ejemplos avanzados:
Aqui podreis encontrar ejemplos avanzados de pequeñas aplicaciones o utilidades:

También podeis encontrar más ejemplos entre las Open Apps.

.

Create PDF    Enviar artculo en formato PDF   
comments: Comentarios desactivados en Guia V7: ejemplos
ene 25

Favoritos en ejecución

Posted in ejercicios

Si ya habeis realizado el ejercicio de ayer, ahora solo debeis realizar unos sencillos pasos para poder ejecutar la aplicación:

  1. Ejecutar vAdmin para Instanciar la aplicación, y dar permisos de ejecución a los usuarios
  2. Ejecutar vClient para tener acceso a la aplicación y poder realizar las primeras pruebas

Aqui os dejo una imagen para el recuerdo, de los inicios del blog, en las pruebas realizadas con este sencillo ejemplo.

Y otra prueba mas de que el ejemplo funciona,

Para tener acceso a todas estas webs, solo debes pulsar sobre la rejilla con el botón derecho del ratón y añadir o modificar los registros de la misma. Despues, solo debes seleccionar un registro y se visualizará la web automáticamente.

¡¡¡ Nos vemos en la vCena !!! 😀

PDF Download    Enviar artculo en formato PDF   
comments: Comentarios desactivados en Favoritos en ejecución
ene 24

Marcadores o favoritos

Posted in ejercicios

Dependiento del navegador en que nos encontremos, una de las opciones mas usadas en cualquiera de ellos es la opción de Favoritos o de Marcadores, que viene a ser, un registro de las paginas web que visitamos con bastante frecuencia.

Y precisamente porque es algo tan habitual, en esta ocasión, he decidido realizar un pequeño y sencillo ejercicio para obtener el mismo resultado, en una aplicación de V7.

Bueno, precisamente el mismo, quizá no, os dejo a vosotros la tarea de darle un estilo agradable. Pero al menos, si vamos a tener la misma funcionalidad al finalizar el ejercicio.

Empecemos pues:

En primer lugar necesitamos 2 proyectos, uno de datos y otro de aplicación, como vemos en la imagen del margen superior derecho.

En el proyecto de datos, solo vamos a utilizar 2 objetos, una VARIABLE global de tipo númerica como se aprecia en la siguiente imagen.

Y también una tabla, cuya estructura vemos a continución, y en la que vamos a guardar toda la lista de favoritos que visitamos habitualmente.

Ya está, ya tenemos el proyecto de datos finalizado.

Pues comencemos con el proyecto de aplicación, que la verdad, tampoco es mucho mas complicado:

Primero, vamos a crear una rejilla y un formulario para el mantenimiento de la tabla que usaremos para almacenar nuestras URL’s

A continuación teneis el formulario y sus propiedades. No voy a entrar en detalles sobre como incluir los cotroles de edición y los botones, que eso ya es muy básico.

Y luego creais la rejilla y le asignais el formulario para Altas, Modificación y Bajas. También podeis crear un formulario para cada cosa, eso ya es decisión vuestra.

Ahora viene la parte interesante, en la que debemos mostrar las paginas web, al pulsar sobre un registro de la rejilla.

Para eso vamos a utilizar un formulario principal, donde visualizaremos el resultado. En este formulario, necesitamos mostrar la rejilla de favoritos y un control “Visor Html” para mostrar la pagina web seleccionada.

Para mostrar la rejilla necesitamos un proceso, sin origen (igual que el formulario) y cargamos la lista de favoritos y retornamos la lista con el resultado.

Para nuestro formulario principal, he decidido que será suficiente con mostrar la rejilla a la izquierda para seleccionar la web favorita, y el visor Html a la derecha para mostrar la pagina web. Y a continución, podeis ver el resultado.

En este formulario principal, ya solo nos queda por hacer 2 operaciónes:

  1. Crear el evento que se ejecutará al seleccionar el registro de favoritos y
  2. Crear una conexión de evento para que se ejecute el evento en el momento apropiado, al pinchar con el ratón sobre cualquier registro de la rejilla.

Aqui teneis el evento y la conexión de evento:

Ahora ya solo nos queda una cosa para terminar el ejercicio y poder ejecutarlo. ¿Que?

Pues crear el AUTOEXEC  y asignarle el formulario anterior,

En ejecución, solo necesitaras crear algunos registros sobre la rejilla, y luego podrás comprobar como al cambiar la selección sobre la rejilla, se actualiza automaticamente la página web deseada.

PDF    Enviar artculo en formato PDF   
comments: 7 »
ene 13

Calculo de stocks II

En el post de ayer, veiamos como realizar un sistema de control de existencias, el más básico de todos, con un solo almacén.

Aqui teneis el enlace para los que no lo visteis:

Calculo de stocks I

Hoy vamos a complicar un poquito el ejemplo, y vamos a convertir nuestro control de existencias en un sistema multi-almacén.

Y para el ejemplo de hoy vamos a necesitar unos cuantos cambios sobre el ejercicio de ayer, pero, dejando claro, que ambos sistemas son compatibles y pueden ser realizados sobre el mismo ejercicio.

Para convertir el ejercicio anterior a multi-almacén necesitamos lo siguiente:

  • Una tabla de Almacenes
  • Una tabla para controlar el Stock

Y por supuesto, necesitamos enlazar estas tablas en el esquema anterior.

Control de stocks en varios almacenesPara incorporar estas tablas a nuestro anterior esquema, solo necesitamos:

  1. En la tabla de “Lineas de documentos”, creamos un enlace a la tabla maestra “Almacen”, para saber en que almacén se produce cada movimiento.
  2. La tabla de “Stock” debe tener enlaces a las tablas maestras “Almacen” y “Productos”, y por supuesto, un campo numerico para guardar el Stock, #STOCK
  3. En la tabla “Stock”, tambien necesitamos un indice de clave unica, formado por los campos #PRODUCTO y #ALMACEN, para evitar que esta tabla tenga registros repetidos.
  4. De nuevo, en la tabla “Lineas de documentos”, necesitamos un campo “Puntero indirecto” a la tabla “Stock” mendiante el indice de clave única formado por #PRODUCTO y #ALMACEN, al que llamaremos #PROD_ALM .
  5. Y para terminar, tambien en la tabla de “Lineas de documento”, necesitamos crear la “Actualización”, a través del campo #PROD_ALM , para acumular la #CANTIDAD en el campo #STOCK de la tabla “Stock”

Una vez creada la actualización, solo debemos indicar el campo a actualizar #STOCK, el modo de actualización “ACUMULAR” y como formula:

¿que formula usariais para actualizar? … pensad un poquito

… pensad un poquito mas

… vale, es que no deberia tener que decirla, es la misma de ayer.

choose( #TIPO=”C” , #CANTIDAD , – #CANTIDAD)

¿Como es posible que la misma formula sirva para actualizar el sistema multi-almacén?

Pues, muy sencillo, porque la actualización se realiza sobre una tabla diferente y esa tabla (Stock), dispone de un indice de clave única que combina las 2 tablas maestras “Productos” y “Almacén”.

¿Cuantos almacenes puedo controlar con este sistema: 2 , 3 , 4?

El ejemplo de ayer nos permitia controlar solo UN almacén. En este ejemplo, no hay una limitación del número de almacenes, en realidad depende del campo #ID de la tabla “Almacén”, si has creado un #ID con valor autonumerico de 1 byte, podrás controlar 255 almacenes, pero si amplias el numero de bytes del valor numérico a 2, podrás contolar más de 65.000 almacenes, y puedes seguir ampliando el número de bytes, pero la pregunta es ¿cuantos almacenes necesitas realmente?

Si vamos a usar la misma formula para actualizar y las dos actualiaciones deben ser creadas en la misma tabla de “Lineas de documento” ¿podemos hacer esto con una actualizacion para las 2 tablas?

La respuesta es ¡NO!, ya que, cada actualización debe corresponderse a un campo enlazado a una tabla maestra o a un puntero indirecto, y como puedes comprobar, la primera actualización acumula el resultado en la tabla “Productos” y la segunda, acumula el resultado en la tabla “Stock”

Y una última pregunta, ahora que he creado el sistema de control multi-almacén, ¿para que necesito mantener la acualización del ejemplo de ayer?

Por una razón muy sencilla: porque manteniendo las 2 actualiaciones, gestionamos mejor nuestro almacén, sabiendo las existencias de cada producto en cada uno de los almacenes, pero también, conociendo el stock acumulado de cada producto.

¿Alguna pregunta más?

Create PDF    Enviar artculo en formato PDF   
comments: 6 »
ene 12

Calculo de stocks I

Vamos a analizar a partir de ahora y en los proximos post, un sistema de control de existencias, y porque en varios post, y no solo uno.

Pues bien, no se trata de hacer un culebrón con este articulo, ya que lo que pretendo es finalizar cada ejemplo en cada uno de los articulos. Se trata de realizar varios ejemplos en base a diferentes analisis para cubrir varias posibilidades.

Y en este primer articulo vamos a ver como realizar el calculo de existencias cuando trabajamos con un almacén, que seria el caso mas sencillo que se nos va a presentar en cualquier aplicación de gestión.

Bueno, es falso, en realidad el ejemplo mas sencillo, seria no tener que controlar el stock 😀 , pero en ese caso, este articulo no tendria ningún sentido.

¿Que necesitamos para realizar este ejercicio?

Pues basicamente, 3 tablas:

  • La tabla de Productos,
  • La tabla de Albaranes (Documentos de venta y/o de compra)
  • Y la tabla de Movimientos (Lineas de documentos)
  • Si utilizamos la misma tabla para movimientos de compra y de venta, entonces, tambien necesitaremos una tabla estatica para diferenciar el tipo de movimiento a realizar, aunque también podriamos usar otros metodos para resolver ese problema.

Ahora que ya conocemos la estructura de nuestra aplicación, ¿cual es el siguiente paso?

Algunos se estaran preguntando, ¿y la tabla de entidades?, ¿donde está?, ¡vaya ejemplo de gestión!, pero es que, para este ejemplo, la tabla de entidades no pinta absolutamente nada, y como no nos resulta útil, he decidido prescindir de ella y centrarnos solo en lo verdaderamente importante: los productos y su stock.

Control de stock de un almacénAhora que ya he dejado claro este punto, seguimos con el ejemplo, el siguiente paso.

La tabla estatica, solo necesita 2 valores, “C” para compras y “V” para ventas. Y en la tabla de Lineas de documentos, debemos crear un enlace a la tabla estatica, para conocer el tipo de cada una de las operaciones realizadas.

Debemos crear las relaciones entre tablas, y aunque puede haber preferencias al elegir el tipo de tabla, el esquema quedara asi. La tabla de movimientos puede ser maestra con un enlace a “Documentos” o tambien submaestra de “Documentos” , pero eso depende de cada uno.

El calculo del stock, lo vamos a realizar directamente en la tabla de Productos, con un campo numérico para acumular el resultado.

Y para obtener dicho acumulado, solo necesitamos crear una “actualización” en la tabla de “Lineas de documentos”, sobre el campo enlazado a la tabla maestra de “Productos”.

Para finalizar el ejercicio, solo debemos indicar el modo de actualizar “ACUMULAR”, y en la Formula: ¿que?

En la formula bastaria una función:

choose( #TIPO=”C” , #CANTIDAD , – #CANTIDAD)

que en castellano, viene a significar:

Si el movimiento es una Compra, “Suma” el campo #CANTIDAD y si no lo es, “Resta” el campo #CANTIDAD.

Create PDF    Enviar artculo en formato PDF   
comments: 7 »
ene 11

Una de búsquedas por multiples claves

Posted in ejercicios, foro

Nuestro amigo Héctor González nos plantea una serie de dudas en este hilo del foro:

dudas-sobre-varias-funcionalidades

Y aprovecho este post para responder a la tercera de sus consultas con un poco mas de detalle.

Planteamiento:

¿Es posible realizar busquedas donde el indice pueda ser varios valores posibles?  ¿Algo como el INLIST o el EXIST en SQL?, hasta ahorita lo hemos resuelto con varias comparaciones OR. Queremos eralizar consultas como ¿Dame los movimientos contables de los clientes que se encuentran en una lista dada?

Solución:

Para solucionar este problema vamos a usar 2 Cestas, que ya podeis ir creando:

  • Una, para la tabla de clientes, en ella guardaremos los clientes de la lista.
  • Otra, para la tabla de movimientos, en ella guardaremos el resultado.
  • También necesitamos una búsqueda de movimientos de UN cliente, con un indice CLIENTE por parte izquierda

Muchos ya estareis imaginando el resultado, es muy sencillo.

Ahora que ya tenemos los clientes en la primera cesta, solo tenemos que crear un proceso, el origen de este proceso da igual, dependera de donde lo useis, pero no influye en el resultado.

En el proceso, “Procesamos la cesta de CLIENTES” y recorremos la lista en modo “solo lectura”, y en cada uno de los registros de los clientes, ejecutamos una “Busqueda” en la tabla “movimientos”.

Para cada registro de la cesta de clientes, asignamos el ID del cliente a una variable, y mediante las sentencias del “Manejador de objetos”, asignamos la variable a la búsqueda y ejecutamos la busqueda de movimientos de un cliente.

El resultado de esa búsqueda, lo agregamos a la otra cesta que habiamos definido, y vamos agregando todos las listas de movimientos a la “Cesta de MOVIMIENTOS” hasta finalizar la lista de clientes.

Una vez finalizada esa parte, ya solo nos queda ver el resultado, como:

“Procesamos la Cesta de MOVIMIENTOS” y “Añadir lista a la salida”

Ahora solo tienes que definir una ACCION que ejecute el proceso y retorne una rejilla para mostrar el resultado.

Como podreis imaginar, ¡yo tambien lo estoy imaginando!, y deberia funcionar. Pero, a estas horas, no tengo ganas de abrir vDevelop ni tiempo para probar si el resultado es correcto.

Pero aunque puedo haber olvidado algún detalle, lo importante es captar el concepto.

¿Lo pillas?

Create PDF    Enviar artculo en formato PDF   
comments: 4 »
ene 10

Arrastrar y soltar

Posted in ejercicios, tutores

Justo antes de navidad, nuestro amigo Miguel, nos preguntaba sobre el “Drag and Drop” , asi que aqui dejo un ejemplo sencillo de como hacerlo:

Este ejemplo esta basado en el ejemplo de facturación incluido en vGestión, pero he querido simplificarlo un poco para que resulte mas sencillo de entender.

En primer lugar, he creado un formulario, y en el podemos apreciar como aparecen 2 controles objeto, con 2 rejillas. En la parte superior, una rejilla para mostrar los albaranes que estan pendientes de facturar y en la parte inferior, una rejilla para mostrar las facturas generadas.

El control objeto de la parte superior, ejecuta un proceso para cargar la lista de albaranes pendientes de facturar, y no voy a mostrar el proceso, ya deberiais saber como es. Solo os dire que si origen debe ser el mismo que el formulario donde lo hemos incrustado y el destino debe ser la lista de albaranes a mostrar.

Para el control objeto de la parte inferior, necesitamos otro proceso, con el mismo origen que el formulario, y destino en la lista de facturas. Si queremos mostrar una rejilla vacia, este proceso no debe contener nada, un simple proceso vacio.

Ahora tenemos que crear las rejillas, y aqui solo voy a indicar, que la rejilla de albaranes (Drag) tenemos que cambiar la propiedad “ESTILO” y marcar una de las 2 opciones que vemos en el grafico:

  • Arrastrable para copiar, si marcamos esta opción, al arrastrar los registros a la otra rejilla, estos no serán borrados de la rejilla de albaranes.
  • Arrastrable para mover, si marcamos esta opción, al arrastrar los registros a otra rejilla, desaparecerán de la rejilla de albaranes, pero no son borrados de la base de datos. Para este ejemplo, vamos a utilizar esta opción.

Ahora queda definir la rejilla de facturas (Drop), donde soltaremos los registros despues de arrastrar.

En esta rejilla de facturas, tenemos que crear un subobjeto DROP y asociarle el proceso a ejecutar cuando alguien “deje caer” los registros arrastrados desde otra rejilla.

Vemos como asociar el proceso al subobjeto DROP

Y por supuesto, necesitamos el proceso que vamos a ejecutar al realizar el “DROP”, y en este caso, es el proceso que realiza la facturación de los albaranes, con origen el la tabla de albaranes (DRAG) y destino en la tabla de facturas (DROP).

El proceso debeis realizarlo vosotros, aunque podeis ver como se llama a otro proceso para poder ejecutar la operación en3 plano.

Si quereis mas información, teneis un “Tutor” entre las Open Apps llamado “Tutor de drag and drop” donde se muestra un ejemplo similar.

PDF    Enviar artculo en formato PDF   
comments: 2 »