Compartir a través de


Conceptos básicos de programación

Cuando se programa, se almacenan datos y se manipulan mediante una serie de instrucciones. Los datos y los contenedores en los que se almacenan los datos constituyen la materia prima de la programación. Las herramientas utilizadas para manipular esta materia prima son comandos, funciones y operadores.

Almacenar datos

Los datos con los que trabaja probablemente incluyan períodos de tiempo, dinero y elementos contables, así como fechas, nombres, descripciones, etc. Cada dato corresponde a un determinado tipo, es decir, pertenece a una categoría de datos que se manipula de maneras similares. Podría trabajar directamente con estos datos sin almacenarlos, si bien perdería la mayor parte de la flexibilidad y eficacia que ofrece Visual FoxPro. Visual FoxPro aporta numerosos contenedores de almacenamiento con el fin de ampliar su capacidad para manipular fácilmente los datos.

Los tipos de datos determinan la manera en que se almacenan los datos y la forma en que se pueden utilizar tales datos. Puede multiplicar dos números, pero no puede multiplicar caracteres. Puede imprimir caracteres en mayúsculas, pero no puede imprimir números en mayúsculas. En la tabla siguiente se muestran algunos de los principales tipos de datos de Visual FoxPro.

Tipos de datos

Tipo Ejemplos
Numeric 123
3.1415
– 7
Character "Prueba"
"123"
"01/01/98"
Logical .T. (verdadero)
.F. (falso)
Date

DateTime

{^1998-01-01}

{^1998-01-01 12:30:00 p}

Contenedores de datos

Los contenedores de datos le permiten realizar las mismas operaciones con varios datos. Por ejemplo, sumar las horas que ha trabajado un empleado, multiplicarlas por el salario por hora y restar los impuestos para determinar el sueldo que ha percibido el empleado. Deberá realizar estas operaciones para cada empleado y para cada período de pago. Si almacena esta información en contenedores y realiza las operaciones sobre éstos, bastará con sustituir los datos antiguos por los nuevos datos y volver a ejecutar el mismo programa. En la siguiente tabla se enumeran algunos de los principales contenedores de datos disponibles en Visual FoxPro:

Tipo Descripción
Variables Elementos individuales de datos almacenados en la memoria RAM (memoria de acceso aleatorio) del PC.
Registros de tabla Varias filas de campos predeterminados, cada uno de los cuales puede contener un dato definido previamente. Las tablas se guardan en disco.
Matrices Varios elementos de datos almacenados en la memoria RAM.

Manipular datos

Los contenedores y los tipos de datos le ofrecen los bloques funcionales que necesita para manipular los datos. Los elementos finales son los operadores, las funciones y los comandos.

Usar operadores

Los operadores se utilizan para vincular los datos. A continuación se muestran los operadores utilizados habitualmente en Visual FoxPro.

Operador Tipos de datos válidos Ejemplo Resultado
= Todas
? n = 7
Imprime .T. si el valor almacenado en la variable n es 7; de lo contrario, imprime .F.
+ Numeric, Character, Date, DateTime
? "Fox" + "Pro"
Imprime "FoxPro"
! o NOT Lógicas
? !.T.
Imprime .F. (falso)
*, / Numérico
? 5 * 5
? 25 / 5
Imprime 25
Imprime 5

Nota   Un signo de interrogación (?) situado delante de una expresión imprime el resultado de la expresión y un carácter de nueva línea en la ventana de resultados activa, que es normalmente la ventana principal de Visual FoxPro.

Recuerde que debe utilizar el mismo tipo de datos con cada operador. Las siguientes instrucciones almacenan dos datos numéricos en dos variables. Los nombres de variable empiezan con la letra n, por lo que se puede determinar de inmediato que contienen datos numéricos, pero puede nombrarlas con cualquier combinación de caracteres alfanuméricos y caracteres de subrayado.

nFirst = 123
nSecond = 45

Las instrucciones siguientes almacenan dos datos de caracteres en dos variables. Los nombres de variable empiezan con la letra c para indicar que contienen caracteres.

cFirst = "123"
cSecond = "45"

Las dos operaciones siguientes, suma y concatenación, producen resultados distintos, ya que el tipo de datos es diferente en cada una de ellas.

? nFirst + nSecond
? cFirst + cSecond

Resultados

168
12345

Puesto que cFirst contiene caracteres y nSecond contiene datos numéricos, se producirá un error de tipo de datos incorrecto si se intenta ejecutar el siguiente comando:

? cFirst + nSecond

Puede evitar este problema si utiliza funciones de conversión. Por ejemplo, STR( ) devuelve el carácter equivalente de un valor numérico, mientras que VAL( ) devuelve el equivalente numérico de una cadena de caracteres formada por números. Estas funciones y LTRIM( ), que elimina los espacios iniciales, le permiten realizar las operaciones siguientes:

? cFirst + LTRIM(STR(nSecond))
? VAL(cFirst) + nSecond

Resultados

12345
168

Usar funciones

Las funciones devuelven un tipo específico de datos. Por ejemplo, las funciones STR( ) y VAL( ) utilizadas en la sección anterior devuelven valores de tipo Character y Numeric, respectivamente. Al igual que ocurre con todas las funciones, estos tipos devueltos están documentados con las funciones.

Hay cinco maneras de llamar a una función de Visual FoxPro:

  • Asignar a una variable el valor devuelto por la función. La siguiente línea de código almacena la fecha actual del sistema en una variable denominada dToday:

    dToday = DATE( )
    
  • Incluir la llamada a la función en un comando de Visual FoxPro. El siguiente comando establece el directorio predeterminado como el valor devuelto por la función GETDIR( ):

    CD GETDIR( )
    
  • Imprimir el valor devuelto en la ventana de resultados activa. La siguiente línea de código imprime la hora actual del sistema en la ventana de resultados activa:

    ? TIME( )
    
  • Llamar a la función sin almacenar en ningún lugar el valor devuelto. La siguiente llamada a la función desactiva el cursor:

    SYS(2002)
    
  • Incluir la función dentro de otra función. La siguiente línea de código imprime el día de la semana:

    ? DOW(DATE( ))
    

A continuación se enumeran otros ejemplos de funciones utilizados en esta sección:

Función Descripción
ISDIGIT( ) Devuelve el valor verdadero (.T.) si el carácter situado al comienzo de una cadena es un número; de lo contrario, devuelve el valor falso (.F.).
FIELD( ) Devuelve el nombre de un campo.
LEN( ) Devuelve el número de caracteres de una expresión de caracteres.
RECCOUNT( ) Devuelve el número de registros de la tabla que está activa en este momento.
SUBSTR( ) Devuelve el número especificado de caracteres a partir de una cadena de caracteres, empezando en una posición especificada de la cadena.

Usar comandos

Un comando hace que se realice una determinada acción. Cada comando dispone de una sintaxis específica, que indica lo que se debe incluir con el fin de que se ejecute correctamente el comando. Hay también cláusulas opcionales asociadas a los comandos que permiten especificar de forma más detallada la acción que se desea realizar.

Por ejemplo, el comando USE permite abrir y cerrar tablas:

Sintaxis de USE Descripción
USE
Cierra la tabla que aparece en el área de trabajo actual.
USE customer
Abre la tabla CUSTOMER en el área de trabajo actual y cierra cualquier tabla que ya esté abierta en el área de trabajo.
USE customer IN 0
Abre la tabla CUSTOMER en la siguiente área de trabajo disponible.
USE customer IN 0 ;
  ALIAS mycust
Abre la tabla CUSTOMER en la siguiente área de trabajo disponible y asigna al área de trabajo el alias mycust.

A continuación se muestran algunos ejemplos de comandos utilizados en esta sección:

(Comando) Descripción
DELETE Selecciona registros especificados de una tabla para su eliminación.
REPLACE Sustituye el valor almacenado en el campo del registro por un nuevo valor.
Go Coloca el puntero de registro en una posición específica de la tabla.

Control del flujo del programa

Visual FoxPro incluye una categoría especial de comandos que "envuelven" a otros comandos y funciones, y determinan cuándo y con qué frecuencia se ejecutan. Estos comandos permiten realizar bucles y bifurcaciones condicionales, dos herramientas de programación muy eficaces. El siguiente programa muestra el uso de los bucles y las bifurcaciones condicionales. Estos conceptos se describen de forma más detallada después del ejemplo.

Suponga que su empresa cuenta con 10.000 empleados y desea conceder a todos aquellos que ganan 30.000 dólares estadounidenses o más un aumento salarial del 3%, y a todos los que ganan menos de 30.000 dólares estadounidenses un aumento del 6%. El siguiente programa de ejemplo le permite hacerlo.

Este programa presupone hay una tabla abierta en el área de trabajo actual, que contiene un campo numérico denominado salary. Si desea obtener información sobre las áreas de trabajo, consulte "Usar múltiples tablas" en Trabajar con tablas.

Programa de ejemplo para aumentar el salario de los empleados

Código Comentarios
SCAN
El código comprendido entre SCAN y ENDSCAN se ejecuta tantas veces como registros haya en la tabla. Cada vez que se ejecuta el código, el puntero de registro se desplaza al siguiente registro de la tabla.
   IF salary >= 30000.00
      REPLACE salary WITH ;
         salary * 1.03
Para cada registro, si el salario es mayor o igual que 30.000, este valor se sustituye por un nuevo salario que es un 3% superior.

El signo de punto y coma (;) que aparece después de WITH indica que el comando continúa en la siguiente línea.

   ELSE
      REPLACE salary WITH ;
         salary * 1.06
Para cada registro, si el salario no es mayor o igual que 30.000, se sustituye este valor por un nuevo salario que es un 6% superior.
   ENDIF
ENDSCAN
Final de la instrucción condicional IF.

Final del código que se ejecuta para cada registro de la tabla.

Este ejemplo utiliza comandos de bifurcación condicional y bucle para controlar el desarrollo del programa.

Bifurcación condicional

La bifurcación condicional permite someter a prueba condiciones y, a continuación, en función del resultado de la prueba, realizar distintas operaciones. Visual FoxPro ofrece dos comandos que permiten realizar una bifurcación condicional:

El código comprendido entre la instrucción inicial y la instrucción ENDIF o ENDCASE sólo se ejecuta si una condición lógica se evalúa con el resultado verdadero (.T.). En el programa de ejemplo, el comando IF se utiliza para distinguir entre dos estados: o el salario es de 30.000 dólares estadounidenses o más, o no lo es. Se adoptan diferentes medidas, dependiendo del estado.

En el siguiente ejemplo, si el valor almacenado en la variable nWaterTemp es menor que 100, no se realizará ninguna acción:

* set a logical variable to true if a condition is met.
IF nWaterTemp >= 100
   lBoiling = .T.
ENDIF

Nota   Un asterisco al principio de una línea de un programa indica que la línea es un comentario. Los comentarios ayudan al programador a recordar la función que debe realizar cada segmento de código, si bien Visual FoxPro los pasa por alto.

Si se desea comprobar varias condiciones posibles, un bloque DO CASE ... ENDCASE puede resultar más eficaz que varias instrucciones IF y además es más fácil realizar un seguimiento del mismo.

Bucles

Un bucle le permite ejecutar una o más líneas de código tantas veces como sea necesario. En Visual FoxPro hay tres comandos que permiten realizar bucles:

Utilice SCAN cuando realice una serie de acciones para cada uno de los registros de una tabla, como en el programa de ejemplo descrito anteriormente. El bucle SCAN permite escribir el código una vez y ejecutarlo para cada registro a medida que el puntero de registro se desplaza por la tabla.

Utilice FOR cuando sepa cuántas veces debe ejecutarse la sección de código. Por ejemplo, sabe que una tabla contiene un número específico de campos. Puesto que la función FCOUNT( ) de Visual FoxPro devuelve este número, puede utilizar un bucle FOR para imprimir los nombres de todos los campos de la tabla:

FOR nCnt = 1 TO FCOUNT( )
   ? FIELD(nCnt)
ENDFOR

Utilice DO WHILE cuando desee ejecutar una sección de código mientras cumpla una determinada condición. Tal vez no sepa cuántas veces debe ejecutarse el código, pero sí sabe cuándo debe detenerse la ejecución. Por ejemplo, supongamos que dispone de una tabla en la que figuran los nombres y las iniciales de una serie de personas y desea utilizar las iniciales para consultar los nombres de las personas. Surgiría un problema la primera vez que intentase agregar una persona cuyas iniciales fuesen las mismas que las de otra persona contenida en la tabla.

Para resolver este problema, podría agregar un número a las iniciales. Por ejemplo, el código de identificación de Miguel Suárez podría ser MS. La siguiente persona cuyas iniciales fuesen las mismas, Margarita Sánchez, sería MS1. Si a continuación agregara María Sanz a la tabla, su código de identificación sería MS2. Un bucle DO WHILE permite localizar el número correcto que se debe adjuntar a las iniciales.

Programa de ejemplo que utiliza DO WHILE para generar un identificador exclusivo

Código Comentarios
nHere = RECNO()
Guarda la posición del registro.
cInitials = LEFT(firstname,1) + ;
   LEFT(lastname,1)
nSuffix = 0
Obtiene las iniciales de la persona a partir de las primeras letras de los campos firstname y lastname.

Si es necesario, establece una variable que contenga el número que se debe agregar al final de las iniciales de una persona.

LOCATE FOR person_id = cInitials
Comprueba si hay otra persona en la tabla cuyas iniciales son las mismas.
DO WHILE FOUND( )
Si en otro registro de la tabla hay un valor person_id que coincide con cInitials, la función FOUND( ) devolverá el valor verdadero (.T.) y se ejecutará el código contenido en el bucle DO WHILE.
Si no se encuentra ninguna coincidencia, la siguiente línea de código que se ejecute será la línea que figura a continuación de ENDDO.
   nSuffix = nSuffix + 1
   cInitials = ;
      LEFT(cInitials,2);
      + ALLTRIM(STR(nSuffix))
Prepara un sufijo nuevo y lo anexa al final de las iniciales.
   CONTINUE
CONTINUE hace que se vuelva a evaluar el último comando LOCATE. El programa comprueba si el nuevo valor contenido en cInitials ya existe en el campo person_id de otro registro. Si es así, FOUND( ) seguirá devolviendo el valor .T. y se volverá a ejecutar el código contenido en el bucle DO WHILE. Si el nuevo valor contenido en cInitials es efectivamente único, FOUND( ) devolverá el valor .F. y la ejecución del programa continuará con la línea de código que aparece después de ENDDO.
ENDDO
Final del bucle DO WHILE.
GOTO nHere
REPLACE person_id WITH cInitials
Vuelve al registro y almacena el código de identificación exclusivo en el campo person_id.

Puesto que no hay manera de saber de antemano cuántas veces se encontrarán los códigos de identificación coincidentes que ya se están utilizando, se utiliza el bucle DO WHILE.

Vea también

Construir un programa pequeño | Trabajar con tablas | SCAN ... ENDSCAN | FOR ... ENDFOR | DO WHILE ... ENDDO | IF ... ELSE ... ENDIF | DO CASE ... ENDCASE | GETDIR( ) | USE