Manual Avanzado de VisualFoxPro 7.0 - Español 113paginas

134
Manual de Visual Foxpro Nota: Este manual se encuentra en construcción, se aceptan dudas y sugerencias. Introducción VFP Características Técnicas VFP Tipos de Datos que maneja VFP Estándares de Programación Estructura TestData.dbc Conociendo la Base de Datos :: Reglas, Procedimientos Almacenados y Disparadores Reglas de Campo Despliege de Infomación Reglas de Registros Procedimientos Almacenados (Store Procedures) Disparadores (Triggers) Exportar Información Importar Información Introducción Programación Orientada a Objetos Creación de Objetos Creación de Clases Explorador de Windows Exportación de Información Agregar Propiedades Agregar Métodos Introducción SQL SELECT - SQL ALTER TABLE - SQL CREATE CURSOR - SQL CRATE TABLE - SQL DELETE - SQL INSERT - SQL UPDATE - SQL Introducción a Vistas Locales Creación de Vistas Locales mediante el Asistente Creación de Vistas Locales mediante Código Ventajas de Vistas Vistas Parametrizadas Actualización de Vistas Mediante el Diseñador de Vistas Mediante Código Introducción a Vistas Remotas Creación ODBC Creación Conexión Creación de Vistas Remotas Mediante el Asistente Creación de Vistas Remotas Mediante Código Introducción SQL Pass-Throug (SPT) Instrucciones Básicas Consulta de Información Ejecución de Comandos en el Servidor Javier Leal Página 1 de 134

Transcript of Manual Avanzado de VisualFoxPro 7.0 - Español 113paginas

Nota: Este manual se encuentra en construccin, se aceptan dudas y sugerencias

Manual de Visual Foxpro

Nota: Este manual se encuentra en construccin, se aceptan dudas y sugerencias.

Introduccin VFPCaractersticas Tcnicas VFPTipos de Datos que maneja VFPEstndares de ProgramacinEstructura TestData.dbcConociendo la Base de Datos :: Reglas, Procedimientos Almacenados y DisparadoresReglas de CampoDespliege de InfomacinReglas de RegistrosProcedimientos Almacenados (Store Procedures)Disparadores (Triggers)Exportar InformacinImportar Informacin

Introduccin Programacin Orientada a ObjetosCreacin de ObjetosCreacin de ClasesExplorador de WindowsExportacin de InformacinAgregar PropiedadesAgregar Mtodos

Introduccin SQLSELECT - SQLALTER TABLE - SQLCREATE CURSOR - SQLCRATE TABLE - SQLDELETE - SQLINSERT - SQLUPDATE - SQL

Introduccin a Vistas LocalesCreacin de Vistas Locales mediante el AsistenteCreacin de Vistas Locales mediante CdigoVentajas de VistasVistas ParametrizadasActualizacin de Vistas Mediante el Diseador de Vistas Mediante CdigoIntroduccin a Vistas Remotas Creacin ODBC Creacin Conexin Creacin de Vistas Remotas Mediante el Asistente Creacin de Vistas Remotas Mediante Cdigo

Introduccin SQL Pass-Throug (SPT) Instrucciones Bsicas Consulta de Informacin Ejecucin de Comandos en el Servidor

UtilerasForo de Discusin VFPMostrar Explorador de Internet en FormasFuncin ShellExecReferencias y Ligas de Utilidad

Introduccin a VFP Visual Fox Pro es una herramienta que desde sus inicios naci para manejar datos, contiene una gran cantidad de instrucciones para el manejo de los datos que programarlas en otros lenguajes es una labor pesada.

Los inicios de esta herramienta se remontan al ao 1960 en un sistema llamado Retrieve el cul fue comercializado por TymShare Corporation, este sistema fue utilizado por Jet Propulsion Laboratory (JPL) en Pasadena, California.

A finales de los 60 JPL asigno a Jeb Long, un empleado de la empresa, la tarea de escribir un programa que hiciera las mismas operaciones que Retrieve haca. En 1973 Jeb Long desarroll un programa de manejo de archivos llamado JPLDIS (Jet Propulsion Laboratory Display Information System), este programa fu escrito en FORTAN, corra en una mquina UNIVAC 1108.

JPLDIS fue el precursor de DBASE, Jeb Long junto con Wayne Ratliff tradujeron DBase en DBase II, una versin que corra en computadoras personales, todo esto en lenguaje ensamblador y formaron la empresa Ashton-Tate.

Posteriormente surgieron DBase y Clipper, estas herramientas son excelentes para la manipulacin de Datos, pero como todo, se debe de evolucionar.

Microsoft adquiri Visual Fox Pro de Ashton-Tate, este producto estaba incluido en el paquete Visual Estudio hasta la versin 6, de la versin 7 en adelante VFP se consigue como producto independiente, esto ha creado varios mitos sobre el futuro de VFP, si ven que un producto es "sacado" de la Suite de lenguajes, lo mas lgico es que sea porque el producto se va a descontinuar.

La realidad es muy distinta, VFP se lanz como producto independiente por varias razones como por ejemplo, el tiempo de liberacin, el costo y el poder que tiene con su base de datos integrada.

VFP es una herramienta integral con un gran potencial, su motor de datos integrado es excelente, el tiempo de respuesta increble, es una herramienta orientada a objetos, puede ser el Back End, Middle Ware, Front End o las tres de un sistema. Pude ser un Cliente y Servidor COM, Se puede trabajar en Internet y muchas cosas mas. No te mortifiques si la nomenclatura no es entendible, segn vayamos avanzando en el libro veremos las definiciones de cada una de ellas.

El conocer el funcionamiento de VFP te va a permitir realizar aplicaciones poderosas en un lapso de tiempo muy pequeo, todo est en la imaginacin que tengas, puedes hacer desde un simple catlogo con altas, bajas, cambios, consultas hasta sistemas en Internet, Aplicaciones Gordas o Delgadas (Fat Client / Thin Client), todo esto con un solo producto.

VFP cuenta con una comunidad virtual en Internet, la cual se ver mas adelante, esta comunidad est formada por gente de varios pases que se juntan con la nica finalidad de compartir sus conocimientos y ayudarse mutuamente, realmente es un gran apoyo en el momento de que ests desarrollando aplicaciones.

Caractersticas Tcnicas VFP...As como cuando se compra un carro es importante conocer las caractersticas tcnicas del vehculo, es importante conocer las caractersticas de VFP para conocer sus capacidad y limitaciones, esta son:

Tablas e ndices.Cantidad mxima de registros por tabla1 Billn

Tamao mximo de tabla2 Gigabytes

Cantidad mxima de caracteres por registro65,500

Cantidad mxima de campos por tabla255

Cantidad mxima de tablas abiertas al mismo tiempo255

Cantidad mxima de caracteres por campo254

Cantidad mxima de bytes por llave ndice no-campacto100

Cantidad mxima de bytes por llave ndice campacto240

Cantidad mxima de ndices abiertos por tablaIlimitado

Cantidad mxima de ndices abiertos en todas las reas de trabajoIlimitado

Cantidad mxima de relacionesIlimitado

Cantidad mxima de expresiones relacionalesIlimitado

Caractersta de CamposCantidad mxima de caracteres por campo254

Cantidad mxima de campos numricos y flotantes20

Cantidad mxima de nombre de campos en tablas libres10

Cantidad mxima de nombre de campos en tablas asignadas a una base de datos128

Valor mnimo de un entero-2,147,483,647

Valor mximo de un entero+2,147,483,647

Cantidad de dgitos de precision en clculos16

Variables y ArreglosCantidad de variables por omisin1,024

Cantidad mxima de variables65,000

Cantidad mxima de arreglos65,000

Cantidad mxima de elementos por arreglo65,000

Programas y ProcedimientosCantidad mxima de lineas en programasIlimitado

Tamao mximo de modulo en programa compilado64K

Cantidad mxima de procedimientos por archivoIlimitado

Cantidad mxima de llamadas DO anidados128

Cantidad mxima de llamadas READ anidadas5

Cantidad mxima de llamadas de comandos estructurados384

Cantidad mxima de parmetros enviados27

Cantidad mxima de transacciones5

ReportesCantidad mxima de objetosIlimitado

Largo mximo20 pulgadas

Cantidad mxima de niveles de grupos128

Cantidad mxima de caracteres por variables255

Otras capacidadesCantidad mxima de ventanas abiertasIlimitado

Cantidad mxima de ventanas Browse abiertas255

Cantidad mxima de caracteres por variable16,777,184

Cantidad mxima de caracteres por lnea de comando8,192

Cantidad mxima de caracteres por etiqueta en reporte252

Cantidad mxima de caracteres por lnea de Macrosustitucin8,192

Cantidad mxima de archivos abiertosLimitado por sistema

Cantidad mxima de campos permitidos en clausula SQL SELECT255

Nota:Las caractersticas dependen de espacio y memoria disponibles en el equipo

Tipos de Datos en VFP...Los tipos de datos que Maneja VFP son:Tipo de DatoRepresentacinDescripcinTamaoRango

CharacterCCualquier texto1 byte por caracter hasta 254Cualquier Texto

CurrencyYCantidades Monetarias8 bytes- 922337203685477.5807 a 922337203685477.5807

DateDFechas formadas por Mes, Ao y Da8 bytes{^0001-01-01},1o Enero DC - {^9999-12-31}, Diciembre 31 9999 DC

DateTimeTFechas formadas por Mes, Ao, Da, Hora, Minutos y Segundos8 bytes{^0001-01-01},1o Enero DC - {^9999-12-31}, Diciembre 31 9999 DC mas 00:00:00 a.m. a 11:59:59 p.m.

LogicalLValores booleanos (Verdadero / Falso)1 byteTrue (.T.) or False (.F.)

NumericNEnteros o Fracciones8 bytes en memoria;1 a 20 bytes en tabla- .9999999999E+19 to .9999999999E+20

DoubleBNmero con precisin de punto flotante8 bytes+/-4.94065645841247E-324 a +/-8.9884656743115E307

FloatFIgual que Numrico8 bytes en memoria;1 a 20 bytes en tabla- .9999999999E+19 a .9999999999E+20

GeneralGHacer referencia a un objeto OLE4 bytes en tablaLimitado a la memoria disponible

IntegerIValores enteros4 bytes-2147483647 a 2147483647

MemoMHace referencia a un block de datos4 bytes en tablaLimitado a la memoria disponible

Character (Binary)CCualquier caracter que se quiere mantener sin cambiar cdigos de pginas1 byte por caracter hasta 254Cualquier caracter

Memo (Binary)MCualquier campo memo que se quiere mantener sin cambiar cdigos de pginas4 bytes en tablaLimitado a la memoria disponible

Estndares de Programacin...No te ha sucedido que despus de escribir un programa y al cabo del tiempo le tienes que dar mantenimiento no te acuerdas del significado de las variables, ni de que tipo son.. o peor an, tienes que hacerle un cambio a un sistema que alguien mas program y oohhh sorpresa.. no le entiendes ni pi de lo que hizo.. no puedes o batallas para seguir su lgica, el alcance de las variables no lo conoces, sern.. locales?, pblicas?, privadas?, es un objeto?, todo un show.. bueno... eso no va a cambiar, pero si utilizas los estndares de programacin te vas a ahorrar mucho, mucho trabajo.

Por qu es importante programar con los estndares de programacin de Microsoft???... Por una sencilla razn.. no ests solo en el universo y es importante todos ponernos de acuerdo, Microsoft sugiere utilizar la nomenclatura Hngara.. qu es esto??? fcil...

Supongamos que queremos hacer un programa que cuente del 1 al 10.. normalmente como se hace.. se crea una variable y se va desplegando el resultado, algo as como esto:

Contador = 1DO WHILE Contador < 10 ? Contador Contador = Contador + 1ENDDO

Con la notacin Hngara las variables vienen precedidas por dos letras, la primera letra indica el alcance de la variable y la segunda letra el tipo de variable que es.. los alcances pueden

El Alcance de la Variable puede ser:

AlcanceLetra

Locall

Privadap

Globalg

Parmetrot

Y el Tipo de variable puede ser:

TipoLetra

Arregloa

Caracterc

Moneday

Fechad

Fecha y Horat

Dobleb

Flotantef

Lgicol

Numricon

Objetoo

Desconocidou

De esta forma, en el ejemplo anterior tenemos la variable "Contador", utilizando la notacin hngara quedara de la siguiente manera (Suponiendo que son variables locales):

Ln_Contador = 1DO WHILE Ln_Contador < 10 ? Ln_Contador Ln_Contador = Ln_Contador + 1ENDDO

Simple y eficiente no? de esta manera cualquier otro desarrollador al ver este cdigo, entiende que la variables utilizadas es de tipo numrico y local, de esta forma se puede tener el mismo nombre de una variable pero de distintos tipos y alcance distinto, por ejemplo en las siguientes variables:La_MesArreglo (Array) con los nombres de los meses

Ln_MesNmero de Mes o Meses

Lc_MesNombre del Mes

Ok, Ok.. esto funciona bien.. pero que hay de los objetos? no que VFP es un lenguaje Orientado a Objetos?.. bueno, la Notacin Hngara tambin se utiliza en los objetos, pero la diferencia es que el objeto viene precedido por tres letras, la cual indica el objeto al que se le esta haciendo referencia.

ObjetoPrefijoObjetoPrefijo

ActiveDocacdLabellbl

CheckBoxchkLinelin

ComboBoxcboListBoxlst

CommandButtoncmdOLEBoundContrololb

CommandGroupcmgOLEole

ContainercntOptionButtonopt

ControlctlOptionGroupopg

CustomPagepag

EditBoxedtPageFramepgf

FormfrmProjectHookprj

FormSetfrsSeparatorsep

GridgrdShapeshp

ColumngrcSpinnerspn

HeadergrhTextBoxtxt

HyperLinkhplTimertmr

Imageimgtbrtbr

Y siguiendo la misma lgica, el nombre de una variable puede ser el mismo y el prefijo distinto e indicar objetos distintos, por ejemplo:ObjetoComentario

Txt_CiudadTextBox llamado Ciudad

Cbo_CiudadComboBox con Ciudades

Lst_CiudadListBox con Ciudades

Al utilizar la notacin Hngara estamos utilizando una nomenclatura estndar que nos permite leer mas fcilmente nuestro cdigo.

Diagrama Entidad Relacin TestData...

Al instalar VFP se instal una base de datos de prueba llamada "TestData.dbc", esta base de datos es sobre ordenes de compra, por lo general est localizada en:

C:\Archivos de programa\Microsoft Visual FoxPro 7\Samples\Data\TestData.dbc

Esta base de datos se utilizar en el curso, por lo que es importante conocer las tablas y estructura que forman esta base de datos. TestData est formada por cinco tablas, estas son:

TablaDescripcin

CustomerInformacin general de los clientes

EmployeeInformacin general de los empleados

OrdersOrdenes de compra hechas por los clientes

OrdItemsDetalle de las ordenes de compra

ProductsCatlogo de productos que se venden

El diagrama Entidad-Relacin en donde se muestran las tablas, los campos que tiene cada una, as como las relaciones que hay entre ellas es la siguiente:

Fcilmente, este diagrama puede ser ledo (de Izquierda a derecha) como: Un cliente hace una o muchas compras, un Empleado hace una o muchas ventas, una Orden de Compra tiene una o muchas partidas y una partida tiene un producto y un producto puede estar en una o muchas partidas.

Conociendo la Base de Datos de Visual Fox Pro :: Reglas, Procedimientos Almacenados y Disparadores.

Introduccin.

Introduccin.

Una de las grandes ventajas con las cuales cuenta VFP es su Base de Datos, Las Base de Datos nos permiten manejar las tablas de una mejor manera, no hay que confundir una tabla con una Base de Datos. en VFP las tablas tienen extensin .dbf mientras que la base de datos cuentan con la extensin .dbc.

Algunas de las Ventajas que tenemos al utilizar una Base de Datos en VFP son: Manejar nombres largos en Tablas y en Campos

Permite validar la informacin que ingresa a nivel campo o a nivel registro

Establecer valores predeterminados en los campos

Permite Mapear Campos a nuestra librera de Clases Definicin de Vistas Locales, Vistas Remotas y Conexiones

Definir Procedimientos Almacenados (Store Procedures)

Manejo de Comentarios a nivel Campos y a nivel tablas

Definicin de ndices

Disparadores (Triggers)

Integridad Referencial

Relaciones Persistentes entre tablas y Base de Datos

Establecer acciones en Eventos de la Base de Datos (VFP 7 y superior).

etc, etc, etc.

El primer paso que vamos a hacer es crear una pequea Base de Datos. Para hacer esto, en nuestro proyecto seleccionamos la pestaa Data y Clic en New, seleccionamos New Database e indicamos el nombre de nuestra base datos, en este ejemplo, la llamaremos Mi_Base_De_Datos.

Ok, la Base de Datos "Mi_Base_De_Datos" ya fue creada, si observamos bien, se puede observar que la base de datos est formada por 5 elementos:

Tablas (Tables)

Vistas Locales (Local Views)

Vistas Remotas (Remote Views)

Conexiones (Connections)

Procedimientos Almacenados (Stored Procedures) como se muestra en la figura de la derecha.

Como dijo Jack el Destripador, vamonos por partes. Vamos a empezar creando una tabla, Simplemente nos posicionamos en el elemento Tables -> New -> New Table, e ingresamos el nombre de la tabla, en este caso, Cliente y nos aparece el Diseador de Tablas.

Ahora empezamos ingresando los nombres de los campos, los tipos, el largo, las decimales, si es dice y si acepta valores nulos. En este ejemplo vamos a definir la siguiente estructura: Id del Cliente (nId_Cliente)

Nombre del Cliente (cNombre)

Apellido Paterno (cApellido_Paterno)

Direccin (cDireccion)

Casado (lCasado)

Nombre del Cnyuge (cConyuge)

La idea de esta tabla es tener un registro bsico de nuestros clientes y del nombre del cnyuge en caso que este casado. Como se observa, podemos utilizar nombres de campos largos (cApellido_Paterno) sin ningn problema.

Aqu se explicaran cmo se establecen las reglas de campo y de registro, el despliege de los datos, los procedimientos almacenados (Store Procedures) y los disparadores (Triggers).Validacin por Campo (Field Validation)

Ok, ahora si se observa bien en el diseador de tabla, en la parte inferior derecha hay una seccin llamada Validacin Campo (Field Validation) aqu indicamos las reglas que debe de cumplir un dato para ser ingresado en un campo.Esta seccin est formada por tres elementos:

Regla (Rule)

Mensaje (Message)

Valor por Omisin (Default Value)

Aqu especificamos las reglas a segir para ingresar un dato, si no cumple con la condicin indicada simplemente no se permite ingresar el dato y se muestra un mensaje de error, de esta forma estamos empezando a proteger nuestra base de datos, con la informacin que entra.

Vamos a empezar indicando la siguiente regla de Validacin de Campo. El Id del Cliente (nId_Cliente) no puede estar vaco y debe ser un nmero mayor a cero. Cmo se hara esa validacin por cdigo? Simple, con el siguiente cdigo:

NOT(EMPTY(nId_Cliente)) AND nId_Cliente > 0

Hay que tomar en cuenta que la expresin que se ingrese en una regla debe de dar un resultado Lgico, o cumple con la condicin o no cumple con la condicin, as de simple. Esta expresin es colocada en la Regla.

Ahora bien, qu pasa si un dato no se cumple la regla, que mensaje aparece? bueno, para esto existe el campo Mensaje (Message), ah indicamos el mensaje a mostrar cuando un dato no cumple con una instruccin. El dato a mostrar debe de ser de tipo Caracter. De esta forma, podemos utilizar el siguiente mensaje:

"Ingrese un Nmero de Cliente Vlido"

Nota: El valor del Campo Mensaje debe de ser de tipo Caracter, sin embargo, es posible utilizar funciones que regresen un valor de tipo caracter, como por ejemplo IIF(Condicion,"Mensaje 1","Mensaje 2").

Por ltimo, podemos indicar cul va a ser el valor por omisin en un campo, este valor puede ser un nmero asignado por nosotros, asignado por una funcin que definamos o una funcin propia de VFP, por ejemplo, si tenemos un campo fecha llamado Fecha_Ingreso_Pedido podemos poner como valor predeterminado la fecha del sistema con DATE().

Para este campo el valor predeterminado va a ser 1. Ahora bien, en la parte inferior podemos ingresar un comentario sobre el campo, esto es solamente para nuestro uso.

Ingresando la Regla de Validacin, el Mensaje, el Valor por omisin y un comentario quedara como en la figura de la derecha. Ahora simplemente grabamos la tabla y listo! ya tenemos nuestra primera regla de campo, el siguiente paso es probarla.

Ahora hacemos lo siguiente, abrimos nuestra tabla (Con un Browse) y en el Men Seleccionamos View/Append Mode, al hacer esto podemos observar que se inserta un registro, en el cual en el Campo nId_Cliente tiene como valor predeterminado el valor de uno. Aqu vemos que se cumpli correctamente el Valor por omisin.

Cambiamos el valor del campo nId_Cliente de uno a cero e intentamos pasarnos al siguiente campo, qu sucede?. Como el valor cero no cumple con la regla de validacin de campo, la tabla no permite que se ingrese el dato y aparece el Mensaje de error que habamos especificado.

Este mensaje nos da tres opciones, Ok, Revert o Help. Si seleccionamos OK nos regresa al campo y nos deja el valor que ingresamos (cero), si seleccionamos Revert nos regresa al campo con el valor que tena antes que ingresaramos el cero (uno). De la misma forma, si ingresamos un nmero negativo se viola la regla y nos aparece el mismo error.

De esta forma comprobamos que se cumpli la regla de Validacin de Campo, que apareci el mensaje que especificamos y el valor por omisin.

Despliege de Informacin (Display)Hasta este punto se mostr como ingresar una Validacin de Campo , ahora vamos a ver como se despliegan los datos, a la izquierda de Validacin de Campo hay una seccin llamada Despliege (Display), en esta parte indicamos cmo se van a capturar y mostrar los datos. Esta seccin est formada por tres elementos: Formato (Format)

Mscara de Entrada (Input Mask)

Mensaje (Caption)

En Caption especificamos el mensaje que aparecer en el campo posicionado al momento de mostrar la tabla, el dato debe de ser caracter, en Input Mask indicamos cmo queremos que los datos sean capturados, y por ltimo en Format indicamos cmo queremos que sea desplegado el dato.

Nota: Para mas informacin consultar la Propiedad Format e InputMask del manual VFP.

Para este ejemplo en Caption ingresamos Clave del Cliente, en Input Mask 999,999 y en Format $. Grabamos los cambios, y abrimos la tabla. Lo primero que observamos es que el Campo nId_Cliente tiene como encabezado "Clave del Cliente", por lo tanto Caption funcion bien.

Ahora agregamos un registro (View/Append Mode). Qu sucede? el nmero viene precedido por un signo de pesos ya que eso fu lo que especificamos en Format, ahora ingrese el siguiente nmero 12500 y ver como al momento de que el nmero es ingresado se tiene una mscara de entrada, en otras palabras en vez de ver 12500 vemos $12,500 la Propiedad Input Mask funcion.

Hasta ahora hemos visto como hacer la Validacin por Campo, Cmo poner comentarios por campo y el Despliege de los datos, hay que recalcar que cada una de esto afecta solamente al campo sobre el cual estamos posicionado, as que debemos de especificar las reglas en los campos que se quieran.

Despliege de Informacin (Display)

Hasta este punto se mostr como ingresar una Validacin de Campo , ahora vamos a ver como se despliegan los datos, a la izquierda de Validacin de Campo hay una seccin llamada Despliege (Display), en esta parte indicamos cmo se van a capturar y mostrar los datos. Esta seccin est formada por tres elementos: Formato (Format)

Mscara de Entrada (Input Mask)

Mensaje (Caption)

En Caption especificamos el mensaje que aparecer en el campo posicionado al momento de mostrar la tabla, el dato debe de ser caracter, en Input Mask indicamos cmo queremos que los datos sean capturados, y por ltimo en Format indicamos cmo queremos que sea desplegado el dato.

Nota: Para mas informacin consultar la Propiedad Format e InputMask del manual VFP.

Para este ejemplo en Caption ingresamos Clave del Cliente, en Input Mask 999,999 y en Format $. Grabamos los cambios, y abrimos la tabla. Lo primero que observamos es que el Campo nId_Cliente tiene como encabezado "Clave del Cliente", por lo tanto Caption funcion bien.

Ahora agregamos un registro (View/Append Mode). Qu sucede? el nmero viene precedido por un signo de pesos ya que eso fu lo que especificamos en Format, ahora ingrese el siguiente nmero 12500 y ver como al momento de que el nmero es ingresado se tiene una mscara de entrada, en otras palabras en vez de ver 12500 vemos $12,500 la Propiedad Input Mask funcion.

Hasta ahora hemos visto como hacer la Validacin por Campo, Cmo poner comentarios por campo y el Despliege de los datos, hay que recalcar que cada una de esto afecta solamente al campo sobre el cual estamos posicionado, as que debemos de especificar las reglas en los campos que se quieran.

Validacin por Registro (Record Validation)

Ok, con lo anterior solemente hemos validado que los datos que entran a un campo sean correctos, pero hay ocasiones en las cuales es necesario validar todo el registro, Por poner un ejemplo, en la tabla de cliente que creamos hay un campo llamado lCasado, el cual es de tipo lgico y un campo llamado cConyuge en el cual esta el nombre del Cnyuge en caso que este casado.

Vamos a establecer la siguiente regla de registro: "Si el cliente est casado, se debe de tener el nombre del cnyuge", as de simple. Cmo haramos esa validacin en el Diseador de Tablas?? muy fcil, en la pestaa "Table" hay una seccin llamada "Record Validation" la cual tiene dos elementos: Regla (Rule)

Mensaje (Message)

Aqu es donde indicamos la regla y el mensaje que aparecer al momento que un registro viole la condicin, es muy parecido a la validacin por campo.

De la misma forma podemos ingresar un comentario de la tabla el cual es solamente para nuestro uso, referencia, etc.

Adems, podemos ver mas informacin sobre la tabla, el nombre, la base de datos a la que pertenece, la cantidad de registros, de campos y la ubicacin fsica del archivo.

Cul sera la instruccin para esta regla de registro? podemos utilizar los siguiente:

IIF(lcasado,NOT(EMPTY(cconyuge)),.T.)

En caso que se viole la regla, que muestre el siguiente mensaje: "Ingrese el nombre del Cnyuge". Como se coment, el resultado de una regla debe de ser un valor lgico, en la instruccin en caso que un cliente no sea casado se regresa verdadero, en otras palabras, cumple con la regla.

Ahora simplemente probamos la regla, abrimos la tabla e ingresamos un nuevo registro, indicamos que el cliente est casado, dejamos en blanco el campo Cnyuge e intentamos pasar a otro registro, qu sucede? como se viola la regla de registro no se puede grabar el registro y nos aparece el mensaje de error que especificamos.

De esta forma estamos protegiendo nuestra tabla, estas opciones son muy poderosas y de gran ayuda en el diseo de nuestras base de datos.

Procedimientos Almacenados (Store Procedures)

Ya se vi como hacer las validaciones a nivel campo y registro, ahora bien, la base de datos cuenta con Procedimientos Almacenados.. qu es esto y para qu nos sirven? bien, supongamos que para validar un campo mandamos llamar la Siguiente Funcion: ValidaCampo(lcCampo) la cual simplemente regresa .T. o .F. as de simple.

Que es lo que tenemos que hacer para que nuestro campo mande llamar a esta funcin? simplemente, al inicio de nuestro programa lo mandamos llamar con SET PROCEDURE TO "C:\...\Mis_Procedimientos.prg" ADDITIVE por poner un ejemplo. Esto funciona siempre y cuando establezcamos la instruccin SET PROCEDURE TO.

Qu sucede si se abre la base de datos sin haber cargado los procedimientos a los cuales hace referencia? Pues tendramos errores y tronara la base de datos ya que no encuentra la funcin o procedimiento.

Ahora bien.. que sucede si una base de datos est siendo utilizada en 10 proyectos?.. Pues simplemente en los 10 Proyectos debemos de hacer referencia al archivo de procedimientos.. que no se nos olvide porque tendramos problemas.

Bueno, para ayudarnos, existen los Procedimientos Almacenados, estos son Procedimientos y Funciones como las que hemos utilizado, la nica diferencia es que en vez de que se graben en un archivo .prg se graban dentro de la base de datos! Con esto nos evitamos el tener que poner en nuestros proyectos SET PROCEDURE TO y si se abre la base de datos, se cargan los procedimientos almacenados, tan simple y poderoso.

En el ejemplo de validacin de Campo del Id del Cliente del ejemplo anterior utilizamos la siguiente instruccin:

NOT(EMPTY(nId_Cliente)) AND nId_Cliente > 0

Esta la colocamos en el campo de Regla de Campo.. Vamos a hacer lo mismo pero con Procedimientos Almacenados. En la Base de datos, hay un elemento llamado Procedimientos Almacenados (Stored Procedures), se posiciona en este elemento y se da click en nuevo, al hacer esto se abre el editor de Procedimientos Almacenados como se muestra en la figura. Aqu es donde creamos nuestros procedimientos.

Insertamos el siguiente cdigo:

&& Validacin del Nmero de Cliente, regresa .T. cuando&& el nmero sea mayor a cero y no este vaco.

PROCEDURE ValidaIdCliente LPARAMETER pn_Id_Cliente

IF NOT(EMPTY(pn_Id_Cliente)) AND pn_Id_Cliente > 0 RETURN .T. ELSE RETURN .F. ENDIFENDPROC

Quedara de la Siguiente manera.. Simplemente se graba.

Perfecto, ya se cre nuestro procedimiento almacenado llamado ValidaIdCliente, ahora simplemente lo mandamos llamar, modificamos la estructura de la tabla Cliente, se posiciona en el campo nId_Cliente y en la regla de Campo establecemos lo siguiente:

ValidaIdCliente(nId_Cliente)

Qu sucede? si intentamos grabar un nmero de cliente vaco o menor a cero, al momento de salir del campo se manda llamar la funcin ValidaIdCliente y esta regresar .F., por lo tanto no permitir ingresar el dato. Esto es de gran ayuda cuando las validaciones a hacer son complejas y requieren de varios procesos.

Podemos hacer tantas validaciones y procedimientos como se quieran y todos quedarn grabados en la base de datos, si 2, 3 o ms proyectos utilizan la misma base de datos, esta ya tiene los procedimientos necesarios, no hay que preocuparse por mandar llamar las Funciones y Procedimientos con SET PROCEDURE TO.

Disparadores (Triggers) Una de las grandes caractersticas con la cual cuentan las bases de datos son los disparadores o triggers, los disparadores son acciones que se "disparan" cuando se crea un registro (insert), se actualiza un registro (update) o se elimina un registro (delete).

Hasta ahora hemos visto como proteger los datos que entran a nuestra tabla y mandar llamadar procedimientos y funciones almacenadas.. pero.. an as nuestra base de datos puede mostrar inconsistencias o no cumplir con las reglas de negocio del sistema.. aqu hay varios ejemplos:

1) Suponga que en una base de datos hay una tabla de Cliente y otras de Cuentas por Cobrar (CxC), en la tabla de Cliente existe el campo nId_Cliente el cual obviamente contiene la clave del cliente y en la tabla de Cuentas por Cobrar tambin se tiene ese campo como llave foranea o de referencia. como se muestra en el siguiente diagrama:

En este diagrama podemos observar como es posible que un cliente tenga una o muchas cuentas por cobrar

Ahora bien, suponga que entra un usuario mal intencionado a nuestra base de datos y elimina a un cliente que tiene cuentas por cobrar.. Qu sucede? Pues para empezar ya hay inconsistencia de datos, porque van a existir cuentas por cobrar que apuntan a un nmero de cliente que no existe, segundo.. ya perdimos dinero, a quin se lo cobramos? o nos lo cobran?.

Otro ejemplo utilizando las mismas tablas.. qu sucede si el mismo usuario mal intencionado ingresa cuentas por cobrar con nmeros de clientes que no existen? Pues tambin hay inconsistencia porque las Cuentas por Cobrar apuntan a clientes que no existen.

2) Suponga que tiene una tabla de Jefes y una de empleados con la estructura de la siguiente figura, una de las reglas es la siguiente: Un empleado no puede ganar igual o mas que su Jefe.

An y que esto lo maneje por cdigo en la forma de captura, que sucede si el mismo usuario mal intencionado entra a la base de datos y aumenta el sueldo de ciertos empleados ms de lo que ganan sus superiores?.. No hay inconsistencias de datos pero si hay violaciones a las reglas del negocio.

Estos son solo unos pocos ejemplos para mostrar como nuestra base de datos puede ser vulnerable, para evitar esto existen los Disparadores, en el primer ejemplo se pudo haber evitado que se borrara un cliente si es que tiene cuentas por cobrar y evitar que se grabara una cuenta por cobrar de un cliente que no existe. De la misma forma en ejemplo de Jefes y empleados se pudo evitar que se grabara un cambio si el sueldo es mayor que el de su superior.

Vamos a ver este pequeo ejemplo para ver como funcionan y cuando se mandan llamar. Creamos tres procedimientos almacenados llamados: SP_Insert, SP_Update y SP_Delete, estos solamente muestran una ventana indicando su nombre, algo as como esto:

PROCEDURE SP_Insert WAIT WINDOW "Store Procedure Insert"ENDPROC

PROCEDURE SP_Update WAIT WINDOW "Store Procedure Update"ENDPROCPROCEDURE SP_Delete WAIT WINDOW "Store Procedure Delete"ENDPROC

Ok, ya creamos los Procedimientos Almacenados, ahora editamos la tabla Cliente y nos posicionamos en la pestaa "Table", en la parte inferior derecha hay una seccin llamada "Triggers", Como se puede observar hay tres opciones de Triggers, al insertar, al actualizar y al eliminar un registro, aqu es donde mandamos llamar nuestros procedimientos, quedando de la siguiente forma:

En el disparador Insertar mandamos llamar el procedimiento SP_Insert()

En el disparador Actualizar mandamos llamar el procedimiento SP_Update()

En el disparador Eliminar mandamos llamar el procedimiento SP_Delete()

Grabamos los cambios, abrimos la tabla e ingresamos un cliente, qu sucede al momento de grabarlo? primero se verifican las reglas de campo, las reglas de registro y el disparador o trigger de Insertar es ejecutado, se puede observar como se muestra el mensaje "Store Procedure Insert", el Disparador de Insertar un registro funcion correctamente.

Ahora bien, nos posicionamos en el cliente que acabamos de crear y hacemos cualquier cambio, al momento de grabarlo de nueva cuenta se verifican las reglas de campo, de registro y el disparador de Actualizar es ejecutado, se muestra el mensaje "Store Procedure Update", por lo tanto el Disparador de Actualizar un registro funcion correctamente.

