creación de proyectos en visual foxpro

33
Creación de Proyectos en Visual FoxPro Para poder crear un programa en visual foxpro o ejecutable es necesario definir un proyecto, el mismo estará compuesto de los formularios (Forms), códigos (Prg), reportes (Report), clases (Class), base de datos (Databases) con sus tablas, tablas libres (Free tables) y otros componentes que forman el proyecto. Al modular un programa se lo separa en diferentes proyectos, compartiendo funciones, clases, reportes, etc; pero su vinculación siempre debe ser un proyecto principal el que llamara a todos los demás. Veamos como se crean un proyecto para controlar asistencias de alumnos a cursos, guardando como datos los alumnos y un registro de asistencias a los cursos, para eso necesitamos además tener cargados que cursos hay, que alumnos van a cada curso y los horarios de los mismo indicando que días semanales se dictan. Primero comencemos por presentar el IDE (Entorno de desarrollo integrado) de visual foxpro: La pantalla de VFP (_Screen) donde podremos arrojar los resultados de los comandos ejecutados en la ventana de comandos y la vamos a poder utilizar desde los

Upload: roshel-tous-jessie

Post on 28-Nov-2015

70 views

Category:

Documents


5 download

TRANSCRIPT

Creación de Proyectos en Visual FoxPro Para poder crear un programa en visual foxpro o ejecutable es necesario definir un proyecto, el mismo estará compuesto de los formularios (Forms), códigos (Prg), reportes (Report), clases (Class),  base de datos (Databases) con sus tablas, tablas libres (Free tables) y otros componentes que forman el proyecto.Al modular un programa se lo separa en diferentes proyectos, compartiendo funciones, clases, reportes, etc; pero su vinculación siempre debe ser un proyecto principal el que llamara a todos los demás. Veamos como se crean un proyecto para controlar asistencias de alumnos a cursos, guardando como datos los alumnos y un registro de asistencias a los cursos, para eso necesitamos además tener cargados que cursos hay, que alumnos van a cada curso y los horarios de los mismo indicando que días semanales se dictan.  Primero comencemos por presentar el IDE (Entorno de desarrollo integrado) de visual foxpro:

La pantalla de VFP (_Screen) donde podremos arrojar los resultados de los comandos ejecutados en la ventana de comandos y la vamos a poder utilizar desde los proyectos como pantalla principal.

  

Ventana de comandos, en este lugar se pueden ejecutar todos los comandos permitidos por VFP.

El menú que se utiliza para opciones de edición y configuración del IDE.

          

Las opciones más importantes a ser configuradas son:            La carpeta de trabajo por defecto  (Solapa File location).            Como queremos que abran las tablas exclusivas o no (Solapa Data). Siempre al configurar tiene que apretar SET AS DEFAULT. O sino al salir y volver a ingresar los cambios no quedaran por defecto. Entonces comencemos a crear el proyecto, para eso podemos primero definir  la carpeta del proyecto y las subcarpetas así acomodamos de forma prolija y por tipo componentes, por ejemplo podría ser de la siguiente forma:

 Esto se encuentra dentro de la carpeta CursoFoxPro que la definí como la carpeta por defecto.

Ahora creamos el proyecto llamado como la misma carpeta, lo podemos hacer de dos formas, desde la ventana comandos escribiendo:

 CREATE PROJECT Prj/CursoFoxpro

 Siempre se indica la ruta donde lo queremos crear, como en este caso nuestro path ya es la carpeta por defecto, solamente escribimos en que carpeta contenida deseamos crearlo.

  O sino desde una forma mas fácil es desde el menú file, new elegimos proyecto y presionamos new file.No se asusten si lo crean y después no esta, esto pasa si no le agregamos ningún componente, el VFP lo borra directamente o pregunta que queremos hacer.            Cuando tenemos el proyecto, nos muestra una pantalla con todos los componentes juntos o por categoría en solapas, si creamos el componente desde esta pantalla queda directamente relacionado con el proyecto, pero si lo creamos desde la ventana de comandos, como veremos mas adelante, lo tenemos que integrar al proyecto utilizando la opción de agregar.       

Si vemos cada una de estas categorías son las solapas que vemos a continuación.

  Como en el programa vamos a necesitar guardar datos, vamos a crear la base de datos para después poder crear las tablas (Los comandos están descriptos en el apuntewww.foxeando.com.ar/paginas/Comandos_y_estructuras_para_manejo_de_tablas.htm)

La base creada se llamara CursoFoxpro quedando con la siguiente estructura

  En el proyecto podemos tener muchos forms, clases, prgs, pero solo uno de ellos puede ser el que inicia el programa, siempre conviene que sea un prgs, donde definimos rutas, seteos generales, configurar el screen y llamar al form o al menú que será el que maneje todo nuestro sistema. Comencemos por crear el prg inicio, lo llamaremos inicio.prg Primero hay que realizar los seteos generales, los principales son:           SET CONFIRM     ON         Especifica que no puede salir de un cuadro de texto escribiendo más allá del último carácter del cuadro. Para salir del cuadro de texto, puede presionar ENTRAR, TAB o cualquiera de las teclas de dirección, para moverse de un cuadro de texto a otro control.SET CENTURY     TO 19 ROLLOVER 80  Especifica un formato de año con cuatro dígitos que ocupa 10 caracteres (incluidos los delimitadores de fecha).Toh un número de 1 a 99 que especifica el siglo actual.Rollever n número de 0 a 99 que especifica el año a partir del cual es el siglo actual.SET CENTURY     ON  Compatibilidad con el año 200.SET CLASSLIB      TO ...  Define la librería de clases active y sin ningún nombre,                libera todas las librerías.SET DATE        TO FRENCH      Define el formato de la fecha a día/mes/año.SET DECIMALS    TO 5         Define la cantidad de decimales a 5.SET DELETED     ON          No ver los registros borrados lógicamente.

SET ECHO        OFF         Desactiva la ventana de seguimiento, depuración.SET ENGINEBEHAVIOR 70      Compatibilidad de comandos SQL con versiones 7.SET ESCAPE      OFF       Impide que al presionar la tecla Esc se cancele la ejecución.SET EXACT       ON        Cuado compara cadenas de texto, estas deben ser iguales carácter a carácter para que las considere equivalentes.SET HELP                OFF     Desactiva la ayuda de fox.  SET HEADING     OFF       Especifica que no se muestren los nombres de los campos en los cálculos como calculate, max, etc.SET MEMOWIDTH           TO 256    Determina el ancho del resultado que puede mostrar, por ejemplo de los campo memo.SET PATH               TO     Determina que directorios toma en cuenta vfp para búsqueda.SET PRINTER     TO PRN    Determina a que impresora se direcciona el resultado.SET PROCEDURE TO ...      Indica archive de procedimientos.SET RESOURCE    TO ...       Especifica que los archivos de recurso sobre las modificaciones de vfp, se guarden en otro archive que no sea foxuser.SET SAFETY          OFF          Determina que no muestre ningún cuadro de dialogo antes de sobrescribir un archive.SET STATUS      OFF        Desactiva la barra de estados.SET TALK        OFF          Si vfp muestra o no los resultados de los comandos.SET STATUS BAR OFF     Quita la barra de estado grafica.SET SYSMENU       TO    Desactiva la barra de menú de vfp.   SET EXCLUSIVE   OFF    Impide que las tablas se abran de forma exclusiva.   A continuación llamaremos a un formulario llamado menú, con el que manejaremos a todos los módulos del sistema. DO FORM Forms/Menu   A continuación tenemos que ingresar el siguiente comando READ EVENTS  Para que sirve este comando?, como ya sabemos un prg  (código secuencial) se ejecuta desde el principio paso a paso hasta el final y se cierra. Que paso con el formulario? Lo mostró y lo cerro tan rápido que ni nos dimos cuenta. El comando soluciona el problema al decirle que vfp quede escuchando eventos, dejándonos interactuar con el o los formulario y cuando ya no queramos le diremos que limpie los eventos con el comando CLEAR EVENT

(por ejemplo en un botón salir) descargando los objetos, de esta forma volverá al código original en la línea del READ EVENTS terminando la aplicación por lo comentado anteriormente.  En la próxima parte veremos que son los objetos, clases, eventos, etc., y seguiremos armando la aplicación de asistencias.  

 Creación de Proyectos en Visual FoxPro

