Es un sistema orientado
a objeto para la generación de Base de Datos y
el desarrollo de
aplicaciones.
Desde Visual FoxPro
podemos crear Formularios, Base
de Datos , Informes,
Vistas, Proyectos entre
otros. Podemos crear los elementos de un proyecto por
separado y luego agregarlos a un proyecto
existente o crear un proyecto y desde éste ir agregando
los elemento que deba contener. Cuando creamos un proyecto
debemos crear una carpeta de trabajo en la se guarde el proyecto.
Para indicarle a Visual Foxpro en cual
directorio debe buscar los archivos del
proyecto debemos indicarle el directorio por defecto; en le
menú Herramientas
en la opción de Opciones en la ficha de Archivos,
aparecerá la ruta por defecto el directorio de Vfp
cambiamos este directorio por la carpeta en la que está
nuestro proyecto y seleccionamos Aceptar. Desde la Ventana
de Comandos se
utiliza el comando SET DEFAULT nombrederuta por ejemplo: Set
default c:publicopractica (La Ventana de Comandos
será explicada mas adelante)
CREACION DE LA BASE DE DATOS
- Ubiquese en la ficha Datos y luego en Base
de Datos y presione el botón
Nuevo
La ventana del Diseñador de Base da datos
aparecerá :
Puede utilizar la barra de herramientas
del Diseñador para el control de la
Base de
Datos.
Descripción de los botones de la Barra de
herramientas (Diseñador de Base de Datos):
Crear una
nueva tabla.
Agregar
una tabla existente
Eliminar
una tabla seleccionada
Modificar
una tabla seleccionada
Creación de Vistas remotas
Creación de Vistas locales
Editar
Procedimientos
almacenados en la Base de Datos
Creación de Conexiones con vistas
remotas
Examinar
el contenido la tabla (BROWSE)
Los nombres de las tablas deben ser de una a ocho
caracteres de largo y deben tener la extensión
predeterminada .dbf (database file: archivo de Base
de Datos)
Crear una nueva tabla:
1. Click en el botón de Nueva tabla,
aparecerá la ventana Nueva Tabla
- Se selecciona Nueva Tabla, luego
aparece la ventana de guardar el archivo,
seleccione el directorio y el nombre de la tabla y luego
presione el boton de guardar.
La ventana del Diseñador de tablas
aparecerá en pantalla:
Esta es la parte mas importante de la tabla, es
aquí donde se define la estructura de
datos que contendrá dicha tabla. El primer paso es
definir los campos, tipos, tamaño, Formato y Reglas de
validación.
- Definición de campos:
Igual que en las versiones anteriores, la
definición de campos es igual. Se introduce el nombre
del campo (name) el tipo de datos que soportará
(Type) y el tamaño. Los nombres de los campos
pueden tener hasta 254 caracteres sin espacios en
blancoFormat (Formato): Es el formato de salida del
campo, ejemplo si fuera númerico 9,999.99 o si fuera
carácter !!!!!!!!!!!!, para que solo
acepte mayusculasInput mask (Máscara de entrada): Igual
que el Format, lo único que es para la entrada de
datos.Captión (Título): Descripción mas precisa del campo, es
de utilidad al
diseñar los Formularios.- Definición del Display
- Definición de reglas de validación a
nivel de campo
La validación son triggers o eventos que se
ejecutan a nivel de campo. Ejemplo: una validación de un
campo que solo acepte números positivos. (id >
0)
Rule (Regla): Es la regla de validación,
ejemplo: id > 0, si queremos que acepte valores
positivos.
Message(Mensaje): Es el mensaje personalizado que
queremos que aparezca en pantalla a la hora de violarse la regla
de validación del campo. Ejemplo : ‘Solo se aceptan
números positivos’ (nota: el texto debe
escribirse entre comillas).
Default Value : Valor por
defecto del campo. (nota: hay que respetar el tipo de dato
del
Campo)
Luego de hacer la definición de los campos,
pasamos a la definición de Indices de la tabla, que
será muy importante a la hora de crear las relaciones
entre las tablas.
Los índices facilitan la ubicaciòn en la
tabla de un registro
especìfico asì como tambien determinan el tipo de
relaciones que existen entre las tablas
Los índices pueden ser CDX o IDX:
Los índices .IDX son índices compactos se
crean: "INDEX ON estado to
estado
compact" crea un archivo de índice llamado estado.cdx.
Desafortunadamente si alguna vez abre la tabla sin el
índice y añade un registro,
éste no se actualizará y tendrá que ser
recreado.
Los índices .CDX se crean: "INDEX ON estado tag
estado" . Estos archivos se abren automáticamente junto
con las tablas.
La estructura
interna de los IDX y los CDX es diferente.
- Nombre del Indice (name)
Introducir el Nombre del archivo índice. Es
conocido también como TAG (etiqueta).- Type ( tipo de
Indice)
Primary : Llave primaria.
Candidate : Llave candidata
Unique : Llave única.
Regular : Llave foránea.
El índice Primary o Principal: garantiza que solo
se introduzcan valores
únicos en un campo y determina el orden en el que se
procesan los registros. Cada
tabla puede tener únicamente un índice
Principal.
El índice Candidate o Candidato: puede ser un
candidato para utilizarse como índice principal, refuerza
la unicidad de los
valores.
El índice Unique o Unico: almacena un lista de
cada valor
único en la tabla índices.
El índice Regular o Normal: puede ser utilizado
para ordenar y buscar datos en consultas e informes. No
refuerza la unicidad de los datos
c. Nombre de la Expresión
Nombre de los campos que conforman la clave
primaria:
Ejemplo : id, o si son varios campos : id
+ linea
Nota: si los campos no son del mismo hay que forzarlos
al tipo de dato deseado, ejemplo: si id es carácter
y linea, entoces el nombre de la expresion
sería:
Id + STR(linea)
STR() convierte de número a carácter y
VAL() convierte de carácter a númerico.
Después de detallar los índices, se define
los eventos de La
validación a nivel de registro y los eventos que se
ejecuten a la hora de Insertar un registro, de actualizar o
borrar.
Visual Foxpro tiene
37.767 espacios de trabajo, llamadas áreas de trabajo
porque una tabla deber ser seleccionada para volverla la tabla
actual. Cuando se inicia Visual FoxPro el
área de trabajo es la 1 por omisión. Para abrir una
tabla en el área de trabajo 1 cuando ninguna otra tabla
está abierta, tecleamos en la Ventana de
Comandos:
USE nombretabla
No necesariamente debe estar en un área de
trabajo para abrir una tabla puede especificar: USE nombretabla
IN 3
Sin embargo con mas frecuencia se utiliza: USE nombre
tabla IN 0 lo que significa encuentre el área de trabajo
siguiente en la que no se encuentre abierta una tabla y abre
nombretabla ahí.
Cuando se utiliza una tabla Visual FoxPro le asigna un
alias, un nombre de hasta 10 caracteres con el cual se refiere a
ella en el programa,
generalmente el alias es el mismo nombre que el de la
tabla
Para crear una tabla desde la Ventana de Comandos:
CREATE <nombretabla>
Para modificar una tabla Administrador de
Proyectos |
Datos | Base de Datos| Tablas | Seleccionamos la tabla |
Modificar.
Desde la Ventana de Comandos: Use tabla | MODIFY
ESTRUCTURE
En Visual FoxPro existe la Ventana de comandos
ésta funge como la ventana de MSDOS que puede utilizarse
desde Windows con la
finalidad de permitir utilizar comandos del lenguaje para
ejecutar algunas funciones. Por
ejemplo desde Windows desde
el explorador podemos examinar el contenido de un disckette
acción que también podemos hacer si abrimos una
ventana de MSDOS y tecleamos DIR A:. Es decir a pesar de que se
pueden tener acceso a la mayoría de los elementos de
Visual FoxPro desde el menú muchas veces es útil
simplemente teclear un comando.
Para activar la Ventana de Comandos auque ella aparece
por defecto en el en el entorno de trabajo tecleamos Ctrl.
F2
Para agregar registros a una
tabla : Administrador de
Proyectos | Datos | Base de Datos | Tablas | Seleccionamos la
tabla | Examinar y luego en el menú Ver | Modo
Añadir
Desde la Ventana de Comandos: Teniendo la tabla activa
escribimos APPEND.
Para ver los registros de una tabla: Administrador de
Proyectos | Datos | Base de Datos | Tablas | Seleccionamos la
tabla | Examinar.
Desde la Ventana de Comandos: teniendo la tabla activa
escribimos BROWSE.
En Visual Foxpro los registros de una tabla pueden
borrarse lógicamente y físicamente.
Para borrar lógicamente un registro :
Administrador de Proyectos | Base de Datos | Tablas |
Seleccionamos la Tabla | Examinar luego con el ratón
hacemos Click en la primera columna de izquierda a derecha, la
columna en la celda seleccionada se colocará de color
negro.
Desde la Ventana de Comandos: DELETE (Teniendo
seleccionado el registro)
Para ver los registros de una tabla sin que aparezcan
los registros borrados lógicamente:
Primero desde la Ventana de Comandos debemos teclear :
SET DELETE ON y luego desde el Administrador de Proyectos | Datos
| Base de Datos | Tablas | Examinar .
También desde la Ventana de Comandos con el
comando BROWSE
Si queremos incluso los registros borrados
lógicamente tecleamos en la Ventana de Comandos SET DELETE
OFF y luego tecleamos BROWSE.
Para desmarcar los registros borrados lógicamente
(desde la Ventana de Comandos): Suponemos que anteriormente
habían sido borrados los empleados cuyo sueldo era 15000:
DELETE FOR sueldo=15000
Para desmarcar estos registros : RECALL FOR
sueldo=15000
Para borrar físicamente registros de una tabla
primero deben estar borrados lógicamente
Y luego desde la Ventana de Comandos tecleamos el
comando PACK, para utilizar este comando la tabla debe ser
abierta en modo exclusivo USE nombretabla EXCLUSIVE .
Algunos comandos para manipular
tablas:
List for cedula="12434213" Muestra en el
entorno de trabajo la informacion del registro que cumpla con
esta condición.
List fields cedula,nombre. Muestra en el
entorno de trabajo todas las cédulas y nombres de la tabla
seleccionada.
Sum cantidad (suponemos que la tabla activa tiene un
campo de tipo numérico llamado cantidad). Muestra en el
entorno de trabajo la suma del campo cantidad de la tabla
activa.
Sum cantidad for cantidad>1000 Obtiene la suma de los
campos cantidad de los registros que cumplen con la
condición indicada
Count to Registros for nota>15 (quermos contar los
registros de una tabla cuyo campo nota sea mayor a 15 puntos,
guardar este total en una variable llamada Registros ) Si luego
queremos examinar el contenido de la variable Registros tecleamos
?Registros (signo de interrogación que cierra y luego el
nombre de la variable que queremos examinar)
Comandos SEEK y LOCATE
Los comandos Locate y Seek permiten buscar un registro
en particular. Locate funciona en cualquier campo dentro de una
tabla ya sea que esté indexada o no Seek da por hecho que
la clave que está buscando encaja con el índice
actual.
Locate for nombre="Luis" La tabla activa posiciona su
cursor el registro que cumpla con esta
condiciòn.
Seek("Luis") ERROR
Set order to nombre (CORRECTO) Primero se debe activar
el ìndice
Seek("Luis") y luego hacer la bùsqueda
La funciòn Set filter:
Esta funciòn provoca que Visual FoxPro se
comporte como si no existieran los registros que no coinciden con
la expresiòn de filtro, y en las operaciones que
se realicen solo se tomaràn en cuenta las registros que
cumplen con la condiciòn del filtro actual.
Set filter to nota=15
Para desactivar un filtro colocamos set filter to y
para
Como moverse en una tabla de VFP
Skip mueve el puntero hacia delante un
registro
Skip – 1 mueve el puntero hacia tras un
registro
Go top mueve el puntero hacia el primer registro de la
tabla
Go bottom mueve el puntero hacia el ùltimo
registro de la tabla.
Go 3 mueve el puntero hacia el registro #3 de la
tabla
Operaciones Ciclìcas:
Existen una cantidad de mecanismos de ciclos que puede
utilizar para moverse a travès de una tabla. El principal
es SCAN
Por ejemplo:
Select Cliente (No hay
necesidad de hacer go top)
Scan
Sueldo=sueldo + 5000
Endscan
Las lìneas de còdigo entre Scan y Endscan
se ejecutaràn 1 vez por cada registro de la
tabla.
Lo mismo se puede hacer con :
Select Cliente
Go top
Do While not eof()
Sueldo=sueldo+5000
Skip
Enddo
La instrucciòn FOR:
For i=1 to 10
Cont=cont+1;
endfor
Para eliminar una tabla:
Para eliminar una tabla con los indices
principales, valores predeterminados y reglas de
validaciòn asociadas a la tabla use el comando DROP
nombretabla por ejemplo:
Open Database inscripciones
Drop table alumnos
Uso de Funciones:
Str() convierte a String
Val convierte a nùmero
Date() devuelve la fecha del sistema
Hoy=Date()
GetDir() Obtiene el directorio por
defecto
Cd
GetDir
Imprime el dìa de la semana
?Dow(Date())
Len() Devuelve el nùmero de caracteres de
una expresiòn de caracteres
Recno() Obtiene la posiciòn de un
registro
Para cerrar abierta en el àrea de trabajo actual
utilizamos el comando USE
Uso de Procedimientos y
Funciones:
Procedure Nombreprocedure
*Aquí va el còdigo
ejecutable
endproc
Function Nombrefuncion
*aquí va el còdigo
ejecutable
endfunc
El valor devuelto de forma predeterminada es verdadero
(.t.) pero puede utilizarse el comando Return
Function semanas(dDate)
Return dDate + 14
Endfunc
Si se incluyen los procedimientos y funciones en
un archivo de programa
disttinto, podrà hacer accesibles estos procedimientos y
funciones desde su programa si utiliza el Set procedure to. Por
ejemplo: Si tiene un archivo llamado: FunProc.prg se utiliza el
siguiente comando:
Set Procedure to FunProc.prg
Llamado a un procedimiento o a
una fuciòn:
-Utilizar el Do:
Do Miproc
-Incluir delante del nombre de la funciòn un
signo (=) e incluir parentesis despues del nombre de la
funciòn. Por ejemplo
=Mifuncion()
Envìo de valores a un Procedimiento o a
una Funcion:
Procedure Nombreprocedimiento(eString)
*La linea siguiente muestra un mensaje
messagebox("Mi proc" + eString)
endproc
El paso de paràmetros a una funciòn es
exactamente igual.
Para invocar a un procedimiento:
Do nombreprocedimiento with parametro
ò
=NombreFunciòn(paràmetro)
Con mùltiples
paràmetros:
Procedure nombreproc (dDate, eString,Ntimes)
*Codigo
ejecutable
endproc
En la llamada: do nombreproc with Date(), "Hola",
10
Comprobaciòn de Paràmetros en un
Procedimiento o una funciòn
Function Semanas (dDate)
If type("dDate")="D"
Return dDate + 14
Else
Messagebox("Requiere un paràmetro de
fecha")
Return{} &&Devuelve una fecha
vacìa
endif
endfunc
Procedure valores (cStore, dDate2, nDatos)
If parameters()<3
Messagebox("No se han pasado suficientes
paràmetros")
Return .f.
Else
If parameters()=3
*Operar con los paràmetros
endif
endif
endproc
Si se especifican dos paràmetros pero
llamò al procedimiento con tres paràmetros,
obtendrà un mensaje de erros. Pero si un procedimiento
espera mas paràmetros de los que recibe, los
paràmetros adicionales se inicializaràn como falso
(.F.)
Ejercicio Práctico:
Cree la siguiente base de datos con el nombre de
scott.
RELACIONES ENTRE TABLAS:
Las relaciones mas comunes entre tablas se definen
:
De uno a uno : Ejemplo de una llave primaria a
otra llave primaria
De uno a muchos : Ejemplo de una llave primaria a
una Regular o Foránea.
Las relaciones entre tablas se crean arrastrando la
llave de la tabla a la llave de otra tabla.
La figura muestra una relación entre las
tablas región y departamento, la relación se
leería así : "Una región tiene muchos
departamentos".
Generación de integridad referencial
Reglas que rigen la coherencia de datos,
específicamente las relaciones entre las claves principal
y externa de claves de tablas distintas. Visual Foxpro Resuelve
la Integridad Referencial mediante reglas a nivel de campo y a
nivel de registro definidas por el usuario. El Generador de la
Integridad Referencial le ayuda a definir reglas para
controlar cómo se insertan actualizan o eliminan registros
de tablas relacionadas.
Desencadenante: código
de evento a nivel de registro que se ejecuta despues de una
inserción, una actualización o una
eliminación. Se ocupan para integridad entre las
tablas.
El establecimiento de la integridad referencial
implica la creación de un conjunto de reglas para
preservar las relaciones definidas entre las tablas al
introducir o eliminar registros.
Si exige la integridad referencial, Visual FoxPro
impedirá las acciones
siguientes:
- · Agregar registros a una tabla relacionada
cuando no haya ningún registro asociado en la tabla
primaria. - · Cambiar valores de una tabla primaria cuando
tales cambios supongan dejar registros huérfanos en una
tabla relacionada. - · Eliminar registros de una tabla primaria
cuando tengan registros relacionados coincidentes.
Si lo desea, puede escribir sus propios
desencadenantes y procedimientos almacenados para exigir
la integridad referencial. Sin embargo, el Generador de
integridad referencial (IR) de Visual FoxPro permite determinar
los tipos de reglas que desea exigir, las tablas a las que desea
exigirlas y los eventos del sistema que
harán que Visual FoxPro las compruebe.
El Generador de IR trata múltiples niveles de
eliminaciones y actualizaciones en cascada, y es recomendable
como herramienta para asegurar la integridad
referencial.
Para abrir el Generador de IR
1 Abra el Diseñador de bases de
datos.
2 En el menú Base de datos, elija
Editar integridad referencial.
Al utilizar el Generador de IR para crear reglas que se
van a aplicar a la base de datos, Visual FoxPro guarda el
código generado para exigir las reglas de integridad
referencial como desencadenantes que hacen referencia a
procedimientos almacenados. Para ver este código
puede abrir el editor de texto de
procedimientos almacenados en la base de datos. Si desea información sobre la forma de crear
desencadenantes por programa, consulte Uso de desencadenantes en
el capítulo 7, Trabajo con tablas.
Precaución Cuando haga cambios en el
diseño
de una base de datos, como modificaciones en sus
tablas o alteraciones en los índices
utilizados en una relación persistente, debe
volver a ejecutar el Generador de IR antes de utilizar de nuevo
la base de datos. De esta forma se revisarán el
código de procedimiento almacenado y los
desencadenantes utilizados para exigir la integridad
referencial, de forma que reflejen el nuevo diseño.
Si no vuelve a ejecutar el Generador de RI, puede que obtenga
resultados inesperados, ya que no se habrán actualizado
los procedimientos almacenados y los desencadenantes para
ajustarlos a las modificaciones.
El Generador IR se muestra cuando:
Hace doble clic en una línea de
relación entre dos tablas del Diseñador
de bases de datos y elige el botón Integridad
Referencial en el cuadro de diálogo Editar
relación.
Elige Integridad referencial en el
menú contextual del Diseñador de bases de
datos.
Elige Editar integridad referencial en
el menú Base de datos.
Fichas del generador
Reglas para la actualización Especifica
reglas para aplicar cuando se modifica el valor clave de
la tabla primaria.
Reglas para la eliminación Especifica las
reglas que se aplican cuando se elimina un registro de la tabla
primaria.
Reglas para insertar Especifica las reglas que se
aplican cuando se inserta un nuevo registro o cuando se actualiza
un registro existente en la tabla secundaria.
VISTAS LOCALES:
¿Qué es una vista?
Una vista es un objeto que se crea empleando la
instrucción SELECT de SQL para
bases de datos
relacionales. Las vistas pueden ser locales o Remotas
SELECT campos
FROM tablas
WHERE condicion
GROUP BY campos de agrupamiento
ORDER BY campos de ordenamiento
Ejemplo:
SELECT cedula, nombre
FROM Alumnos
ORDER BY nombre
Creación de una vista local.
Clic en el botón para crear vistas
locales.
La ventana para agregar las tablas, se utiliza para
añadir tablas que se van a ocupar en la instrucción
SELECT – SQL, en este
caso estaríamos seleccionando la parte del FROM.
Seleccionemos s_region y luego Agregar. La tabla se
agregará, luego le damos cerrar (close).
Ventana de creación de la
vista:
Fields: (Campos) Aquí se seleccionan
los campos de la vista (SELECT campos)
Join : Relaciones entre tablas
Filter : Condición de filtrado (WHERE
condición)
Order by : campos de ordenamiento (ORDER
BY)
Group by : campos de Agrupamiento (GROUP
BY)
CREACION DE VISTAS REMOTAS:
Una vista remota es una vista que se hace de otra base
de datos vía ODBC. Esta base de datos puede ser Access, ORACLE,
SQL-SERVER, entre otros.
Crear una vista remota:
Clic en
icono para crear vista remotas.
Escoger Nueva Vista (New View)
Si no a creado una conexión es necesario
crear en New, si ya esta creada seleccione la
conexión y luego OK.
¿Como crear una conexión?
Si no ha creado la conexión seleccione
New
Siga estos pasos cuidadosamente:
1. Seleccione New Data Source (Nueva Fuente de
Datos) y aparecerá la configuración del
ODBC:
2. En el folder User
DSN Presione el botón Add
(Agregar)
- Escoja de la ventana el Controlador deseado, Ejemplo:
Microsoft Access Driver
(*.mdb) y luego el botón
Finalizar. - Luego aparece la Ventana de ODBC del controlador que
selecciono (En este caso en de Access)
Escriba el nombre del Data Source (Fuente de datos),
Luego seleccione la Base de Dato a la que hace referencia ( en el
boton Select Database)
Luego de haber seleccionado la base de datos, acepte
todas las ventanas que aparecieron anteriormente y detengase en
la siguiente ventana:
Luego seleccione de la lista de data source el data
source que usted acaba de crear.
Luego presione Aceptar (OK).
Después le aparece la primera Ventana donde
escoge las conexiones, le aparecerá la conexión que
usted ha creado.
Nota: Esta conexión que usted a creado
servirá para sesiones futuras.
Seleccione la conexión creada y luego
Aceptar (OK)
Luego le aparecerá la ventana donde usted escoge
las tablas que utilizará:
Luego aparecerá la ventana donde se diseña
la vista:
El procedimiento para crear la vista es igual a la
creación de vista Locales.
Consultas a la BD usando SELECT-SQL
SELECT – SQL usando dos o mas tablas:
Sintaxis :
SELECT alias1.campo1
,alias2.campo2
,alias3.campo3
FROM tabla1 alias1
,tabla2 alias2
,tabla3 alias3
WHERE alias1.campo1 =
alias2.campo2
alias1.campo2 = alias2.campo3
Ejemplo :
Un ejemplo sencillo: si queremos listar el nombre
del empleado, el id del
departamento, y el nombre del
departamento al que pertenece el empleado la query
(consulta) sería:
SELECT A.nombre AS empleado
,A.dept_id
,B.nombre AS depto
FROM s_emp A
,s_dept B
WHERE A.id = B.region_id
Ejercicios :
Seleccionar el No. depto, apellido, salario y cargo
para los empleados que ganen mas de 100 y el departamento este en
41, 10 y 50
select dept_id
,nombre
,salario
,cargo
from s_emp
where salario >
100
and dept_id IN (41,10,50)
seleccionar el apellido, del empleado, id del depto, y
el nombre del depto.
select a.nombre AS empleado
,b.id
,b.nombre AS depto
from s_emp a
,s_dept b
where a.id = b.dept_id
Seleccionar el apellido del empleado, no del depto, el
nombre deldepto para los depto que esten entre 20 y 50 sin
incluirlos.
select a.nombre AS empleado,
b.id,
b.nombre AS depto
from s_emp a, s_dept b
where a.id = b.dept_id
and b.id > 20 and b.id < 50
seleccionar el nombre del empleado no. del depto, nombre
del depto, para los deptos que comiencen con 4 y ordenados el
numero de depto y nombre del empleado desc
select a.nombre AS empleado,
b.id,
b.nombre AS depto
from s_emp a,
s_dept b
where a.id=b.dept_id
and ALLTRIM(STR(b.id)) like '4%'
order by a.nombre asc,
b.id
Seleccionar el nombre del cliente para
aquellos empleados que el no del depto sean 30, 40, 41, 42 y el (
salario sea mayor que 1000 o el depto sea 50 )
select a.nombre AS cliente,
b.nombre AS empleado,
b.salario,
b.id,
b.dept_id
from s_customer a,
s_emp b
where a.emp_id=b.id
and b.dept_id IN (30,40,41,42)
and (b.salario > 1000 or b.dept_id='50')
Otra soluccion:
select a.nombre
from s_customer a
where a.emp_id IN (Select id
from s_emp
where dept_id in (30, 40,41,42)
and (salario > 1000 or dept_id=50 )
Seleccionar el nombre del cliente, nombre de region y el
salario para todos los empleados que el salario sean mayor que
100
select a.nombre AS empleado,
b.nombre AS depto,
a.salario
from s_emp a,
s_dept b
where a.dept_id=b.id
and a.salario > 100
Funciones de grupos
salarios minimos y maximos de los empleados
select max(salario) sal_max,
min(salario) sal_min
from s_emp
Suma, maximo, minimo salario por Departamento
select dept_id,
sum(salario),
max(salario),
min(salario)
from s_emp
group by dept_id
*—
select dept_id,
count(dept_id)
from s_emp
group by dept_id
having dept_id > 20
*—
select dept_id,
sum(salario)
from s_emp
group by dept_id
having sum(salario) between 2000 and 4000
*—
select avg(salario),
min(salario),
max(salario),
sum(salario)
from s_emp
where UPPER(title) like 'SALES%'
*—
select count(nombre),
dept_id
from s_emp
where dept_id=31
group by dept_id
SELECT COUNT(ID),
DEPT_ID
FROM S_EMP
GROUP BY DEPT_ID
SELECT COUNT(ID),
CREDIT_RATING
FROM S_CUSTOMER
GROUP BY CREDIT_RATING
*—-
SELECT SUM(SALARIO), CARGO
FROM S_EMP
WHERE upper(TITLE) NOT LIKE 'VP%'
GROUP BY CARGO
*—-
SELECT SUM(SALARIO), TITLE
FROM S_EMP
GROUP BY TITLE
*—-
SELECT TITLE, SUM(SALARIO)
FROM S_EMP
WHERE UPPER(TITLE) NOT LIKE 'VP%'
GROUP BY TITLE
HAVING SUM(SALARIO)> 5000
*—-
Formularios Sencillos
Un Formulario Sencillo, es el que es realizado
generalmente utilizando una sola tabla.
Un ejemplo típico de formularios sencillos son
las pantallas de los catálogos de un Sistema, que
solamente tienen la función de
registrar, modificar, eliminar y consultar datos de una
tabla.
Por ejemplo vamos a construir una forma sencilla
utilizando el Wizard de Visual Foxpro:
- Abra su proyecto
- Ubíquese en la pestaña de
documentos (document) y luego en Formas
(Forms). - Presione el Botón Nuevo (New).
Aparece la siguiente ventana:
- Seleccione Wizard.
- Seleccione Form Wizard y
OK. - Luego aparece la ventana donde usted escoge la tabla
a utilizar y los campos de esa tabla. - Una vez seleccionado la tabla y sus respectivos
campos, presiones próximo (Next). - Se visualizará la siguiente
ventana:
10. Seleccione el estilo de la forma y el tipo de
botones a utilizar en la forma y luego presione
próximo (Next).
11. Aparecerá la siguiente ventana:
Para visualizar todas las imágenes
faltantes haga click en el menu superior "Bajar
Trabajo".
12. Seleccione el ordenamiento de la tabla, aquí
por lo general se selecciona el índice de la tabla ( los
índices aparecen con asterisco *)
13. Introduzca el titulo de la forma y luego
Finalizar (Finish)
Visual Foxpro Generará la forma, luego usted
puede modificar la forma si lo desea.
La forma, que creamos con el wizard, quedaría de
esta forma:
Nota: Reconstruya el proyecto en la
opción Build (botón del proyecto). Luego
Seleccione Rebuild Proyect y OK. Visual
Foxpro, compila su proyecto.
Notará que en la pestaña de clases de su
proyecto Visual Foxpro le ha agregado una clase que él
ocupa para construir formas con el Wizard, el nombre de la
clase es WizStyle.
Formularios Maestro – Detalle
Un formulario maestro detalles es aquel en que entran en
juego dos o
más tablas, las cuales tengan una relación de uno a
muchos. Ejemplo la relación de s_region con s_dept ( una
región puede tener muchos departamentos).
Se pueden construir formas mestro-detalle utilizando el
Wizard, sin embargo, nosotros utilizaremos la forma manual para
personalizar a nuestro gusto la forma.
Pasos para construir una forma maestro –
detalle
Para este ejemplo utilizaremos las tablas
s_region y s_dept
- Abra su proyecto
- Ubíquese en la pestaña de
documentos (document) y luego en Formas
(Forms). - Presione el Botón Nuevo
(New). - Seleccione Nueva Forma en blanco.
- En la forma en blanco presione el botón
derecho del ratón y luego Entorno de Datos (Data
Environment)
6. Seleccione las tablas s_region, que
será el maestro y luego la tabla s_dept que
será nuestro detalle.
7. Arrastre uno por uno los campos de la tabla s_region
a su forma, de tal manera que queden asi:
8. Luego arrastre toda la tabla s_dept al
formulario
- Ahora vamos a modificar las propiedades del Grid que
hemos insertado: seleccionan el grid, botón derecho del
ratón y luego propiedades. Se sitúan en la
pestaña datos, para modificar las siguientes propiedades
con el fin de establecer la relación entre las dos
tablas:
En la clase se explicaron los procedimientos para
Incluir Modificar y Eliminar alumnos a una base de datos de
inscripciones. En este este codigo se
estan actualizando clientes el
código es análogo
Boton Incluir:
if thisform.incluir.caption="Incluir"
scatter memvar blank
thisform.incluir.caption="Guardar"
thisform.salir.caption="Cancelar"
thisform.text1.enabled=.t. (Recuerden que los texbox
poseen nombres que se
corresponden con la realidad
txtcedula,txtnombre…,
aunque en este ejemplo no se planteen así
debe
programarse)
thisform.text2.enabled=.t.
thisform.text3.enabled=.t.
thisform.text4.enabled=.t.
else
if thisform.text1.value<>''
if thisform.text2.value<>''
if thisform.text3.value<>''
if thisform.text4.value<>''
append blank
gather memvar
endif (Pueden mostrarse mensajes de validación de
llenar todos
los campos antes de incluir un registro)
endif
endif
endif
thisform.incluir.caption="incluir"
thisform.salir.caption="Salir"
thisform.text2.enabled=.f.
thisform.text3.enabled=.f.
thisform.text4.enabled=.f.
endif
thisform.refresh
Boton Modificar:
if thisform.modificar.caption="Modificar"
thisform.text1.enabled=.f.
thisform.text2.enabled=.t.
thisform.text3.enabled=.t.
thisform.text4.enabled=.t.
thisform.modificar.caption="Guardar"
thisform.salir.caption="Cnacelar"
else
gather memvar
thisform.text1.enabled=.t.
thisform.text2.enabled=.f.
thisform.text3.enabled=.f.
thisform.text4.enabled=.f.
thisform.modificar.caption="Modificar"
thisform.salir.caption="Salir"
endif
Boton Eliminar
(Recuerden que en la ayuda de Visual FoxPro está
la información de la aplicación de la
función y/o procedimiento Messagebox)
if messagebox("Esta seguro que desea
eliminar este cliente",36,"Confirmacion")=6
(Implementada como función)
delete
pack
messagebox("El registro fue
eliminado",0,"Aviso")
(implementada como procedimiento)
scatter memvar blank
endif
thisform.refresh
Boton Salir:
if thisform.incluir.caption="Guardar"
thisform.text2.enabled=.f.
thisform.text3.enabled=.f.
thisform.text4.enabled=.f.
thisform.incluir.caption="Incluir"
thisform.Salir.caption="Salir"
else
if thisform.modificar.caption="Guardar"
thisform.text1.enabled=.t.
thisform.text2.enabled=.f.
thisform.text3.enabled=.f.
thisform.text4.enabled=.f.
thisform.modificar.caption="Modificar"
thisform.Salir.caption="Salir"
else
thisform.release
endif
endif
Boton Primero:
go top
m.codigo=clientes.codigo
m.nombre=clientes.nombre
m.telefono=clientes.telefono
m.direccion=clientes.direccion
thisform.refresh
Boton Ultimo:
go bottom
m.codigo=clientes.codigo
m.nombre=clientes.nombre
m.telefono=clientes.telefono
m.direccion=clientes.direccion
thisform.refresh
Boton Siguiente
if eof()
thisform.siguiente.enabled=.f.
go bottom
m.codigo=clientes.codigo
m.nombre=clientes.nombre
m.telefono=clientes.telefono
m.direccion=clientes.dirección
frmactcliente.refresh
else
skip 1
m.codigo=clientes.codigo
m.nombre=clientes.nombre
m.telefono=clientes.telefono
m.direccion=clientes.direccion
if thisform.anterior.enabled=.f.
thisform.anterior.enabled=.t.
endif
endif
thisform.refresh
Boton Anterior
if bof()
thisform.anterior.enabled=.f.
go top
else
skip -1
if thisform.siguiente.enabled=.f.
thisform.siguiente.enabled=.t.
endif
endif
m.codigo=clientes.codigo
m.nombre=clientes.nombre
m.telefono=clientes.telefono
m.direccion=clientes.direccion
thisform.refresh
Creación de Clases de Objetos
En Visual Foxpro se pueden crear clases de objetos que
pueden de uso muy común, como por ejemplo el botón
salir es muy comun en todas las pantallas.
Pasos para creación de clases:
- Abra su proyecto
- Ubíquese en la pestaña de
classes. - Presione el Botón Nuevo
(New). - Introduzca el nombre de la clase, el tipo de clase (en
este caso Boton de comando) y guardarlo como curso. - Inmediatamente aparecerá la siguiente
pantalla: - Personalice el botón y luego cierre la ventana
y sálvelo. - La
clase que usted a creado aparecerá en la pestaña
clases de su proyecto:
Cómo hacer uso de la clase :
2. presione el botón de ver clases y
luego agregar (Add) y seleccione la clase que usted a
creado.- Cree o Abra una forma
- Aparecerá la clase que usted a creado con el
botón de salir - Para poner el botón en la forma, seleccione el
botón en la barra de controles y luego clic en la
forma.
En clase se implementó una clase basada en la
clase TextBox que cambia el color de fondo y
el color de la letra del Textbox cuando el texbox obtiene o
pierde el focus ( utilizando los procedimientos LosFocus y
GotFocus) de esta manera el usuario identifica mas facilmente el
texbox activo
Código del Procedimiento LostFocus de la clase
TxtColor (obtenel el focus)
This.backcolor=rgb(0,0,255) (color de fondo
azul)
This.forecolor=rgb(255,255,255) (color de las letras
blancas)
Código del Procedimiento GosFocus del la clase
TextColor (perder el focus)
This.backcolor=rgb(255,255,255) (color de fondo
blanca)
This.forecolor=rgb(0,0,0) (color de las letras
negras)
Soporte de Tecnología
ActiveX
Cuando usted instala Visual Foxpro, se instalan una
serie de controles ActiveX soportados por Visual
Foxpro.
Un ActiveX, no es más que un control externo,
es parecido a una clase ya que las clases se pueden guardar en un
archivo (extensión VCX) y los ActiveX tienen
extensión OCX. La diferencia es que los VCX solo puede
ocuparse en Visual Foxpro, mientras que los OCX se consideran
como tecnología abierta, es decir, pueden ser
utilizado por cualquier lenguaje
visual como Visual C++ o
Visual Basic, por
mencionar algunos.
Estos controles ActiveX, vienen hechos de fabrica, son
comercializables y no son modificables, sin embargo uno puede
crear sus propios OCX. Los lenguajes donde se pueden construir
estos OCX actualmente son Visual C++ y
Visual Basic. En
visual Foxpro 5.0 usted no puede crear OCX.
Hay que tener mucho cuidado a la hora de comprar un OCX
y verificar que lenguajes soporta, por que algunos OCX no son
soportados por algunos lenguajes visuales incluso con Visual
Foxpro.
Cómo hacer uso de los ActiveX en Visual
Foxpro:
Un OCX es un objeto por lo cual tiene propiedades y
eventos implícitos en él.
En el curso, utilizaremos dos Controles ActiveX
:
- OutLine control
- Microsoft Progress Bar Control
OutLine control:
El
Outline Control se utiliza para hacer Arboles como
por Ejemplo: Regiones con departamentos
(maestro-detalle)
Cómo agregar un ActiveX a la
forma:
- Abra o Cree una nueva forma.
- Seleccione Ver clases
- Seleccione ActiveX Control
- Seleccione el control deseado, en este caso el
Outline Control y póngalo en la forma.
5. Vamos a crear una forma maestro detalle utilizando el
Outline Control. El Outline control presentará la
información de las Regiones y vamos a agregar un Grid que
serán los departamentos, Algo asi:
Completar Código del Outline
control:
Método | Código |
Init | *————————————- * Cargar el OCX *————————————- *——– pnIndex = 0 THIS.Additem( "Regiones" ) THIS.Indent( pnIndex ) = pnIndex Select s_region SCAN pnIndex = pnIndex + 1 datos = ALLTRIM(name) THIS.Additem(datos) THIS.Indent( pnIndex ) = 1 THIS.PictureType(pnindex) = 2 THIS.ListIndex = pnindex THIS.ItemData(pnIndex) = RECNO() ENDSCAN |
Click | SELECT s_region GO RECORD THIS.ItemData(THIS.ListIndex) THISFORM.REFRESH() |
El último paso es agregar el Grid con la
tabla departamentos y luego establecer la relación con la
tabla de regiones.
Progress Bar Control:
Este control permite hacer una barra de
progreso:
Propiedades :
Propiedad | Descripción |
Max | Máximo valor de la Barra |
Min | Mínimo valor de la Barra |
Value | Valor actual de la barra |
Almacenar objetos OLE en la Base de
Datos:
Con Visual Foxpro se pueden almacenar objetos OLE en la
Base de Datos, estos objetos OLE van desde una simple imagen BMP de
Paintbruhs hasta un video clip, un
documento en Word, una hoja
en Excel un
grafico.
Esto se llama OLE Automation (automatización OLE)
¿Qué se necesita para hacer OLE
Automation?
Muy sencillo:
- El campo de la tabla debe ser tipo
General - Utilizar el control OLE Bound Control de Visual
Foxpro - Utilizar el Comando APPEND GENERAL
Sintaxis de APPEND GENERAL
APPEND GENERAL Nombre Campo tipo
General
[FROM Nombre Archivo]
[DATA Nombre de Variable]
[CLASS Nombre de la Clase OLE]
FROM : Por si deseamos insertar un Archivo
existente en el disco
DATA : Si no es un archivo puede ser una
variable, entonces se especifica
aquí.
CLASS : El nombre de la clase de la
aplicación al que esta asociada el archivo
o la variable.
Toda aplicación Windows ( Word, Excel, Graph,
Paint,
WordPad, Block de Notas, Power Point,
entre otras) tienen un nombre de clase:
Por mencionar algunos nombres de
clases:
Aplicación | Nombre de la |
Paintbrush Picture | PAINT.PICTURE |
Documento de Word 97 | WORD.DOCUMENT |
Hoja de Calculo de Excel | EXCEL.SHEET |
Como conocer el nombre de clase de una
aplicación Windows:
- Cree un
formulario nuevo - Inserte en el formulario el control OLE Container
Control - Insertar la Aplicación deseada: (Escoger el
objeto y luego OK) - Luego en las propiedades del objeto insertado buscar
la propiedad
OLECLASS:
Incluir en el Formulario el Objeto
OLE:
Diseño de Reportes
Guia rápida visual:
Los informes muestran datos y resumen datos en un
formulario impreso o en pantalla. Los dos componentes principales
de los informes son los datos y el formato. La fuente de datos
del informe puede ser
una tabla de base de dato, una consulta o una vista.
El primer paso para diseñar un informe es
determinar los datos que se van a mostrar, y el segundo paso es
determinar cuál va a ser el mejor formato para mostrar ese
informe. Puede crear listados que se basen en una única
tabla o en informes complejos.
El Generador de Informes es una herramienta flexible y
de fácil uso para la creación, diseño y
modificación de informes.
Pasos para Creación de Informes
:
I. Selección de los datos
Esta es la parte más importante del informe, la
selección de datos, hay que saber
qué es lo que quiere el usuario o que el usuario muestre
el diseño del informe que desea, para comenzar a
trabajar.
Los datos pueden ser simples (utilizando una sola
tabla), como listados de regiones, listado de departamentos,
entre otros; o pueden ser algo mas complejos (utilizando mas de
una tabla) Ejemplo Reportes agrupados, reportes consolidados,
etc.
Los datos se pueden obtener directamente utilizando las
tablas o utilizando SQL para crear cursores, esta
última es la más recomendada para una
aplicación multiusuario.
Existen varios tipos de informes entre ellos
:
– Listados (Ej. Listados de regiones)
Muestra:
——————————-
id name
——————————-
01 Region 1
02 Region 2
——————————–
– Grupos con detalles ( o maestro
detalles)
——————————-
Region
Departamento
——————————-
Region 1
Departamento a
Departamento b
Region 2
Departamento x
Departamento y
——————————–
– Matriciales o consolidados
——————————————–
Rating
Region Excellent Good Poor
——————————————–
Region 1 1 2 0
Region 2 3 0 1
——————————————–
Totales 4 2 1
——————————————–
Creación de Informes usando el entorno de
datos:
1. En el administrador de proyectos, seleccione la ficha
Documentos.
2. Seleccione Informes
3. Pulse el botón nuevo
4. Pulse el botón nuevo informe.
Aparece el generador de informes y al barra de
herramientas Controles de informes.
5. Seleccione Entorno de datos y seleccione la
tabla
6. Arrastre los campos a utilizar del entorno de datos
en el informe en la parte de detalle
7. Introduzca los encabezados del reporte
8. Puede ver como queda el informe con el botón
de presentación preliminar:
Presentación Preliminar :
Menú de Reportes
Titulo/Sumario (Title/Summary):
Muestra el área del Titulo y el Sumario del
Informe
Titulo : Aparece solo en la primera pagina del
Reporte
Sumario : Aparece solo en la ultima pagina del
Reporte
Agrupamiento de datos (Data Grouping)
El agrupamiento de datos se utiliza para informes
maestro – detalle.
Las variables son
útiles para hacer cálculos con los datos del
reporte y luego presentarlas en el mismo reporte.
Propiedades de los campos
Cada campo en el Informe posee propiedades :
Creación de Informes usando Cursores
SQL:
1. Crear el cursor con el comando SELECT….. FROM
…..WHERE….
2. Crear el Informe manualmente, con los nombres de
campos del cursor.
3. Correr el Reporte.
Ejemplo:
* Se define una ventana Personalizada
DEFINE WINDOW w_Output ;
FROM 0,0 TO 25,70 ;
TITLE 'Informes – INATEC' ;
CLOSE FLOAT GROW ZOOM SYSTEM
USE IN .datas_region IN 0
SELECT id, name
FROM s_region
INTO CURSOR c_region
* Si lo queremos por pantalla
REPORT FORM .reportpp_detalles ;
PREVIEW WINDOWS w_output ;
NOEJECT NOCONSOLE
* Por Impresora
REPORT FORM .reportpp_detalles ;
TO PRINTER PROMPT ;
NOEJECT NOCONSOLE
* Hacia un Archivo
REPORT FORM .reportpp_detalles ;
TO FILE PUTFILE() ;
ASCII
* Cerrar el cursor
USE IN c_region
Integración de la
Aplicación
Creación de Menús:
Guía rápida Visual:
Tipos de Menús:
Existen dos tipos de menús : menú y
Shortcut.
Creación de Menús:
La creación de menús es un proceso que
conlleva diferentes pasos. Primero, debemos definir las opciones
del menú y de los submenús. Luego, asignar
funcionalidad a las opciones de menú. Finalmente, generar
el programa de menús.
Puede l generador de menús de Visual Foxpro para
que le ayude a construir menús rápidamente. El
Generador de menús le permite definir la estructura y
funcionalidad de su sistema de menús a través de
cuadros de diálogo de fácil uso y de listas
desplegables que puede utilizar para crear y modificar su sitema
de menús.
Definición de las opciones de
menú.
Los menús presentan su aspecto con una lista de
opciones para iniciar una actividad. La mayoría de los
elementos de menú muestran submenús u opciones
adicionales cuando el usuario selecciona uno de estos elementos.
Antes de generar un menú para una aplicación,
tendrá que determinar que selecciones tendrá
disponibles el usuario final y qué opciones de
menús pertenecen a otras opciones de menús (sub
menus).
Cómo crear un nuevo menú
Aparece la página otros con las
categorías de archivo de Menús, Texto y
Otros.- Pulse
la ficha de otros en el Administrador de proyectos. - Seleccione menús en la lista de
categorías - Pulse el botón nuevo y escoja si es Menu o un
Shortcut
4. Introduzca las opciones del menu y luego el resultado
del menú ( submenu, comando o procedimiento)
5. A la derecha del resultado se encuentra la
opción crear o modificar según el caso. ( crea o
modificar los resultados de la opción del
menu).
Tipos de Resultados :
Submenu : Si el menú contiene un
submenu
Comando : Si la opción de ese menú
invoca un comando (Ejemplo: DO FORM
Regiones, para llamar un formulario;
CLEAR EVENT, por lo general va en la
opción Salir)
Procedimiento : Si la opción de ese
menú invoca varias líneas de comandos ( un
procedimiento).
Opciones de Menú:
En las opciones del menú se
especifican:
- Teclas de Acceso directo
- Mensajes del menú
- Condición de habilita/No habilitar
Generación del menú
:
- En el menú escoja la opción
Menú. - Se le pregunta si desea grabar los cambios ( responda
que si) - Luego se le pide que proporcione el archivo de salida
del menu ( escoja la ruta y el nombre del archivo, por lo
general son extension MPR) y luego seleccione
generar. - Si existe ya el archivo se le pide si desea
re-escribirlo ( seleccione que si)
Como invocar al menú
creado:
Al generar el menú se crea un archivo que por lo
general tiene extensión MPR que contiene el código
para desplegar el menú.
La instrucción sería:
DO ruta y nombre del archivo MPR
Ejemplo : DO menu.MPR
- Para volver a re establecer el menú por
default de Visual Foxpro utilice la instrucción: SET
SYSMENU TO DEFAULT
Creación del Ejecutable de la
Aplicación.
Primero se tiene que crear un programa de inicio, al
cual se le tiene que decir que ese es el programa que se
ejecutara de primero ( esto se hace haciendo clic derecho en el
programa que designemos como principal y escoger la opción
main ( principal) del menú de opciones)
Contenido Ejemplo del programa
principal:
CLEAR ALL
* Variables
Publicas
PUBLIC w_Output, g_año, gid_area, g_nivel,
g_cambio, g_login_entry ;
,g_pass_entry, V_MENU_PRE, V_ERROR, g_acceso
* Definicion de Ventana para los Reportes
DEFINE WINDOW w_Output ;
FROM 0,0 TO 25,70 ;
TITLE 'Informes – BCN' ;
CLOSE FLOAT GROW ZOOM SYSTEM
* Ambiente
SET SYSMENU TO
SET ECHO OFF
SET TALK OFF
SET CENTURY ON
SET CLOCK STATUS
SET DATE brit
SET DELETE ON
SET PATH TO formenu,bmp,prg,data
SET EXCLUSIVE OFF
SET SAFETY OFF
SET REFRESH TO 5
SET REPROCESS TO AUTOMATIC
SET MULTILOCK ON
SET LOCK OFF
SET PROCEDURE TO .prgutility
* Fondo de la Pantalla principal
_SCREEN.Picture=".bmpfondo.bmp"
_SCREEN.WINDOWSTATE=2
_SCREEN.CLOSABLE=.F.
_SCREEN.CAPTION="Formulación
Presupuestaria"
* Base de Datos
OPEN DATA .SCOTTscott SHARED
* Llamada al Menu
DO .menumenu.mpr
READ EVENT
CLEAR ALL
SET SYSMENU TO DEFAULT
Creación del Ejecutable
En el Administrador de proyectos seleccione la opcion
Build, luego la opción build Executable y luego
OK.
- En las opciones es recomendable seleccionar Recompile
All y display Error, para recompilar todos sus programas y
formularios ; y Por si hay un error mostrarlo al final de la
generación del Ejecutable.
Suerte en tu nuevo aprendizaje…
Para visualizar todas las imágenes
faltantes haga click en el menu superior "Bajar
Trabajo".
Autor:
Richard A. Sequera A.
Estudio: Ing. en Informatica, UCLA, Venezuela.
e-mail: