Ir arriba

Lenguaje: FOX PRO WIN

Mi congenere virtual algorítmico, esta propuesta pretende servirte de modelo básico integral para diseñar cualquier sistema dentro de la tecnología del entorno Windows del polpular Fox Pro o también Visual Fox Pro
Si eres principiante, te recomiendo copiar textualmente estos algoritmos, compila y yá está..!! veras que estarás administrando todo una base de datos..!! Luego que veas funcionando esto, ya te resultará muy simple introducirle los ajustes de acuerdo a tus necesidades.

BASES de DATOS
Son son estructuras para almacenar grandes volúmenes de datos en soportes informáticos organizados bajo los siguientes conceptos:
- CAMPOS: Colección de datos, agrupados vectorialmente bajo el mismo nombre y cuyo contenido son datos del mismo tipo.
- REGISTROS: Colección de campos, por lo tanto puede estar constituido por datos de distinto tipo y magnitud.
- TABLAS: Colección de registros.

Base
Datos
Altas
Consulta
Bajas
Modificar
Los
Procedimiento
Función
Métodos
Las
Clases
Estructura
Modelo
Lenguaje
SQL

PARADIGMA: No tomes la vida en serio...
..nunca saldremos vivos de ella..!!
Volver al principio Qué es esto..??Fox Pro Win Esp 2.6

Los algoritmos que te propongo los diseñé de manera que sean fáciles de comprender, que su lectura describa el objetivo de cada módulo y lo que es más importante, que pueda ser compilado en la última versión de su hermano mayor VISUAL FOX PRO..!!

Amigo digital.. te garantizo que todos estos algoritmos funcionan correctamente, pero seguramente que está vieja propuesta...puede ser fácilmente mejorada por ti.

Buena suerte..!! y que le saques provecho...!!!




*
*                     |                |                      
*  P R O G R A M A    | FOX PRO WIN    |FechaInicio: 15/05/96 
*      TALLER         | Version 2.6    |                      
*       FOX           | Wilo Carpio    |UltimaModif: 11/08/96 
*        «»           |                |                      
*
do autor
do ventana with " SINTAXIS Y SEMANTICA: TALLER DE FOX          "
*
*          M E N U   D E   O P C I O N E S                    
*
do while .t.
  @ 4,13 GET opcion FUNCTION '*B a:\Consulta.bmp;a:\Lapiz.ico;a:\volar.bmp '  SIZE 5,12,1.3 default 1 Message 'CONSULTAS, MODIDICACIONES y SALIR: Elije una Opción haciendo CLICK EN UN ICONO.!!!'
  read
  do case
      case opcion = 1
                    do Consultas
	  case opcion = 2
           if clave()
              do while opcion < 5
                 opcion = cincoTeclas('MODIFICAR','Altas','Corregir','Borrar','Indexar','Volver')
                  do case
	                case opcion = 1
	                              do GrabaNuevaFicha  
	                case opcion = 2
	                              do corrigeFicha
	                case opcion = 3
	                              do borraFicha
	                case opcion = 4
	                              do indexar 
                 endcase
              enddo   
           endif   
	  case opcion = 3
					 do chau
   endcase
 enddo
return



Volver al principio


Volver al principio ALTASIngreso de nuevos datos

Lo importante es lo de adentro. (Jack el Destripador)

GRABACION DE DATOS EN LA BASE

Te aconsejo, si eres un principiante que copies textualmente codigos usados y pongas atención en los siguientes conceptos:

  • ABRIR LA BASE: use taller98
  • HABILITAR UN ESPACIO EN BLANCO: append blank
  • GRABAR EL DATO: repla

El funcionamiento de estos algoritmos están totalmente probados


*
*              A L T A S                    
*


procedure GrabaNuevaFicha
 use taller98
 go bottom
 ultimo = legajo
 do while Cuestion('Deseas grabar una nueva ficha..?','Ultima Ficha: '+legajo+'  '+alltrim(nombre))
	okdatos = .f.
	do while okdatos = .f.
       do VentanaGrabar with "Registra los nuevos datos, luego cierra esta ventana",1,1,12,50
	   @ 0,0  say " Legajo     Apellido y Nombre          Comision " color gr+/W 
	   @ 4,0  say " Parcial     Recuperación " color gr+/W 
	   buscado = space(10)
	   @ 2,1 say ultimo
	   @ 1,1 get buscado
	   read
       locate for "&buscado" $ upper(legajo)
       if found() then
           deactivate window Grabar
           =Mensaje(  nombre+"  ya está en registro   Nº " +alltrim(str(recno())),"&buscado"+":  Este dato ya fue grabado")
           exit
          else 
	       nomb  = space(30)
		   @ 1,12 get nomb
		   comi  = space(1)
		   @ 1,43 get comi
		   parc  = 0
		   @ 5,1 get parc
		   recu  = 0
		   @ 5,14 get recu
           @ 7,2 GET Ok FUNCTION '*h \!\



Volver al principio


Volver al principio Ver los datos

Cristobal no me rompas los huevos..!! ( La reina Isabel )

VISULIZACION DE DATOS DE LA BASE

Te aconsejo, si eres un principiante que copies textualmente codigos usados y pongas atención en los siguientes conceptos:

  • DIRECCIONAMIENTO: go n
  • VISUALIZACION: brow
  • BUSQUEDA: locate

El funcionamiento de estos algoritmos están totalmente probados



*
*              CONSULTAS                    
*

procedure Consultas
 do while opcion < 5
    use taller98
    opcion = seisTeclas('BUSCAR DATOS DE:','Por Nombre','Un Legajo','Todos los alumnos','Comisiones','Aprobados y otros','Volver')
    do case
       case opcion = 1
            n = LeeNombre('buscar')
            go n
            do abreVentana with 'FICHA Nº  '+alltrim(str(n))+'   :  '+nombre,2,1,10,70
            brow nomodi nodele FONT 'System', 15  STYLE 'N'
       case opcion = 2
*            buscado = leeDato("Nº de Legajo")
*            locate for "&buscado" $ upper(legajo)
*            if recno() > reccount() then
*               =Mensaje('Lo lamento','El legajo ' + '&buscado'+ '  No esta registrado..!!')
*              else 
*               =Mensaje('Leg: '+legajo +" esta en registro " +alltrim(str(recno())), nombre +'Comisión: '+ comision)
*            endif
            n = leeLegajo()
            go n
            do abreVentana with 'FICHA Nº  '+alltrim(str(n))+'  LEGAJO: '+legajo+'   :  '+nombre,2,1,10,70
            brow nomodi nodele  FONT 'System', 15  STYLE 'N' 
       case opcion = 3
            do abreVentana with "Nomina de "+alltrim(str(reccount())) +" Alumnos",1,1,20,60
            brow nomodi  FONT 'System', 15  STYLE 'N'
            if Confirma("Deseas copias impresas ?") 
               buscado = leeDato("Nº de COMISION a imprimir ") 
               do ImprimeCondicion with 'alumnos.frx',alltrim(buscado)
            endif 
       case opcion = 4
            buscado = alltrim(str(leeComision()))
