Documentos de Académico
Documentos de Profesional
Documentos de Cultura
GUIA DE LABORATORIO Nº 4
Programación Estructurada: Secuencial, Condicional, Repetitiva y
Modularidad
Objetivo:
Conocer la estructura de programas (.prg) creados en VFP9.
Crear, depurar y ejecutar programas utilizando programación estructurada.
Crear programas que interactúen con la base de datos “Permisodb”.
Consideraciones
- Debe de continuar trabajando dentro de su proyecto “PermisosUes”.
Creación de programas:
NUEVO
PROGRAMA
Se muestra la pantalla para digitar el nuevo programa:
Programa Secuencial:
Nombre del programa: Capturar
Objetivo: Capturar una cadena de texto, dicho texto
concatenarlo con una expresión constante y
mostrarlo como salida del programa.
Algoritmo: Se inicia variable.
Se captura una cadena de texto por medio de la
función INPUTBOX() y se guarda el la variable
Cnombre
El texto capturado se concatena con un texto
constante y el resultado se almacena en la variable
Cresultado.
El resultado se muestra en una ventana a través de la
función MESSAGEBOX().
2
Las instrucciones de la figura anterior se detallan a continuación:
---------------------------------------------------------------------------------------------------
* PROGRAMA: CAPTURAR.PRG
* OBJETIVO:CAPTURAR UNA CADENA DE CARACTERES ,
* CONCATENAR Y MOSTRAR EL RESULTADO
cNombre = " "
cNombre = INPUTBOX("DIGITE SU NOMBRE: ")
cResultado = "El programa se ejecuta correctamente " + UPPER(cNombre)
MESSAGEBOX(cResultado, "Aviso")
Capturar
Capturar
3
Ejecución del programa.
Desde la ventana de comando digite la siguiente instrucción:
Capturar
Entrada de dato:
Programas Condicionales:
Creación de un programa con estructuras condicionales:
Crear un programa que permita la captura del carácter M o F y calcule el total de
empleados masculinos o femeninos (según carácter).
4
Nombre del programa: Tgenero_01.prg
IF cGenero = "F"
* cuenta cuantos empleados cumplen con la condición y
* guarda el total en variable nTotal
COUNT FOR Empleados.Genero = cGenero TO nTotal
* concatena expresiones
CSalida = "Total de personal femenino:" + cTotal
* resultado de salida
MESSAGEBOX(CSalida, "Aviso")
ELSE
COUNT FOR Empleados.Genero = cGenero TO nTotal
cTotal = STR(nTotal)
CSalida = "Total de personal Masculino:" + cTotal
MESSAGEBOX(CSalida, "Aviso")
ENDIF
* FIN
Ejecutar desde la ventana de comando: DO Tgenero_01
5
Programa mejorado utilizando un seleccionador de casos:
DO CASE
CASE cGenero = "F"
* cuenta cuantos empleados cumplen con la condición y
* guarda el total en variable nTotal
COUNT FOR Empleados.Genero = cGenero TO nTotal
* concatena expresiones
CSalida = "Total de personal femenino:" + cTotal
* resultado de salida
MESSAGEBOX(CSalida, "Aviso")
OTHERWISE
MESSAGEBOX("Debe seleccionar M o F", "Aviso")
ENDCASE
CLOSE DATABASES ALL
6
Programas con ciclos repetitivos:
Crear un programa que permita capturar un rango de edades (una edad inicial y
una final) debe calcule el total de empleados con edad dentro de ese rango.
SET CENTURY ON
SET DATE TO BRITISH
num = 0
SELECT 0
USE EMPLEADOS
GO TOP
SCAN
nedad = YEAR(DATE()) - YEAR(Empleados.Fecnac)
IF BETWEEN(nedad, nedadini, nedadfin)
num = num + 1
MESSAGEBOX(Empleados.Apellidos + Empleado.Nombres + " Enter para continuar")
ENDIF
ENDSCAN
7
Programas con la instrucción Browse:
* PROGRAMA: INDICE001
* OBJETIVO: MOSTRAR EL ORDEN DE LA TABLA EMPLEADO APLICANDO SUS INDICES
* ESTOS INDICES SON: PKEMPLEADO, APELLIDOS
SELECT 0
USE EMPLEADOS
* FIN
8
Crear un programa que permita capturar el Nit de un empleado y buscarlo; sí
existe mostrar el nombre del empleado:
Para crear este programa debe de utilizar una estructura repetitiva y al finalizar la
consulta, preguntar: “Desea continuar (Si o No)”, capturando su respuesta por
medio de la función MESSAGEBOX()
SET STRICT TO 0
SET CENTURY ON
SET DATE TO BRITISH
SET DELETE ON
SELECT 0
USE Empleados
SET ORDER TO PKempleado
IF SEEK(cNit)
cApellidos = ALLTRIM(Empleados.Apellidos)
cNombres = ALLTRIM(Empleados.Nombres)
cEmpleado = cApellidos + ", " + cNombres
MESSAGEBOX("Encontrado: " + cEmpleado, "Resultado")
ELSE
MESSAGEBOX("No encontrado")
ENDIF
* FIN
9
Ejercicios propuestos:
10
6. Glosario de comandos en VFP aplicados en los programas
Parámetro: ALL
Cierra todas las bases de datos, tablas e índices abiertos en la sesión de datos
actual y en todas las sesiones de datos inactivas y selecciona el área de trabajo 1.
CLOSE ALL.
USE (Comando)
Abre una tabla y sus archivos de índice asociados, o una vista SQL.
USE [[DatabaseName!]Table | SQLViewName | ?] [IN nWorkArea | cTableAlias]
[ONLINE] [ADMIN] [AGAIN] [NOREQUERY [nDataSessionNumber]]
[NODATA] [INDEX IndexFileList | ? [ORDER [nIndexNumber | IDXFileName |
[TAG] TagName [OF CDXFileName] [ASCENDING | DESCENDING]]]] [ALIAS
cTableAlias] [EXCLUSIVE] [SHARED] [NOUPDATE] [CONNSTRING
cConnectionString | (m.nStatementHandle) ]
Parámetros
[DatabaseName!]TableName
Especifica el nombre de la tabla que se va a abrir. Puesto que los espacios en
blanco son importantes en los nombres de archivo de Microsoft Windows 98 y
posteriores, evite usar espacios adicionales en TableName. Si un nombre de tabla
contiene espacios, escríbalo entre comillas (" " o ' ')
Para abrir una tabla fuera de la base de datos actual, identifique la tabla con el
nombre de la base de datos, con un signo de exclamación (!) para separar el
nombre de la base de datos del nombre de la tabla. Si no identifica una tabla con
un nombre de base de datos, Microsoft Visual FoxPro sólo podrá abrir las tablas
de la base de datos actual. Si el nombre de la base de datos, el nombre de la tabla
o ambos contienen espacios, escriba el nombre de la base de datos y el nombre
de la tabla entre comillas (" " o ' ')
11
GO | GOTO (Comando)
Coloca el puntero de registro en el número de registro especificado de una tabla.
Puede utilizar uno de los siguientes ejemplos:
GO [RECORD] nRecordNumber [IN nWorkArea | IN cTableAlias]
GO TOP | BOTTOM [IN nWorkArea | IN cTableAlias]
GOTO [RECORD] nRecordNumber [IN nWorkArea | IN cTableAlias]
GOTO TOP | BOTTOM [IN nWorkArea | IN cTableAlias]
Parámetros
RECORD nRecordNumber
Especifica el número de registro físico al que desea mover el puntero de registro.
Puede omitir por completo GO o GOTO y especificar simplemente el número de
registro. Si especifica solamente el número de registro, podrá mover el puntero
solamente en el área de trabajo actual.
IN nWorkArea
Especifica el área de trabajo de la tabla en la cual se mueve el puntero de registro.
IN cTableAlias
Especifica el alias de la tabla en la cual se mueve el puntero de registro.
TOP
Sitúa el puntero de registro en el primer registro de la tabla. Si la tabla tiene en uso
un índice ascendente, el primer registro será el registro con el valor clave más
bajo. Si el índice está en orden descendente, el primer registro será el registro con
el valor clave más alto.
BOTTOM
Sitúa el puntero de registro en el último registro de la tabla. Si la tabla tiene activo
un índice ascendente, el último registro será aquél con el valor de clave más
elevado. Si el índice está en orden descendente, el último registro será el que
tenga el menor valor de clave.
Observaciones
GO y GOTO pueden utilizarse indistintamente. Estos comandos actúan sobre la
tabla del área de trabajo actual a menos que especifique otra área de trabajo con
la cláusula IN.
12
SKIP (Comando)
Parámetros
nRecords
Especifica el número de registros que hay que mover el puntero.
Si ejecuta SKIP sin nRecords, el puntero avanzará al siguiente registro. El puntero
de registro se mueve hacia el final del archivo nRecords si nRecords tiene un valor
positivo. El puntero de registro se moverá hacia el principio del archivo nRecords
si nRecords tiene un valor negativo.
Si el puntero de registro está colocado en el último registro de una tabla y se
ejecuta SKIP sin argumentos, RECNO( ) devolverá un valor superior en uno al
número de registros de la tabla y EOF( ) devolverá verdadero (.T.). Si el puntero
de registro está colocado en el primer registro de una tabla y se ejecuta SKIP -1,
RECNO( ) devolverá 1 y BOF( ) devolverá (.T.).
IN nWorkArea | cTableAlias
Mueve el puntero de registro en una tabla de un área de trabajo específica.
nWorkArea especifica el número del área de trabajo y cTableAlias especifica el
alias de una tabla o de un área de trabajo.
SELECT (Comando)
Activa el área de trabajo especificada.
SELECT ¡Error! Referencia de hipervínculo no válida. | ¡Error! Referencia de
hipervínculo no válida.
Parámetros
nWorkArea
Especifica el área de trabajo que se va a activar. Si nWorkArea es 0, se activará el
área de trabajo no utilizada que tenga el número menor.
cTableAlias
Especifica un área de trabajo que contiene una tabla abierta para activar.
cTableAlias es el alias de la tabla abierta. También puede incluir una letra de la A
a la J para que cTableAlias active una de las diez primeras áreas de trabajo.
Observaciones
De forma predeterminada, el área de trabajo número 1 está activa cuando se inicia
Visual FoxPro.
Nota: Los campos de las tablas de cualquier área de trabajo pueden incluirse en
comandos y funciones de Visual FoxPro. Utilice los formatos siguientes para tener
acceso a los campos de una tabla abierta en un área de trabajo distinta de la
actual: alias.field o alias -> field.
13
Instrucciones relacionadas a: manejo de base de datos
INPUTBOX( ) (Función)
Entrada y salida | INPUT (Comando) | MESSAGEBOX (Función)Muestra un
cuadro de diálogo modal utilizado por una vista parametrizada para la entrada de
una sola cadena.
INPUTBOX(cInputPrompt [, cDialogCaption [, cDefaultValue [, nTimeout
[,cTimeoutValue]]]])
Parámetros
cInputPrompt
Especifica el mensaje mostrado sobre el cuadro de entrada de texto.
cDialogCaption
Especifica el texto que se va a mostrar en la barra de título del cuadro de diálogo.
cDefaultValue
Especifica el valor predeterminado que se va a mostrar en el cuadro de entrada de
texto.
nTimeout
Especifica un valor de tiempo de espera en 1/1000 segundos.
cTimeoutValue
Especifica el valor devuelto si termina el tiempo de espera.
Observaciones
El cuadro de diálogo muestra un cuadro de edición y botones Aceptar y Cancelar.
El botón Aceptar siempre devuelve el contenido del cuadro de texto. El botón
Cancelar siempre devuelve una cadena vacía. Si termina el tiempo de espera
siempre devolverá el texto especificado en cTimeoutValue o una cadena vacía si
cTimeoutValue no fue pasado.
Ejemplo
Y = "Nothing at all"
Y = INPUTBOX("TypeHere","Input ",Y,5000)
&& Muestra el cuadro de diálogo por 5 segundos,
&& luego muestra algo escrito o "Nothing at all"
14
MESSAGEBOX( ) (Función)
Muestra un cuadro de diálogo definido por el usuario.
MESSAGEBOX(eMessageText [, nDialogBoxType ][, cTitleBarText][, nTimeout])
Parámetros
eMessageText
Especifica el texto que aparece en el cuadro de diálogo. Utilice un retorno de carro
(CHR(13)) en eMessageText para mover una parte del mensaje a la línea
siguiente del cuadro de diálogo. El alto y el ancho del cuadro de diálogo aumentan
lo que sea necesario para que quepa cMessageText.
Puede utilizar cualquier función o tipo de datos válido de Visual FoxPro en vez de
eMessageText. Si la función que utiliza produce un valor que no sea un carácter,
Visual FoxPro utilizará automáticamente TRANSFORM( ) para proporcionar el
carácter equivalente. En el siguiente ejemplo, se devuelve una fecha tipo carácter
y se pasa a MESSAGEBOX( ): Ejemplo: MESSAGEBOX(DATE())
Para mover una parte del mensaje a la línea siguiente en el cuadro de diálogo, use
un retorno de carro, CHR(13), en eMessageText. La altura y ancho del cuadro de
diálogo se incrementa como sea necesario para contener cMessageText.
nDialogBoxType
Especifica los botones y los iconos que aparecen en el cuadro de diálogo, el botón
elegido inicialmente cuando se muestra y el comportamiento del mismo.
En las tablas siguientes, los valores 0 a 5 del botón del cuadro de diálogo
especifican los botones que aparecen en el mismo. Los valores de icono 16, 32,
48 y 64 especifican el icono que aparece en el cuadro de diálogo. Los valores
predeterminados 0, 256 y 512 especifican qué botón del cuadro de diálogo es el
botón predeterminado. El botón predeterminado se selecciona cuando aparece el
cuadro de diálogo. Omitir nDialogBoxType es idéntico a especificar un valor de 0
para nDialogBoxType.
15
Valor Icono
16 Punto.
32 Signo de interrogación.
48 Signo de exclamación.
64 Icono de información (i).
nDialogBoxType puede ser la suma de hasta tres valores, uno de cada una de las
tablas anteriores. Por ejemplo, si nDialogBoxType es 290 (2+32+256), el cuadro
de diálogo especificado tendrá las siguientes características:
Botones Anular, Reintentar e Ignorar.
El cuadro de mensaje muestra el icono del signo de interrogación.
El segundo botón, Reintentar, es el botón predeterminado.
Hay disponible información adicional acerca de las constantes en el archivo
FoxPro.h, que se encuentra en el directorio de inicio de Visual FoxPro. El uso de
constantes definidas tales como MB_ABORTRETRYIGNORE +
MB_ICONQUESTION + MB_DEFBUTTON2 puede ser más legible que 2 + 32 +
256.
cTitleBarText
Especifica el texto que aparece en la barra de título del cuadro de diálogo. Si omite
cTitleBarText, en la barra de título aparecerá el título "Microsoft Visual FoxPro".
nTimeout
Específica el número de milisegundos que Visual FoxPro mostrará cMessageText
sin ninguna entrada desde el teclado o el ratón antes de borrar cMessageText. Es
posible especificar cualquier tiempo de espera válido. Un valor menor de 1 no
agotará el tiempo de espera hasta que se produzca la entrada del usuario (igual
que si no se utiliza el parámetro nTimeout).
Valores devueltos
Dato tipo Numérico. MESSAGEBOX( ) devuelve un valor que indica cuál botón se
eligió en el cuadro de diálogo. La siguiente tabla muestra los valores devueltos por
MESSAGEBOX( ) para cada botón.
16
Valor devuelto Botón
1 Aceptar
2 Cancelar
3 Anular
4 Reintentar
5 Ignorar
6 Si
7 No
En el cuadro de diálogo con un botón Cancelar, al presionar ESC para salir del
cuadro de diálogo devuelve el valor (2) como si hubiera elegido Cancelar.
MESSAGEBOX( ) devuelve un valor de -1 cuando se agota el tiempo de espera.
Observaciones
La abreviatura para MESSAGEBOX( ) es MESSAGEB( ).
La función MESSAGEBOX( ) utiliza parámetros inteligentes donde el tipo de
parámetro dicta que parámetro se está utilizando. El primer parámetro es
requerido y siempre es cMessageText; sin embargo, el segundo parámetro,
opcional, puede ser nDialogBoxType si el tipo es numérico o cTitleBarText si el
tipo es de caracteres. Siempre se asume el parámetro nTimeout para el segundo
parámetro numérico opcional que se pasa. Algunos ejemplos válidos son:
MESSAGEBOX("HELLO","Mi Titulo",36,1)
MESSAGEBOX("HELLO",36," Mi Titulo ",1)
MESSAGEBOX("HELLO",36,1)
MESSAGEBOX("HELLO",36,1," Mi Titulo ")
Ejemplo
El siguiente ejemplo muestra un cuadro de diálogo definido por el usuario. Como
título del cuadro de diálogo definido por el usuario, se muestra el mensaje
"Registro no encontrado. Desea buscar de nuevo?", y en la barra de título se
muestra "Mi aplicación".
El cuadro de diálogo definido por el usuario contiene los botones Si y No, y el
icono del signo de interrogación; el segundo botón (No) es la selección
predeterminada. Cuando elija uno de los botones, la selección se mostrará en
pantalla.
cMessageTitle = 'Mi Aplicación'
cMessageText = 'Registro no encontrado. Desea buscar de nuevo?'
nDialogType = 4 + 32 + 256
* 4 = Botones Si y No
* 32 = Icono Interrogación
* 256 = Segundo botón como predeterminado
nAnswer = MESSAGEBOX(cMessageText, nDialogType, cMessageTitle)
DO CASE
CASE nAnswer = 6
17
WAIT WINDOW 'Eligió Si'
CASE nAnswer = 7
WAIT WINDOW 'Eligió No'
ENDCASE
Parámetros
lExpression
Especifica la expresión lógica evaluada. Si lExpression da como resultado
verdadero (.T.), se ejecutarán cualesquiera instrucciones posteriores a IF o
THEN y anteriores a ELSE o ENDIF (lo que suceda primero).
Si lExpression es falso (.F.) y se incluye ELSE, se ejecutan los
comandos situados después de ELSE y antes de ENDIF .
Si lExpression es falso (.F.) y no se incluye ELSE, se pasarán por
alto todas las instrucciones entre IF y ENDIF. En este caso la
ejecución del programa continuará con la primera línea de comando
a continuación de ENDIF.
Observaciones
Puede anidar un bloque IF ... ENDIF dentro de otro bloque IF ... ENDIF.
Los observaciones precedidos de && se pueden colocar en la misma línea
después de IF, THEN, ELSE y ENDIF. Estas observaciones se pasarán por alto
durante la compilación y la ejecución del programa.
18
DO CASE ... ENDCASE (Comando)
Ejecuta el primer conjunto de comandos cuya expresión condicional de como
resultado verdadero (.T.).
DO CASE
CASE lExpression1 Commands
[Commands]
[CASE lExpression2
[Commands]] ...
[CASE lExpressionN
[Commands]]
[OTHERWISE
[Commands]] ENDCASE
Parámetros
CASE lExpression1 Commands ...
Cuando se encuentre la primera expresión CASE con el valor verdadero (.T.), se
ejecutará el conjunto de comandos que haya a continuación. La ejecución del
conjunto de comandos continuará hasta encontrar la siguiente expresión CASE o
ENDCASE. La ejecución se reanuda en el comando que hay inmediatamente a
continuación de ENDCASE.
Si una expresión CASE tiene el valor falso (.F.), se pasará por alto el conjunto de
comandos que le siguen hasta la siguiente cláusula CASE.
Sólo se ejecuta un conjunto de comandos. Se trata de los primeros comandos
cuya expresión CASE se evalúe con el resultado verdadero (.T.). Se pasan por
alto todas las expresiones CASE posteriores que tengan el valor verdadero (.T.).
OTHERWISE Commands
Si todas las expresiones CASE dan como resultado falso (.F.), OTHERWISE
determinará si se ejecuta otro conjunto de comandos adicional.
Si incluye OTHERWISE, se ejecutará el conjunto de comandos que
sigue a OTHERWISE y la ejecución saltará al primer comando que
hay a continuación de ENDCASE.
Si omite OTHERWISE, la ejecución saltará al primer comando que
hay a continuación de ENDCASE.
Observaciones
DO CASE se utiliza para ejecutar un conjunto de comandos de Visual FoxPro
según el valor de una expresión lógica. Cuando se ejecuta DO CASE, se evalúan
cada una de las expresiones lógicas sucesivas; los valores de las expresiones
determinan el conjunto de comandos que se ejecuta.
Se admiten observaciones después de DO CASE y ENDCASE, si se incluyen en
la misma línea. Estos observaciones se pasan por alto durante la compilación y
ejecución del programa.
19
DO WHILE ... ENDDO (Comando)
Ejecuta un conjunto de comandos dentro de un bucle condicional.
DO WHILE lExpression
Commands
[LOOP] [EXIT] ENDDO
Parámetros
lExpression
Especifica una expresión lógica cuyo valor determina si se debe ejecutar el
conjunto de comandos incluido entre DO WHILE y ENDDO. Siempre que
lExpression dé como resultado verdadero (.T.), el conjunto de comandos se
ejecutará.
Commands
Especifica el conjunto de comandos de Visual FoxPro que se ejecutan siempre y
cuando lExpression dé como resultado verdadero (.T.).
LOOP
Devuelve el control del programa directamente a DO WHILE. LOOP se puede
situar en cualquier lugar entre DO WHILE y ENDDO.
EXIT
Transfiere el control del programa desde el interior del bucle DO WHILE hasta el
primer comando situado detrás de ENDDO. EXIT puede situarse en cualquier
lugar entre DO WHILE y ENDDO.
Observaciones
Un conjunto de comandos situados entre DO WHILE y ENDDO se ejecuta siempre
y cuando el valor de la expresión lógica lExpression sea verdadero (.T.). Una
instrucción DO WHILE debe tener su correspondiente instrucción ENDDO.
Puede situar observaciones después de DO WHILE y ENDDO en la misma línea.
Estos observaciones se pasan por alto durante la compilación y ejecución del
programa.
20
SCAN ... ENDSCAN (Comando)
Mueve el puntero de registro por la tabla seleccionada y ejecuta un bloque de
comandos para cada uno de los registros que cumple las condiciones
especificadas.
Parámetros
Alcance
Especifica el conjunto de registros que se va a explorar. Sólo se examinarán los
registros que se encuentren dentro del rango. Las cláusulas de alcance son: ALL,
NEXT nRecords, RECORD nRecordNumber y REST. Para obtener más
información acerca de las cláusulas de alcance, vea el tema Cláusulas de alcance.
El alcance predeterminado para SCAN es todos los registros (ALL).
FOR lExpresión1
Ejecuta comandos solamente para los registros para los que lExpresión1 se
evalúa como verdadero (.T.). La inclusión de la cláusula FOR le permite filtrar los
registros que no desea explorar.
Si lExpresión1 es una expresión optimizable, Rushmore optimizará una consulta
creada con SCAN ... FOR. Para obtener el máximo rendimiento, utilice una
expresión optimizable en la cláusula FOR.
WHILE lExpresión2
Especifica una condición por la cual los comandos se ejecutan siempre que
lExpresión2 se evalúe como verdadero (.T.).
Comandos
Especifica los comandos de Visual FoxPro que se van a ejecutar.
LOOP
Devuelve el control directamente a SCAN. LOOP puede colocarse en cualquier
lugar entre SCAN y ENDSCAN.
EXIT
Transfiere el control del bucle SCAN ... ENDSCAN al primer comando que sigue
inmediatamente a ENDSCAN. EXIT puede colocarse en cualquier lugar entre
SCAN y ENDSCAN.
ENDSCAN
Indica el final del procedimiento SCAN.
Observaciones
SCAN avanza automáticamente el puntero de registro al siguiente registro que
cumple las condiciones especificadas y ejecuta el bloque de comandos.
21