Ir arriba

Lenguaje: F O X

BASE DE DATOS(Banco de Datos)
Datos de un contexto, almacenados en formato digital, que pueden gestionarse con programas SGBD para almacenarlos y leerlos. Pueden clasificarse:
a) Bases de datos estáticas:
Datos históricos de solo lectura, para ver el comportamiento a través del tiempo, realizar proyecciones, tomar decisiones en inteligencia empresarial.
b) Bases de datos dinámicas:
Datos que se modifican con el tiempo, permiten la actualización, borrado, edición y consulta.
c) Bases de datos bibliográficas:
Datos del autor, fecha de publicación, editorial, título, edición, de una determinada publicación, etc.
d) Bases de datos de texto:
Fuentes primarias, como contenidos de las colecciones de ediciones de libros.
Fox Pro
Win
Clases
y
Objetos
Funcion
y
Procedimiento
Mantenimiento
Lenguaje
S Q L

PARADIGMA
: En los ojos del joven arde la llama.
En los ojos del viejo brilla la luz.
(Víctor Hugo)

Modelos de bases de datos:
1) Bases de datos jerárquicas:
Organizadas como un árbol invertido, en donde un nodo padre de información(raíz) puede tener varios hijos (un hijo solo puede tener un padre) y los nodos sin hijos, son las hojas.
2) Base de datos de red:
Cada nodo permite tener varios padres
3) Bases de datos transaccionales:
Usados para el envío y recepción de datos a grandes velocidades (Ej. transacción de dinero entre cuentas bancarias).
4) Bases de datos relacionales:
Usa "relaciones", en forma lógica como conjuntos de datos llamados "tuplas".
Cada relación es una tabla compuesta por registros (filas de la tabla), que son tuplas, y campos (columnas la tabla).
SQL(Structured Query Language) se usa para consultas a bases de datos relacionales.
5) Bases de datos orientadas a objetos:
Incorpora las propiedades del paradigma de objetos:
5.1.- Encapsulación - Permite ocultar la información al resto de los objetos, impidiendo así accesos incorrectos o conflictos.
5.2.- Herencia - Los objetos heredan comportamiento dentro de una jerarquía de clases.
5.3.- Polimorfismo - Operación mediante la cual puede ser aplicada a distintos tipos de objetos.
Fox que pertenece a este ámbito, se usa para construir sistemas de administración de bases de datos. Superó a los añejos lenguajes Fortran, Basic, Pascal, Cobol, Clipper, Fox, C++ y otros que ya son solo historia del viejo milenio.!!.
En este enfoque, están Visual Fox Pro, Visual C++, C++Builder, Visual Basic, Delphi, Visual J++ y otros.
6) Bases de datos deductivas (o lógicas):
Permite hacer deducciones a través de inferencias basadas en lógica matemática, con reglas y hechos almacenados en la base de datos.

F O X: Clases y Objetos
Clases
y
Objetos
Funcion
y
Procedimiento
Mantenimiento S Q L Fox Pro
Win
Esto es un objeto.!!

Conceptualmente cada objeto es la materialización de una clase, por lo tanto es un ente tangible y operable, como puedes apreciar en este ejemplo, tiene un formato de una botonera de comandos, espesífico de acuerdo a la tarea para el que fue creado.

Este objeto tiene determinadas propiedades o atributos que lo caracterizan y lo diferencia de los demás. Así, esta botonera tiene una forma, color y un tamaño propio; además cuando se lo usa, tiene una determinada ubicación sobre otro ojeto contenedor.

Mediante un mensaje adecuado, denominado evento, cada objeto es requerido para realizar un servicio, que será concretado sin que el usuario se entere cómo fué efectuado. Una vez creados los objetos adecuados y definidos los eventos convenientes, un programa es la coordinación secuencial donde los objetos pueden ser llamados.

En cambio, la clase es un ente intangible que registra la información sobre las especificaciones de apariencia y comportamiento de un objeto. La clase es algo similar al plano del objeto. En cambio el objeto es la corporización de la clase.

Por ello, en la práctica de la programación, tanto las clases como los objetos son bloques funcionales de aplicaciones, los cuales a pesar de estar muy vinculados, tienen distintos conceptos.

Un ejemplo, para aclarar estos conceptos, es decir que la clase es el plano de conexiones eléctricas internas del teclados, mientras que el objeto, que es una instancia de esa clase y es el propio teclado.

La codificación para generar una clase dentro de este entorno posee la siguiente estructura sintáctica:


DEFINE  CLASS nombreClaseDefinida
   ADD OBJECT nombreObjeto  AS nombreClase WITH Propiedades

  PROCEDURE / FUNCTION
     Instrucciones
     . . . . . 
  ENDPROC / RETURN   
ENDDEFINE

Es de vital importancia que captes y retengas esta estructura sintáctica y a partir de ella los siguientes conceptos:

  1. PROGRAMACIÓN ORIENTADA A OBJETOS
    En este lenguaje, se caracteriza por:

    1. ENCAPSULAMIENTO
      Para conceptualizarlo diremos que, cuando se conecta un teclado a una PC, si no se trata de un técnico capacitado en el tema, generalmente a nadie le interesa el funcionamiento de los circuitos eléctricos y de sus conexiones internas dentro del aparato.

      Todos estos elementos, por suerte, quedan ocultos; pues el usuario solo desea conocer el procedimiento necesario para lograr la comunicación del teclado con la computadora.

      Tal ventaja que permite ignorar todos los detalles internos del objeto y que ovbiamente, posibilita al operador únicamente a concentrarse en los aspectos de utilización, es la ABSTRACCION.

      El encapsulamiento, que consiste en empaquetar el código de los métodos, las propiedades y sus valores en un mismo objeto, contribuyen a tal abstracción.

    2. HERENCIA
      Gracias a esta propiedad, el programador cuando efectúa mantenimiento o actualización de sus algoritmos y debe realizar un cambio en una clase, este afecta a todas las subclases basadas en ella.

      Por la misma razón, si detecta un error en una clase, solo se efectúa la corrección en ella y por lo tanto, ya no es necesario cambiar el código de todas las subclases correspondientes.

      Esta actualización simple y automática ahorra tiempo y trabajo y por lo tanto $$$$.

    3. SUB CLASE
      Es la clase generada a partir de otra clase base de la cual hereda una serie de características primarias.

      La subclase, además de la funcionalidad y controles adicionales propios, podrá tener toda la funcionalidad de una clase base existente.

      De este modo, la creación de subclases reduce la cantidad de código a escribir, por que gracias a herencia muchas características no deben volver a definirse.

  2. PROPIEDADES Y ACTIVIDAD DEL OBJETO
    Para definir las características físicas y la forma como se invocan a los objetos tienes las siguientes alternativas:

    1. ESTABLECER PROPIEDADES
      Las alternativas que tienes para definir el formato físico (Color, tamaño, ubicación, etc) que tendrán tus objetos, son:

      • ESTABLECIMIENTO SIMPLE:
        Consiste en asignarle un valor a cada propiedad de cada objeto, usando para esto la sintaxis

        Primario.Objeto.Propiedad = Valor

      • ESTABLECIMIENTO MULTIPLE
        En este caso a varios objetos similares les puedes asignar valores a cada una de sus propiedades, usando la sintaxis WITH... ENDWTH

        Ejemplo:

        
              WITH  MiFormulario.MiGrilla.Colum1 
                      Width = 69 
                      BackColor=RGB(255,255,255)
              ENDWITH
        

      Con este fin, diremos que los objetos que son creados bajo entorno de un lenguaje Visual, también tienen propiedades que están determinadas por la clase en la que se basan tales objetos y que pueden establecerse durante el tiempo de diseño o en tiempo de ejecución.

      Ejemplo, algunas de estas propiedades que puede tener los objetos son:

      
         Caption (Etiqueta del objeto) 
         Visible (Muestra u Oculta el objeto) 
         Enabled (Habilita el objeto) 
         Left  (Absisa del Objeto 
         Top   (Ordenada del objeto)
         ForeColor(Color del texto) 
         Value  (Valor del Objeto)
          . . . y muchos otros..!!!  
      

    2. LLAMADO A METODOS
      Recuerda que los métodos registran en código de instrucciones la tarea que debe cumplir el objeto, pero este no actua solo, requiere que lo invoques.

      Para llamar a un método de un objeto desde cualquier parte de una aplicación, debe utilizarse la sintaxis

      Primario .Objeto . Metodo

    3. REFERENCIA A OBJETOS
      Para que el objeto haga lo que tu dispongas es preciso que lo convoques y para esto tienes dos alternativas

      • REFERENCIA ABSOLUTA:
        Se usa para convocar a un objeto que no esta presente, algo así: "Que Javier Omar Batistuta.. meta un gol..!!, por ello al objeto invocado le debes proporcionar su jerarquía completa de contenedor.

        Ejemplo: ConjuntoForm.Form1.BotonComando1

      • REFERENCIA RELATIVA:
        Si al Bati lo tenes frente tuyo, la orden anterior no tiene mucho sentido, símplemente le diras "Vos, meté un gol..!!", por ello la referencia a objetos desde el contenedor, puedes abreviar la identificación del objeto a manipular, con THIS o THISFORM.
        Ejemplo:

        Case.This.Value=1

    PARADIGMA
    "Al que tiene le será dado" la fortuna es como la gallina
    ..pone el segundo huevo donde ya puso el primero..!!

  3. EL OBJETO PUEDE CONTENER OTROS OBJETOS

    Sobre un objeto, si es del tipo contenedor o formulario, puedes "pegar" todos los objetos que te hagan falta para procesar tu sistema.

    Para esto, puedes usar las siguientes alternativas:

    1. ADD OBJECT en el comando DEFINE CLASS.

      Ejemplo:

      
          DEFINE CLASS ClaseCreada As ClaseBase 
             Add Object ObjetoAdicionado1 As ObjetoBase1 With Propiedades
             Add Object ObjetoAdicionado2 As ObjetoBase2 With Propiedades
             Add Object ObjetoAdicionado3 As ObjetoBase3 With Propiedades
             ...........
          END Define
      

      Como ya habrás sospechado los objetos son adicionados en tiempo de diseño del objeto contenedor.

    2. ADDOBJECT en el código correspondiente método de una clase, por ejemplo dentro de un PROCEDURE, tal como puedes apreciar en la siguiente sintaxis. Ejemplo:
      
        PROCEDURE NombreProcedimiento 
            This.AddObject(ObjetoAdicionado1, ObjetoBase1)
            This.AddObject(ObjetoAdicionado2, ObjetoBase2)
            This.AddObject(ObjetoAdicionado3, ObjetoBase3)
           ...............
         ENDProc 
      

      En esta segunda opción los objetos se pegan en tiempo de ejecución, cuando el procedimiento sea convocado.

  4. EL OBJETO TE OBEDECE..!!
    Cada objeto reconoce y responde a acciones llamadas eventos, estos son actividades específicas, predeterminadas y que pueden ser iniciadas por el usuario, como ocurre en la mayor parte de los casos, pero también pueden ser desencadenadas por el propio sistema. Los eventos pueden tener métodos asociados.

    Las acciones del usuario que producen eventos son:

    • Clicks con el ratón,
    • Movimientos del ratón,
    • Pulsaciones sobre pantallas,
    • Digitaciones de teclas.
    • Otros..

    También hay eventos iniciados por el sistema, por ejemplo cuando se crea un objeto y luego se ejecuta una línea de código que produce un error.

    PARADIGMA
    El placer está tan cerca del dolor,
    que muchas veces lloramos de alegría..!!
    Wilucha

    En el siguiente ejemplo puedes ver en acción a los eventos Click y MoveMouse

    
    *********************************************
    *   ACTIVAR MENU DE ABM
    *********************************************
    PROCEDURE Modificar.Click
     DO ActivarPantallaPrincipal 
     ThisForm.Caption = 'BASE DE DATOS: SELECCIONA UNA OPCION' 
     ThisForm.VerSuerte.Visible=.F.
     ThisForm.LogoUTN.Visible=.F.
     This.Visible=.F.
     ThisForm.MenuPrincipal.Visible=.T.
    ENDPROC
    
    *********************************************
    *   VISUALIZAR CONTAINER DE INGRESO DE FECHA
    *********************************************
    PROCEDURE VerSuerte.MouseMove
      PARAMETER a, b, c, d, e
     DO ActivarPantallaPrincipal 
     ThisForm.Caption = 'INGRESA EL DIA QUE NACISTE, luego ENTER' 
     ThisForm.Modificar.Visible=.F.
     ThisForm.LogoUTN.Visible=.F.
     This.Visible=.F.
     ThisForm.LeeFecha.Visible=.T.
    ENDPROC
    

  5. EL OBJETO POSEE METODOS..!!
    En el entorno de estos paradigmas, los métodos constituyen la definición del comportamiento de los objetos, cuando estos , sean convocados por el usuario o el propio sistema, mediante los la activacion de los eventos adecuados.

    Los métodos son instrucciones o procedimientos codificados por el programador y que están asociados a un objeto. Serian algo parecido al código fuente tradicional.

    Los métodos se diferencian de los procedimientos estándar del lenguaje, porque están vinculados intrínsecamente a un objeto y además se les asigna nombres distintos que los procedimientos normales.

    En este mundo todo lo bueno, o es pecado, o engorda, o preña....!!

    Los métodos también pueden existir independientemente de los eventos, en tal caso, se debe llamar a tales métodos de forma explícita en el código. El conjunto de eventos es limitado pero amplio y aunque no se pueden crear nuevos eventos, el conjunto de métodos puede ampliarse indefinidamente. Tanto las propiedades, como los eventos y los métodos de todo objeto se deben especificar durante la definición de las clases.

    Los métodos adoptan la forma de bloques operativos o subprogramas denominados procedimientos o funciones que tienen múltiples aplicación, con similar criterio que los paradigmas procedurales y por ello, pueden operar con parámetros o prescindir de ellos, como puede apreciarse en el siguiente ejemplo.

    
    
    PROCEDURE DatosAFicha
      MenuCambios.Caption = 'Corrige esta ficha Nº '+Str(Recno())
      MenuCambios.Hojas.ActivePage = 2
      MenuCambios.Hojas.Page2.TexBoxLegajo.Value  =Taller.Legajo
      MenuCambios.Hojas.Page2.TexBoxNombre.Value  =Taller.Nombre
      MenuCambios.Hojas.Page2.TexBoxComision.Value=Taller.Comision
      MenuCambios.Hojas.Page2.TexBoxFecha.Value   =Taller.Fecha
      MenuCambios.Hojas.Page2.TexBoxParcial.Value =Taller.Parcial
      MenuCambios.Hojas.Page2.TexBoxRecupera.Value=Taller.Recupera
    RETURN
    
    

    Ademas del uso de los procedimientos y funciones insertas en los métodos de las clases; también los métodos pueden operar, usando estructuras propias, predefinidas por el propio lenguaje de codificación.

F O X: Función y Procedimiento
Clases y Objetos Funcion y Procedimiento Mantenimiento S Q L Fox Pro Win 2.6

PARADIGMA: Delante de una mujer
..nunca olvides a tu madre..!! (Vigil)

Las funciones son métodos o subprogramas, que actuan como bloques operativos independientes, que se deben usar cuando determinado comportamiento de un objeto va a repetirse varias veces,

Cada vez que la función sea convocada en un método, generará como resultado un nuevo dato, por ello se dice que las funciones devuelven valores..!!

Para su cometido, las funciones pueden requerir o no de parámetros, los cuales son valores que reciben desde el exterior a su estructura, como se aprecia en el siguiente ejemplo, cuya estructura sintáctica conviene que retengas.

Siguiendo el mismo criterio de la programación tradicional donde las funciones son subprogramas que al activarlas devuelven un valor o una acción; también en el entorno visual las funciones tienen la misma valiosa aplicación, para ello el criterio es prácticamente el mismo, ademas ellas, pueden operar con parámetros o prescindir de ellos
Un ejemplo típico es la siguiente función de búsqueda:


   FUNCTION EstaGrabado
     PARAMETER LegajoLeido
    YaEsta = .F.
    GO Top                                           
    LOCATE FOR Taller.Legajo = AllTrim(LegajoLeido)    
    IF Found()                                        
       =MessageBox('Ya fué grabada esta ficha',0+64,legajo+'  '+nombre)
       YaEsta = .T.
	   MenuCambios.Hojas.Page1.BotonGuardar.Enabled = .F.
    ENDIF
   RETURN YaEsta

Los procedimientos en la programación orientada a objetos se estructura con la misma filosofía que el de la programación procedural. Actuan de modo similar a las funciones, solo que no necesariamente devuelven un valor.

Conceptualmente representan subprogramas que pueden estar constituidas por todos los elementos del mismo programa, que funcionan internamente en forma independiente y que pueden recibir información desde el exterior, pero que también pueden trabajar sin ellos.


PROCEDURE BotonBuscar.Click 
  Set Near On
  Set Exact Off
  Buscado = Upper(AllTrim(ThisForm.ModNombre.Value))
  GO Top                                           

  LOCATE FOR Upper(Telf.Nombre) = Buscado    

  IF Found()
     ThisForm.ModNombre.Visible    = .F.
     ThisForm.ModDireccion.Visible = .F.
     ThisForm.ModTelefono.Visible  = .F.
     ThisForm.BoxNombre.Visible    = .T.
     ThisForm.BoxDireccion.Visible = .T.
     ThisForm.BoxTelefono.Visible  = .T.
     ThisForm.CancelaBuscar.Visible = .F.
     This.Visible = .F.
     ThisForm.BotonBajas.Visible = .T.
     ThisForm.BotonAltas.Visible = .T.
     ThisForm.Modificacion.Visible = .T.
     Formulario.Refresh

    ELSE 

      =MessageBox('No esta registrado',0+64,Buscado)

  ENDIF

  Set Exact On
 ENDPROC
PARADIGMA: Al envejecer uno se vuelve..
..más loco y más cuerdo..!!

TU PRIMERA VEZ..!!
Para ver toda esta teoría en acción, te recomiendo seguir los siguientes pasos:

Todo sistema requiere de una clase contenedora primaria, que definirá las características del objeto base, sobre el que luego se alojaran todos los demás objetos de tu sistema.

Con ese fin, te propongo la siguiente clase con sus correspondientes propiedades y objetos, los cuales puedes modificar en función de tus propias necesidades.

Por razones de simplificar este modelo solo utilizo una clase base, pero si deseas usar nuevos formularios, recuerda que el tratamiento es similar a este ejemplo.


*****************************************
*       CREACION de la CLASE PRINCIPAL
*****************************************
DEFINE CLASS FormularioWilo AS Form
 Caption    ='AGENDA 2003 de WILO        '+ Dtoc(date())
 ShowTips   = .T.
 Top        = 10
 Left       = 10
 Height     = 300                      
 Width      = 500                      
 FontBold   = .T.                       
 ControlBox = .T.  
 Closable   = .F. 
 minButton  = .T. 
 maxButton  = .T.  
 BorderStyle= 3
 BackStyle  = 1        
 Picture    = 'Rayado.bmp'
 
 **********************************************
 *       OBJETOS DE LA PAGINA PRINCIPAL
 **********************************************
 ADD OBJECT VerAutor      AS ContainerAutor
 ADD OBJECT Volar AS Image WITH Top=250, Left=450,Picture = 'Llave.bmp', ToolTipText='Salir de este programa..!'

 **********************************************
 *       METODOS DE LA PAGINA PRINCIPAL
 ********************************************** 
 PROCEDURE Volar.Click
  Mensaje=Messagebox('Confirma tu Opción',4+32+256,'DESEAS CERRAR ESTE PROGRAMA')
  IF Mensaje=6
     Clear Events
  ENDIF
 ENDPROC

ENDDEFINE

PARADIGMA SISTEMICO
La materia ni se crea ni destruye..
..pero se puede perder..!!

En Visual Fox Pro, los eventos se codifican de manera similar a los demás entornos visuales orientados a objeto, tales como Delphi, Builder, Visual Basic, etc. La sintaxis es simple y se ajusta al órden

Cada objeto reconoce y responde a acciones llamadas eventos, estos son actividades específicas, predeterminadas y que pueden ser iniciadas por el usuario, como ocurre en la mayor parte de los casos, pero también pueden ser desencadenadas por el propio sistema.


 **********************************************
 *       METODOS DE LA PAGINA PRINCIPAL
 ********************************************** 
 PROCEDURE Volar.CLICK
  Mensaje=Messagebox('Confirma tu Opción',4+32+256,'DESEAS CERRAR ESTE PROGRAMA')
  IF Mensaje=6
     Clear Events
  ENDIF
 ENDPROC

ENDDEFINE

Cada clase define el formato físico del objeto, en nuestro caso:

  1. PROPIEDADES DEL OBJETO: Formulario
    
     Caption    ='AGENDA 2003 de WILO        '+ Dtoc(date())
     ShowTips   = .T.
     Top        = 10
     Left       = 10
     Height     = 300                      
     Width      = 500                      
     FontBold   = .T.                       
     ControlBox = .T.  
     Closable   = .F. 
     minButton  = .T. 
     maxButton  = .T.  
     BorderStyle= 3
     BackStyle  = 1        
     Picture    = 'Rayado.bmp'
     
     
    
    PARADIGMA SISTEMICO
    La mentira ...es un simple sistema de verdades..!!!

  2. PROPIEDADES DEL OBJETO: Autor
    
      ToolTipText='El Autor'
      TOP    = 10
      LEFT   = 100
      WIDTH  = 340
      HEIGHT = 280
      Picture= 'mitapiz.bmp'
      VISIBLE=.F.
      BorderStyle = 2
      BackColor  = 32768
    
PARADIGMA: La riqueza es como el agua salada;
cuanto más se bebe, más sed da..!!
Schopenhauer

Esta propuesta está codificado en Visual Fox Pro, desde la versión 5 en adelante, maneja una base de datos, que deberás crear, en función de los campos, que seguramente puedes deducir de este documento, que especifica la visualización de los respectivos campos.

Si es tu primera vez.!!..te felicito..!!, por que ingresarás al exclusivo mundo de los programadores en el entorno visual orientado a objetos..!!..Ya verás..que es mucho más simple que la vieja filosofía de la programación procedural...

Ah..!! la calidad de tus productos informáticos serán muy superiores en los aspectos de estética, amigabilidad, seguridad, credibilidad y... todas esos aspectos que debes aplicar en tus diseños personales..!!

PARADIGMA : Para obtener éxito en el mundo
hay que parecer loco y ser sabio
Montesquieu

PROGRAMACION ORIENTADA A OBJETOS

Te recomiendo copiar textualmente los siguientes códigos; por el momento no cambies nada, hasta tanto hayas visto su correcto funcionamiento..!!!

Lee el procedimiento LOAD y deduce el nombre y la estructura de la tabla usada



***************************************************
* WILO CARPIO CACERES     16/09/2003                     
* Visual Fox 7 Español    Modelo2003.prg
* PROGRAMA AGENDA:        Formulario único
***************************************************
Close Data
Clear All
Set Date To French
Set Point To '.'
Set Optimize On  
Public DatoDelCombo, Elegido

Formulario = CREATEOBJECT('FormularioWilo')  
Formulario.SHOW		
READ EVENTS                                

DEFINE CLASS FormularioWilo AS Form
 Caption    ='AGENDA 2003 de WILO        '+ Dtoc(date())
 ShowTips   = .T.
 Top        = 10
 Left       = 10
 Height     = 300                      
 Width      = 500                      
 FontBold   = .T.                       
 ControlBox = .T.  
 Closable   = .F. 
 minButton  = .T. 
 maxButton  = .T.  
 BorderStyle= 3
 BackStyle  = 1        
 Picture    = 'Rayado.bmp'
 
**********************************************
*       OBJETOS DE LA PAGINA PRINCIPAL
**********************************************
 ADD OBJECT PanelBoxesDatos AS DatosContainer
 ADD OBJECT PanelGrilla     AS GrillaContainer
 ADD OBJECT MenuPrincipal   AS BotonesContainer
 ADD OBJECT MenuConsulta    AS VerDatosContainer
 ADD OBJECT PanelBuscar     AS BuscarContainer
 ADD OBJECT PanelAutor      AS AutorContainer
 ADD OBJECT PanelFrame      AS FrameContainer
 ADD OBJECT LogoUTN AS Image WITH Top=90,  Left=150,Picture = 'BebeWilo.gif', ToolTipText='Autor',BackStyle=0


**********************************************
*       METODOS DEL FORMULARIO PRINCIPAL
**********************************************
 PROCEDURE Load                         
   SET DELETE ON                         
   USE Agenda.dbf ALIAS Telf IN 1
   GO Top                               
 ENDPROC
 
 PROCEDURE LogoUTN.MouseMove
  PARAMETER a, b, c, d, e
     This.TOP =  10
     This.LEFT = 450
     This.Picture = 'Wilin.bmp'
 ENDPROC
 
 PROCEDURE LogoUTN.Click
  ThisForm.MenuPrincipal.Visible=.F.
  ThisForm.PanelAutor.Visible=.T.
 ENDPROC
 
ENDDEFINE
********************************
* FIN DEL FORMULARIO PRINCIPAL
********************************
PARADIGMA: Hay una fuerza motríz más poderosa
que el vapor, la electricidad y la Energía atómica ..
La voluntad..!! (Albert Einstein)

CREACION DE CLASES ADJUNTAS
Sigue copiando textualmente los siguientes códigos, que corresponden a las clases que se pegarán sobre el formulario principal del link anterior. Ojito.. No cambies nada..!!! (Por el momento)

*************************************************************************
*   CLASES EXTERNAS AL FORMULARIO PRINCIPAL
*           MENU PRINCIPAL
********************************
DEFINE CLASS BotonesContainer AS MiContainer
  TOP    = 5
  LEFT   = 10
  WIDTH  = 365
  HEIGHT = 70
  VISIBLE=.T.
 ADD OBJECT Consultas AS UnBoton
 ADD OBJECT Altas     AS UnBoton WITH Left=77, Caption = '\< Altas',  Picture='ABM.bmp',      ToolTipText=' Grabar nuevos datos '    
 ADD OBJECT Modificar AS UnBoton WITH Left=147,Caption = '\< Cambios',Picture='Modificar.ico',ToolTipText=' Modificar registros '    
 ADD OBJECT Bajas     AS UnBoton WITH Left=217,Caption = '\< Bajas',  Picture='Borrar.ico',   ToolTipText=' Eliminar registros '    
 ADD OBJECT Cerrar    AS UnBoton WITH Left=287,Caption = '\< Salir',  Picture='Llave.bmp',    ToolTipText=' Cierra este programa '    
  PROCEDURE Consultas.Click
   Formulario.Caption = 'Elige una opción de consulta'
   Formulario.MenuPrincipal.Visible = .F.
   Formulario.MenuConsulta.Visible = .T.
  ENDPROC
  PROCEDURE Altas.Click
   Formulario.Caption = 'DIGITA LOS NUEVOS DATOS,  luego graba'
   Formulario.MenuPrincipal.Visible = .F.
   DO LimpiarBoxes
   DO OcultarAutor
   Formulario.PanelBoxesDatos.Grabar.Visible = .F.
   Formulario.PanelBoxesDatos.Limpiar.Visible = .T.
   Formulario.PanelBoxesDatos.Visible = .T.
  ENDPROC
  PROCEDURE Modificar.Click
   Formulario.Caption ='SELECCIONA LA FICHA A CAMBIAR,  Luego pulsa Aceptar'
   Formulario.PanelBoxesDatos.Grabar.Visible = .T.
   Formulario.PanelBoxesDatos.Limpiar.Visible = .T.
   Formulario.MenuPrincipal.Visible = .F.
   Formulario.PanelBuscar.MiCombo.Visible = .T.
   Formulario.PanelBuscar.Ordenar.Visible = .T.
   Formulario.PanelBuscar. Visible = .T.
   DO OcultarAutor
  ENDPROC
  PROCEDURE Bajas.Click
   Formulario.Caption ='ELIGE LA FICHA A BORRAR,  Luego pulsa Aceptar'
   Formulario.MenuPrincipal.Visible = .F.
   Formulario.PanelBuscar.MiCombo.Visible = .T.
   Formulario.PanelBuscar. Visible = .T.
   DO OcultarAutor
  ENDPROC

  PROCEDURE Cerrar.Click
   Mensaje=Messagebox('Confirma tu Opción',4+32+256,'DESEAS CERRAR ESTE PROGRAMA')
   IF Mensaje=6
      Clear Events
   ENDIF
  ENDPROC
ENDDEFINE

************************************************
*       CLASE CONTAINER DE CONSULTA
************************************************
DEFINE CLASS VerDatosContainer AS BotonesContainer
  WIDTH  = 365
  Visible = .F.
 ADD OBJECT PanelGrilla AS UnBoton WITH Left=7,  Caption = '\ < Grilla',   Picture='Grilla.ico', ToolTipText=' Grabar nuevos datos '    
 ADD OBJECT Buscar      AS UnBoton WITH Left=77, Caption = '\ < Combo',    Picture='Combo.ico',  ToolTipText=' Modificar registros '    
 ADD OBJECT UnaFicha    AS UnBoton WITH Left=147,Caption = '\ < UnaFicha', Picture='Ficha.ico',  ToolTipText=' Eliminar registros '    
 ADD OBJECT CerrarEsto  AS UnBoton WITH Left=217,Caption = '\ < Volver',   Picture='Salir.ico',  ToolTipText=' Cierra este programa '    
  PROCEDURE PanelGrilla.Click
    Formulario.Caption = 'GRILLA: de '+STR(RECCOUNT())+' FICHAS GRABADAS'
    Formulario.PanelBuscar.Ordenar.Visible = .F.
    Formulario.MenuConsulta.Visible=.F.
    Formulario.PanelGrilla.Refresh
    Formulario.PanelGrilla.Visible=.T.
    DO OcultarAutor
  ENDPROC
  PROCEDURE Buscar.Click
    Formulario.Caption ='SELECCIONA EL DATO A BUSCAR,  luego presiona Aceptar'
    Formulario.MenuConsulta.Visible = .F.
    Formulario.PanelBuscar.MiCombo.Requery
    Formulario.PanelBuscar.MiCombo.Refresh
    Formulario.PanelBuscar.MiCombo.Visible = .T.
    Formulario.PanelBuscar.BoxDato.Visible = .F.
    Formulario.PanelBuscar. Visible = .T.
    DO OcultarAutor
 ENDPROC
 PROCEDURE UnaFicha.Click
    Formulario.Caption ='DIGITA EL DATO A BUSCAR,  luego presiona ENTER'
    Formulario.MenuConsulta.Visible = .F.
    Formulario.PanelBuscar.MiCombo.Visible = .F.
    Formulario.PanelBuscar.BoxDato.Visible = .T.
    Formulario.PanelBuscar.BoxDato.SetFocus
    Formulario.PanelBuscar. Visible = .T.
    DO OcultarAutor
 ENDPROC
 PROCEDURE CerrarEsto.Click
    Formulario.MenuConsulta.Visible= .F.
    DO ActivarPantallaPrincipal
 ENDPROC
 
ENDDEFINE

DEFINE CLASS UnBoton AS CommandButton
 TOP   = 7 
 Left  = 7
 Width = 70
 Height= 55
 FontBold=.T.
 Caption = '\< Consultas'
 Picture='Ver.ico'     
 Visible = .T.
 ToolTipText='Ver datos grabados '    
ENDDEFINE

DEFINE CLASS BotonAceptar AS UnBoton
 TOP = 70
 Left= 427
 Width = 50
 Caption = '\< Acepto'
 Picture='OK.bmp'
 Visible = .F.
 ToolTipText='Aceptar la Operación'
ENDDEFINE

DEFINE CLASS MiContainer AS Container
  TOP    = 10
  LEFT   = 10
  WIDTH  = 485
  HEIGHT = 250
  Picture= 'mitapiz.bmp'
  VISIBLE=.F.
  ADD OBJECT Salir AS UnBoton WITH Caption='\< Cerrar',TOP=10,Left=427,Width=50,Picture='Llave.bmp', ToolTipText='Cerrar esto', BackStyle=0
 PROCEDURE Salir.Click
  DO ActivarPantallaPrincipal
  Formulario.PanelFrame.Visible = .F.
  Formulario.PanelBoxesDatos.Visible = .F.
 ENDPROC
ENDDEFINE

DEFINE CLASS GrillaContainer AS MiContainer
 ADD OBJECT MiGrilla AS Grid WITH TOP=10, Left=10, Width=410,Height=230,ReadOnly=.T.,FontBold=.T.     
ENDDEFINE

DEFINE CLASS AutorContainer AS MiContainer
 ADD OBJECT Foto AS Image WITH TOP=15, Left=20, Picture = 'Pavaroti.jpg',ToolTipText='Londres Marzo 1998', Visible=.T.
ENDDEFINE

DEFINE CLASS DatosContainer AS MiContainer
  ADD OBJECT RotNombre AS Label   WITH TOP=15, LEFT=10,Autosize=.T.,HEIGHT=10, FONTBOLD  = .T.,Caption='   Nombre'
  ADD OBJECT RotDirecc AS Label   WITH TOP=60, LEFT=10,Autosize=.T.,HEIGHT=10, FONTBOLD  = .T.,Caption='Domicilio'
  ADD OBJECT RotTelefo AS Label   WITH TOP=105,LEFT=10,Autosize=.T.,HEIGHT=10, FONTBOLD  = .T.,Caption=' Teléfono'
  ADD OBJECT BoxNombre AS TextBox WITH TOP=15, LEFT=80, WIDTH=230,HEIGHT=23,ReadOnly=.F., ToolTipText='Nombre y Apellido'
  ADD OBJECT BoxDirecc AS TextBox WITH TOP=60, LEFT=80, WIDTH=230,HEIGHT=23,ReadOnly=.F., ToolTipText='Direccion del Mono'
  ADD OBJECT BoxTelefo AS TextBox WITH TOP=105,LEFT=80, WIDTH=130,HEIGHT=23,ReadOnly=.F., ToolTipText='Teléfono del Mono'

  ADD OBJECT Limpiar   AS UnBoton WITH Caption='\< Limpiar',TOP=70, Left=427,Width=50,Picture='Borrar.ico',ToolTipText='Limpia los datos',BackStyle=0
  ADD OBJECT Grabar    AS UnBoton WITH Caption='\< Grabar', TOP=130,Left=427,Width=50,Picture='Grabar.bmp',ToolTipText='Graba estos datos'
 
 PROCEDURE Limpiar.Click
   Formulario.Caption = 'DIGITA LOS NUEVOS DATOS,  luego graba'
   DO LimpiarBoxes
 ENDPROC

 PROCEDURE BoxNombre.LostFocus
  PARAMETER a, b, c, d, e
  IF NOT(Formulario.PanelBoxesDatos.BoxNombre.Value='        ')
     Formulario.PanelBoxesDatos.Grabar.Visible = .T.
  ENDIF  
 ENDPROC

 PROCEDURE Grabar.Click
  Mensaje=Messagebox('Estas seguro ?',4+32+256,'Deseas Grabar la FICHA NUEVA')
  IF Mensaje=6
     IF Formulario.Caption = 'DIGITA LOS NUEVOS DATOS,  luego graba'
        DO GrabarLaNuevaFicha
     ENDIF 
     IF Formulario.Caption = 'DIGITA LOS CAMBIOS,  Luego pulsa -> Grabar'
        DO GrabarLosCambios
        Formulario.PanelBoxesDatos.Visible=.F.
        Formulario.MenuPrincipal.Visible=.T.
        Formulario.MenuPrincipal.Consultas.SetFocus
     ENDIF  
     DO IndexarTabla
     Formulario.PanelBoxesDatos.Grabar.Visible = .F.
     DO LimpiarBoxes
  ENDIF 
ENDPROC

ENDDEFINE

DEFINE CLASS BuscarContainer AS MiContainer
 ADD OBJECT MiCombo AS ComboNombre
 ADD OBJECT BoxDato AS TextBox  WITH TOP=10, Left=10, Width=190,Height=25,Visible = .F.,FontBold=.T.     
 ADD OBJECT Ordenar AS CheckBox WITH TOP=70, Left=10, Visible = .F.,Caption = '\< Mantenimiento'     
 ADD OBJECT Aceptar AS BotonAceptar
  PROCEDURE MiCombo.InteractiveChange
   Formulario.PanelBuscar.Aceptar.Visible=.T.
  ENDPROC	
  PROCEDURE BoxDato.LostFocus
   Formulario.PanelBuscar.Aceptar.Visible=.T.
  ENDPROC	
  PROCEDURE Ordenar.Click
   Formulario.Caption ='MANTENIMIENTO DE LA BASE DE DATOS'
   Formulario.PanelBuscar. Visible = .F.
   Formulario.PanelBuscar.Ordenar.Value = .F.
   Formulario.PanelFrame. Visible = .T.
   DO OcultarAutor
  ENDPROC
  PROCEDURE Aceptar.Click  
   Formulario.PanelBuscar.Visible = .F.
   DO CASE
      CASE Formulario.Caption = 'SELECCIONA EL DATO A BUSCAR,  luego presiona Aceptar'
            GO UbicaFicha()
            Formulario.MenuConsulta.Visible = .F.
            Formulario.PanelBoxesDatos.Grabar.Visible = .F.
            Formulario.PanelBoxesDatos.Limpiar.Visible = .F.
            DO MostrarLosDatos
      CASE Formulario.Caption = 'DIGITA EL DATO A BUSCAR,  luego presiona ENTER'
            Set Near On
            Set Exact Off
	        DatoBuscado = Upper(AllTrim(Formulario.PanelBuscar.BoxDato.Value))
	        GO Top                                          
	        LOCATE FOR Upper(Telf.Nombre) = DatoBuscado   
		    IF Found()
                DO MostrarBrowser
              ELSE
	          =MessageBox('No esta registrado',0+64,DatoBuscado)
	        ENDIF
	        Set Exact On
            DO ActivarPantallaPrincipal
      CASE Formulario.Caption = 'SELECCIONA LA FICHA A CAMBIAR,  Luego pulsa Aceptar'
		    GO UbicaFicha()
		    Mensaje=Messagebox(nombre+'  Dirección: '+Direccion,4+32+256,'DESEAS CAMBIAR LA FICHA')
		    IF Mensaje=6
		       Formulario.Caption = 'DIGITA LOS CAMBIOS,  Luego pulsa -> Grabar'
               DO MostrarLosDatos
               Formulario.PanelBoxesDatos.BoxNombre.SetFocus
              ELSE
                DO ActivarPantallaPrincipal
            ENDIF
      CASE Formulario.Caption ='ELIGE LA FICHA A BORRAR,  Luego pulsa Aceptar'
		    GO UbicaFicha()
    	    Mensaje=Messagebox(nombre+'  Dirección: '+Direccion,4+32+256,'DESEAS BORRAR LA FICHA DE')
		    IF Mensaje=6
		        dele
                DO ActivarPantallaPrincipal
                Formulario.PanelBuscar.MiCombo.Requery               
                Formulario.PanelBuscar.MiCombo.Refresh
              ELSE
                DO ActivarPantallaPrincipal
            ENDIF
            Formulario.PanelBuscar.MiCombo.Value=1
   ENDCASE
 ENDPROC
ENDDEFINE

DEFINE CLASS ComboNombre AS ComboBox
 ToolTipText = 'Abre esta lista y elige un Nombre'
 Left = 300
 Top=10
 Left=10
 Width=190
 Visible=.T.
 TabIndex = 1
 RowSourceType = 3
 RowSource="SELECT Nombre FROM Agenda ORDER BY Agenda.Nombre INTO CURSOR Dato" 
 PROCEDURE Init
	This.Value    = 1   && Valor seleccionado es  1º de la lista.
    This.Refresh
 ENDPROC	
 
ENDDEFINE

F O X: Mantenimiento
Clases y Objetos Funcion y Procedimiento Mantenimiento S Q L Fox Pro Win 2.6
PARADIGMA: Lo que con mucho trabajo se adquiere, ..
..más se ama..!! (Aristóteles)

Te recomiendo además de copiar textualmente los siguientes códigos, que pongas atención a los procedimientos de mantenimiento:

***************************************************************
*    OBJETOS PARA MANTENIMIENTO DE LAS BASES DE DATOS
*         INDEXACIÓN, ORDENAMIENTO y BACKUP
***************************************************************
**************************************
*   CLASE TIPO FRAME O PAGINAS
**************************************
DEFINE CLASS FrameContainer AS MiContainer
 ADD OBJECT Folios AS MiFrame WITH TOP=10, LEFT=10
ENDDEFINE

DEFINE CLASS MiFrame AS PageFrame
  PageCount=3
  Page1.Caption='Indexar'
  Page2.Caption='Ordenar'
  Page3.Caption='Backup'
  Width=320
  Height=230
  Visible=.T.
  PROCEDURE Init
   This.Page1.ADDOBJECT('OpcionIndexar','Opciones')
   This.Page1.OpcionIndexar.Buttons(1).Caption='\  Agenda.CDX',0+64,'TABLA INDEXADA Tipo CDX')
       ELSE  
         ***************************************
         *    IDX: Genera InIDXNom.IDX
         ***************************************
         DO IndexarTabla
	     =MessageBox('Se generó-> InIDXNom.IDX',0+64,'TABLA INDEXADA Tipo IDX')
     ENDIF  
  ENDIF   
 ENDPROC
ENDDEFINE

**************************************
*   ORDENAMIENTO DE UNA TABLA
**************************************
DEFINE CLASS AceptarOrdenar AS BotonAceptar
 PROCEDURE Click
  Mensaje=Messagebox('Estas seguro ?',4+32+256,'QUERES ORDENAR LA TABLA')
  IF Mensaje=6
     IF ThisForm.PanelFrame.Folios.Page2.OpcionOrdenar.Buttons(1).Value=1
         SORT TO OrdenNom.dbf ON Nombre
	     =MessageBox('POR NOMBRE',0+64,'TABLA ORDENADA')
       ELSE  
         SORT TO OrdenDir.dbf ON Direccion
         =MessageBox('POR DIRECCION',0+64,'TABLA ORDENADA')
     ENDIF  
  ENDIF   
 ENDPROC
ENDDEFINE

**************************************
*   COPIAR LA TABLA EN DISCO
**************************************
DEFINE CLASS AceptarCopiar AS BotonAceptar
 PROCEDURE Click
  Mensaje=Messagebox('Estas seguro ?',4+32+256,'QUERES COPIAR LA TABLA')
  IF Mensaje=6
     IF ThisForm.PanelFrame.Folios.Page3.OpcionCopiar.Buttons(1).Value=1
         Mensaje=Messagebox('Estas seguro ?',4+32+256,'COPIAR TABLA EN TU RÍGIDO')
         IF Mensaje=6
            *************************
            *  COPIA EN EL RIGIDO
            *************************
            COPY TO C:\Mis documentos\BackDato.dbf
	        =MessageBox(' EN EL RIGIDO..!!',0+64,'LA TABLA YA FUE COPIADA')
	     ENDIF  
       ELSE  
         Mensaje=Messagebox('Insertaste el disquete..??',4+32+256,'COPIAR TABLA POR DISKETERA')
         IF Mensaje=6
            *************************
            *  COPIA EN DISKETE
            *************************
            COPY TO A:\BackDato.dbf
	        =MessageBox(' EN EL DISQUETE..!!',0+64,'LA TABLA YA FUE COPIADA')
	     ENDIF  
     ENDIF  
  ENDIF   
 ENDPROC