*            buscado = leeDato("Comision buscada")
            count for  "&buscado" $ upper(comision) to total
            do abreVentana with "COMISION "+buscado+" Total alumnos: "+ alltrim(str(total)),2,1,25,75
            brow field legajo,nombre,grupo for "&buscado" $ alltrim(comision) nomodi  FONT 'System', 15  STYLE 'N'
       case opcion = 5
            opcion = seisTeclas('Alumnos..','Aprobados','Que Recuperan','Con Prácticos','Sin Prácticos','Libres','Volver')
            do case
               case opcion = 1
                    count for parcial => 4 to total
                    do abreVentana with alltrim(str(total))+" ALUMNOS APROBARON EL EVALUATIVO",2,1,25,75
                    brow field legajo,nombre,parcial for parcial => 4                    
               case opcion = 2
                    count for parcial < 4 to total
                    do abreVentana with alltrim(str(total))+" ALUMNOS DESAPROBARON EL EVALUATIVO",2,1,25,75
                    brow field legajo,nombre,parcial for parcial < 4                    
               case opcion = 3
                    count for practico = .T. to total
                    do abreVentana with alltrim(str(total))+" ALUMNOS APROBARON LOS PRACTICOS",2,1,25,75
                    brow field legajo,nombre,parcial for practico = .T.                    
               case opcion = 4
                    count for practico = .F. to total
                    do abreVentana with alltrim(str(total))+" ALUMNOS DEBEN LOS PRACTICOS",2,1,25,75
                    do abreVentana with "NOMINA DE ALUMNOS QUE DEBEN PRACTICOS",2,1,25,75
                    brow field legajo,nombre,parcial for practico = .F.                    
               case opcion = 5
                    count for parcial < 4 and practico = .F. to total
                    do abreVentana with alltrim(str(total))+" ALUMNOS QUEDARON LIBRES",2,1,25,75
                    brow field legajo,nombre,parcial for parcial < 4 and practico = .F.                   
            endcase 
            deactivate window ver
    endcase
    deactivate window ver
 enddo
return


Volver al principio


Volver al principio BAJASEliminar datos

Al fin solos... ( El llanero solitario )

SACANDO DATOS DE LA BASE

Te aconsejo, si eres un principiante que copies textualmente codigos usados y pongas atención en los siguientes conceptos:

  • ABRIR LA BASE: use taller98
  • BORRADO LOGICO: delete
  • BORRADO FISICO: pack

El funcionamiento de estos algoritmos están totalmente probados


*
*              B A J A S                     
*


procedure borraFicha
 use taller98  
 n = LeeNombre('borrar')
 go n
 if Cuestion('Registro Nº '+alltrim(str(n))+'   Leg: '+legajo +'   '+ nombre,'Deseas Borrar este registro.??')
    delete record n
    if Confirma("Borras Definitivamente Registro: "+alltrim(str(n))+' Leg:'+legajo +'   '+ nombre)
       pack
    endif 
    deactivate window otra
 endif  
return  


Volver al principio


Volver al principio MODIFICARCambiar datos

Nuestra madre es una loba... (Rómulo y Remo)

REEMPLAZANDO DATOS EN LA BASE

Te aconsejo, si eres un principiante que copies textualmente codigos usados y pongas atención en los siguientes conceptos:

  • LISTANDO LA BASE: list
  • ORDENANDO LA BASE: sort
  • INDEXANDO LA BASE: index

El funcionamiento de estos algoritmos están totalmente probados


*
*              M O D I F I C A C I O N E S                    
*


procedure corrigeFicha
 use taller98 
 opcion = seisTeclas('CORREGIR..','Otros Datos','Nombres','Legajos','Parciales','Practicos','Cancelar')
 do case
    case opcion = 1 
         opcion = seisTeclas('Modificar..','Todos los datos','Recuperación','Generar TXT','Ordenar Datos','Datos a Disquete','Cancelar')
         do case
            case opcion = 1 
                 do abreVentana with "Cambia los Datos de la FICHAS    ..luego, cierra esta ventana",2,1,25,65
                 brow   FONT 'System', 15  STYLE 'N'
            case opcion = 2 
                 do abreVentana with "Cambia las Notas de recuperatorios  ..luego, cierra esta ventana",2,1,25,65
                 browse field legajo,nombre,recupera freeze recupera   FONT 'System', 15  STYLE 'N'
            case opcion = 3 
                 do abreVentana with "Se generó el archivo texto.txt",2,1,25,65
                 List To texto.TXT OFF
                 wait window 'Fin generación de archivo texto.txt'
            case opcion = 4 
                 copy to datosbak
                 sort to alumalfa on nombre
                 close data taller98
                 dele file taller98.dbf
                 use alumalfa
                 copy to taller98
                 use taller98
            case opcion = 5 
                 use taller98
                 copy to a:\CopiaDB
         endcase   
    case opcion = 2 
         go LeeNombre('corregir')
         do abreVentana with "Cambia los Datos de la ficha   ..luego, cierra esta ventana",2,1,10,65
         brow   FONT 'System', 15  STYLE 'N'  
    case opcion = 3 
         buscado = leeDato("Nº de Legajo")
         locate for "&buscado" $ upper(legajo)
         if found() then
            if Confirma("Cambias el registro " +alltrim(str(recno()))+' Leg:'+legajo + nombre +'Com: '+ comision)
               do abreVentana with "Cambia los Datos de la ficha   ..luego, cierra esta ventana",2,1,25,65
               edit
            endif
           else
            =Mensaje('Lo lamento','&buscado'+ '  No esta registrado..!!')
         endif  
    case opcion = 4 
         if Confirma("Deseas cambiar notas de parciales ")
            do abreVentana with "Cambia las Notas de Parciales   ..luego, cierra esta ventana",2,1,25,65
            browse field legajo,nombre,parcial freeze parcial
         endif
    case opcion = 5 
         if Confirma("Deseas cambiar datos de Trabajos Prácticos ")
            do abreVentana with "Cambia los datos de los Practicos   ..luego, cierra esta ventana",2,1,25,65
            browse field legajo,nombre,practico freeze practico
         endif
 endcase    
 deactivate window ver
return  


Volver al principio


Volver al principio PROCEDIMIENTOSSubprogramas anexos

Qué hermosa que es la humanidad..!! ( Un caníbal )

PROCEDIMIENTOS TIPICOS

Te aconsejo, si eres un principiante que copies textualmente codigos usados y pongas atención en los siguientes conceptos:

  • ESTRUCTURA: procedure
  • VALOR DEVUELTO: return
  • PARAMETRO: parameter

El funcionamiento de estos algoritmos están totalmente probados

*
*        P R O C E D I M I E N T O S  V A R I O S             
*