Por ltimo, eliminamos el registro, al momento de grabar el cambio el disparador de Eliminar es ejecutado, se muestra el mensaje "Store Procedura Delete", por lo tanto el Disparador de Eliminar un registro funcion correctamente.

Con estos ejemplos, se vio el proceso que siguen los disparadores, ahora, para ponerlos un poco en prctica, en nuestra base de datos creamos una tabla sencilla en la cual van a estar las cuentas por cobrar llamada CxC, con los siguientes campos: nId_CxC,nId_Cliente y nSaldo. Como se muestra en la figura.

Ya creada la tabla de Cuentas por cobrar, el siguiente paso es crear el Procedimiento Almacenado que permitira o prohiba eliminar un cliente. Creamos el procedimiento llamado EliminaCliente al cual le enviamos como parmetro el Id del Cliente a eliminar, si el cliente tiene saldo pendiente entonces no se permite eliminarlo, de lo contrario se elimina el cliente, el procedimiento quedara de la siguiente forma:*!* *************************************************************************************&& Este procedimiento regresa .T. cuando un cliente no&& tiene CxC, de lo contrario regresa .F.*!* *************************************************************************************PROCEDURE EliminaCliente LPARAMETER ln_Id_Cliente

&& Abrimos la tabla CxC en caso que no este abierta IF NOT(USED("CxC")) SELECT 0 USE CxC ENDIF && Nos posicionamos en la tabla y en el primer registro SELECT CxC GO TOP && Obtenemos el saldo del cliente SUM nSaldo ALL FOR nId_Cliente = Ln_Id_Cliente TO ln_Saldo IF Ln_Saldo = 0 RETURN .T. ELSE =MESSAGEBOX("No se puede eliminar un Cliente con CxC",64,"Disparador") RETURN .F. ENDIFENDPROC*!* **************************************************************************************!**!* *************************************************************************************

Quedando de la siguiente forma:

Ya creamos el procedimiento que verifica si un cliente puede o no ser eliminado de la base de datos, el siguiente paso es indicarle a la tabla de cliente que mande llamar este procedimiento, en donde va este procedimiento? pues en el disparador de eliminar (Delete Trigger) ah es donde lo mandamos llamar. Modificamos la tabla, editamos el Disparador, simplemente poniendo la siguiente instruccin: EliminaCliente(nid_cliente) y listo!

Ahora probamos nuestro Disparador, en la tabla de Cliente nos aseguramos que exista un cliente con la clave 1, y en la tabla de cuentas por cobrar (CxC) ingresamos tres registros (o mas) que pertenezcan al cliente uno y con saldo mayor a cero, como en la siguiente figura.

Ok, ahora verificamos que el disparador funcione correctamente, eliminamos el cliente uno, al hacer esto se ejecuta el disparador de eliminar y como el cliente tiene cuentas por cobrar no permite la eliminacin aparece el mensaje especificado en el disparador y nos aparece el mensaje "Trigger Failed".

Como se puede observar el uso de Procedimientos Almacenados y Disparadores nos ayuda a tener un mejor control de la base de datos de una manera mas sencilla.Exportacin de Informacin...Una de las grandes ventajas con las que cuenta VFP es su capacidad para exportar la informacin a varios formatos, para hacer esto VFP cuenta con las siguientes instruccion: EXPORT y COPY TO.

Export

VFP Exporta la informacin de la tabla, vista o cursor del cual se encuentra posicionado.

Sintaxis ExportEXPORT TO FileName [TYPE] DIF | MOD | SYLK | WK1 | WKS | WR1 | WRK | XLS | XL5

[FIELDS FieldList] [Scope] [FOR lExpression1] [WHILE lExpression2]

[NOOPTIMIZE] [AS nCodePage]Parmetros

ClusulaDescripcin

FileNameNombre del archivo de salida

WK1Crea una hoja de clculo de Lotus 1-2-3 (Revisin 2.x)

WKSCrea una hoja de clculo de Lotus 1-2-3 (Revisin 1-A)

XLSCrea una hoja de Microsoft Excel

XL5Crea una hoja de Microsoft Excel Versin 5.0

Ejemplos.

&& Copia el contenido de la tabla Customer a un archivo en ExcelSELECT CustomerEXPORT TO "C:\MisClientes.Xls"

&& Crea una cursor y lo exporta a formato Lotus 123SELECT ; Customer.Company,; Orders.Order_Id,; Orders.Order_Date ;FROM Orders, Customer WHERE Orders.Cust_Id = Customer.Cust_Id INTO CURSOR MiCursor

EXPORT TO "c:\Mis Archivos\Ordenes.WK1"

Copy To

Aunque las instrucciones se parecen, hacen acciones un poco distintas, EXPORT TO exporta la informacin a otros formatos, mientras que COPY TO copia la informacion de la tabla en la que est posicionada a un nuevo archivo

Sintaxis Copy ToCOPY TO FileName [DATABASE DatabaseName [NAME LongTableName]]

[FIELDS FieldList | FIELDS LIKE Skeleton | FIELDS EXCEPT Skeleton]

[Scope] [FOR lExpression1] [WHILE lExpression2] [[WITH] CDX]

| [[WITH] PRODUCTION] [NOOPTIMIZE]

[[TYPE] [FOXPLUS | FOX2X | DIF | MOD

| SDF | SYLK | WK1 | WKS | WR1 | WRK | CSV | | XLS | XL5

| DELIMITED [WITH Delimiter | WITH BLANK | WITH TAB

| WITH CHARACTER Delimiter]]] [AS nCodePage]Parmetros

ClusulaDescripcin

FileNameNombre del archivo a copiar, si no se especifica una extensin VFP crea una tabla dbf.

DATABASE DatabaseNameNombre de la base de datos en la cual es archivo es copiado

NAME LongTableNameNombre de la nueva tabla, los nombres pueden contener 128 carateres.

FIELDS FieldListLista de los campos que se van a exportar, si no se especifican, VFP exporta todos los campos

ScopeCriterio a Exportar

TYPEEspecifica el tipo de archivo, si el archivo no es dbf

CSVCrea un archivo delimitado por comas

XLSCrea un archivo Microsoft Excel

DELIMITEDCrea un archivo delimitado, el delimitador por default es coma

DELIMITED WITH DelimiterCrea un archivo delimitado por el caracter especificado

DELIMITED WITH TABCrea un archivo delimitado por tabuladores

DELIMITED WITH CHARACTER DelimiterCrea un archivo delimitado por el caracter especificado

Ejemplos:

SELECT EmployeeCOPY TO "C:\empleado tab.txt" DELIMITED WITH TABCOPY TO "C:\empleado pipe.txt" DELIMITED TITH CHARACTER "|"COPY TO "c:\empleado coma.csv" TYPE CSV

Importar Datos.As como VFP cuenta con funciones para exportar informacin, cuenta con funciones para importar informacin de otros formatos (Excel, Texto, WK, etc) a tablas dbf.

Las instrucciones bsicas que se encargan de estos procesos son: IMPORT FROM y APPEND FROM.

IMPORT FROM

Sintaxis Import FromIMPORT FROM FileName [DATABASE DatabaseName [NAME LongTableName]]

[TYPE] FW2 | MOD | PDOX | RPD | WK1 | WK3 | WKS | WR1 | WRK | XLS

| XL5 [SHEET cSheetName] | XL8 [SHEET cSheetName] [AS nCodePage]Parmetros

ClusulaDescripcin

FileNameNombre del archivo del cual se van a importar los datos

TYPEEs opcional, pero debe de ir si va alguna de las siguientes clusulas: FW2,MOD,PDOX,RPD,WK1,XLS...

WK1Crea una hoja de clculo de Lotus 1-2-3 (Revisin 2.x)

WKSCrea una hoja de clculo de Lotus 1-2-3 (Revisin 1-A)

XLSCrea una hoja de Microsoft Excel

XL5Crea una hoja de Microsoft Excel Versin 5.0

Ejemplo: En la carpeta C:\Curso VFP7\Importar Datos\ se encuentra el archivo Clientes.xls, el cual tiene informacin de clientes en formato Excel, la idea es convertir esa informacin en un archivo .dbf, utilizaramos el siguiente cdigo

SET DEFAULT TO "IMPORT FROM "

VFP no solamente importa los datos, sino que crea un archivo dbf que fcilmente lo podemos manipular, como se ve en la siguiente figura:

APPEND FROM

Agrega registros al final de la tabla de otros formatos, es muy parecida a IMPORT FROM.

Sintaxis Append FromAPPEND FROM FileName | ? [FIELDS FieldList] [FOR lExpression]

[[TYPE] [DELIMITED [WITH Delimiter | WITH BLANK | WITH TAB

| WITH CHARACTER Delimiter] | DIF | FW2 | MOD | PDOX | RPD |

SDF | SYLK | WK1 | WK3 | WKS | WR1 | WRK | CSV | XLS | XL5

[SHEET cSheetName] | XL8 [SHEET cSheetName]]] [AS nCodePage]Parmetros

ClusulaDescripcin

FileNameNombre del archivo del cual se van a importar los datos

TYPEEs opcional, pero debe de ir si va alguna de las siguientes clusulas: FW2,MOD,PDOX,RPD,WK1,XLS...