ENDDEFINE

PARADIGMA: Para obtener éxito en el mundo
hay que parecer loco y ser sabio (Montesquieu)

Volver al principio
PARADIGMA
La ignorancia afirma o niega
La ciencia duda..!!
Voltaire

METODOS EXTERNOS

Además de copiar textualmente los siguientes códigos, compara los siguientes procedimientos y funciones con los del primer link y deduce la diferencia..!!



*******************************************************************
*               FUNCIONES Y PROCEDIMIENTOS EXTERNOS
*******************************************************************
**************************************
*   BUSCAR UNA FICHA POR COMBO BOX
**************************************
FUNCTION UbicaFicha
  FOR Ficha = 1 TO Formulario.PanelBuscar.MiCombo.ListCount
    IF Formulario.PanelBuscar.MiCombo.Selected(Ficha)
       DatoDelCombo=AllTrim(Formulario.PanelBuscar.MiCombo.List(Ficha))
    ENDIF
  ENDFOR
  LOCATE FOR '&DatoDelCombo'$Nombre
  Ubicacion = RECNO()
RETURN Ubicacion
 
PROCEDURE LimpiarBoxes
 Formulario.PanelBoxesDatos.BoxNombre.Value = ''
 Formulario.PanelBoxesDatos.BoxDirecc.Value = ''
 Formulario.PanelBoxesDatos.BoxTelefo.Value = ''
 Formulario.PanelBoxesDatos.BoxNombre.SetFocus
RETURN

PROCEDURE MostrarLosDatos
 Formulario.PanelBoxesDatos.BoxNombre.Value = Nombre
 Formulario.PanelBoxesDatos.BoxDirecc.Value = Direccion
 Formulario.PanelBoxesDatos.BoxTelefo.Value = Telefono
 Formulario.PanelBoxesDatos.Visible = .T.
RETURN

PROCEDURE ActivarPantallaPrincipal
 Formulario.Caption = 'AGENDA 2003 de WILO     '+ Dtoc(date())+ STR(RECCOUNT())+' Fichas'
 Formulario.Picture = 'Esterilla.bmp'
 Formulario.MenuPrincipal.Visible = .T.
 Formulario.PanelGrilla.Visible = .F.
 Formulario.LogoUTN.Top=90
 Formulario.LogoUTN.Left=200
 Formulario.LogoUTN.Picture = 'LogoUTN.bmp'
 Formulario.LogoUTN.Visible = .T.
 Formulario.PanelAutor.Visible = .F.
 Formulario.PanelBuscar.Visible = .F.
 Formulario.PanelBuscar.Aceptar.Visible=.F.
 Formulario.PanelBuscar.Ordenar.Visible = .F.
 Formulario.Refresh
RETURN

PROCEDURE MostrarBrowser
 DEFINE WINDOW Ventana FROM 2,2 TO 20,50 TITLE 'RESULTADO de la BUSQUEDA' CLOSE FLOAT GROW ZOOM MINIMIZE
 ACTIVATE WINDOW Ventana
   BROW FIELDS Nombre, Direccion  FOR Upper(Telf.Nombre) = DatoBuscado NoAppe NoDele NoModi NORMAL IN WINDOW Ventana
 DEACTIVATE WINDOW Ventana  
RETURN

PROCEDURE GrabarLaNuevaFicha
 INSERT INTO Agenda (Nombre, Direccion, Telefono) ;
        VALUES (Formulario.PanelBoxesDatos.BoxNombre.Value,;
                Formulario.PanelBoxesDatos.BoxDirecc.Value,;
                Formulario.PanelBoxesDatos.BoxTelefo.Value)
                Formulario.PanelBuscar.MiCombo.Requery               
                Formulario.PanelBuscar.MiCombo.Refresh              
RETURN

PROCEDURE GrabarLosCambios
  REPLACE;
  Telf.Nombre    WITH Formulario.PanelBoxesDatos.BoxNombre.Value,;
  Telf.Direccion WITH Formulario.PanelBoxesDatos.BoxDirecc.Value,;
  Telf.Telefono  WITH Formulario.PanelBoxesDatos.BoxTelefo.Value
RETURN

PROCEDURE IndexarTabla
  Set Safety Off
  Select Telf
  GO Top
  Index On Nombre To IndexNom
  Set Safety On
RETURN

PROCEDURE OcultarAutor
  Formulario.PanelAutor.Visible = .F.
  Formulario.LogoUTN.Visible = .F.
RETURN

Puedes destacar la aplicación del esqueleto sobre el que se apoya todo el sistema

Formulario = CREATEOBJECT('MiFormulario')
Formulario.SHOW
READ EVENTS

DEFINE CLASS MiFormulario AS Form
.......
ENDDEF


**************************************************************************
* WILO CARPIO CACERES     PROGRAMA AGENDA: Modelo con un solo Formulario                   
* Visual Fox 6 Español      01/09/2000
*    mode2000.prg
**************************************************************************
Close Data
Clear All
Set Date To French
Set Point To '.'
Set Optimize On  
Public DatoDelCombo, Elegido

Formulario = CREATEOBJECT('MiFormulario')  
Formulario.SHOW		
READ EVENTS                                

DEFINE CLASS MiFormulario AS Form
 Caption    ='AGENDA DE WILO     Modelo 2000        '+ Dtoc(date())
 ShowTips   = .T.
 Top        = 10
 Left       = 10
 Height     = 300                      
 Width      = 500                      
 FontBold   = .T.                       
 ControlBox = .T.  
 Closable   = .F. 
 minButton  = .T. 
 maxButton  = .T.  
 BorderStyle= 3
 BackStyle  = 1        
 Picture    = 'Esterilla.bmp'
 
**********************************************
*       OBJETOS DE LA PAGINA PRINCIPAL
**********************************************
 ADD OBJECT BoxesDeDatos  AS ContainerDatos
 ADD OBJECT VerGrilla     AS ContainerGrilla
 ADD OBJECT MenuPrincipal AS ContainerBotones
 ADD OBJECT MenuConsulta  AS ContainerVerDatos
 ADD OBJECT UnDatoBuscado AS ContainerBuscar
 ADD OBJECT VerAutor      AS ContainerAutor
 ADD OBJECT Volar AS Image With Top=250, Left=450,Picture = 'Llave.bmp', ToolTipText='Salir de este programa..!'
 ADD OBJECT UTN   AS Image With Top=50,  Left=200,Picture = 'LogoUTN.bmp', ToolTipText='Autor',BackStyle=0

 
********************************************************
*          METODOS DE ALTAS DE NUEVAS FICHAS
********************************************************

 PROCEDURE MenuPrincipal.Altas.Click
  ThisForm.Caption = 'DIGITA LOS NUEVOS DATOS,  luego graba'
  ThisForm.MenuPrincipal.Visible = .F.
  DO LimpiarBoxes
  ThisForm.BoxesDeDatos.Grabar.Visible = .F.
  ThisForm.BoxesDeDatos.Limpiar.Visible = .T.
  ThisForm.BoxesDeDatos.Visible = .T.
 ENDPROC
 
 PROCEDURE BoxesDeDatos.Salir.Click
  ThisForm.Caption = 'AGENDA DE WILO     Modelo 2000        '+ Dtoc(date())
  ThisForm.BoxesDeDatos.Visible = .F.
  DO ActivarPantallaPrincipal
 ENDPROC

 PROCEDURE BoxesDeDatos.Limpiar.Click
  IF ThisForm.Caption = 'PARA BORRAR ESTA FICHA,  Pulsa -> Limpiar'
	  DELETE 
	  Wait Window 'Se eliminó la ficha de '+nombre
      ThisForm.BoxesDeDatos.Visible = .F.
      ThisForm.MenuPrincipal.Visible = .T.
    ELSE
      ThisForm.Caption = 'DIGITA LOS NUEVOS DATOS,  luego graba'
      DO LimpiarBoxes
   ENDIF  
 ENDPROC

 PROCEDURE BoxesDeDatos.BoxNombre.LostFocus
  PARAMETER a, b, c, d, e
  IF NOT(ThisForm.BoxesDeDatos.BoxNombre.Value='        ')
     ThisForm.BoxesDeDatos.Grabar.Visible = .T.
  ENDIF  
 ENDPROC

 PROCEDURE BoxesDeDatos.Grabar.Click
  Mensaje=Messagebox('Estas seguro ?',4+32+256,'Deseas Grabar la FICHA NUEVA')
  IF Mensaje=6
     IF ThisForm.Caption = 'DIGITA LOS NUEVOS DATOS,  luego graba'
        APPEND BLANK
     ENDIF  
     REPLACE;
       Telf.Nombre    With ThisForm.BoxesDeDatos.BoxNombre.Value,;
       Telf.Direccion With ThisForm.BoxesDeDatos.BoxDirecc.Value,;
       Telf.Telefono  With ThisForm.BoxesDeDatos.BoxTelefo.Value
     Set Safety Off
     Select Telf
     GO Top
     Index On Nombre To IndexNom
     Set Safety On
  ENDIF 
  ThisForm.BoxesDeDatos.Grabar.Visible = .F.
  DO LimpiarBoxes
  IF ThisForm.Caption = 'DIGITA LOS CAMBIOS,  Luego pulsa -> Grabar'
     ThisForm.BoxesDeDatos.Visible=.F.
     ThisForm.MenuPrincipal.Visible=.T.
     ThisForm.MenuPrincipal.Consultas.SetFocus
  ENDIF
ENDPROC

ENDDEFINE

Volver al principio

USE Agenda.dbf ALIAS Telf IN 1

En esta page revisa tus conceptos para abrir bases de datos por programa y algunas de las estructuras típicas en todo sistema


**********************************************
*       METODOS DE LA PAGINA PRINCIPAL
**********************************************
 PROCEDURE Load                         
   SET DELETE ON                         
   USE Agenda.dbf ALIAS Telf IN 1
   GO Top                               
 ENDPROC
 
 PROCEDURE Volar.Click
  Mensaje=Messagebox('Confirma tu opción',4+32+256,'DESEAS CERRAR ESTE PROGRAMA')
  IF Mensaje=6
     Clear Events
  ENDIF
 ENDPROC
 
 PROCEDURE UTN.MouseMove
  PARAMETER a, b, c, d, e
     This.TOP =  10
     This.LEFT = 450
     This.Picture = 'Wilin.bmp'
 ENDPROC
 
 PROCEDURE UTN.Click
  ThisForm.VerAutor.Visible=.T.
 ENDPROC

********************************************************
*   METODOS DE VISUALIZACION DE FICHAS GRABADAS
********************************************************
 PROCEDURE MenuPrincipal.Consultas.Click
  ThisForm.Caption = 'Elige una opción de consulta'
  ThisForm.MenuPrincipal.Visible = .F.
  ThisForm.MenuConsulta.Visible = .T.
 ENDPROC

 PROCEDURE MenuConsulta.Salir.Click
  ThisForm.Caption = 'AGENDA DE WILO     Modelo 2000        '+ Dtoc(date())
  ThisForm.MenuConsulta.Visible = .F.
  DO ActivarPantallaPrincipal
 ENDPROC

**********************************
*   VISUALIZAR EL AUTOR
**********************************
 PROCEDURE VerAutor.Salir.Click
  ThisForm.Caption = 'AGENDA DE WILO     Modelo 2000        '+ Dtoc(date())
  ThisForm.VerAutor.Visible = .F.
  DO ActivarPantallaPrincipal
  ThisForm.UTN.Top=50
  ThisForm.UTN.Left=200
  ThisForm.UTN.Picture = 'LogoUTN.bmp'
 ENDPROC
 
**********************************
*   VISUALIZAR TOTAL POR GRILLA
**********************************
PROCEDURE MenuConsulta.TeclaVerTabla.Click
 ThisForm.Caption = 'GRILLA DE FICHAS GRABADAS'
 ThisForm.MenuConsulta.Visible=.F.
 ThisForm.VerGrilla.Visible=.T.
ENDPROC
 
 PROCEDURE VerGrilla.Salir.Click
  ThisForm.Caption = 'AGENDA DE WILO     Modelo 2000        '+ Dtoc(date())
  ThisForm.VerGrilla.Visible = .F.
  ThisForm.MenuPrincipal.Visible=.T.
 ENDPROC

Volver al principio

COMBO BOX

El manejo de los combo box te simplifican la vida y especialmente de los usuarios de los sistemas que tu generes..!!


   
**********************************
*   BUSCAR POR COMBO O TextBox
**********************************
 PROCEDURE MenuConsulta.TeclaDeBuscar.Click
  ThisForm.Caption ='SELECCIONA EL DATO A BUSCAR,  luego presiona Aceptar'
  ThisForm.MenuConsulta.Visible = .F.
  ThisForm.UnDatoBuscado.MiCombo.Visible = .T.
  ThisForm.UnDatoBuscado.BoxDato.Visible = .F.
  ThisForm.UnDatoBuscado. Visible = .T.
 ENDPROC

 PROCEDURE MenuConsulta.TeclaUnaFicha.Click
  ThisForm.Caption ='DIGITA EL DATO A BUSCAR,  luego presiona Aceptar'
  ThisForm.MenuConsulta.Visible = .F.
  ThisForm.UnDatoBuscado.MiCombo.Visible = .F.
  ThisForm.UnDatoBuscado.BoxDato.Visible = .T.
  ThisForm.UnDatoBuscado.BoxDato.SetFocus
  ThisForm.UnDatoBuscado. Visible = .T.
 ENDPROC
 
 PROCEDURE UnDatoBuscado.Salir.Click
  ThisForm.Caption = 'AGENDA DE WILO     Modelo 2000        '+ Dtoc(date())
  ThisForm.UnDatoBuscado.Visible = .F.
  DO ActivarPantallaPrincipal
 ENDPROC

¿Hasta dónde se lavan la cara los pelados?

Volver al principio

¿Por qué apretamos más fuerte los botones del control remoto cuando tiene poca batería??

PROCEDURE MenuPrincipal.Modificar.Click

Solo deben estar visibles los objetos que serán usados en la transacción..!!


********************************************************
*   ACTIVAR MenuPrincipal DE MODIFICACION DE FICHAS GRABADAS
********************************************************
 PROCEDURE MenuPrincipal.Modificar.Click
  ThisForm.Caption ='SELECCIONA LA FICHA A CAMBIAR,  Luego pulsa Aceptar'
  ThisForm.BoxesDeDatos.Grabar.Visible = .T.
  ThisForm.BoxesDeDatos.Limpiar.Visible = .T.
  ThisForm.MenuPrincipal.Visible = .F.
  ThisForm.UnDatoBuscado.MiCombo.Visible = .T.
  ThisForm.UnDatoBuscado. Visible = .T.
 ENDPROC

********************************************************
*   ACTIVAR MenuPrincipal DE BAJAS DE FICHAS GRABADAS
********************************************************
 PROCEDURE MenuPrincipal.Bajas.Click
  ThisForm.Caption ='ELIGE LA FICHA A BORRAR,  Luego pulsa Aceptar'
  ThisForm.MenuPrincipal.Visible = .F.
  ThisForm.UnDatoBuscado.MiCombo.Visible = .T.
  ThisForm.UnDatoBuscado. Visible = .T.
 ENDPROC

¿Por qué la luz negra no es negra?

Volver al principio

SELECCIONA EL DATO A BUSCAR

Elige tus fichas para modificar o hacerlos pelota..!!


********************************************************
*   ACEPTAR LA BUSQUEDA O MODIFICACION
********************************************************
 PROCEDURE UnDatoBuscado.Aceptar.Click  
  ThisForm.UnDatoBuscado. Visible = .F.
  DO CASE
     CASE ThisForm.Caption = 'SELECCIONA EL DATO A BUSCAR,  luego presiona Aceptar'
            GO UbicaFicha()
            ThisForm.MenuConsulta.Visible = .F.
            ThisForm.BoxesDeDatos.Grabar.Visible = .F.
            ThisForm.BoxesDeDatos.Limpiar.Visible = .F.
            DO MostrarLosDatos
           
     CASE ThisForm.Caption = 'DIGITA EL DATO A BUSCAR,  luego presiona Aceptar'
            Set Near On
            Set Exact Off
	        DatoBuscado = Upper(AllTrim(ThisForm.UnDatoBuscado.BoxDato.Value))
	        GO Top                                          
	        LOCATE FOR Upper(Telf.Nombre) = DatoBuscado   
		    IF Found()
               ThisForm.BoxesDeDatos.Grabar.Visible = .F.
               ThisForm.BoxesDeDatos.Limpiar.Visible = .F.
               DO MostrarLosDatos
    	     ELSE
	          =MessageBox('No esta registrado',0+64,UnDatoBuscado)
	        ENDIF
	        Set Exact On
	       
     CASE ThisForm.Caption = 'SELECCIONA LA FICHA A CAMBIAR,  Luego pulsa Aceptar'
		    GO UbicaFicha()
		    Mensaje=Messagebox(nombre+'  Dirección: '+Direccion,4+32+256,'DESEAS CAMBIAR LA FICHA')
		    IF Mensaje=6
		       ThisForm.Caption = 'DIGITA LOS CAMBIOS,  Luego pulsa -> Grabar'
               DO MostrarLosDatos
               ThisForm.BoxesDeDatos.BoxNombre.SetFocus
              ELSE
               ThisForm.MenuPrincipal.Visible = .T.
            ENDIF

     CASE ThisForm.Caption ='ELIGE LA FICHA A BORRAR,  Luego pulsa Aceptar'
		    GO UbicaFicha()
		    Mensaje=Messagebox(nombre+'  Dirección: '+Direccion,4+32+256,'DESEAS BORRAR LA FICHA DE')
		    IF Mensaje=6
		       ThisForm.Caption = 'PARA BORRAR ESTA FICHA,  Pulsa -> Borrar'
               DO MostrarLosDatos
              ELSE
               ThisForm.MenuPrincipal.Visible = .T.
            ENDIF
  ENDCASE
ENDPROC

Al mundo redondo lo llamamos planeta. Si fuese plano... ¿lo llamaríamos redondeta.??

Volver al principio

Si un abogado enloquece... ¿pierde el juicio?

CONTENEDORES..!!

Cuanto más contenedores uses tus programas, ademas menos laboriosos, serán más simples para su actualización y mántenimiento..!!



*****************************************
*         OBJETOS EXTERNOS
*****************************************
DEFINE CLASS ContainerDatos AS Container
  ToolTipText='Container de Datos'
  TOP    = 5
  LEFT   = 5
  WIDTH  = 350
  HEIGHT = 200
  Picture= 'mitapiz.bmp'
  VISIBLE=.F.
  ADD OBJECT RotNombre AS Label         WITH TOP=15, LEFT=10,Autosize=.T.,HEIGHT=10, FONTBOLD  = .T.,Caption = ' Nombre'
  ADD OBJECT RotDirecc AS Label         WITH TOP=60, LEFT=10,Autosize=.T.,HEIGHT=10, FONTBOLD  = .T.,Caption = ' Domicilio'
  ADD OBJECT RotTelefo AS Label         WITH TOP=105,LEFT=10,Autosize=.T.,HEIGHT=10, FONTBOLD  = .T.,Caption = ' Teléfono'
  ADD OBJECT BoxNombre AS TextBox       WITH TOP=15, LEFT=80, WIDTH=230,HEIGHT=23,ReadOnly=.F., ToolTipText='Nombre y Apellido'
  ADD OBJECT BoxDirecc AS TextBox       WITH TOP=60, LEFT=80, WIDTH=230,HEIGHT=23,ReadOnly=.F., ToolTipText='Direccion del Mono'
  ADD OBJECT BoxTelefo AS TextBox       WITH TOP=105,LEFT=80, WIDTH=130,HEIGHT=23,ReadOnly=.F., ToolTipText='Teléfono del Mono'
  ADD OBJECT Grabar    AS Image WITH TOP=150, LEFT=90, Picture='Grabar.bmp',ToolTipText='Graba estos datos'
  ADD OBJECT Limpiar   AS Image WITH TOP=150, LEFT=150,Picture='Borrar.ico',ToolTipText='Limpia los datos',BackStyle=0
  ADD OBJECT Salir     AS Image With Top=155, Left=280,Picture='Volar.bmp', ToolTipText='Cerrar esto',     BackStyle=0
ENDDEFINE

DEFINE CLASS ContainerBotones AS Container
  ToolTipText='Container de Modificaciones'
  TOP    = 5
  LEFT   = 5
  WIDTH  = 85
  HEIGHT = 270
  Picture= 'mitapiz.bmp'
  VISIBLE=.T.
 ADD OBJECT Consultas AS CommandButton With Top=7,  Left=7,Width=70,Height=60,Caption = ' Consultas',Picture='Ver.ico',      Visible = .T.,ToolTipText = ' Ver datos grabados '    
 ADD OBJECT Altas     AS CommandButton With Top=72, Left=7,Width=70,Height=60,Caption = ' Altas',    Picture='ABM.bmp',      Visible = .T.,ToolTipText = ' Grabar nuevos datos '    
 ADD OBJECT Modificar AS CommandButton With Top=137,Left=7,Width=70,Height=60,Caption = ' Cambios',  Picture='Modificar.ico',Visible = .T.,ToolTipText = ' Modificar registros '    
 ADD OBJECT Bajas     AS CommandButton With Top=202,Left=7,Width=70,Height=60,Caption = ' Bajas',    Picture='Borrar.ico',   Visible = .T.,ToolTipText = ' Eliminar registros '    
ENDDEFINE

Volver al principio

PEGANDO OBJETOS


DEFINE CLASS ContainerVerDatos AS Container
  ToolTipText='Container de Consultas'
  TOP    = 5
  LEFT   = 5
  WIDTH  = 80
  HEIGHT = 150
  Picture= 'mitapiz.bmp'
  VISIBLE=.F.
 ADD OBJECT TeclaVerTabla AS CommandButton With Top=7,  Left=5, Width=70,Height=30,Caption = ' Ver Tabla',ToolTipText='Muestra toda la tabla de datos'    
 ADD OBJECT TeclaDeBuscar AS CommandButton With Top=42, Left=5, Width=70,Height=30,Caption = ' Buscar',   ToolTipText='Permite Buscar por ComboBox'    
 ADD OBJECT TeclaUnaFicha AS CommandButton With Top=77, Left=5, Width=70,Height=30,Caption = ' Una Ficha',ToolTipText='Busca ficha por Teclado'
 ADD OBJECT Salir AS Image With Top=120, Left=20, Picture = 'Volar.bmp', ToolTipText='Cerrar esto',BackStyle=0
ENDDEFINE

DEFINE CLASS ContainerBuscar AS Container
  ToolTipText='Container de Búsqueda'
  TOP    = 10
  LEFT   = 100
  WIDTH  = 300
  HEIGHT = 100
  Picture= 'mitapiz.bmp'
  VISIBLE=.F.
 ADD OBJECT BoxDato AS TextBox   With Top=10, Left=10, Width=190,Height=25,Visible = .F.,FontBold=.T.     
 ADD OBJECT MiCombo  AS ComboBox With Top=10, Left=10, Width=190,RowSourceType = 3,Visible=.T.,Value=1,;
    RowSource="SELECT Nombre FROM Agenda ORDER BY Agenda.Nombre INTO CURSOR Dato",ToolTipText='Selecciona un dato' 
 ADD OBJECT Aceptar AS CommandButton With Top=10, Left=220, Width=70,Height=30,Caption = ' Aceptar',ToolTipText='Aceptar el dato'
 ADD OBJECT Salir AS Image With Top=55,  Left=240,Picture = 'Volar.bmp', ToolTipText='Cerrar esto',BackStyle=0
ENDDEFINE

DEFINE CLASS ContainerGrilla AS Container
  ToolTipText='Grilla de datos grabados'
  TOP    = 10
  LEFT   = 100
  WIDTH  = 340
  HEIGHT = 280
  Picture= 'mitapiz.bmp'
  VISIBLE=.F.
 ADD OBJECT MiGrilla AS Grid  With Top=10,  Left=10, Width=320,Height=220, Visible = .T.,ReadOnly=.T.,FontBold=.T.     
 ADD OBJECT Salir    AS Image With Top=240, Left=140,Picture = 'Volar.bmp', ToolTipText='Cerrar esto',BackStyle=0
ENDDEFINE

DEFINE CLASS ContainerAutor AS Container
  ToolTipText='El Autor'
  TOP    = 10
  LEFT   = 100
  WIDTH  = 340
  HEIGHT = 280
  Picture= 'mitapiz.bmp'
  VISIBLE=.F.
  BorderStyle = 2
  BackColor  = 32768
 ADD OBJECT Foto  AS Image With Top=10, Left=10, Picture = 'Pavaroti.jpg',ToolTipText='Londres Marzo 1998', Visible=.T.
 ADD OBJECT Salir AS Image With Top=240,  Left=130,Picture = 'Volar.bmp', ToolTipText='Cerrar esto',BackStyle=0
ENDDEFINE

Si la piscina es honda, ¿el mar es Toyota.???

Volver al principio

FUNCIONES Y PROCEDIMIENTOS

Tus sistemas serán más cortos y por lo tanto más ágiles cuanto más subprogramas adoptes..!!!


************************************************
*    FUNCIONES Y PROCEDIMIENTOS EXTERNOS
************************************************
FUNCTION UbicaFicha
  FOR Ficha = 1 TO Formulario.UnDatoBuscado.MiCombo.ListCount
    IF Formulario.UnDatoBuscado.MiCombo.Selected(Ficha)
       DatoDelCombo=AllTrim(Formulario.UnDatoBuscado.MiCombo.List(Ficha))
    ENDIF
  ENDFOR
  LOCATE FOR '&DatoDelCombo'$Nombre
  Ubicacion = RECNO()
RETURN Ubicacion
 
PROCEDURE LimpiarBoxes
 Formulario.BoxesDeDatos.BoxNombre.Value = ''
 Formulario.BoxesDeDatos.BoxDirecc.Value = ''
 Formulario.BoxesDeDatos.BoxTelefo.Value = ''
 Formulario.BoxesDeDatos.BoxNombre.SetFocus
RETURN

PROCEDURE MostrarLosDatos
 Formulario.BoxesDeDatos.BoxNombre.Value = Nombre
 Formulario.BoxesDeDatos.BoxDirecc.Value = Direccion
 Formulario.BoxesDeDatos.BoxTelefo.Value = Telefono
 Formulario.BoxesDeDatos.Visible = .T.
RETURN

PROCEDURE ActivarPantallaPrincipal
 Formulario.MenuPrincipal.Visible = .T.
 Formulario.Picture = 'Esterilla.bmp'
 Formulario.Refresh
RETURN

F O X: Lenguaje S Q L
Clases y Objetos Funcion y Procedimiento Mantenimiento S Q L Fox Pro Win 2.6