procedure indexar
 if Cuestion('Deseas indexar la tabla ?','Indexación por nombre o legajo') 
    use taller98
    opcion = tresTeclas('INDEXAR BASES por:','Nombres','Legajo','Volver')
    do case
       case opcion = 1
	        index on nombre to alumnos
            use taller98 index alumnos
	   case opcion = 2
	        index on legajo to legajos unique
            use taller98 index alumnos
    endcase
    do abreVentana with "Tabla Indexada",2,1,25,65
    browse  field  legajo,nombre,comision nomodify   FONT 'System', 15  STYLE 'N'
    deactivate window ver
endif 
return

procedure ImprimeCondicion
 parameter reporte,buscado 
 report form '&reporte' for   comision = '&buscado' preview 
 if Confirma("Preparaste tu impresora...tiene papel ?") 
    do otraVentana with "Imprimiendo reporte..",2,1,21,60
    report form '&reporte' for comision = '&buscado' to printer
    deactivate window otra
 endif   
return

procedure DeseasImprimir
* Ejemplo: do DeseasImprimir with 'taller.frx'
parameter reporte
if Confirma('Deseas copias impresas ?') 
   use taller98
   report form '&reporte' preview 
   if Confirma('Preparaste tu impresora...tiene papel ?') 
      do otraVentana with 'Imprimiendo reporte..',2,1,21,60
      report form '&reporte' to printer
      deactivate window otra
  endif   
endif 
return

procedure chau
 if Confirma("Deseas salir de este programa y volver a Windows ?") 
   deactivate window ventana
   close procedure
   clear program
   close database
   clear
   Cancel
*   quit
 endif  
return       
 

procedure tecla
  wait "Pulse Tecla p/Continuar"  window
return

procedure ventana
 parameter titulo
 define window ventana from 0,0 to 28,79 title "&titulo" + dtoc(date()) system mdi minimize zoom  fill file Fondo.bmp close grow color b 
 activate window ventana 
 @ 4,25 say 'cayopity.bmp' bitmap 
 @ 17,60 say 'Utn.ico' bitmap 
 @ 19,57 say ' Wilo Carpio ' FONT  'ARIAL',9 STYLE 't' Color br
 @ 20,60 say ' 1999 ' FONT  'ARIAL',7 STYLE 't'  Color b
 @ 6,25  say ' Consultas ' FONT  'ARIAL',10 STYLE 'bt'  Color Gr+
 @ 12,25 say ' Modificar ' FONT  'ARIAL',10 STYLE 'bt' Color Gr+
 @ 18,25 say ' Salir ' FONT  'ARIAL',10 STYLE 'bt'  Color b+
return

procedure ventanaDatos
 parameter titulo
 define window ventanaDatos from 3,3 to 20,60 in window ventana title '&titulo' system mdi minimize zoom  close grow color w+/+gr
 activate window ventanaDatos 
return


procedure Autor
 for i= 6 to 25
  define window comenzar from 2,2 to i+8,2*i+8 title 'Programa Modelo Fox Pro Win' system mdi minimize zoom style 't' fill file Tejas.bmp grow color w+/r
  activate window comenzar
  if i>20 then 
    @ 3,15 say 'WiloBaby.bmp' bitmap 
  endif  
  Wait Window 'Bienvenido al programa..!!' TimeOut 0.2
 endfor
 for i= 2 to 12
   @ i,1 say ' Wilo Carpio ' FONT  'PRESTIGE',2*i STYLE 'B'
 endfor
 @ 20,5 say ' PRESENTA ' FONT  'PRESTIGE',3*i STYLE 'B' Color +gr
 Wait window '..CLICK para Comenzar.!!' TimeOut 10
 deactivate window comenzar
return


Volver al principio


Volver al principio FUNCIONESFunciones anexas

Muerte a los comechingones. (Los chingones)

FUNCIONES TIPICAS

Te aconsejo, si eres un principiante que copies textualmente codigos usados y pongas atención en los siguientes conceptos:

  • ESTRUCTURA: function
  • VALOR DEVUELTO: return
  • PARAMETRO: parameter

El funcionamiento de estos algoritmos están totalmente probados



*              F U N C I O N E S                    
*

    
function leeDato
 parameter etiqueta
 do otraVentana with "Digita "+"&etiqueta"+", luego pulsa ENTER",3,25,7,75
  dato = space(30)
  @ 0,2 say "" get dato 
  read
  dato = alltrim(upper(dato))
 deactivate window otra
return  dato

function leeNumero
 parameter membrete
 do otraVentana with membrete,2,2,6,30
  @ 1,10 get numeroBuscado spinner 1,1,9999 default 10 size 1,5 font 'prestige new',12 style 'b' color b+/w
  read
  deactivate window otra
return  numeroBuscado

function leeFecha
 do abreVentana with "Digite la fecha",2,2,5,20
 fecha = date()
 @ 0,0 say "" get fecha font "prestige",14  style "n"
 read
 deactivate window ver
return  fecha
function leeNombreCombo
 DIMENSION elementoVector(reccount())
 for i = 1 to reccount()
    go i 
	elementoVector(i) = nombre
 endfor	
 do otraVentana with 'Selecciona un nombre',1,1,10,50
 @ 1,1  GET Indice PICTURE '@^' FROM elementoVector SIZE 3,30 color w+/g+ default 1
 @ 1,34 GET Opcion PICTURE '@*v \!\ < Aceptar;\!\ < Cancelar' SIZE 2,10,1 DEFAULT 1
 read
 if Opcion = 1
	elegido = elementoVector(Indice)
 endif
 deactivate window otra
return elegido

function LeeNombre
 parameter tema
 DIMENSION elementoVector(reccount())
 for i = 1 to reccount()
    go i 
	elementoVector(i) = nombre
 endfor	
 do abreVentana with 'Selecciona el nombre a '+tema,1,1,10,50
 @ 1,1  GET Indice PICTURE '@^' FROM elementoVector SIZE 3,30 color w+/g+ default 1
 @ 1,34 GET Opcion PICTURE '@*v \!\ < Aceptar;\!\ < Cancelar' SIZE 2,10,1 DEFAULT 1
 read
 if Opcion = 1
	elegido = elementoVector(Indice)
 endif
 deactivate window ver
return Indice

function leeLegajo
 parameter tema
 DIMENSION VectorLegajo(reccount())
 for i = 1 to reccount()
    go i 
	VectorLegajo(i) = Legajo
 endfor	
 do abreVentana with 'Selecciona legajo',1,1,10,50
 @ 1,1  GET Indice PICTURE '@^' FROM VectorLegajo SIZE 3,30 color w+/g+ default 1
 @ 1,34 GET Opcion PICTURE '@*v \!\ < Aceptar;\!\ < Cancelar' SIZE 2,10,1 DEFAULT 1
 read
 if Opcion = 1
	elegido = VectorLegajo(Indice)
 endif
 deactivate window ver
return Indice