[DELIMITED [WITH Delimiter | WITH BLANK | WITH TAB | WITH CHARACTER Delimiter]Delimitador del archivo

En la carpeta Importar Datos existe el archivo "clientes.txt", forma como importaramos la informacin es parecido a esto:

CREATE CURSOR MisClientes ;(Company C(30) ,;Address C(30) ,;City C(30) ,;PostalCode C(5) ,;Country C(10) ,;Phone C(20))

APPEND FROM "C:\Curso VFP7\Importar Datos\clientes.txt" DELIMITED WITH TABBROWSE

Introduccin a la Programacin Orientada a Objetos (POO)Muchas veces se ha escuchado el trmino de Programacin Orientada a Objetos (POO), se ha escuchado que permite una reutilizacin de cdigo y nos ahorra el tiempo en desarrollo.

VFP es un lenguaje Orientado a Objetos y por lo tanto tiene todas las ventajas de la misma, para empezar se debe de olvidar la forma estructurada de programacin y entender el concepto de objetos, en vez de pensar estructuradamente se debe de pensar en crear objetos que realicen estas funciones.

Empezamos definiendo lo que es un objeto. Un objeto es una representacin de algo fsico o una entidad que tiene ciertas caractersticas y sabe como hacer cierta cosas, por ejemplo, un telfono, un automvil, un avin, una escuela, una persona, una factura, etc. Todos ellos se pueden representar como objetos

A las caractersticas del objeto se le conocen como Propiedades, las acciones que realiza el objeto se le conoce como Metodos (o Eventos en algunos casos, mas bien son los resultados de la accin del usuario o del cdigo del programa)

Por ejemplo, en un telfono podemos observar las siguientes Propiedades:

Color

Ubicacin

Ancho

Largo

Peso

Marca

etc

De la misma manera, en un avin tendramos las siguientes propiedades:

Color

Ancho

Largo

Peso

Peso Mximo

Velocidad Despegue Mximo Alcance

Altura Mxima

Cantidad de Ventanas

Velocidad de Crucero

Cantidad de Asientos

etc.

Siguiendo el mismo procedimiento se van estableciendo las propiedades del objeto.

Ahora bien, los Mtodos son las acciones que le pueden suceder al objeto, tomando de nueva cuenta el ejemplo del telfono, puden suceder las siguientes acciones: Sonar Timbre

Levantar auricular

Contestar llamada

Colgar auricular

Marcar botn

etc.

En donde cada Mtodo del objeto tiene instrucciones sobre como reaccionar, por ejemplo, al colgar el aricular el objeto sabe que debe terminar la llamada.

Los Eventos tambin son mtodos, la nica diferencia entre un evento y un mtodo es que el evento se ejecuta automticamente bajo ciertas condiciones, por ejemplo en un humano, el evento LatirCorazon() se ejecuta en automtico, por poner un ejemplo. En VFP podemos crear mtodos mas no eventos.

En la POO se ingresan todas las propiedades y mtodos de un objeto y ests son empaquetadas, al utilizar el objeto no es necesario saber como funciona internamente, por ejemplo, al marcar un nmero en el telfono sabemos que accion va a pasar, no nos preocupamos por como lo maneja internamente, si manda la seal a un microchip, si tiene una memoria interna, eso no lo sabemos, simplemente lo utilizamos.

A esta caracterstica se le conoce como Encapsulacin, la capacidad de agrupar piezas relacionadas de informacin y procedimientos en una sola unidad. La encapsulacin es implementada utilizando Objetos con propiedades y mtodos.

En VFP creamos objetos en Clases, se pueden hacer por cdigo o utilizando el Diseador de Clases, al definir la clase especificamos las propiedades y mtodos que la forman. Todos los objetos que se creen de esta clasen tendrn las mismas propiedades y mtodos, es parecido a hacer un molde, en donde todas las piezas que salgan del molde son iguales, al proceso de crear objetos de una clase se le conoce como Instanciacin, el objeto que se crea es una instancia de la clase.

Supongamos que tenemos un sistema con 50 pantallas, en cada pantalla tenemos el logotipo de la empresa, que pasa si el logotipo cambia? tenemos que ir a cada una de las pantallas y hacer el cambio del logotipo, utilizando objetos creariamos un objeto que muestra el logotipo de la empresa. Inherencia es una caracterstica que se debe de presentar para que un lenguaje sea considerado Orientado a Objeto, la inherencia es la habilidad de un objeto de recibir las caractersticas del objeto del cual es creado, se puede ver como la capacidad de ver reflejado los cambios hechos en la clase base en todas sus instanciaciones, por ejemplo, supongamos que tenemos un botn como clase y la leyenda del botn dice "Alta" y este botn ha sido instanciado o colocado en 50 formas

Ahora por alguna causa, es necesario cambiar la leyenda de "Alta" por "Nuevo", como se hara antiguamente??? tendramos que modificar las 50 formas y hacer el cambio, en la POO hacemos el cambio en la clase y el cambio se ve reflejado automticamente en todas las instanciaciones de la clase! en pocas palabras, los cambios hecho en el molde se ven reflejados en las instancias.

Por ltimo, Polimorfismo es la capacidad de enviar el mismo mensaje pero de diferentes tipos y de responder de acuerdo al tipo que se envi. Cuando realizamos programacin estructurada debemos tener cuidado de no llamar con el mismo nombre a dos variables o a dos procedimientos, sin embargo en la POO podemos llamar a un mtodo o a una propiedad de una clase de igual forma que un mtodo o propiedad de otra. Esta caracterstica es lo que se denomina polimorfismo. Veamos un ejemplo con propiedades

DEFINE CLASS MiClase1 AS CUSTOM MiPropiedad = 10ENDDEFINE

DEFINE CLASS MiClase2 AS CUSTOM MiPropiedad = "Hola"ENDDEFINE

oUno = CREATEOBJECT("MiClase1")oDos = CREATEOBJECT("MiClase2")

? oUno.MiPropiedad? oDos.MiPropiedad

Como se puede ver el nombre de la propiedad es el mismo en ambos casos, pero con un resultado distinto.

Algunas de las ventajas de utilizar POO son: Objetos reutilizables: Una vez que se ha desarrollado y depurado una clase, esta puede ser utilizada en mas aplicaciones sin necesidad de modificarla mas.

Mantenimiento mas fcil: El mantenimiento es hecho en el objeto, las instancias que de este objeto heredern los cambios automticamente.

Facilidad de modificacin: Al hacer el cambios en el objeto, estos cambios se vern reflejados en las instanciaciones.

Creacin de Objetos Ya que se entendo lo que es la POO, los objetos, Propiedades y mtodos el siguiente paso es la creacin de objetos en VFP, pero antes se debe de comprender la nomenclatura que se utiliza para hacer referencia a las propiedades y eventos.

Para hacer referencia a la Propiedad de un objeto, se sigue lo siguiente:

NombreDelObjeto.Propiedad

Mientras que a los Mtodos de un objeto se sigue lo siguiente: NombreDelObjeto.Mtodo()

Para hacer referencia a varias propiedades se puede hacer esto: NombreDelObjeto.Propiedad1 = Valor1 NombreDelObjeto.Propiedad2 = Valor2 NombreDelObjeto.Propiedad3 = Valor3 NombreDelObjeto.Propiedad4 = Valor4 NombreDelObjeto.Propiedad5 = Valor5

O mejor an, utilizar la clusula WITH / ENDWITH quedando de la siguiente forma:

WITH NombreDelObjeto .Propiedad1 = Valor1 .Propiedad2 = Valor2 .Propiedad3 = Valor3 .Propiedad4 = Valor4 .Propiedad5 = Valor5 ENDWITH

Para la creacin de objetos VFP cuenta con el comando DEFINE CLASS, la sintaxis es la siguiente:DEFINE CLASS ClassName1 AS ParentClass [OF ClassLibrary] [OLEPUBLIC]

[[PROTECTED | HIDDEN PropertyName1, PropertyName2 ...]

[Object.]PropertyName = eExpression ...]

[IMPLEMENTS cInterfaceName [EXCLUDE]

IN TypeLib | TypeLibGUID | ProgID ]

[ADD OBJECT [PROTECTED] ObjectName AS ClassName2 [NOINIT]

[WITH cPropertylist]]

[[PROTECTED | HIDDEN] FUNCTION | PROCEDURE Name[_ACCESS |_ASSIGN]

([cParamName [AS type] [@]])

[AS type] [HELPSTRING cHelpString]

THIS_ACCESS [NODEFAULT] cStatements [ENDFUNC | ENDPROC]]

[PEMName_COMATTRIB = nFlags | DIMENSION PEMName_COMATTRIB[5]

[PEMName_COMATTRIB[1] = nFlags

PEMName_COMATTRIB[2] = cHelpString

PEMName_COMATTRIB[3] = cPropertyCapitalization

PEMName_COMATTRIB[4] = cPropertyType

PEMName_COMATTRIB[5] = nOptionalParams]]

ENDDEFINE En donde ParentClass se especifica la clase padre de la cual el objeto tomar sus propiedades y eventos, esta puede tomar cualquiera de los siguientes valores:

ActiveDocCustomProjectHookPageFrame

CheckBoxDataEnvironmentLabelRelation

ColumnEditBoxLineSeparator

ComboBoxFormListBoxSession

CommandButtonFormSetOLEControlSpinner

CommandGroupGridOLEBoundControlTextBox

ContainerHeaderOptionButtonTimer

ControlHyperlinkOptionGroupToolBar

CursorImagePage

Para empezar, vamos a crear un objeto llamado Automovil, el cual tenga las siguientes propiedades: Marca, Modelo, Ao y Placas, adems que tenga estos dos eventos Encender y Apagar. Para hacer esto, utilizamos el siguiente cdigo:

DEFINE CLASS Automovil AS Custom && Se especifican las Propiedades del Automvil cMarca = "" cModelo = "" nAo = 0 cPlacas = "" lEnMarcha = .F.

&& Se especifican los eventos de encendido y apagado PROCEDURE Encender This.lEnMarcha = .T. ENDPROC

PROCEDURE Apagar This.lEnMarcha = .F. ENDPROCENDDEFINE

Este cdigo creara un objeto llamado Automvil con las propiedades y eventos especificados, ahora el siguiente paso es crear una instancia del objeto, para hacer esto VFP cuenta con el comando CREATEOBJECT() el cual nos ayuda a crear el objeto (ya que con DEFINE CLASS simplemente lo definimos), tendramos el siguiente cdigo:

oCivic = CREATEOBJECT("Automovil")y listo! ahora simplemente asignamos propiedades y mandamos llamar los eventos

Como se puede ver en el ejemplo anterior, se hace una instancia del objeto Automovil, esta instancia es llamada "oCivic", despus de crear el objeto asignamos las propiedades y por ltimo desplegamos la Marca, el Modelo, Encendemos y apagamos el motor.

El objeto Automovil puede ser llamado varias veces, cada instancia tendr sus propias propiedades y mtodos.

oCivic = CREATEOBJECT("Automovil")oGolf = CREATEOBJECT("Automovil")oTsuru = CREATEOBJECT("Automovil")

&& Asignamos la Propiedades al Objeto oCivicWITH oCivic .cMarca = "Honda" .cModelo = "Civic" .nAo = 2002 .cPlacas = "HCP-001" .Encender()ENDWITH

&& Asignamos la Propiedades al Objeto oGolfWITH oGolf .cMarca = "VolksWagen" .cModelo = "Golf" .nAo = 2003 .cPlacas = "GVW-003" .Apagar()ENDWITH

&& Asignamos la Propiedades al Objeto oTsuruWITH oTsuru .cMarca = "Nissan" .cModelo = "Tsuru" .nAo = 2001 .cPlacas = "NTS-002" .Encender()ENDWITH

&& Al desplegar los datos cada objeto tiene sus propios valores.

? oCivic.cMarca && Honda? oGolf.cMarca && VoksWagen? oTsuru.cMarca && Nissan? oCivic.lEnMarca && .T.? oTsuru.nAo && 2001

Creacin de Clases VFP permite la creacin de clases por medio de un diseador de clases que nos facilita mucho la tarea, todas nuestras clases se guardan en una biblioteca de clases (.vcx) que nosotros definimos, por ejemplo, vamos a crear una clase basada en el botn estndar de VFP, con la caracterstica que la leyenda sea "Hola".

Para empezar a crear la clase, en el Proyecto seleccionamos la pestaa de Clases y damos clic en New, al hacer esto aparecer la pantalla New Class, aqu es donde especificamos:

Nombre de la clase (Class Name)

Clase en la que est badada (Basen On)

Lugar donde se quiere grabar (Store In).

Ingresamos el nombre de nuestra clase, en este caso "MiBoton" y especificamos la clase en la que va a estar basada, al hacer clic en el Combo Box "Based On" nos aparece una lista de clases padres sobre la cual se va a basar nuestra clase, como en este ejemplo esta basada en un botn seleccionamos CommandButton.

Por ltimo indicamos en donde queremos grabar la librera de clases dando clic en el botn o ingresando y ubicacin de la librera de clases, como se muestra en la siguiente figura.

Al dar clic en el botn OK aparecer la siguiente pantalla, en esta pantalla es donde configuramos nuestra clase,

Como se puede observar, se creo la librera de clases "MisClases" y esta se agreg en la Pestaa de clases, en esta librera pertenece nuestra clase de tipo botn, al posicionarnos sobre el botn, dar clic con el botn derecho y seleccionar Propiedades aparece la ventana de Propiedades y Mtodos de la clase.

Nos posicionamos en la Propiedad Caption y la cambiamos por "Hola", adems en el evento click ingresamos el siguiente cdigo:

MiBoton.Click()WAIT WINDOW "Hola Mundo!"

Quedando de la siguiente manera:

Ahora simplemente grabamos nuestra clase y listo, ya definimos las caractersticas como queremos que funcione el botn, ahora el siguiente paso es instanciarlo en nuestra forma. El siguiente paso es en nuestro proyecto, posicionarnos en la pestaa Documentos y dar clic en el botn New, y seleccionar "New Form", nos aparecer la siguiente forma.

Para insertar nuestra clase, lo primero que se tiene que hacer es agregar nuestra librera de clases en la barra de herramientas de VFP, para hacer esto, damos clic en el segundo cono de la barra de herramientas (libros) y seleccionamos la opcin Add. Al hacer esto aparecer la ventana de seleccin de archivo, seleccionamos "MisClases.Vcx" y esta se agregar a nuestra barra de herramientas.

Ahora simplemente insertamos nuestra clase en la forma, en este ejemplo insertamos (instanciamos) nuestra clase 10 veces, con la finalidad de que se vea la propiedad Caption de cada instancia dice "Hola" adems, al ejecutar la forma y dar clic en cualquier botn aparecer el mensaje "Hola Mundo!".

Esto es, las instancias adquieren las propiedades y mtodos de la clase de donde proceden, esto nos ayuda a tener una gran reutilizacin de cdigo.

Como es que esto nos ayuda a reducir el tiempo? bueno, supongamos que se debe de cambiar la leyenda de Hola por Adis, adems al dar clic mostrar Adis Mundo en vez de Hola Mundo. Con la utilizacin de clases la ventaja est que en vez de hacer el cambio en los 10 botones de la forma, simplemente nos vamos a la clase y hacemos los cambios en la clase, cambiamos el caption y el evento click y estos cambios se vern reflejados automticamente en todas las formas que utilicen este botn.

Despus de hacer los cambios en la clase y ejecutar la forma, los cambios se ven reflejados sin necesidad de modificar la forma. Al utilizar la POO nos permite hacer cambios en nuestras clases bases y sin necesidad de hacer cambios en las formas.

Ejercicio: Crear una librera de clases que contenga al menos estos elementos: CheckBox

ComboBox

CommandButton

Container

EditBox

Grid

Image

Label

ListBox

Spinner

TextBox

Timer

Botn Explorador de Windows... Ya que se vio como crear clases, vamos a empezar a desarrollar una clase que nos muestre el explorador de Windows, esta sencilla clase va a ser un botn que al momento que el usuario dispare el evento Click ejecute esta accin.

Para abrir el Explorador de Windows vamos a utilizar la funcin ShellExec, empezamos agregando a nuestra librera de clases nuestra clase (Cmd_Explorador)

Al dar clic en OK aparece nuestro botn, hacemos estos cambios en las propiedades

Height = 24Width = 24Caption = ""Picture = "..\curso vfp7\imagenes\bmp\explorer.bmp" && Path donde esta la imgen

Ahora, en el evento Click ingresamos el siguiente cdigo:

*!* *******************************************************!* Cmd_Explorador.Click()*!* ******************************************************lcLink = "c:\" && Carpeta que va a abrirlcAction =""lcParms = ""

lcAction = IIF(EMPTY(lcAction),"Open",lcAction)lcParms = IIF(EMPTY(lcParms),"",lcParms)

DECLARE INTEGER ShellExecute ; IN SHELL32.dll ; INTEGER nWinHandle ,; STRING cOperation ,; STRING cFileName ,; STRING cParameters ,; STRING cDirectory ,; INTEGER nShowWindow

DECLARE INTEGER FindWindow ;IN WIN32API ;STRING cNull, STRING cWinName

RETURN ShellExecute(FindWindow(0,_SCREEN.Caption) ,;lcAction,lcLink,;lcParms,SYS(2023),1)*!* *******************************************************!**!* ******************************************************

Quedando de la siguiente manera:

Por ltimo, ingresamos informacin sobre la clase, esto nos va a permitr que el momento de utilizarla tengamos una referencia sobre lo que hace y uso, en el men de VFP seleccionamos Class/Class Info y aparecer la pantalla Class Info, aqu es donde ingresamos los datos,

En Toolbar Icon especificamos la imgen que deseamos que represente la clase en la barra de herramientas, en Container Icon el cono que aparecer en nuestra librera de clases, y en Description, como su nombre lo indica, una breve descripcin de lo que hace la clase.

Ahora simplemente grabamos la clase, creamos una nueva forma (_Cmd_Explorer) e insertamos nuestra clase, ejecutamos la forma y hacemos clic en nuestro botn, el Explorador de Windows se abrir como en la siguiente figura:

Y listo! ahora simplemente insertamos esta clase en nuestros proyectos y el usuario puede abrir el Explorador de Windows

Clase Exportar Informacin... Como ya se vi, VFP permite exportar informacin a varios formatos utilizando los comandos EXPORT TO y COPY TO, ahora se va a crear una clase basada en un botn, que al momento de ejecutar el evento Click exporte la informacin de una determinada tabla a Microsoft Excel.

Empezamos agregando a nuestra librera de clases nuestra clase (Cmd_Export)

Al dar clic en OK aparece nuestro botn, hacemos estos cambios en las propiedades

Height = 24Width = 24Caption = ""Picture = "..\curso vfp7\imagenes\bmp\open_in_excel.bmp" && Path donde esta la imgen

Ahora, en el evento Click ingresamos el siguiente cdigo:*!* *******************************************************!* Cmd_Export.Click()*!* ******************************************************

Lc_Tabla = GETFILE("DBF","Tabla:","Abrir")

IF EMPTY(Lc_Tabla) && El usuario no selecciono ninguna tabla RETURNENDIF

&& Ahora preguntamos en donde y con que nombre&& se quiere grabar el archivoLc_Archivo = PUTFILE("Grabar en:","MiArchivo","XLS")IF EMPTY(Lc_Archivo) && El usuario no especifico ningn nombre RETURNENDIF&& Si la tabla no est abierta se abreIF NOT(USED(Lc_Tabla)) SELECT 0 USE (Lc_Tabla)ENDIF&& Ahora exportamos la informacinSELECT (Lc_Archivo) EXPORT TO (Lc_Archivo) TYPE XLSMESSAGEBOX("Informacin Exportada",64,"Cmd_Export")

*!* *******************************************************!**!* ******************************************************

Quedando de la siguiente manera:

De nueva cuenta, ingresamos la descripcin de la clase (Class/Class Info...) y los conos que queramos utilizar, creamos una forma (_Cmd_Export), insertamos nuestro botn y ejecutamos la forma, al dar clic en el botn aparecer un cuadro de dilogo en el cual especificamos la tabla que queremos abrir, en este caso la tabla Customer.

Acto seguido la clase abre un cuadro de dilogo en el cual indicamos el nombre y lugar donde queremos grabar la exportacin

Al momento de hacer clic en el botn de Guardar la informacin es exportada e Microsoft Excel, y aparece la siguiente ventana:

Si abrimos la carpeta encontraremos el archivo que contiene la informacin de la tabla Customer en formato Excel.

Simplemente utilizamos la clase en nuestros proyectos para brindarle al usuario la capacidad de exportar la informacin a otro formato.

Agregar Propiedades... Hay ocasiones en las cuales es necesario agregar propiedades a nuestras clases, a nuestros objetos le podemos agregar la cantidad de propiedades y mtodos que necesitemos.

Para poner un ejemplo, en la clase Cmd_Export que se acaba de hacer, el usuario al momento de hacer clic en el botn, la clase pregunta por una tabla y acto seguido pregunta por un nombre de archivo. Que sucede si en nuestra aplicacin queremos mediante cdigo asignar el nombre de la tabla, as como el nombre y ubicacin del archivo? Como se hara eso?

Bueno, lo primero es analizar la problemtica, en si, para solucionar esto se requiere indicarle a la clase 2 datos, la tabla y el nombre del archivo a crear, la primera solucin que se podra pensar es crear 2 variables pblicas y estas mandarlas llamar en el evento click, algo as como esto..

PUBLIC gc_Tabla, gc_Archivogc_Tabla = "Customer"gc_Archivo = "c:\Clientes.xls"y modificar el evento click de la clase a algo as como esto:*!* *******************************************************!* Cmd_Export.Click()*!* ******************************************************

Lc_Tabla = gc_Tabla

IF EMPTY(Lc_Tabla) && El usuario no selecciono ninguna tabla RETURNENDIF

&& Ahora preguntamos en donde y con que nombre&& se quiere grabar el archivoLc_Archivo = gc_Archivo && El usuario no especifico ningn nombre RETURNENDIF&& Si la tabla no est abierta se abreIF NOT(USED(Lc_Tabla)) SELECT 0 USE (Lc_Tabla)ENDIF

&& Ahora exportamos la informacinSELECT (Lc_Archivo)EXPORT TO (Lc_Archivo) TYPE XLSMESSAGEBOX("Informacin Exportada",64,"Cmd_Export")

*!* *******************************************************!**!* ******************************************************

An y que esto funcione, rompe con todas las reglas de la POO, ya que se intenta evitar el uso de variables lo mas posible, la solucin utilizando POO es crearle al objeto propiedades donde se guarde el nombre de la tabla y el nombre del archivo, en este caso vamos a agregar a la clase dos propiedades, cTabla y cArchivo. Para hacer esto en el Men seleccionamos Class/New Property, al entrar a esta opcin aparecer la pantalla New Property, especificamos el nombre de las propiedades a crear (cTabla y cArchivo).

En esta pantalla indicamos el nombre, en el Combo Box de Visibilidad podemos escoger entre Public, Protected o Hidden, aqu indicamos el alcance de la propiedad, si deseamos que sea visible (Public), solo lectura (Protected) u oculto (Hidden). En el cuadro de descripcin ingresamos la referencia de la propiedad que se ha creado. Creamos la Propiedad cTabla, hacemos clic en el botn Add y acto seguido creamos la propiedad cArchivo y de nueva cuenta clic en el botn Add.

Al hacer esto, hemos agregado dos nuevas propiedades a nuestra clase (Cmd_Export) al ver las Propiedades estas dos se encuentran al final de las Propiedades como se ve en la figura. Por omisin, todas las valores de las nuevas propiedades son de tipo lgico (.F.) podemos cambiar el valor simplemente posicionandonos en la propiedad y haciendo el cambio.

Como las dos propiedades son de tipo texto, nos posicionamos en las propiedades y eliminamos el valor de .F., al hacer esto cambiar el valor de .F. a (None) como se ve en la figura de la derecha.

Y listo! ya se han creado las Propiedades y asignado los valores, el siguiente paso es utilizarlos.

En VFP para hacer referencia a un objeto se tiene que escribir el path completo del objeto, que es esto?, por ejemplo, en una forma tenemos un botn llamado Cmd_Boton1, para hacer referencia se utiliza la siguiente nomenclatura:

THISFORM.Cmd_Boton1

Se hace uso de la clusula THISFORM, pero como en la vida real no sabemos con certeza en donde van a colocar nuestro botn no podemos utilizarlo, ya que pueden poner el botn dentro de la forma, o dentro de un contenedor, dentro de un Page Frame, etc.

Sin embargo, VFP cuenta con una clusula con la cual el objeto se hace referencia a si mismo, esta es muy utilizada ya que nos da un gran poder y flexibilidad, la clusula es THIS.

Cuando VFP encuentra This.MiPropiedad o This.MiMetodo(), busca la propiedad o mtodo en el objeto que se est llamando, utilizando esto el cdigo de nuestra clase cambia a esto:

*!* *******************************************************!* Cmd_Export.Click()*!* ******************************************************

Lc_Tabla = This.cTabla

IF EMPTY(Lc_Tabla) && El usuario no selecciono ninguna tabla RETURNENDIF

&& Ahora preguntamos en donde y con que nombre&& se quiere grabar el archivoLc_Archivo = This.cArchivo && El usuario no especifico ningn nombre RETURNENDIF&& Si la tabla no est abierta se abreIF NOT(USED(Lc_Tabla)) SELECT 0 USE (Lc_Tabla)ENDIF

&& Ahora exportamos la informacinSELECT (Lc_Archivo)EXPORT TO (Lc_Archivo) TYPE XLSMESSAGEBOX("Informacin Exportada",64,"Cmd_Export")

*!* *******************************************************!**!* ******************************************************

Nuestro ltimo paso es crear una forma (_Propiedades.scx) y en esta agregar dos estiquetas y dos instanciaciones de nuestra clase,hacemos los siguientes cambios en las propiedades de los objetos:

Label1.Caption = "Customer"Label2.Caption = "Employee"

Cmd_Export1.cArchivo = "C:\Curso VFP7\Salidas Excel\Customer.xls"Cmd_Export1.cTabla = "Customer"

Cmd_Export2.cArchivo = "C:\Curso VFP7\Salidas Excel\Employee.xls"Cmd_Export2.cTabla = "Employee"

Quedando algo parecido a la siguiente figura:

Al momento de grabar la forma y hacer clic en los botones aparecer la ventana que nos indica que la informacin ya fue creada y los archivos fueron creados.

Agregar Mtodos...

As como a los objetos le podemos agregar Propiedades, tambin se puede agregra Mtodos, el proceso es muy parecido al de las Propiedades. Supongamos que a nuestra clase Cmd_Export deseamos agregarle una funcin llamada VerDatos, que al momento de llamarle muestre el contenido de la tabla que tiene en la propiedad cTabla.

En el men seleccionamos Class/New Metod, ingresamos el nombre del mtodo (VerDatos), al ver las Propiedades de nuestra clase y posicionarnos en la pestaa Methods vemos que el mtodo creado est posicionado al final, ahora simplemente damos doble clic en el mtodo para empezar a escribir el cdigo. Tendramos algo parecido a esto:

*!* *******************************************************!* Cmd_Export.VerDatos()*!* ******************************************************

IF EMPTY(This.cTabla) && El usuario no selecciono ninguna tabla RETURNENDIF

&& Si la tabla no est abierta se abreIF NOT(USED(This.cTabla)) SELECT 0 USE (This.cTabla)ENDIF

SELECT (This.cTabla)BROW && Mostramos el contenido de la tabla*!* *******************************************************!* Cmd_Export.VerDatos()*!* ******************************************************

Ahora, creamos una nueva forma (_VerDatos.scx), agregamos en el DataEnvironment la tabla Products.dbf, en la forma agregamos un botn estndar y nuestra clase (Cmd_Export). Asignamos las siguientes propiedades:

Cmd_Export1.cArchivo = "C:\Curso VFP7\Salidas Excel\Products.xls"Cmd_Export1.cTabla = "products"

En el evento Click del Botn estndar ingresamos la siguiente lnea de cdigo:&& Mandamos llamar el evento VerDatos en el botn Cmd_Export1THISFORM.Cmd_Export1.VerDatos()

Como se puede observar, estamos creando mtodos y mandarlos llamar.SQL - Introduccin... SQL (Structured Query Lenguage) es un lenguaje surgido de un proyecto de investigacin de IBM para el acceso a bases de datos relacionales. Actualmente se ha convertido en un estndar de lenguaje de bases de datos, y la mayora de los sistemas de bases de datos lo soportan, desde sistemas para computadoras personales, hasta grandes servidores.

Como su nombre indica, el SQL nos permite realizar consultas a la base de datos. Pero el nombre se queda corto ya que SQL adems realiza funciones de definicin, control y administracin de la base de datos. Las sentencias SQL se clasifican segn su finalidad dando origen a tres lenguajes o mejor dicho sublenguajes:

DDL (Data Description Language), lenguaje de definicin de datos, incluye rdenes para definir, modificar o borrar las tablas en las que se almacenan los datos y de las relaciones entre estas. (Es el que ms varia de un sistema a otro).

DCL (Data Control Language), lenguaje de control de datos, contiene elementos tiles para trabajar en un entorno multiusuario, en el que es importante la proteccin de los datos, la seguridad de las tablas y el establecimiento de restricciones en el acceso, as como elementos para coordinar la comparticin de datos por parte de usuarios concurrentes, asegurando que no interfieren unos con otros.

DML (Data Manipulation Language), lenguaje de manipulacin de datos, nos permite recuperar los datos almacenados en la base de datos y tambin incluye rdenes para permitir al usuario actualizar la base de datos aadiendo nuevos datos, suprimiendo datos antiguos o modificando datos previamente almacenados. VFP soporta comandos SQL, los comandos SQL son frases donde indicamos que es lo que queremos obtener y donde lo queremos guardar o que accin queremos hacer sobre los datos.

ComandoDescripcin

SELECTEspecifica el criterio de la consulta, VFP interpreta la consulta y obtiene los datos de las tablas especificadas

ALTER TABLEAltera la estructura de una tabla existente, se puede modificar el nombre, el tipo, la presicin, aceptacin de valores nulos e integridad referencial para cada campo en la tabla

CREATE CURSORCrea una tabla temporal, se especifica el nombre y campos de la tabla

CREATE TABLECrea una tabla, se especifica el nombre y campos de la tabla

DELETEMarca registros para borrar

INSERTInserta un nuevo registro al final de la tabla

UPDATEActualiza registros en la tabla

Nota: No hay que confundir estos comandos SQL con los comandos nativos de VFP, aunque se parezcan son mtodos distintos.

La gran diferencia entre SQL y XBase (La tecnologa VFP) es que XBase es por Procedimiento mientras SQL no, en XBase hay que indicar exactamente que hacer para ir del punto A al punto B, de otra forma XBase no tiene ni idea de lo que se est pidiendo. En cambio, a SQL simplemente se le indica que es lo que se quiere y SQL sabe como lo obtiene. Por ejemplo, en SQL simplemente le indicamos que campos queremos mientras que en XBase se debe de navegar en la tabla para obtener la informacin.

A continuacin se explicar la sintaxis y uso de cada una de estas funciones. Para entender bien la sintaxis cuando se encuentre con una expresin con un pipe "|", como ALL | DISTINCT , el pipe se toma como seleccin, se lee como "All o Distinct", si esta expresin est encerrada por los caracteres [ y ] entonces la expresin es opcional.

De esta forma, si se encuentra con la siguiente expresin: [ ALL | DISTINCT] se entiende que la expresin es opcional, pero si se incluye en la sentencia, entonces solo puede tomar como valor "ALL" o "DISTINCT".

Referencia:http://www.aulaclic.org/sql/

SELECT - SQL.Sintaxis SELECT - SQL:

SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT]] [Alias.] Select_Item