Parte 2 En el documento anterior vimos como se crea un proyecto, como se compone y un ejemplo de prg de inicio con varios seteos y una llamada a un formulario menú, en este documentos veremos el prg nuevamente pero en lugar de llamar al form, generaremos un menú de acceso a los distintos módulos que iremos agregando de a poco.

****************Inicio.Prg****************SET CONFIRM     ON SET CENTURY     TO 19 ROLLOVER 80SET CENTURY     ONSET DATE        TO FRENCHSET DECIMALS    TO 5 SET DELETED     ON   SET ECHO        OFF  SET ENGINEBEHAVIOR 70SET ESCAPE      OFFSET EXACT       ON       SET HELP                OFF   SET HEADING     OFF  SET MEMOWIDTH           TO 256  SET PATH        TO   SET PRINTER     TO PRN   SET SAFETY          OFFSET STATUS      OFF SET TALK        OFF   SET STATUS BAR OFF    SET SYSMENU       TO  SET EXCLUSIVE   OFF   SET PROCEDURE TO prg/funciones.prg   (2)SET DEFAULT TO 'F:\LEO\CURSOFOXPRO'SET PATH TO 'F:\LEO\CURSOFOXPRO'_screen.Visible = .T._screen.ForeColor = RGB(255,128,128)  _screen.Picture = 'F:\LEO\CURSOFOXPRO\IMAGENES\FONDO.JPG'   *Un fondo al screen_screen.WindowState = 2   *Que siempre se ejecute maximizado DO GenMenu                     (1)

 READ EVENTS (1) Si nos acordamos en pseudocódigo cuando queríamos ejecutar un procedimiento la sentencia se escribía hacer <nombre de procedimiento>,  en vfp es parecido pero en ingles DO GenMenu si necesito pasarles parámetros van entre paréntesis y separados por comas, Ej.:   DO GenMenu(“hola”, VarCant).Si vemos arriba en la parte de seteos en el (2) vemos la definición del prg a utilizar para guardar las funciones y procedimientos, que serán accesibles desde todos los módulos del sistema.  Entonces tenemos dos prgs, uno llamado inicio.prg (el definido como default de arranque) y funciones.prg donde iremos guardando todos los procedimientos y funciones.  

************Funciones.Prg**************PROCEDURE genmenu            SET SYSMENU TO            *Desactiva el menú del vfp.

DEFINE PAD sysuno OF _MSYSMENU PROMPT '\<Asistencias' KEY ALT+A*Define el primer menú comenzando de la izquierda llamado sysuno y titulo *Asistencias.ON PAD sysuno OF _MSYSMENU ACTIVATE POPUP Asistencias*Define que pasa si se clickea en el menú y dice que active un popup (como los del *botón derecho del Mouse) llamado asistencias.DEFINE POPUP Asistencias MARGIN RELATIVE FONT "MS Sans Serif, 12"*Crea el popup llamado asistencias diciendo que tome como margen el lugar donde esta *el mouse y con una determinada fuente.DEFINE BAR 1 OF Asistencias PROMPT "\<Registro de Asistencias"*Crea las opciones que tendrá el popup asistencias, se llama 1 y titulo Registro *asistencias.ON SELECTION BAR 1 OF Asistencias DO form Forms/Asistencias*Define que pasa si se clickea en la opción llamada 1, en este caso se ejecuta el form *Asistencias.DEFINE BAR 2 OF Asistencias PROMPT "Alumnos"

            *La segunda opción.ON SELECTION BAR 2 OF Asistencias DO form forms/ActAlumnos

            *Lo que pasa si se elige la opción 2.             DEFINE PAD syssalir OF _MSYSMENU PROMPT '\<Salir' KEY ALT+S            *Se define el segundo menú llamado syssalir con el titulo Salir.      

ON SELECTION PAD syssalir OF _Msysmenu Do salir*Acá directamente dice que si se elige el menú, llama al procedimiento salir (este se *encontrara en funciones .prg mas abajo).SET SYSMENU AUTOMATIC*Define que la barra de menú siempre este accesible desde el programa.

ENDPROC  En muchas partes vimos que se utilice el “\<” antes de una letra, esto lo que hace es definir como atajo a la misma, le pone la marca del que vemos en los menúes con el “_” debajo de la tecla. PROCEDURE Salir