PARADIGMA: El tonto tiene una gran ventaja
sobre el hombre de espíritu:
Está siempre contento de si mismo..!! (Napoleon)

Si el programador desea ubicar un dato que se encuentra en alguna de sus bases o tablas de datos. Las alternativas de métodos pueden ser los procedimientos tipo Locate, Seek, Select

Este último lo ofrece la técnica SQL y es la de mayor eficiencia, cuya sintaxis completa puede verse en el manual corrrespondiente, pero que en su forma simplificada, responde a la siguiente estructura:

SELECT FROM Tabla ORDER BY Tabla.Campo
INTO CURSOR/ARRAY/DBF/TABLE [ TO PRINTER/SCREEN/FILE ] Destino
WHERE Condición

Para ampliar tus conocimientos de esta metodología que es válida para todos los lenguajes modernos, te recomiendo leer detenidamente los CD de ayuda que trae el paquete M Estudio.

Por ejemplo:

Imprime.MiEleccion.RowSource =
SELECT DISTINCT comision FROM alumnos ORDER BY alumnos.comision
INTO CURSOR LaComision

MANEJO DE DATOS CON SQL

Colega virtual en este link podrás encontrar información sobre la forma más simple, moderna, estandar de concretar tus operaciones de actualización de tus tablas o bases de datos.

En esta primera parte puedes ver la metodología que utilizan los comandos SQL, válidos para la mayoría de los lenguajes, para efectuar altas, bajas, modificaciones y consultas.

COMANDO INSERT - SQL
Agrega un registro al final de una tabla que contiene los valores de campo especificados.

SINTAXIS: Tienes dos alternativas..

Argumentos

El nuevo registro contiene los datos indicados en la cláusula VALUES o incluidos en la matriz o las variables de memoria especificadas. El puntero de registro se coloca en el nuevo registro.

EJEMPLOS INSERT - SQL
En el siguiente ejemplo se abre la tabla Alumnos y se agrega un registro.


     USE Alumnos

         INSERT INTO Alumnos (Legajo, Nombre, Comision) ;

                      VALUES (1322, "Pirulo", "3ro 2da")

El ejemplo siguiente abre la tabla customer de la base de datos testdata.
El contenido del registro actual se reparte en variables, y la estructura de la tabla se copia a una nueva tabla llamada MiTabla.

Se usa INSERT - SQL para insertar un registro nuevo en la tabla MiTabla y se ejecuta BROWSE para mostrar el nuevo registro.


  CLOSE DATABASES
  CLEAR

  OPEN DATABASE (HOME(2) + 'Data\testdata')
  USE Alumnos     && Abre la tabla Alumnos
* Esparcir el registro actual a variables de memoria
  SCATTER MEMVAR

* Copiar estructura de la tabla actual a la tabla de ejemplo
  COPY STRUCTURE TO MiTabla

* Insertar registro desde variable de memoria
  INSERT INTO MiTabla FROM MEMVAR

  SELECT MiTabla
  BROWSE

* Cerrar y eliminar tabla de ejemplo
  USE
  DELETE FILE MiTabla.dbf

COMANDO DELETE - SQL

Marca registros para eliminarlos.

SINTAXIS

DELETE FROM [NombreBaseDatos!]NombreTabla [WHERE CondiciónFiltro1 [AND | OR CondiciónFiltro2 ...]]

Argumentos

Los registros marcados para eliminación no se eliminan físicamente de la tabla hasta que se ejecute PACK. Los registros marcados para eliminación pueden recuperarse (quitarles la marca) con RECALL.

Si se establece SET DELETED como ON, todos los comandos que incluyan un alcance pasarán por alto los registros marcados para eliminación.

A diferencia de DELETE, DELETE - SQL utiliza el bloqueo de registros cuando marca varios registros para eliminarlos de las tablas abiertas para acceso compartido. Este hecho disminuye la contención de registros en situaciones de varios usuarios, pero puede ralentizar el rendimiento. Para conseguir el máximo rendimiento, abra la tabla para uso exclusivo o utilice FLOCK( ) para bloquear la tabla.

EJEMPLO de DELETE - SQL
El ejemplo siguiente abre la tabla customer de la base de datos testdata. Se usa DELETE - SQL para marcar todos los registros para eliminar cuyo campo country contenga EE.UU. Se muestran todos los registros marcados para eliminar. Se usa RECALL ALL para quitar las marcas de todos los registros marcados para eliminar.


   CLOSE DATABASES
   CLEAR

   OPEN DATABASE (Home(2)+ 'Data\testdata')
   USE Alumnos  && Abre la tabla Alumnos.

   DELETE FROM Alumnos WHERE comision = "2do 3ra"    && Marcar para eliminar.

   CLEAR
   LIST FIELDS Legajo, Nombre FOR DELETED( )      && Muestra los registros marcados.
   * Si el archivo estuviera empaquetado en este punto, se eliminarían los registros.
   WAIT WINDOW "Registros actualmente marcados para eliminación"+CHR(13) + ; "Tecla para desmarcar..."

   * Quita las marcas de todos los registros marcados para eliminar.
   RECALL ALL
   CLEAR
   * Comprueba los registros revertidos.
   COUNT FOR DELETED( )=.T. TO nDeleted

   * Convierte nEliminado en una cadena de caracteres y muestra información.
   WAIT WINDOW ALLTRIM(STR(nEliminado)) + " registros marcados para eliminación"

COMANDO MODIFY QUERY
Abre el Diseñador de consultas para permitirle modificar o crear una consulta.

Sintaxis

MODIFY QUERY [NombreArchivo | ?]
[[WINDOW NombreVentana1]
[IN SCREEN]
[NOWAIT]
[SAVE]
[AS nPáginaCódigos]

Argumentos

Al ejecutar MODIFY QUERY sin ningún argumento se muestra el cuadro de diálogo Abrir. Si elige “Nuevo” en este cuadro de diálogo, se asigna el nombre CONSULTA1 a la consulta. Puede guardar la consulta con otro nombre distinto al salir del Diseñador de consultas.

Después de crear una consulta, ésta se almacena como un archivo de programa de Visual FoxPro con la extensión .qpr. Puede ejecutar un programa de consulta con DO, pero es necesario incluir la extensión .qpr con el nombre del archivo de consulta.

Volver al principio

COMANDO CREATE QUERY

Abre el Diseñador de consultas.

Sintaxis

CREATE QUERY [NombreArchivo | ?] [NOWAIT]

Argumentos

Para recuperar datos de las tablas se utiliza un comando SELECT de SQL. SELECT es muy eficaz y puede reemplazar a varios comandos de Visual FoxPro. Puesto que un comando SELECT de SQL realiza las funciones de varios comandos de Visual FoxPro, SELECT optimiza el rendimiento del programa.

Piense en SELECT como en una forma de presentar una consulta a Visual FoxPro para que obtenga información de tablas. SELECT le permite especificar la información que quiere sin tener que decirle a Visual FoxPro cómo ha de obtener la información. Visual FoxPro determina la forma óptima de obtener la información.

Después de crear una consulta, la consulta se almacenará en un archivo de programa de Visual FoxPro con una extensión .qpr.
Un programa de consulta puede ejecutarse mediante DO. Cuando ejecute una consulta con DO debe incluir la extensión del archivo de consulta, como se muestra en el ejemplo siguiente.

DO mi_cons.qpr

Si se ejecuta el comando CREATE QUERY sin ningún argumento adicional, se abrirá una nueva ventana de consulta. A la consulta se le asigna el nombre CONSULTA1. Cuando salga de la ventana Consulta, podrá guardar la consulta con un nombre diferente.

Si la tabla que especifica está abierta, INSERT anexa el registro a la tabla. Si la tabla está abierta en una área de trabajo distinta del área de trabajo actual, no se seleccionará después de anexar el registro; el área de trabajo actual permanecerá seleccionada.

SELECT

SELECT [ALL | DISTINCT] [TOP nExpresión [PERCENT]] [Alias.] Elemento_Selección [AS Nombre_Columna] [, [Alias.] Elemento_Selección [AS Nombre_Columna] ...]

Especifica los campos, constantes y expresiones que se mostrarán en el resultado de la consulta.

Volver al principio

F R O M

FROM [FORCE][NombreBaseDatos!]Tabla [[AS] Local_Alias] [[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN NombreBaseDatos!]Tabla [[AS] Local_Alias] [ON CondiciónCombinación …]

Enumera las tablas que contienen los datos que ha obtenido la consulta. Si no hay ninguna tabla abierta, Visual FoxPro mostrará el cuadro de diálogo Abrir para permitirle especificar la ubicación del archivo. Una vez abierta, la tabla permanecerá abierta cuando la consulta se haya terminado.

I N T O

[[INTO Destino] | [TO FILE NombreArchivo [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]]

Determina donde se almacenan los resultados de la consulta. Si incluye una cláusula INTO y una cláusula TO en la misma consulta, la cláusula TO se pasará por alto. Si no incluye la cláusula INTO, los resultados de la consulta se mostrarán en la ventana Examinar. Los resultados de la consulta pueden dirigirse también a la impresora o a un archivo mediante la cláusula TO.

Destino puede ser uno de los siguientes:

[PREFERENCE NombrePreferencia] [NOCONSOLE] [NOWAIT]

Si el resultado de una consulta se envía a una ventana Examinar, podrá incluir PREFERENCE para guardar los atributos y opciones de la ventana Examinar para utilizarlos después.

WHERE

[WHERE CondiciónCombinación [AND CondiciónCombinación ...] [AND | OR CondiciónFiltro [AND | OR CondiciónFiltro ...]]]

Indica a Visual FoxPro que incluya únicamente ciertos registros en el resultado de la consulta. WHERE es necesario para recuperar datos de varias tablas.

Volver al principio

[GROUP BY ColumnaGrupo [, ColumnaGrupo ...]]

Agrupa las filas de la consulta basándose en los valores de una o más columnas. ColumnaGrupo puede ser el nombre de un campo normal de una tabla, o un campo que incluya una función de campo SQL, o una expresión numérica indicando la posición de la columna en la tabla resultado (la columna más a la izquierda tiene el número 1).

[HAVING CondiciónFiltro]

HAVING CondiciónFiltro: Especifica una condición de filtro que los grupos deben satisfacer para quedar incluidos en el resultado de la consulta. HAVING debe utilizarse con GROUP BY. Puede incluir tantas condiciones de filtro como se deseen, conectadas con el operador AND u OR. También puede utilizar NOT para invertir el valor de una expresión lógica.

CondiciónFiltro no puede contener una subconsulta.

Una cláusula HAVING sin una cláusula GROUP BY actúa como una cláusula WHERE. Puede utilizar alias locales y funciones de campo en la cláusula HAVING. Utilice una cláusula WHERE para acelerar el rendimiento si su cláusula HAVING no contiene funciones de campo. No olvide que la cláusula HAVING debería de aparecer antes de una cláusula INTO porque, de lo contrario, se producirá un error de sintaxis.

[UNION [ALL] SELECTCommand]

[UNION [ALL] ComandoSELECT]: Combina el resultado final de una SELECT con el resultado final de otra SELECT. De forma predeterminada, UNION comprueba el resultado combinado y elimina las filas duplicadas. Puede utilizar paréntesis para combinar múltiples cláusulas UNION.

Utilice la palabra clave opcional ALL para impedir que UNION elimine filas duplicadas de los resultados combinados.

Las cláusulas UNION siguen las reglas siguientes:

ORDER BY

[ORDER BY Elemento_Orden [ASC | DESC] [, Elemento_Orden [ASC | DESC] ...]]

Únicamente el SELECT final puede tener una cláusula ORDER BY, que debe referirse a las columnas de los resultados por su número. Si se incluye otra cláusula ORDER BY, afectará al resultado completo. ORDER BY Elemento_Orden

Ordena el resultado de la consulta basándose en los datos de una o varias columnas. Cada Elemento_Orden debe corresponder a una columna del resultado de la consulta, y puede ser uno de los siguientes:

Un campo de una tabla FROM que también es un elemento de selección en la cláusula principal SELECT (no en una subconsulta).

Una expresión numérica que indica la ubicación de la columna en la tabla resultante. (La columna de la izquierda es la número 1.)

ASC especifica un orden ascendente para los resultados de la consulta, de acuerdo con el elemento o los elementos de orden, y es el valor predeterminado para ORDER BY.

DESC especifica un orden descendente para los resultados de la consulta.

SELECT ES...

SELECT es un comando SQL que está incorporado en Visual FoxPro como cualquier otro comando de Visual FoxPro.

Cuando utiliza SELECT para componer una consulta, Visual FoxPro interpreta la consulta y recupera los datos especificados de las tablas. Puede crear una consulta SELECT:

Cuando ejecuta SET TALK ON y ejecuta SELECT, Visual FoxPro muestra la duración de la consulta y el número de registros del resultado. _TALLY contiene el número de registros del resultado de la consulta.

SELECT no respeta la condición de filtro actual especificada con SET FILTER.

Una subconsulta, a la que se hace referencia en los argumentos siguientes, es un comando SELECT dentro de otro SELECT y debe incluirse entre paréntesis.

Puede tener múltiples subconsultas al mismo nivel (no anidadas) en la cláusula WHERE (consulte esta sección de los argumentos). Las subconsultas pueden contener múltiples condiciones de combinación.

Cuando se obtiene el resultado de una consulta, las columnas se denominarán según las siguientes reglas:

  1. Si un elemento seleccionado es un campo con un nombre único, el nombre de la columna de resultado es el nombre del campo.

  2. Si hay más de un elemento seleccionado con el mismo nombre, se anexarán un signo de subrayado y una letra al nombre de la columna. Por ejemplo, si una tabla llamada Cliente tiene un campo llamado CALLE, y una tabla llamada Empleados también tiene un campo llamado CALLE, las columnas de resultado se llamarán Extensión_A y Extensión_B (CALLE _A y CALLE _B). En el caso de un elemento seleccionado con un nombre de 10 caracteres, se truncará el nombre para anexar el símbolo de subrayado y la letra. Por ejemplo, DEPARTMENT se convertiría en DEPARTME_A.

  3. Si un elemento seleccionado es una expresión, su columna de resultado se llamará EXP_A. Cualquier otra expresión recibirá el nombre de EXP_B, EXP_C, y así sucesivamente.

  4. Si un elemento seleccionado contiene una función de campo como, por ejemplo, COUNT( ), la columna de resultado se llamará CNT_A. Si otro elemento seleccionado contiene SUM( ), su columna de resultado se llamará SUM_B.

  5. Funciones definidas por el usuario con SELECT Aunque la utilización de funciones definidas por el usuario en la cláusula SELECT ofrece unas ventajas evidentes, también debería tener en cuenta las siguientes limitaciones:

  6. Es posible que la velocidad de realización de las operaciones con SELECT se vea limitada por la velocidad a la que se ejecutan las funciones definidas por el usuario. Las manipulaciones de un gran volumen que impliquen funciones definidas por el usuario se pueden realizar mejor utilizando funciones API y funciones definidas por el usuario escritas en C o en lenguaje ensamblador.

  7. No se puede prever nada acerca de la entrada/salida de Visual FoxPro (E/S) ni del entorno de la tabla en funciones definidas por el usuario invocadas a partir de SELECT. Generalmente, no se puede saber qué área de trabajo se ha seleccionado, ni el nombre de la tabla actual, ni los nombres de los campos que se están procesando. El valor de dichas variables depende del lugar específico, dentro del proceso de optimización, en el que se invoque la función definida por el usuario.

  8. En funciones definidas por el usuario invocadas desde SELECT, no es seguro cambiar la E/S de Visual FoxPro ni el entorno de la tabla. Por norma general, los resultados son impredecibles.

  9. La única forma segura de pasar valores a funciones definidas por el usuario invocadas desde SELECT es mediante la lista de argumentos pasada a la función cuando es invocada.

  10. Si prueba y descubre una manipulación teóricamente prohibida que funciona correctamente en una versión determinada de FoxPro, eso no significa que también funcione en versiones posteriores.

Salvando dichas limitaciones, las funciones definidas por el usuario son aceptables en la cláusula SELECT. Sin embargo, recuerde que la utilización de SELECT puede ralentizar el rendimiento.

Las siguientes funciones de campo están disponibles para ser utilizadas con un elemento seleccionado que sea un campo o una expresión que implique a un campo:

Combinaciones Visual FoxPro acepta sintaxis de combinación de 1992 SQL ANSI, lo que le permite crear consultas que vinculen las filas en dos o más tablas mediante la comparación de los valores de campos especificados. Por ejemplo, una combinación interna selecciona filas procedentes de dos tablas sólo cuando los valores de los campos combinados son iguales. Visual FoxPro admite combinaciones anidadas.

Dado que SQL se basa en la teoría de conjuntos matemática, se puede representar a cada tabla con un círculo. La cláusula ON que especifica las condiciones de la combinación determina el punto de intersección, el cual representa el conjunto de filas que coinciden. En el caso de una combinación interna, la intersección tendrá lugar en el interior o en una parte “interna” de los dos círculos. Una combinación externa incluye tanto las filas coincidentes que se han encontrado en la sección de intersección interna de las tablas, como las filas de la parte externa del círculo a la izquierda, o a la derecha, de la intersección.

Importante Tenga presente la siguiente información a la hora de crear condiciones de combinación:

Si incluyes dos tablas en una consulta y no especifica una condición de combinación, cada registro de la primera tabla se combinará con cada registro de la segunda tabla hasta que surtan efecto las condiciones del filtro. Una consulta tal puede producir unos resultados interminables.

Se prudente al utilizar, en condiciones de combinación, funciones tales como DELETED( ), EOF( ), FOUND( ), RECCOUNT( ), y RECNO( ), que aceptan un área de trabajo o un alias opcional. La inclusión de un alias o de un área de trabajo en dichas funciones puede producir resultados inesperados. SELECT no utiliza sus áreas de trabajo; realiza lo equivalente a USE ... AGAIN. Las consultas de una única tabla que utilizan estas funciones sin un área de trabajo o un alias opcional, tendrán resultados correctos. De todas formas, las consultas de varias tablas que utilicen dichas funciones (incluso sin un área de trabajo o un alias opcional) pueden tener resultados inesperados.

Se prudente al combinar tablas que contengan campos vacíos porque Visual FoxPro concuerda campos vacíos. Por ejemplo, si combina CUSTOMER.ZIP e INVOICE.ZIP, y CUSTOMER contiene 100 códigos postales vacíos e INVOICE contiene 400 códigos postales vacíos, el resultado de la consulta contendrá 40.000 registros más, como resultado de los campos vacíos. Use la función EMPTY( ) para eliminar los registros vacíos del resultado de la consulta.

EJEMPLOS


Ejemplo 1: Muestran los nombres de todas las compañías en customer (un campo de una tabla).

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT customer.company ;
   FROM customer


Ejemplo 2: Muestra el contenido de tres campos de dos tablas y combina las dos tablas basándose en el campo clie_id. Utiliza alias locales para ambas tablas.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT a.company, b.order_date, b.shipped_on ;
   FROM customer a, orders b ;
   WHERE a.cust_id = b.cust_id


Ejemplo 3: Muestra únicamente registros con datos únicos en los campos especificados.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT DISTINCT a.company, b.order_date, b.shipped_on ;
   FROM customer a, orders b ;
   WHERE  a.cust_id = b.cust_id

Ejemplo 4: Muestra los campos country, postalcode y company en orden ascendente.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + ‘data\testdata’)  
SELECT country, postalcode, company ;
   FROM customer ;
   ORDER BY country, postalcode, company


Ejemplo 5: Almacena el contenido de los campos de dos tablas en una tercera tabla.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT a.company, b.order_date, b.shipped_on ;
   FROM customer a, orders b ;
   WHERE a.cust_id = b.cust_id ;
   INTO TABLE custship.dbf
BROWSE


Ejemplo 6: Muestra únicamente los registros con una fecha de factura anterior al 02/26/2001.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT a.company, b.order_date, b.shipped_on ;
   FROM customer a, orders b ;
   WHERE a.cust_id = b.cust_id ;
   AND b.order_date < {^2001-02-26}


Ejemplo 7: Muestra los nombres de todas las empresas de customer con un código postal que coincida con el código postal de la tabla orders.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT company FROM customer a WHERE ;
   EXISTS (SELECT * FROM orders b WHERE a.postalcode = b.postalcode)


Ejemplo 8: Muestra todos los registros de customer que tengan un nombre de empresa que comience por una C mayúscula y tenga cualquier longitud.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer a WHERE a.company LIKE "C%"


Ejemplo 9: Muestra todos los registros de customer que tengan un nombre de país que comience por U mayúscula seguido de un carácter desconocido.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer a WHERE a.country LIKE "U_"


Ejemplo 10:  Muestra los nombres de todas las ciudades de customer en mayúsculas y llama CityList a la columna de los resultados.

CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT UPPER(city) AS CityList FROM customer


Ejemplo 11: Muestra cómo se puede realizar una consulta de datos que contenga signos de porcentaje (%).
Se colocará una barra inversa (\) antes del signo de porcentaje para indicar que tendría que ser tratado
como un literal, y la barra inversa se especifica como el carácter de escape en la cláusula ESCAPE.

Dado que las tablas de ejemplo incluidas con Visual FoxPro no contienen el carácter de signo de porcentaje,
esta consulta no devolverá ningún resultado.

  CLOSE ALL
  CLOSE DATABASES
  OPEN DATABASE (HOME(2) + 'data\testdata')
  SELECT * FROM customer;
  WHERE company LIKE "%\%%" ESCAPE "\"


Ejemplo 12: Muestra cómo se puede realizar una consulta de datos que contenga signos de subrayado (_).
            Se colocará una barra inversa (\) antes del signo de subrayado para indicar que debería ser tratado
            como un literal, y se especificará la barra inversa como el carácter de escape en la cláusula ESCAPE.

            Dado que las tablas de ejemplo incluidas con Visual FoxPro no contienen el carácter de subrayado,
            esta consulta no devolverá ningún resultado.

  CLOSE ALL
  CLOSE DATABASES
  OPEN DATABASE (HOME(2) + 'data\testdata')  
  SELECT * FROM customer;
  WHERE company LIKE "%\_%" ESCAPE "\"



Ejemplo 13: El carácter Escape se utiliza a sí mismo como un literal.
            El guión es tanto el carácter escape como un literal.
            La consulta devuelve todas las filas en las que el nombre de la compañía contiene
            un signo de porcentaje seguido de un guión.

Dado que las tablas de ejemplo proporcionadas con Visual FoxPro no contienen el carácter del signo
de porcentaje, esta consulta no devolverá ningún resultado.

CLOSE ALL
CLOSE DATABASES
OPEN

PARADIGMA
Se conoce el corazón del hombre por lo que hace,
..y su sabiduría, por lo que dice...!!
Taleb

PARADIGMA: Es más valioso quién se levanta
que quién nunca cayó.. (Wilucha)

Apuntes de clasesLenguaje Apuntes de clasesGramática Apuntes de clasesAutómata Apuntes de clasesLaplace Apuntes de clasesSeries Apuntes de clasesEcuación Apuntes de clasesOperador

PARADIGMA
Cultivo una rosa blanca
..en julio, como en enero
para el amigo sincero
que me da su mano franca..!!

Y para el cruel que me arranca
el corazón con que vivo,
cardo ni ortiga cultivo;
..cultivo una rosa blanca..!
José Martí

Te espero en: wilucha@gmail.com

Esta page está en: www.wilocarpio.com.ar

10/12/2003

Volver al principio