[[AS] Column_Name] [, [Alias.] Select_Item [[AS] Column_Name] ...]

FROM [FORCE][DatabaseName!]Table [[AS] Local_Alias]

[[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN

DatabaseName!] Table [[AS] Local_Alias] [ON JoinCondition ]

[[INTO Destination] | [TO FILE FileName [ADDITIVE] | TO PRINTER

[PROMPT] | TO SCREEN]] [PREFERENCE PreferenceName]

[NOCONSOLE] [PLAIN] [NOWAIT]

[WHERE JoinCondition [AND JoinCondition ...]

[AND | OR FilterCondition [AND | OR FilterCondition ...]]]

[GROUP BY GroupColumn [, GroupColumn ...]]

[HAVING FilterCondition] [UNION [ALL] SELECTCommand]

[ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]]Parmetros:

ClusulaDescripcin

SELECTEspecifica los campos, constantes y expresiones que se despliegan en la consulta

ALLDespliega todos los campos de la tabla (Por omisin)

DISTINCTNo muestra registros duplicados

ALIAS.Select_ItemNombre del campo que se quiere desplegar

AS Column_NameNombre que se le quiere dar al campo

FROMEspecifica de donde se va a hacer la consulta

[AS] Local_AliasEspecifica un nombre temporal que se le quiere dar a la tabla