*Utilizamos la herramienta messagebox que nos permite emitir un mensaje, definir que *botones queremos que aparezcan y nos dice cual de ellos presionamos.*El 32 es los botones que aparecen y 4 es el icono, estos datos se los suma.*Con el if estamos validando que se haya presionado el botón si = 6.IF MESSAGEBOX("Desea Salir de la aplicacion", 32 + 4, "Pregunta") = 6

*En el inicio.prg escribimos la funciones read events y dijimos que el prg *quedaba frenado ahí escuchando los eventos del sistema, con esto lo que le *decimos que no escuche mas ninguno, el prg sigue su ejecución y al no tener *mas nada el programa se cierra.CLEAR EVENTS

            ENDIFENDPROCHasta acá lo que pueden es ir armando las carpetas, el proyecto los dos prg copiando y pegando todo el código para ver como funciona.  Antes de comenzar con la creación de formularios,  clases, objetos, etc veamos de una forma rápida que son. Una Clase esta formada por métodos, propiedades y eventos. Tomando un ejemplo de clase como un auto las propiedadespueden ser el color, ancho, alto, cantidad de ruedas, cantidad de puertas, tipo de motor, color de tapizado y todas las propiedades que nos parezca, entonces por lo que vemos cada clase puede tener su conjunto de propiedades diferentes. Pensemos en un reloj, que propiedades puede tener, color, tamaño, tipo de numeración, digital o analógico, formato, si tiene segundero y muchas mas. Ahora veamos una clase conocida por nosotros como un botón (esos que apretamos para aceptar) que propiedades podemos tener alto, ancho, imagen, la leyenda, nombre, posición en la pantalla, si lo queremos ver o que este oculto y otras tantas mas. Como vemos las propiedades sirven para configurar la clase. Por otro lado tenemos los eventos que lo podemos definir como las acciones que es capaz de generar la clase, veamos el auto puede arrancar, acelerar, frenar, doblar, etc. pero cuando se ejecuta una acción pasa algo o debería pasar algo, ese algo es el método relacionado, por ejemplo método arrancar hace que vaya nafta a los inyectores y que las bujías hagan chispa. En el botón una acción podría ser click con un método asociado, en el cual indicaremos que debe hacer al presionarlo.Los objetos es la representación real de la clase, por ejemplo la clase auto y la representación real es mi auto.  Ahora que ya sabemos que son las clases y los objetos, nuestro próximo paso es crear un objeto basado en la clase form,llamado ActAlumnos y hacer que interactue con la tabla alumnos, los pasos a seguir son los siguientes: 

1)      Ir a la solapa Docs, clickear sobre forms/formularios y presionar nuevo, al hacer esto nos muestra dos opciones asistente y nuevo formulario, elegimos la última opción y nos aparece en pantalla un formulario vacío.

  

              

2)      En la tabla alumnos hay 4 campos, para mostrar los valores, crearlos o modificarlos necesitamos agregar 4 clases textbox (al agregarlas se transforman en objetos porque creamos una instancia), para indicar al usuario que dato vemos en cada uno utilizamos 4 etiquetas o clase label y por ultimo para movernos entre los registros, borrarlos, crearlos vamos a usar 8 botones o clase commandbutton. Para incorporar al formulario los objetos utilizamos la barra de herramientas llamada Controles de Formulario, en la captura siguiente la podemos ver:

   

  

     

Acá están todas las clases nativas de vfp que podemos utilizar en nuestra aplicación.Para agregarlas al formulario lo único que debemos hacer es arrastrarla.     

3)      Al agregarlos quedan todos desordenados, hay una herramienta importante que ayuda a la hora de hacer el diseño del formulario, esa se llama Barra de Herramienta de Diseño, sirve para acomodar un solo objeto o mas de uno como grupo. Es algo así:

       

                                    

Para seleccionar mas de un objeto lo podemos hacer con el mouse o sino presionando shift y clickeando sobre los mismos.

4)      La propiedad más importante a definir es Name, en ella indicaremos con que   nombre nos referimos al objeto, vfp pone por defecto el nombre de la clase más el número de objeto agregado. Para ir a la ventana propiedades se presiona el botón derecho del mouse y se clickea propiedades.     Que se ven de la siguiente forma:

        

