|
19/05/2003
Experto
|
claro que si, con mucho gusto:
como expuse en la respuesta anterior, mi opinion personal es basicamente tener el control total o casi total de las aplicaciones que yo genero, por esta razon las lagunas que puedan provocar las librerias de terceros pueden impedir este control, y en algunos casos el descrontrol de tus propias aplicaciones.
por esta razon, he decidido generar mis propias funciones, librerias, pantallas base, etc. utilizando de base la filosofia de la HERENCIA y el POLIMORFISMO, conceptos que no son muy dificiles de comprender, y una vez que los pones en practica estos permiten hacer cosas mucho mas practicas que las que pueden ofrecer las librerias de terceros.
un ejemplo concreto puede ser un mantenimiento, o ABC, (Altas, Bajas, Cambios), el cual afecte a una tabla especifica, esto surgio como necesidad de el numero de tablas que intervienen en una apliacion y que son necesarias para parametrizar dicha aplicacion, es aqui donde empieza la repeticion de codigo, pantallas, botones, etc., por esto llego a la conclusion que, (al igual que todo el mundo), un mantenimiento es simplemente ALTAS, BAJAS, CAMBIOS, y que esto se repite siempre, bueno pues entonces me dedique a generar una ventana en la cual existiera un control datawindow, 4 botones y basicamente unos eventos los cuales son disparados en funcion de una tarea.
EXPLICANDO:
el control datawindow permite integrar un datawindow object el cual diseño previamente, de los 4 botones uno esta determinado para hacer la funcion de cancelar una operacion o cerrar el mantenimiento, claro esto depende de que actividad este efectuando, de los 3 botones adicionales,
*- uno esta destinado para las altas
*- otro para cambios
*- y el otro para las eliminaciones o bajas
cuando pulso cualquier boton, este ejecuta una tarea relacionada con su actividad, por ejemplo, bulso el boton de altas, internamente en el evento click lo que hace es un INSERTROW(0) al datawindow control, de esta misma pantalla, le cambia el valor a una variable que me informa por el estado de las altas, la cual es de tipo boolean, y dispara un evento del usuario al cual llamo ue_init_values(<ROW>) como veras, en este evento envio la fila, que en este momento estoy insertando, puesto que la funcion insertrow(0) devuelve el numero de fila que insertó, en este evento ue_init_values(), puedo integrar instrucciones de valores iniciales, por ejemplo, si necesito colocar valores en campos que son o no visibles, como una fecha, un codigo, un status, etc. es aqui donde los inicializo utilizando simplemente la funcion SETITEM(), una vez que el boton es activado, este cambia su titulo de ALTAS a GRABAR, y el boton de SALIDA, cambia a CANCELAR, como ya te habras imaginado, esto lo hago simplemente utilizando una funcion tipo protegida, en la misma forma, la cual dependiendo de las variables que me indican altas, o modificacion, configuran los botones, de tal forma que cada vez que pulso uno de estos, envio el control a las funciones adicionales, luego al evento o eventos del usuario, y despues al datawindow control,
entonces: si existe un boton para las altas exite una variable que es afectada y que tiene la misma finalidad, igualmente si existe un boton para los cambios, tambien hay una variable para este proceso, de esta forma se o conozco en que momento estoy, y la funcion que configura mis botones tambien,
claro, cuando pulso el boton de altas, cambia el valor de la variable, configura los botones, dispara el evento y da el control al datawindow,
el boton de altas cambia su titulo de ALTAS, a GRABAR, y el boton de SALIDA cambia a CANCELAR, por supuesto que cada uno de estos en su evento CLICK pregunta por el valor de las variables relacionadas con la accion, y asi ejecutan un proceso u otro, en el caso del boton ALTAS-GRABAR, cuando se encuenta en GRABAR, y se pulsa, este dispara un evento del usuario que llamo ue_before_save(<row>, <abort>), el cual recibe el numero de la fila que estoy afectando, y utiliza una variable tipo boolean, y como referencia, de tal forma que si cambie el valor de la variable abort, el cual en principio es FALSE, detengo la accion de grabacion y espero hasta que el usuario reclame de nuevo el proceso o lo cancele, este evento me permite adicionar una tarea, la cual por ejemplo podria servir para adicionar un registro o modificar otro, se me ocurre afectar una tabla en la cual registre el proximo numero o codigo relacionado con la tabla que en este momento estoy utilizando, asi pues si efectuara un error cualquiera que sea dicha tabla secundaria, esto lo podria reflejar en la variable abort, y suspender el proceso de grabacion, si esto no es asi, entonces regresa del evento del usuario, y luego ejecuta la funcion UPDATE() del datawindow, la cual actualiza la tabla, y las variables relacionadas con los buffers del datawindow, cambia el valor a la variable que controla las altas, y ejecuta la funcion de configuracion de botones, y por supuesto, devuelve el control al datawindow, claro que existen muchas mas cosas entre proceso y proceso, pero eso puede ser generado por tus necesidades, imaginacion, y aplicacion.
esto se lo aplicas a los demas botones, y el resultado es sorprendente.
una vez que ya tienes montada la pantalla y estas segura que funciona bien, pues la integras dentro de una libreria la cual puedes llamar, manto_lib, por ejmplo, se me ocurre por colocar todo lo relacionado con temas de mantenimiento, y esta pantalla peculiar, la utilizas siguiendo la filosofia de la herencia. asi pues cuando necesites darle mantenimiento a una tabla, simplemente generas el datawindow, y creas una pantalla basada en la herencia de la ventana que acabamos de crear, y el resultado puede darte muchas satisfacciones, claro, como te digo esto es una explicacion basica, y una situacion basica, la pantalla puede contener muchos mas proceso, funciones e incluso, eventos del usuario los cuales se disparan, en momentos clave, como cuando modificas, borrar, o si se da el caso añadir mas botones, que por ejemplo den la posibilidad de buscar, imprimir, etc. y cada uno dispare sus propios eventos de usuario, de tal manera que cuando sea heredado, los eventos sean utilizados para colocar esas cosas que son diferentes entre si, pero siempre utilizaras una pantalla, asegurandote que esta funciona, que es eficiente, y que solo una vez la vas a escribir, y que cuando necesites hacer un cambio, en ella, este estará automaticamente disponible en toooodos los demas mantenimientos, y que no tendras que ir uno por uno modificando, o lo que es mas complicado, que se te pase por alto, alguno y empiezan los tediosos errores, en fin,
esto mismo lo puede aplicar a una pantalla para generar un reporte, para hacer una busqueada, para controlar un mensaje de error, para una pantalla inicial, en fin para todo, y asi vas conformando tus librerias genericas, con funciones, clases, pantallas, etc. y por supuesto, herendando o haciendo instancias de las clases, y programando con una eficiencia y velocidad superior a la de lo normal,
espero que esto pueda servir para resolver tu problema
saludos
agdsys
|