INTO DestinationEspecifica en donde se quiere guardar la consulta, pude ser cualquiera de estas tres opciones: ARRAY, CURSOR, DBF

TO FILE FileNameEnvia el resultado a un archivo ASCII

WHEREIndica que se muestren solamente los registros que cumplan con una determinada condicin lgica

GROUPY BY GroupColumnAgrupa los registros basados en el valor de una o mas columnas

ORDER BY Order_ItemOrdena la consulta por los campos especificados

La expresin SELECT-SQL es bsica para hacer consultas en las tablas, veamos un pequeo ejemplo, si se quisieran seleccionar todos los Nombres de los Compaas, el contacto y el pas de la tabla Customer de la base de datos TestData, la instruccin SQL sera la siguiente:

SELECT Customer.Company, Customer.Contact, Customer.Country FROM Customer

Al ingresar est lnea en la ventana de comandos, VFP interpreta esta consulta, selecciona los campos de la tabla especificada y muestra los resultados como se muestra en la siguiente figura:

Nota: Para ver la estructura de TestData.dbc, as como el diagrama Entidad-Relacin, de clic aqu

Como se puede observar, la clusula SELECT - SQL selecciona campos y registros que cumplan con una determinada condicin, si la tabla en la cual se est haciendo la consulta no est abierta, VFP intenta abrirla en forma automtica.

La sentencia SQL se puede reducir ingresando un Alias a la tabla y poniendo este alias en los campos a seleccionar, por ejemplo, en el ejemplo anterior la tabla de donde se hacen las consultas es "Customer", si utilizamos un alias llamado "Cust", entonces, la sentencia quedara en cualquiera de las dos siguientes formas:

1. SELECT Cust.Company, Cust.Contact, Cust.Country FROM Customer AS Cust2. SELECT Cust.Company, Cust.Contact, Cust.Country FROM Customer Cust

Y se obtiene el mismo resultado, la ventaja de usar alias es que ahorramos tiempo al escribir y el cdigo y es mas legible.

Ahora bien, se puede hacer mucho mas que simplemente seleccionar campos de una tabla, se pueden realizar filtros, ordenar la informacin, realizar sumatorias, clculos, etc, veamos los siguientes ejemplos:

Realizar la misma consulta anterior, pero ahora solamente de los clientes que sean de Mxico. Para hacer esto, a la clusula SELECT se le agrega el comando WHERE CondicinLgica, quedando de la siguiente manera:

SELECT Cust.Company, Cust.Contact, Cust.Country FROM Customer AS Cust WHERE Country = "Mexico"

Y se obtienen los clientes que sean de Mxico. Si en la consulta se desea que est ordenada por nombre de compaa en forma descente, se agregara a la consulta la clusula ORDER BY Campo [ASC|DESC], quedando de la siguiente manera la consulta:SELECT Cust.Company, Cust.Contact, Cust.Country FROM Customer AS Cust WHERE Country = "Mexico" ORDER BY Company DESC

Si se quiere realizar la misma consulta, pero sobre clientes de otro pas se puede cambiar la sentencia, por ejemplo, para ver los clientes de Argentina, tendramos la siguiente sentencia:

SELECT Cust.Company, Cust.Contact, Cust.Country FROM Customer AS Cust WHERE Country = "Argentina" ORDER BY Company DESC

Claro, el problema aqu es que tendramos que hacer una sentencia para todos los pases que hay en la lista, para evitar esto, se puede hacer la consulta parametrzada, enviandole en la condicin una variable precedida por el signo de interrogacin (?), por ejemplo, si se tiene el siguiente cdigo:

gc_Country = "Mexico"SELECT Cust.Company, Cust.Contact, Cust.Country FROM Customer AS Cust WHERE Country = ?gc_Country ORDER BY Company DESC

Se obtiene la lista de clientes de Mxico, si se quieren los de Brazil, simplemente se cambia el valor de la variable gc_Country por "Brazil" y se ejecuta la consulta.

Si a la sentencia SQL le agregamos la clusula INTO CURSOR NombreDelCursor, el resultado de la consulta se guarda en una cursor temporal, un cursor (Current Set Of Records) tiene las mismas caractersticas de una tabla, pero su existencia no es permanente, existe solamente en memoria, al salir de VFP. el cursor es liberado.

Si tenemos la siguiente clusula:

SELECT Cust.Company FROM Customer INTO CURSOR MisClientes

VFP realiza la consulta pero a diferencia de los ejemplos anteriores no muestra el resultado en la pantalla, sino que lo guarda en un cursor llamado MisClientes, si activamos la sesin de datos, veremos que se creo el cursor "MisClientes".

Ahora bien, SQL permite realizar consultas sobre una o mas tablas, como se vio en el diagrama Entidad-Relacin, se tiene que un cliente tiene una o muchas ordenes de compra y si se quiere obtener un listado de los clientes con sus respectivas ordenes de compra, tendriamos una consulta SQL de la siguiente forma:

SELECT Customer.Company, Orders.Order_Id FROM Customer, Orders WHERE Customer.Cust_Id = Orders.Cust_Id

De esta manera se obtiene una lista de los Clientes con sus ordenes de compra, algunas otras consultas que se pueden hacer son:

Lista de Clientes, ordenes de compra y vendedor:

SELECT ; Customer.Company,; Orders.Order_Id,; Employee.First_Name,; Employee.last_name ; FROM Customer, Orders, Employee ;WHERE ; Customer.Cust_Id = Orders.Cust_Id AND ; Employee.Emp_Id = Orders.Emp_Id

Lista de Clientes, ordenes de compra que vendi "Laura"

SELECT ; Customer.Company,; Orders.Order_Id,; Employee.First_Name,; Employee.Last_Name ; FROM Customer, Orders, Employee ;WHERE ; Customer.Cust_Id = Orders.Cust_Id AND ; Employee.Emp_Id = Orders.Emp_Id AND ; Employee.First_Name = "Laura"etc, etc.

Alter Table - SQLSintaxis ALTER TABLE - SQLALTER TABLE TableName1 ADD | ALTER [COLUMN] FieldName1 FieldType

[(nFieldWidth [, nPrecision])] [NULL | NOT NULL]

[CHECK lExpression1 [ERROR cMessageText1]] [DEFAULT eExpression1]

[PRIMARY KEY | UNIQUE] [REFERENCES TableName2 [TAG TagName1]]

[NOCPTRANS] [NOVALIDATE]

oALTER TABLE TableName1 ALTER [COLUMN] FieldName2 [NULL | NOT NULL]

[SET DEFAULT eExpression2] [SET CHECK lExpression2 [ERROR cMessageText2]]

[DROP DEFAULT] [DROP CHECK] [NOVALIDATE]oALTER TABLE TableName1 [DROP [COLUMN] FieldName3]

[SET CHECK lExpression3[ERRORcMessageText3]] [DROP CHECK]

[ADD PRIMARY KEY eExpression3 [FOR lExpression4] TAG TagName2]

[DROP PRIMARY KEY]

[ADD UNIQUE eExpression4 [[FOR lExpression5] TAG TagName3]]

[DROP UNIQUE TAG TagName4] [ADD FOREIGN KEY [eExpression5]

[FOR lExpression6] TAG TagName4 REFERENCES TableName2

[TAG TagName5]]

[DROP FOREIGN KEY TAG TagName6 [SAVE]]

[RENAME COLUMN FieldName4 TO FieldName5] [NOVALIDATE]Como se explic, la sentencia ALTER TABLE nos permite modificar la estructura de una tabla mediante cdigo.

Parmetros:

ClusulaDescripcin

TableName1Nombre de la tabla que se va a alterar

ADD [COLUMN] FieldName1Especifica el nombre del campo que se va a agregar

ALTER [COLUMN] FieldName1Especifica el nombre del campo que se va a modificar

FieldTypeLetra que indica el Tipo de Campo que se va a agregar, para ver la lista de campos de clic aqu

nFieldWidthTamao del campo

DROP [COLUMN] FieldName3Nombre del campo que se va a eliminar de la tabla

RENAME COLUMN FieldName4 TO FieldName5Cambia el nombre de un campo

Algunos ejemplos:

&& Agregar un campo nuevoALTER TABLE Customer ADD COLUMN cWebSite C(100)

&& Eliminar un campoALTER TABLE Customer DROP COLUMN City

&& Cambiar nombre a un campoALTER TABLE Customer RENAME COLUMN Address TO cDireccion

Create Cursor - SQL

Sintaxis CREATE CURSOR - SQL

CREATE CURSOR alias_name (fname1 type [(precision [, scale])] [NULL | NOT NULL] [CHECK lExpression [ERROR cMessageText]] [DEFAULT eExpression] [UNIQUE] [NOCPTRANS] [, fname2 ...]) | FROM ARRAY ArrayName

Esta instruccin crea una tabla temporal, que existe hasta que es cerrada, esta tabla puede ser manipulada como cualquier otra tabla de VFP.

Parmetros:

ClusulaDescripcin

Alias_NameNombre del cursor que se va a crear

FnameNombre del campo

FieldTypeLetra que indica el Tipo de Campo que se va a agregar, para ver la lista de campos de clic aqu

Para crear un cursor sobre informacin de clientes tendramos la siguiente clusula:CREATE CURSOR CursorClientes (nId_Cliente N(10), cNombre C(30), cDireccion C(100), cTel C(50), cPais C(50))

Create Table - SQLSintaxis CREATE TABLE - SQLCREATE TABLE | DBF TableName1 [NAME LongTableName] [FREE]

(FieldName1 FieldType [(nFieldWidth [, nPrecision])]

[NULL | NOT NULL] [CHECK lExpression1 [ERROR cMessageText1]]

[DEFAULT eExpression1] [PRIMARY KEY | UNIQUE]

[REFERENCES TableName2 [TAG TagName1]] [NOCPTRANS]

[, FieldName2 ...] [, PRIMARY KEY eExpression2 TAG TagName2

|, UNIQUE eExpression3 TAG TagName3]

[, FOREIGN KEY eExpression4 TAG TagName4 [NODUP] REFERENCES TableName3 [TAG TagName5]]

[, CHECK lExpression2 [ERROR cMessageText2]])| FROM ARRAY ArrayNameCrea una tabla en disco.Parmetros:ClusulaDescripcin

TableName1Nombre de la tabla que se va a crear

FieldNameNombre del campo

FieldTypeLetra que indica el Tipo de Campo que se va a agregar, para ver la lista de campos de clic aqu

Siguiendo la misma lgica, para crear una tabla utilizando SQL tendramos la siguiente clusula

&& Creando una tabla en el directorio por omisinCREATE TABLE MiTabla (Campo1 C(10), Campo2 N(20), Campo3 C(20))

&& Creando una tabla en un directorio especificadoCREATE TABLE "c:\MisDatos\MiTabla" (Campo1 C(10), Campo2 N(20), Campo3 C(20))

Delete - SQLSintaxis DELETE - SQL

DELETE FROM [DatabaseName!]TableName

[WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]

Como su nombre lo indica, marca registros para borrar.

Parmetros:

ClusulaDescripcin

[DatabaseName!]TableNameNombre de la Tabla en la cual se van a eliminar los registros

WHERE FilterCondition1 [AND | OR FilterCondition2 ...]

Condicin lgica que se debe cumplir para marcar el registro como borrado

Nota: Los registros marcados para borrar no son eliminados fsicamente hasta que se realize un PACK

&& Eliminar todos los clientes que sean de MxicoDELETE FROM Customer WHERE Country="Mexico"

Insert - SQLSintaxis INSERT - SQL

Inserta un registro al final de la tabla con valores establecidos

INSERT INTO dbf_name [(fname1 [, fname2, ...])]

VALUES (eExpression1 [, eExpression2, ...])

oINSERT INTO dbf_name FROM ARRAY ArrayName | FROM MEMVAR

Parmetros:

ClusulaDescripcin

dbf_nameEspecifica el nombre de la tabla en la cual se va a insertar el registro

(fname1 [, fname2, ...])Especifica los nombres de los campos en donde los nuevos valores son insertados

VALUES (eExpression1 [, eExpression2, ...])Especifica los valores que se van a insertar en los campos

FROM ARRAY ArrayNameEspecifica el nombre del arreglo de donde se insertan los registros

&& Insertar cliente clave "MiCte", Compaa = "Mi Compaa"INSERT INTO Customer (Cust_Id,Company) VALUES ("MICTE","Mi Compaa")

Update - SQLSintaxis UPDATE-SQL

UPDATE [DatabaseName1!]TableName1 SET Column_Name1 = eExpression1 [, Column_Name2 = eExpression2 ...]

WHERE FilterCondition1 [AND | OR FilterCondition2 ...]Actualiza los valores de una tabla

Parmetros:

ClusulasDescripcin

[DatabaseName1!]TableName1Nombre de la tabla en la cual se van a hacer los cambios

SET Column_Name1 = eExpression1 [, Column_Name2 = eExpression2 ...]Especifica las columnas que sern afectadas con los cambios

WHERE FilterCondition1 [AND | OR FilterCondition2 ...]Especifica la condicin lgica donde se realizan los cambios

&& Cambiar el nombre de la companaUPDATE Customer SET Company = "Mi Compaa Con Cambios" WHERE Cust_Id = "MICTE"

Vistas Locales. Como se mencion, VFP permite la utilizacin de comandos SQL con los cuales tenemos la capacidad de hacer consultas en la base de datos, permitindonos guardar los resultados en una tabla temporal, conocida en VFP como CURSOR (Curren Set Of Records), por ejemplo para obtener el nombre de la compaa, Direccin y Pas de la tabla Customer utilizaramos la siguiente instruccin:

SELECT Customer.Company, Customer.Address, Customer.Country FROM Customer INTO CURSOR MiCursor

Esto nos creara una tabla en memoria llamada "MiCursor" la cual la podemos manipular como cualquier otra tabla de VFP. La desventaja de utilizar Cursores es que como se indico, son temporales y si se quisiera obtener el mismo resultado, se tendra que ejecutar de nueva cuenta la instruccin SQL.

VFP cuenta con Vistas Locales, las cuales tienen la misma estructura de las consultas SQL pero con la gran diferencia que estas son guardadas en la Base de Datos, estas pueden usarse en cualquier parte sin necesidad de crear la consulta SQL de nuevo.

Las vistas que creemos las podemos accesar en la pestaa Data, al expandir Local View como se ve en la siguiente figura.

Para la creacin de vistas se pueden utilizar cualquiera de estas formas, mediante cdigo o mediante el asistente para crear vistas, a continuacin mostraremos cada uno de ellos.Creacin de Vistas Locales mediante el Asistente. Una forma fcil para empezar a crear vistas locales es mediante el Asistente que VFP tiene, en realidad cuenta con dos asistentes (View Wizard y New View) aqu se mostrarn los dos.

View Wizard.

Empezamos creando una vista sobre la tabla Customer que contenga los siguientes campos: Cust_Id, Company,Contact y Country, siempre y cuando sean de Mxico o Brazil. Adems queremos ver la informacin ordenada por Pas y Compana.

Para empezar, nos posicionamos en la carpeta Data y en Local View, acto seguido hacemos clic en el botn New, al hacerlo aparecer una pantalla preguntndonos si queremos seleccionar el asistente (View Wizard) o una nueva vista (New View), seleccionamos View Wizard.

Al empezar el asistente VFP muestra la base de datos que se encuentre abierta, as como las tablas y vistas que la componen, el primer paso consiste en seleccionar la tabla y campos que queremos que la vista contenga, en este caso seleccionamos Customer y agregamos los campos Cust_Id, Company,Contact y Country.

Ahora indicamos los filtros que queremos que nuestra vista contenga, en este ejemplo, ingresamos los filtros para que solamente muestre los clientes que sean de Mxico o Brazil.

El asistente nos pregunta ahora por la forma como deseamos que la vista sea ordenada, seleccionamos Country y Company.

Este paso nos pregunta por el porcentaje de registros que queremos mostrar, en este caso simplemente hacemos clic en siguiente.

Este es el ltimo paso, aqu indicamos a VFP que deseamos guardar nuestra vista, hacemos clic en Finish y nos aparecer una pantalla preguntndonos por el nombre de la vista, en este caso view_customer_wizard_1.

Y listo! la vista se ha agregado en la base de datos, si deseamos ver los resultados simplemente seleccionamos la vista y hacemos clic en browse.

New View.

Este asistente es algo parecido al anterior, solamente que no es tan amigable, sin embargo, muy parecido. Al igual que el ant