En la lista aparecen los objetos para poder ir a las propiedades, eventos y métodos de cada uno, las solapas las dividen entre distintas categorías relacionadas con su función y una que agrupa a todas. 

      

                 

5)      Al agregar todos los objetos, acomodarlos e indicarle el nombre debe quedar algo como esto:

             

 Con la propiedad Caption podemos indicar las leyendas que queremos que se vean ( la del form, commandbutton y labels).    

6)      Ahora que ya tenemos todo nos falta definir los formatos de datos que tendrán cada textbox, como interactúan con la tabla y que debe hacer cada botón.Antes de comenzar veamos en que orden se cargan los objetos en memoria y cuales eventos se accionan. Como vimos en el caso del formulario, a el le incorporamos una serie de objetos generando una relación de padre/hijo, dado que hay objetos que tienen la característica de poder contener uno o mas, a ellos se les dice padre y a los contenidos se les dice hijos. Entonces para poder tener los hijos necesitamos al padre, por lo tanto primero se carga el form y después los demás objetos.Por otro lado los objetos tienen un evento init y el form además tiene un load, el segundo se acciona apenas se carga el form  antes de que se hayan cargado los otros objetos, luego el init de los objetos y por ultimo el init del form. Simplificando a) Load del Form, b) Init de los objetos y c) init del form.Entonces si desde el load del form queremos cambiar una propiedad de un objeto no vamos a poder hacerlo porque aun no esta creado, pero si desde el init. Como necesitamos que los objetos tengan acceso a los datos debemos abrir la tabla antes de que sean creados, para eso utilizamos la accion load del formulario agregando la línea USE bd/alumnos ORDER id. En cada init de los objetos vamos a poner que valor por defecto debe tomar, ejemplo para fecha y texto: This.Value = {}, This.Value = "". Para vincular cada textbox con un campo de la tabla debemos utilizar la propiedad controlsource (origen de datos) completando con el nombre de la tabla y campo, ejemplo: alumnos.apellido, alumnos.nombre, etc. De esta forma los textbox arrojaran la información cargada en cada campo de la tabla. Para cerrar el formulario agregamos en el evento click del botón salir ThisForm.Release, eso quiere decir que me descargue de memoria el formulario y todos sus objetos, pero el menú sigue estando activo. Veamos que hace cada botón: 

            Anterior IF NOT BOF()    &&BOF me dice si estoy en el comienzo del archive (begin of file)                          ** si es así me daría error si trato de seguir yendo para atrás.            SKIP -1  &&Me mueve un registro hacia atrás, es lo mismo que Go Recno()–1.            Thisform.Refresh    &&Refresco el formulario para que los objetos tomen los          

                                             ** nuevos valoresENDIF Primero GO TOP         &&Voy al primer registroThisform.Refresh   &&Siempre refresco los objetos.    Ultimo GO BOTTOM           &&Voy al ultimo registroThisform.Refresh       &&Refresco Siguiente IF NOT EOF()         &&EOF función que valida si es el final del archivo                                 **End of File.                                      SKIP            &&Si no le pongo valor toma por defecto +1, go recno() + 1ENDIF*Para darse cuenta de porque esta puesto lo que sigue prueben sin ponerlo.IF EOF()            GO BOTTOMENDIF            ThisForm.Refresh Nuevo SELECT Alumnos     &&Selecciono la tablaCALCULATE MAX(Alumnos.id) TO UltId    &&Calculo el id mas grandeUltId = UltId + 1               &&Le sumo unoINSERT INTO Alumnos (Id) VALUES (UltId)   &&Inserto el valor del idGO BOTTOM     &&Voy al ultimo registro, el recién creadoThisForm.Refresh  && Refresco los datosThisForm.Nombre.SetFocus   &&me posiciono en el nombre para comenzar la carga.    Borrar SELECT Alumnos   &&selecciono la tabla*El messagebox devuelve valores que son referidos a la tecla presionada, en este caso la *tecla yes = 6.IF MESSAGEBOX("Desea borrar este dato", 36, "Atención") = 6    &valido si dijo si.            DELETE      &&borro el dato en el que estoy posicionado            GO TOP       &&como el dato ya no existe voy al primero            Thisform.Refresh  &&refrescoENDIF 

 Hojear SELECT alumnos                  &&Selecciono la tablaBROWSE NORMAL            &&Hago un brow  Salir SELECT Alumnos              &&Selecciono la tablaUSE                                     &&La cierroThisForm.Release                &&Descargo de memoria todos los objetos.  