function leeComision
 parameter tema
 n = 10
 DIMENSION VectorComision(n)
 for i = 1 to 10
    go i 
	VectorComision(i) = i
 endfor	
 do otraVentana with 'Selecciona Comisión',1,1,10,50
 @ 1,1  GET Indice PICTURE '@^' FROM VectorComision SIZE 3,30 color w+/g+ default 1
 @ 1,34 GET Opcion PICTURE '@*v \!\ < Aceptar;\!\ < Cancelar' SIZE 2,10,1 DEFAULT 1
 read
 if Opcion = 1
	elegido = VectorComision(Indice)
 endif
 deactivate window otra
return Indice

function clave
 do abreVentana with "Digita CLAVE.!!",3,32,6,50
 set color to x,x,x,x
 clear
 klave = space(4)
 intento = 1
 do while intento < 4
	 @ 0,0 say "" get klave 
	 read
	 if klave = "oliw"
        retorno = .t.  
        intento = 4
     else
        retorno = .f.
        intento = intento + 1
     endif
 enddo    
 if retorno = .f.
    deactivate window ver
    =Mensaje('LO LAMENTO..','NO SOS OPERADOR AUTORIZADO..!!!')
    close procedure
    clear program
    close database
    deactivate window ventana
    clear
    quit
 endif  
 deactivate window ver
return retorno 


function abreVentana
 parameter rotulo, x1, y1, x2, y2 
 define window ver from x1, y1 to x2, y2 in window ventana title rotulo system Style 't'  fill file Fondo4.bmp close float grow color w+/+gr
 activate window ver
return

function otraVentana
 parameter rotulo, x1, y1, x2, y2 
 define window otra from x1,y1 to x2,y2 in window ventana title rotulo system mdi minimize zoom style 't' fill file Aros.bmp grow color w+/r
 activate window otra
return

function VentanaGrabar
 parameter rotulo, x1, y1, x2, y2 
 define window Grabar from x1, y1 to x2, y2 in window ventana title rotulo system close float grow color w+/g
 activate window Grabar
return

function VentanaTecla
 parameter rotulo, largo 
 define window ventana2 from 1,1 to largo,27 in window ventana title rotulo system close float grow color w+/g
 activate window ventana2
return

function tresTeclas
 parameter rotulo, primera, segunda, tercera 
 do VentanaTecla with rotulo,8.4
 @ 0,0 GET opcion FUNCTION '*v \!\ <&primera;\!\ <&segunda;\!\ <&tercera' FONT 'PRESTIGE NEW' STYLE 'B' SIZE 2,28.4,0 DEFAULT 1 Message 'Con el mouse o la letra subrayada, Elije una opción'
 read
 read
 deactivate window ventana2
return opcion   

function cuatroTeclas
 parameter rotulo, primera, segunda, tercera, cuarta
 do VentanaTecla with rotulo,10.6
 @ 0,0 GET opcion FUNCTION '*v \!\<&primera;\!\<&segunda;\!\<&tercera;\!\<&cuarta' FONT 'PRESTIGE NEW' STYLE 'B' SIZE 2,28.4,0 DEFAULT 1 Message 'Con el mouse o la letra subrayada, Elije una opción'
 read
 deactivate window ventana2
return opcion   

function cincoTeclas
 parameter rotulo, primera, segunda, tercera, cuarta, quinta
 do VentanaTecla with rotulo,12.6
 @ 0,0 GET opcion FUNCTION '*v \!\<&primera;\!\<&segunda;\!\<&tercera;\!\<&cuarta;\!\<&quinta' FONT 'PRESTIGE NEW' STYLE 'B' SIZE 2,28.4,0 DEFAULT 1 Message 'Con el mouse o la letra subrayada, Elije una opción'
 read
 deactivate window ventana2
return opcion   

function seisTeclas
parameter rotulo, primera, segunda, tercera, cuarta, quinta, sexta
 do VentanaTecla with rotulo,14.8
 @ 0,0 GET opcion FUNCTION '*v \!\<&primera;\!\<&segunda;\!\<&tercera;\!\<&cuarta;\!\<&quinta;\!\<&sexta' FONT 'PRESTIGE NEW' STYLE 'B' SIZE 2,28.4,0 DEFAULT 1  Message 'Con el mouse o la letra subrayada, Elije una opción'
 read
 deactivate window ventana2
return opcion   

function Confirma
  parameter pregunta
  do otraVentana with 'CONFIRMA TU OPERACION.!!',2,2,11,75
  @ 1,67 say 'Duda.bmp' bitmap 
  retorno=.f.
  Elige = 1
  @ 1,1 say Pregunta FONT  'PRESTIGE',12 STYLE 'B' Color +gr
  @ 3,1 GET Elige FUNCTION '*BH a:\Ok2.bmp;a:\Volver.ico '  SIZE 4,8,1 default 1
  read 
  deactivate window otra
  if Elige = 1
		      retorno=.t.  
  endif
return retorno 

function Cuestion
  parameter pregunta, rotulo
  do otraVentana with Rotulo,2,2,11,75
  @ 1,67 say 'Duda.bmp' bitmap 
  retorno=.f.
  Elige = 1
  @ 1,1 say Pregunta FONT  'PRESTIGE',12 STYLE 'B' Color +gr
  @ 3,1 GET Elige FUNCTION '*BH a:\Ok2.bmp;a:\Volver.ico '  SIZE 4,8,1 default 1
  read 
  deactivate window otra
  if Elige = 1
		      retorno=.t.  
  endif
return retorno 

function Mensaje
parameter rotulo, mensaje
  do otraVentana with rotulo,1,1,10,55
  @ 1,1 say mensaje FONT  'PRESTIGE',12 STYLE 'B'
  @ 3,1 say 'Idea.bmp' bitmap 
  @ 3,40 GET Elige FUNCTION '*B a:\Volver.ico '  SIZE 4,10 default 1
  read
  deactivate window otra
return  


Volver al principio


Volver al principio PROGRAMACION ORIENTADA A OBJETOSMETODOS y EVENTOS

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.

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
 

PARADIGMA
El verdadero odio es el desinterés
y el asesinato perfecto es el olvido..!!
Bernanos


Volver al principio


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.

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


Volver al principio


LA FUNCION DEVUELVE UN VALOR..

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..!!

Si la montaña no viene a mi... seguro que se me paso la borrachera...!!

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.



   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

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

PARADIGMA
El habla es plata..
El silencio es oro..!!
Provervio


Volver al principio


PARADIGMA
El infierno de las mujeres...es la vejez..!!

EL PROCEDIMIENTO CUMPLE TU ORDEN..!!

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.

A los 15 años era una bomba... a los 25 una reventada....!!

Un ejemplo típico es el siguiente procedimiento de búsqueda:



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
Mujeres honradas que no esten cansadas de serlo..
. . p o c a s . .!!
Realidad

PARA MANEJAR DATOS LO MEJOR: S Q L..!!!

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.

Si estudiar hace grande al hombre, que estudien los petisos...!!

Por ejemplo:

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


Volver al principio


Volver al principio FUNCIONESCLASES y OBJETOS

TU PRIMERA VEZ..!!

Para ver toda esta teoría en acción, te recomiendo seguir los siguientes pasos:

  • ACTIVA Visual Fox Pro:
    Cualquiera de sus versiones, luego con File/New/Program abre el editor de programas.

    Copia textualmente el siguiente código: Lo logré..!!!

    
    *****************************
    * WILO CARPIO CACERES        
    * Visual Fox 7 Español      
    *    26/08/98      
    * FUENTE: MiDebut.PRG
    *****************************
    
    Formulario = CREATEOBJECT('FormularioWilo')   
    Formulario.SHOW		
    READ EVENTS                                 
    
    *****************************************
    *       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
    
    
    **********************************************
    *       CREACION DE LA CLASE DEL AUTOR
    **********************************************  
    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
    

  • GRABA:
    Como "MiDebut.PRG"

  • PROVEE LAS IMAGENES:
    Consigue dos tapices: "Rayado.bmp" y "MiTapiz.bmp" y dos fotos: "Pavaroti.jpg" y "Volar.bmp"

  • COMPILA:
    Con el path Program/Ejecute/MiDebut.PRG

    OOHHH...!!! aparecerá el resultado adjunto..!!

PARADIGMA
Al envejecer uno se vuelve..
..más loco y más cuerdo..!!


Volver al principio


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..!!


Volver al principio


PARADIGMA SISTEMICO
Si se juntan suficientes datos
..se puede demostrar cualquier cosa..!!
.. con ayuda del sistema estadístico

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

PARADIGMA SISTEMICO
El trabajo en equipo es esencial..
..te permite echarle la culpa a otro..!!


Volver al principio


PARADIGMA SISTEMICO
Cuando no sepas lo que estas haciendo..
..hazlo con esmero y alegría..!!

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' 
     
    

  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 
    


Volver al principio


Volver al principio FUNCIONESESTRUCTURA

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..!!

Un día sin sonrisas es un día perdido..!! 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
********************************

Un día sin sonrisas es un día perdido..!! PARADIGMA
Para obtener éxito en el mundo
hay que parecer loco y ser sabio
Montesquieu


Volver al principio


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


Volver al principio


Un día sin sonrisas es un día perdido..!! PARADIGMA
Lo que con mucho trabajo se adquiere, ..
..más se ama..!!
Aristóteles

MANTENIMIENTO DE TABLAS

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

  • Indexar
  • Ordenar
  • Copiar backups


***************************************************************
*    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

Un día sin sonrisas es un día perdido..!! PARADIGMA
Para obtener éxito en el mundo
hay que parecer loco y ser sabio
Montesquieu


Volver al principio


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


Volver al principio


Volver al principio FUNCIONESMODELO

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

Puedo guardar el ratón de mi PC en el baúl del coche con el gato del auto.??


Volver al principio


METODOS
Y EVENTOS Volver al principio

Si cuando comí huevos me pateó el hígado, cuando coma hígado... ¿me pateará los huevos?

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

Cuando se hace algo mucho tiempo, se hace cada vez mejor, ¿por qué los taxistas manejan tan mal.??


Volver al principio


CONSULTAS
Ver datos Volver al principio

¿Por qué no hay comida para gatos 'con sabor a ratón'?

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


CAMBIOS
Modificar datos 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


BUSCANDO
..para cambiar Volver al principio

¿Por qué los Kamikazes usaban cascos.??

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


VARIOS
Accesorios 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


VARIOS II
Accesorios II Volver al principio

¿Los infantes disfrutan la infancia tanto como los adultos el adulterio.??

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
Sub Programas.. Volver al principio

¿Debería cortarme las venas o dejármelas largas.??

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


Volver al principio


Volver al principio S Q LINSERT y SELECT

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..

  • INSERT INTO nombre_dbf [(Campo1 [, Campo2, ...])] VALUES (Dato1 [, Dato2, ...])

  • INSERT INTO nombre_dbf FROM ARRAY NombreMatriz | FROM MEMVAR

Argumentos

  • INSERT INTO nombre_dbf: Especifica el nombre de la tabla a la que se anexará un registro. nombre_dbf puede incluir una ruta de acceso y puede ser una expresión de nombre.

    Si la tabla que especifica no está ya abierta, se abrirá en modo exclusivo en una área de trabajo nueva y se anexará el registro. El área de trabajo nueva no se selecciona, sino que permanece seleccionada el área de trabajo actual.

  • [(Campo1 [, Campo2 [, ...]])] : Especifica los nombres de los campos del nuevo registro donde se insertan los valores.

  • VALUES (Dato1 [, Dato2 [, ...]]): Especifica los valores de campo que se insertan en el nuevo registro. Si omite los nombres de los campos, debe especificar los valores de campo en el orden definido por la estructura de la tabla. Si SET NULL está ON, INSERT - SQL intentará insertar valores nulos en cualquier campo no especificado de la cláusula VALUES.

  • FROM ARRAY NombreMatriz : Especifica la matriz cuyos datos se insertan en el nuevo registro. El contenido de los elementos de la matriz, comenzando por el primer elemento, se inserta en los campos correspondientes del registro. El contenido del primer elemento de la matriz se inserta en el primer campo del nuevo registro, el contenido del segundo elemento se inserta en el segundo campo, y así sucesivamente.

    Se ignora cualquier valor predeterminado de los campos cuando se incluye la cláusula FROM ARRAY.

  • FROM MEMVAR: Especifica que el contenido de las variables de memoria se inserta en los campos que tengan los mismos nombres que dichas variables. Si no existe una variable de memoria con el mismo nombre que el campo, éste permanecerá vacío.

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

No hay tonto más molesto que el ingenioso..!!


Volver al principio


Si tenes ganas de estudiar, sentate hasta que se te pase..!!!

COMANDO DELETE - SQL

Marca registros para eliminarlos.

SINTAXIS

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

Argumentos

  • FROM [NombreBaseDatos!]NombreTabla:

    Especifica la tabla en la que se marcan registros para eliminar.

  • NombreBaseDatos! Especifica el nombre de una base de datos no actual que contiene la tabla. Incluya el nombre de una base de datos que contenga la tabla si no es la base de datos actual. Incluya el delimitador signo de exclamación (!) después del nombre de base de datos y antes del nombre de tabla.

  • WHERE CondiciónFiltro1 [AND | OR CondiciónFiltro2 ...]: Especifica que Visual FoxPro sólo marca algunos registros para eliminar.

  • CondiciónFiltro: Especifica los criterios que deben satisfacer los registros para marcarlos para eliminación. Puede incluir tantas condiciones como desee si las conecta con el operador AND u OR. También puede emplear el operador NOT para invertir el valor de una expresión lógica o utilizar EMPTY( ) para comprobar si hay campos vacíos.

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"

La verdad es hija del tiempo..!!. No de la autoridad..!!!


Volver al principio


El amor como la gripe siempre terminan en la cama..!!!

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

  • NombreArchivos:Especifica el nombre del archivo para la consulta. Si no especifica ninguna extensión para el nombre del archivo, Visual FoxPro asigna automáticamente la extensión .qpr.

  • ?:Muestra el cuadro de diálogo Abrir, en el que puede elegir una consulta existente o introducir el nombre de una nueva consulta que desee crear.

  • WINDOW NombreArchivo1 Especifica la ventana de la que el Diseñador de consultas va a tomar las características. Por ejemplo, si se ha creado la ventana con la opción FLOAT de DEFINE WINDOW, se podrá desplazar El Diseñador de consultas. No es necesario que la ventana esté activa o visible, pero sí que esté definida.

  • IN SCREEN: Abre explícitamente el Diseñador de consultas en la ventana principal de Visual FoxPro, después de situarlo en una ventana primaria. El Diseñador de consultas se sitúa en una ventana primaria incluyendo la cláusula IN WINDOW.

  • NOWAIT: Continúa la ejecución del programa después de abrir el Diseñador de consultas. El programa no espera a que se cierre el Diseñador de consultas, sino que continúa la ejecución en la línea de programa siguiente a la que contiene MODIFY QUERY NOWAIT. Si omite NOWAIT al ejecutar MODIFY QUERY en un programa, el Diseñador de consultas se abre y la ejecución del programa se interrumpe hasta que se cierre el Diseñador de consultas. NOWAIT está disponible solamente desde dentro de un programa. No tiene ningún efecto sobre el comando MODIFY QUERY cuando se ejecuta desde la ventana Comandos.

  • SAVE: Deja abierto el Diseñador de consultas después de activar otra ventana. Si omite SAVE, el Diseñador de consultas se cerrará cuando se active otra ventana. Incluir SAVE no tiene efecto cuando se ejecuta desde la ventana Comandos.

  • AS nPáginaCódigo: Especifica la página de códigos de la consulta. Incluya AS nPáginaCódigo si la consulta se creó con una página de códigos distinta de la activa en Visual FoxPro. Cuando se abre la consulta, Visual FoxPro convierte automáticamente la consulta a la página de códigos actual de Visual FoxPro. Puede utilizar GETCP( ) para que nPáginaCódigo muestre el cuadro de diálogo Página de códigos, que le permite especificar una página de códigos para la consulta.

    La consulta se guarda en su página de códigos original cuando se cierra.

    Si omite la cláusula AS nPáginaCódigos o nPáginaCódigos es 0, la consulta no se convierte a la página de códigos actual de Visual FoxPro. Si especifica para nPáginaCódigos un valor no admitido, Visual FoxPro genera un mensaje de error.

    En Visual FoxPro, las consultas se pueden agregar a un proyecto, y el usuario puede especificar la página de códigos de la consulta desde el Contenedor de proyectos. El Contenedor de proyectos conserva un registro de la página de códigos de la consulta. No obstante, si utiliza MODIFY QUERY para abrir una consulta fuera del Contenedor de proyectos, debe incluir AS nPáginaCódigos para especificar la página de códigos de la consulta.

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


Qué cuentan las ovejas para poder dormir..!!!

COMANDO CREATE QUERY

Abre el Diseñador de consultas.

Sintaxis

CREATE QUERY [NombreArchivo | ?] [NOWAIT]

Argumentos

  • CREATE QUERY abre el Diseñador de consultas para que pueda crear una consulta de forma interactiva.

  • NombreArchivo: Especifica el nombre de archivo para la consulta. Si no se incluye ninguna extensión con el nombre del archivo, Visual FoxPro le asignará automáticamente la extensión .qpr.

  • ? : Muestra el cuadro de diálogo Crear, que le pide que asigne nombre a la consulta que desea crear.

  • NOWAIT: Continúa la ejecución del programa después de que se haya abierto el Diseñador de consultas. El programa no espera a que se cierre el Diseñador de consultas para cerrarse, sino que continúa la ejecución en la línea de programa inmediatamente posterior a la línea que contiene CREATE QUERY NOWAIT. Si omite NOWAIT cuando se ejecuta CREATE QUERY en un programa, se abrirá el Diseñador de consultas y se detendrá la ejecución del programa hasta que se cierre el Diseñador de consultas.

    NOWAIT sólo es efectivo desde dentro de un programa. No tiene ningún efecto en CREATE QUERY cuando se ejecuta desde la ventana Comandos.

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.


Volver al principio


Volver al principio S Q LINSERT y SELECT

MANEJO DE DATOS CON SQL

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.

  • ALL: De forma predeterminada, se muestran todas la filas del resultado de la consulta.

  • DISTINCT: Excluye duplicados de cualquier fila del resultado de la consulta. Puede utilizar DISTINCT únicamente una vez por cláusula SELECT.

  • TOP nExpresión [PERCENT]: Especifica que el resultado de la consulta contenga un número determinado de filas o un porcentaje de filas en el resultado de la consulta. Es necesario incluir una cláusula ORDER BY si incluye la cláusula TOP.

  • La cláusula ORDER BY especifica las columnas en las que la cláusula TOP determinará el número de filas que se va a incluir en el resultado de la consulta.

    Puede especificar desde 1 a 32,767 filas. Las filas de valores idénticos para las columnas especificadas en la cláusula ORDER BY se incluyen en el resultado de la consulta. A partir de entonces, si especifica 10 para nExpr, el resultado de la consulta podrá obtener más de 10 filas si hay más de 10 filas con valores idénticos para las columnas especificadas en la cláusula ORDER BY.

    Si se incluye la palabra clave PERCENT, se redondeará al número entero más alto el número de columnas devuelto en el resultado.

    Los valores permitidos para nExpr cuando se incluye la palabra clave PERCENT son 0.01 a 99.99.

  • Alias: Califica nombres de elementos coincidentes. Cada elemento que especifique con Elemento_Selección genera una columna de los resultados de la consulta. Si dos o más elementos tienen el mismo nombre, incluya el alias de la tabla y un punto antes del nombre del elemento para impedir la duplicación de las columnas.

    Elemento_Selección especifica un elemento a incluir en el resultado de la consulta. Un elemento puede ser uno de los siguientes: El nombre de un campo de una tabla de la cláusula FROM.

    Una constante especificando que el mismo valor constante ha de aparecer en cada fila del resultado de la consulta.

    Una expresión que puede ser el nombre de una función definida por el usuario (FDU).

  • AS Nombre_Columna: Especifica el título de una columna en el resultado de la consulta. Esta opción resulta muy útil cuando Elemento_Selección es una expresión o contiene una función de campo y desea dar un nombre significativo a la columna. Nombre_Columna puede ser una expresión pero no puede contener caracteres (por ejemplo, espacios) que no estén permitidos para nombres de campos de tablas.

Puedo guardar el ratón de mi PC en el baúl del coche con el gato del auto.??


Volver al principio