Creación de Proyectos en Visual FoxProParte 3

 Hasta el momento vimos como se crean los proyectos, como se genera un prg  para guardar funciones y procedimientos, otro de arranque con los seteos principales y un formulario de ABM básico. En este documento veremos como se definen las clases propias y como se las utiliza, como se agregan los objetos por código y por último como podemos utilizar un solo formulario ABM para todas las tablas. La imagen muestra el DER (diagrama de entidad-relación) de la base de datos que usamos para el proyecto CursoFoxpro.

               

                     

Los pasos a seguir van a ser los siguientes: 

1)      Creación de clase para selección de sexos.2)      Creación de clase para relación de tablas. (ejemplo: en alumnos guardar

en el campo id_loc el id de la localidad que seleccionamos).3)      Crear plantillas de carga.4)      Modificar el form ActAlumnos por el Actualiza genérico.

   Clase Sexo: Las clases se almacenan dentro de librerías de clases, permitiendo agruparlas por funcionalidad. Ejemplo: 

                

 

Hay dos librerías abm y herramientas, cada una de ellas tienen clases relacionada con la funcionalidad.Para crear una clase nueva presionamos new y nos aparece el siguiente formulario:

    

           

Entonces vamos a crear una clase llamada sexo, basada en combobox y la guardamos dentro de abm. Nos va a aparecer algo así:

  

        El objeto combobox nos sirve para mostrar una lista de opciones posibles a seleccionar, por ejemplo masculino y femenino. Esta clase la podemos utilizar en cualquier lugar donde haya selección de sexo, eso es lo bueno de las clases propias, ahorramos código y si mas tarde queremos agregar una nueva opción no tenemos que rastrear todos los lados sino solo modificamos la clase.El combobox tiene mucha similitud con el listbox, la única diferencia es que el listbox siempre aparece como lista y el combo aparece solo lo que

seleccionamos. Por lo tanto las propiedades y métodos que vamos a explicar sirven para cualquiera de las dos clases.Las propiedades que vamos a utilizar son:ColumnCount = 2  **Define la cantidad de columnas a mostrar en la lista.ColumnWidths = 100, 50  **El ancho de cada columna para mostrar el valor.Style = 2   **Como se comporta visualmente.SelectOnEntry = .T.  **Despliega automáticamente la lista al tomar foco.Value = Nos da el valor del dato que seleccionamos, de la columna que seteamos en la propiedad siguiente.BoundColumn = 2  **Por defecto es 1, esto nos dice la propiedad value que valor de columna nos devuelve.Por ultimo en el método init vamos a realizar la carga del combobox: This.AddListItem("Masculino", 1, 1)This.AddListItem("M",1,2)This.AddListItem("Femenino", 2, 1)

This.AddListItem("F", 2, 2)   El método AddlistItem tiene como parámetros el texto a mostrar, la identificación del elemento y la columna donde se mostrara. Si queremos agregar mas de una columna para un mismo elemento lo único que tenemos que hacer es definir la misma identificación para todas las columnas.La propiedad controlsource, tanto en este como en otros objetos, nos dice cual es el origen de datos para la propiedad value, en la mayoría de los casos va a ser una campo de una tabla. No la definimos en la clase porque la podemos usar en mas de una tabla distinta. Clase Relación:   La finalidad de esta clase es poder definirle que datos necesitamos,  de que tabla son y en que campo los queremos grabar. Ella sola abrirá la tabla, configurara todas las propiedades necesarias para establecer el vínculo.Vamos a crear una clase nueva llamada relación y la guardamos dentro de abm,  basada en combobox, igual que la anterior, y definimos las mismas 4 propiedades. Otra propiedad a definir es RowSourceType = 2, en ella le indicamos que el tipo de origen de datos es una tabla.En los formularios y las clases podemos crear propiedades y métodos además de los que ya vienen por herencia, para hacer eso vamos al menú form o class y clickeamos en “New property” o en “New method”. Los métodos sirven para guardar procedimientos o funciones dentro de la clase y las propiedades para guardar ciertos valores a los que podrán acceder todos los objetos.Necesitamos crear dos propiedades:

a)      Campos Vamos a obtener la tabla y los campos que queremos mostrar.b)      Destino Va a ser nuestro valor para el ControlSource.

 En el método init vamos a agregar el siguiente código:(Las funciones utilizadas a continuación están en el apunte: www.foxeando.com.ar/paginas/funciones_vfp.htm)

 Los ejemplo de los valores que se cargan en las propiedades son:*campos = "alumnocat.id, nombre"*destino = "alumnos.id_cat

 TabOri = "bd/" + LEFT(this.campos,AT(".",this.campos)-1)*La tabla que necesitamos abrir la vamos a obtener del string campos.SELECT 0USE (tabOri) ORDER id   *abrimos la tabla para que la propiedad siguiente encuentre el aliasThis.RowSource = This.campos This.ControlSource = This.Destino

  De esta forma ya tenemos la clase genérica relación, a la hora de usarla solo debemos cargar en las propiedades campos y destino los valores para que se configure sola al ejecutarse el código.  En la próxima parte veremos los puntos que quedan. 

Creación de Proyectos en Visual FoxProParte 4

 En la parte 3 nos quedaron por resolver los siguientes puntos

3)      Crear plantillas de carga.4)      Modificar el form ActAlumnos por el Actualiza genérico.

 El objetivo de los dos puntos es poder crear un formulario genérico ABM que nos sirva para cualquier tabla y no tengamos uno por cada una. Plantillas de carga Por cada tabla crearemos un contenedor con el mismo nombre, guardado en una librería llamada plantillas y lo único que vamos a hacer es agregar todos los objetos e indicarles el controlsource. A continuación veremos dos capturas de ejemplo. 

            

             En la captura dos vemos que utilizamos las clases sexo y relación. 

  Formulario genérico Para hacerlo genérico lo único que le vamos a dejar es la botonera, crearemos una propiedad llamada tablaorigen y le cambiamos el nombre por Act. El código del método init del formulario quedara como el que veremos a continuación: *Los dos parámetros vienen dados desde el procedimiento menú, al hacer click y llamar *al formulario ahí agregamos los parámetros para que el formulario sepa el caption del *formulario y que tabla tenemos que usar. Al saber que tabla tenemos que usar además *sabemos que clase agregamos, ya que la llamamos de la misma forma.LPARAMETERS TablaOrigen, titulo*En la propiedad que agregamos guardamos la tabla que usamos.This.tablaorigen = ALLTRIM(TablaOrigen)*El caption es un parámetro que viene desde el menú.This.Caption = ALLTRIM(titulo)*Armamos la cadena de tabla para luego poder abrirla.CadTabla = "bd/"+This.tablaorigen*Abrimos la tabla.SELECT 0USE (CadTabla)CadObj = This.tablaorigen*La variable que vamos a utilizar para saber que clase tenemos que agregar.SET CLASSLIB TO clases/plantillas*Lo que hacemos acá definimos por defecto la librería de clases a plantillas que es *donde tenemos los contenedores con los objetos para cada tabla.This.AddObject("ActDatos", CadObj)*AddObject es un método que nos permite agregar un objeto por código (es lo mismo *que cuando lo agregamos desde diseño con el Mouse), le debemos indicar que clase queremos agregar y como se llamara el objeto en el form (en este caso el objeto se llama ActDatos y la clase es la variable CadObj que la cargamos mas arriba en el código).SET CLASSLIB TO*Estos son tres seteos que le hacemos al objeto luego de agregarlos.This.Actdatos.Visible = .T.this.Actdatos.Top = 1this.Actdatos.Left = 1   En los botones lo único que debemos cambiar o agregar es la sentenciaSELECT (ThisForm.TablaOrigen)*Lo debemos hacer así porque no sabemos nunca que tabla vamos a utilizar ya que viene dada por parámetro. En el menú debemos agregar los parámetros de la tabla y el titulo, un ejemplo es el siguiente:

 ON SELECTION BAR 3 OF Asistencias DO form forms/Actualiza with "alumnos", "Actualizacion de alumnos"*Con with y separados entre comas le pasamos los parámetros que debe recibir el *formulario.