FROM

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.

  • FORCE: especifica que las tablas se combinarán en el orden de aparición en la cláusula FROM. Si se omite FORCE, Visual FoxPro intentará optimizar la consulta. Sin embargo, es posible que la consulta se ejecute más rápido si se incluye la palabra clave FORCE para desactivar la optimización de consultas de Visual FoxPro.

  • NombreBaseDatos!: Especifica el nombre de una base de datos inactiva que contiene la tabla. Es necesario incluir el nombre de la base de datos que contiene la tabla en caso de que no sea la base de datos activa. Incluya el delimitador de signo de exclamación (!) después del nombre de la base de datos y antes del nombre de la tabla.

  • Alias_Local: Especifica un nombre temporal para la tabla indicada en Tabla. Si especifica un alias local, debe utilizar el alias local en lugar de la tabla a través de todo el SELECT.

  • INNER JOIN especifica que el resultado de la consulta contenga sólo filas para una tabla con la que coincidan una o varias filas en otra tabla.

  • LEFT [OUTER] JOIN especifica que el resultado de la consulta contenga todas las filas de la tabla a la izquierda de la palabra clave JOIN y sólo las filas que concuerden procedentes de la tabla a la derecha de la palabra clave JOIN. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinación externa.

  • RIGHT [OUTER] JOIN especifica que el resultado de la consulta contenga todas las filas desde la tabla hasta la derecha de la palabra clave JOIN y sólo las filas que concuerden desde la tabla hasta la izquierda de la palabra clave JOIN. La palabra clave OUTER es opcional; puede incluirse para resaltar la creación de una combinación externa.

  • FULL [OUTER] JOIN especifica que el resultado de la consulta contenga todas las filas, concuerden o no, de ambas tablas. La palabra clave OUTER es opcional; se puede incluir para resaltar que se ha creado una combinación externa.

  • ON CondiciónCombinación especifica las condiciones según las cuales se combinan las tablas.

Si el congelador de una heladera está a 10 grados bajo cero, y en el invierno de la Antártida la temperatura ambiente llega a 50 grados bajo cero.
¿No podrían calentarse las personas entrando a los congeladores?


Volver al principio


¿Por qué no hay comida para gatos con sabor a ratón.?

INTO

[[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:

  • ARRAY NombreMatriz, que almacena los resultados de la consulta en una matriz de variable de memoria. Si la consulta selecciona 0 registros, la matriz no se creará.

  • CURSOR NombreCursor [NOFILTER], que almacena los resultados de la consulta en un cursor. Si especifica el nombre de una tabla abierta, Visual FoxPro generará un mensaje de error.

    Después de que se ejecute SELECT, el cursor temporal permanecerá abierto y estará activo pero solamente para lectura. Una vez que cierre este cursor temporal, se borrará. Los cursores pueden existir como un archivo temporal en la unidad SORTWORK.

    Incluya NOFILTER para crear un cursor que se pueda usar en consultas posteriores.

    En versiones anteriores de Visual FoxPro, era necesario incluir una expresión o una constante adicional como un filtro para crear un cursor utilizable en consultas posteriores.

    Ejemplo, la adición de un Logical verdadero como una expresión de filtro creaba una consulta utilizable en consultas posteriores:

    SELECT *, .T. FROM customers INTO CURSOR myquery

    Si se incluye NOFILTER es posible que disminuya el rendimiento de la consulta, puesto que se creará una consulta temporal en el disco. Cuando se cierre el cursor se eliminará del disco la consulta temporal.

  • DBF | TABLE NombreTabla

  • [DATABASE NombreBaseDatos [NAME NombreLargoTabla]] que almacena el resultado de la consulta en una tabla. Si especifica una tabla que ya esté abierta y SET SAFETY está en OFF, Visual FoxPro sobrescribirá la tabla sin previo aviso. Si no ha especificado ninguna extensión, Visual FoxPro dará una extensión .DBF a la tabla. La tabla permanecerá abierta y activa después de ejecutar SELECT.

    Incluya DATABASE NombreBaseDatos para especificar una base de datos a la que se agregará la tabla. Incluya NAME NombreLargoTabla para especificar un nombre largo para la tabla. Los nombres largos pueden contener un máximo de 128 caracteres y pueden utilizarse en lugar de nombres cortos en la base de datos.

  • TO FILE NombreArchivo: Si incluye una cláusula TO pero no una cláusula INTO, podrá dirigir el resultado de la consulta a un archivo de texto ASCII llamado NombreArchivo, o a la impresora además de al escritorio o la ventana principal de Visual FoxPro.

  • ADDITIVE anexa los resultados de la consulta al contenido existente del archivo de texto especificado en TO FILE NombreArchivo.

  • TO PRINTER [PROMPT] dirige los resultados de la consulta a una impresora. Utilice la cláusula PROMPT opcional para que aparezca en pantalla un cuadro de diálogo antes de que empiece la impresión. En este cuadro de diálogo podrá modificar la configuración de la impresora. Los valores de la impresora modificables dependen del controlador de impresora instalado en este momento. Sitúe la palabra clave PROMPT inmediatamente después de TO PRINTER.

  • TO SCREEN dirige los resultados de la consulta a la ventana principal de Visual FoxPro o a una ventana definida por el usuario que esté activa.

¿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??

[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.

  • PREFERENCE guarda los atributos de la ventana Examinar por tiempo indefinido en el archivo de recursos FOXUSER. Las preferencias pueden recuperarse en cualquier momento.

    Ejecutando SELECT con un NombrePreferencia de PREFERENCE, la primera vez se crea la preferencia. Ejecutando posteriormente SELECT con el mismo nombre de preferencia, se restaurará la ventana Examinar con el mismo estado de preferencia. Cuando se cierra la ventana Examinar, se actualiza la preferencia.

    Si sale de una ventana Examinar presionando CTRL+Q+W, no se guardarán los cambios de la ventana Examinar en el archivo de recurso.

  • NOCONSOLE: Impide que el resultado de la consulta se envíe a un archivo, a la impresora o a la ventana principal de Visual FoxPro.

  • PLAIN: Impide que aparezcan las cabeceras de las columnas al mostrar los resultados de la consulta. PLAIN puede utilizarse tanto si está presente una cláusula TO como si no. Si se incluye una cláusula TO, se pasará por alto PLAIN.

  • NOWAIT: Continúa la ejecución del programa después de abrir la ventana Examinar y de dirigir a ella los resultados de la consulta. El programa no esperará a que la ventana Examinar se cierre, sino que continuará con la ejecución de la línea de programa inmediatamente siguiente a la instrucción SELECT.

  • Cuando se incluye TO SCREEN para dirigir los resultados hacia la ventana principal de Visual FoxPro o una ventana definida por el usuario, los resultados se detiene cuando la ventana principal de Visual FoxPro se llena con resultados de la consulta. Presione una tecla para ver el siguiente conjunto de resultados de la consulta. Si se incluye NOWAIT, los resultados de la consulta se desplazarán fuera del escritorio, la ventana principal de Visual FoxPro o una ventana definida por el usuario sin esperar a que se presione una tecla. NOWAIT se pasa por alto si se incluye con la cláusula INTO.

¿Por qué la luz negra no es negra?


Volver al principio


¿Por qué los Kamikazes usaban cascos.??

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.

  • CondiciónCombinación: Especifica los campos que vinculan las tablas de la cláusula FROM. Si incluye más de una tabla en una consulta, deberá especificar una condición de combinación para cada tabla después de la primera.

    Las condiciones de combinación múltiple deben conectarse mediante el operador AND. Cada condición de combinación tiene la forma siguiente:

  • NombreCampo1 Comparación NombreCampo2: NombreCampo1 es el nombre de un campo de una tabla, NombreCampo2 es el nombre de un campo de otra tabla y Comparación es uno de los operadores siguientes:

    Operador Comparación

    = Igual
    == Exactamente igual
    LIKE SQL LIKE
    <>, !=, # Distinto de
    > Mayor que
    >= Mayor o igual que
    < Menor que
    <= Menor o igual que

  • Cuando utiliza el operador = con cadenas, actúa de forma distinta dependiendo del ajuste de SET ANSI. Cuando SET ANSI está OFF, Visual FoxPro trata las comparaciones de cadenas en la forma habitual en Xbase. Cuando SET ANSI está a ON, Visual FoxPro sigue las normas ANSI para comparaciones de cadenas. Vea SET ANSI y SET EXACT para obtener información adicional sobre la forma en que Visual FoxPro realiza las comparaciones de cadenas.

  • La cláusula WHERE acepta el operador ESCAPE para la CondiciónCombinación, lo que le permite realizar consultas significativas sobre datos que contengan caracteres comodín _ y % de SELECT - SQL.

  • La cláusula ESCAPE le permite especificar que se traten los caracteres comodín de SELECT - SQL como si fueran caracteres literales. En la cláusula ESCAPE se especifica un carácter, el cual, cuando se sitúa inmediatamente antes del carácter comodín, indica que se tratará al carácter comodín como a un carácter literal.

  • CondiciónFiltro: Especifica los criterios que deben cumplir los registros para que se incluyan en el resultado de la consulta. Una consulta puede incluir tantas condiciones de filtro como se deseen, conectadas con el operador AND y OR. También puede utilizar el operador NOT para invertir el valor de una expresión lógica o utilizar EMPTY( ) para comprobar si un campo está vacío.

  • CondiciónFiltro puede presentar una de estas formas:

    1. Ejemplo 1:Muestra la CondiciónFiltro en el formulario de NombreCampo1 Comparación NombreCampo2
      customer.cust_id = orders.cust_id

    2. Ejemplo 2: Muestra CondiciónFiltro en el formulario de NombreCampo Comparación Expresión
      payments.amount >= 1000

    3. Ejemplo 3: Muestra CondiciónFiltro en el formulario de NombreCampo Comparación ALL (Subconsulta)

      Cuando la condición de filtro incluye ALL, el campo debe cumplir la condición de comparación para todos los valores generados por la subconsulta antes de que se incluya el registro en el resultado de la consulta.

      company < ALL ;(SELECT company FROM customer WHERE country = "Reino Unido")

    4. Ejemplo 4: Muestra CondiciónFiltro en el formulario de NombreCampo Comparación ANY | SOME (Subconsulta)

      Cuando la condición de filtro incluye ANY o SOME, el campo debe cumplir la condición de comparación en al menos uno de los valores generados por la subconsulta.

      company < ANY ; (SELECT company FROM customer WHERE country = "Reino Unido")

    5. Ejemplo 5: Muestra CondiciónFiltro en el formulario de NombreCampo [NOT] BETWEEN Inicio_Rango AND Fin_Rango

      Este ejemplo comprueba si los valores del campo están dentro de un intervalo de valores especificado.

      customer.postalcode BETWEEN 90000 AND 99999

    6. Ejemplo 6: Muestra CondiciónFiltro en el formulario de [NOT] EXISTS (Subconsulta)

      Este ejemplo comprueba si al menos una línea cumple los criterios de la subconsulta. Cuando la condición de filtro incluye EXISTS, la condición de filtro se evalúa como verdadera (.T.) a no ser que la subconsulta sea un conjunto vacío.

      EXISTS ; (SELECT * FROM orders WHERE customer.postalcode = orders.postalcode)

    7. Ejemplo 7: Muestra CondiciónFiltro en el formulario de NombreCampo [NOT] IN Conjunto_Configuración

      Cuando una condición de filtro incluye IN, el campo debe contener uno de los valores antes de que el registro se incluya en los resultados de la consulta.

      customer.postalcode NOT IN ("98052","98072","98034")

    8. Ejemplo 8: Muestra CondiciónFiltro en el formulario de NombreCampo [NOT] IN (Subconsulta)

      Aquí, el campo debe contener uno de los valores devueltos por la subconsulta antes de que su registro se incluya en los resultados de la consulta.

      customer.cust_id IN ; (SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")

    9. Ejemplo 9: Muestra CondiciónFiltro en el formulario de NombreCampo [NOT] LIKE cExpresión

      customer.country NOT LIKE "Reino Unido"

      Esta condición de filtro busca cada uno de los campos que coinciden con cExpresión.

      Puede utilizar el signo de porcentaje (%) y subrayado ( _ ) como parte de cExpresión. El signo de porcentaje representa a cualquier secuencia de caracteres desconocidos en la cadena. El subrayado representa un solo carácter desconocido en la cadena.

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


Volver al principio


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

[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:

  • No puede utilizar UNION para combinar subconsultas.

  • Los resultados de ambos SELECT deben tener el mismo número de columnas.

  • Cada columna de los resultados de la consulta de un SELECT debe tener el mismo tipo de dato y anchura que su columna correspondiente en el otro SELECT.

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.

Los resultados de la consulta aparecerán desordenados si no especifica un orden con ORDER BY.


Volver al principio


¿Los infantes disfrutan la infancia tanto como los adultos el adulterio.??

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:

  • AVG(Elemento_Selección), que realiza una media de una columna de datos numéricos.

  • COUNT(Elemento_Selección), que cuenta el número de elementos seleccionados en una columna. COUNT(*) cuenta el número de filas en el resultado de la consulta.

  • MIN(Elemento_Selección) determina el menor valor de Elemento_Selección en una columna.

  • MAX(Elemento_Selección) determina el mayor valor de Elemento_Selección en una columna.

  • SUM(Elemento_Selección) que proporciona el total de la suma de una columna de datos numéricos.

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.

Si el pez nada... ¿la vaca todo..???


Volver al principio


¿Qué tiempo verbal es "no debería haber pasado"?... ¿preservativo imperfecto.??

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}

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


Volver al principio


¿Debería cortarme las venas o dejármelas largas.??

MAS EJEMPLOS




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 DATABASE (HOME(2) + 'data\testdata')   
SELECT * FROM customer;
WHERE company LIKE "%-%--%" Escape "-"

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

PARADIGMA VITAL: Muchos vuelan como las hojas...
..pocos como los pájaros....!!!

Volver al principio

Te espero en: wilucha@gmail.com

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

04/11/2004