Compartir a través de


Construir un programa pequeño

Cuando entienda los conceptos básicos, la programación será un proceso repetitivo. Los pasos se repiten numerosas veces, perfeccionándose el código a medida que se avanza. Al principio, someterá el código a prueba frecuentemente mediante un sistema de prueba y tanteo. Cuanto más conozca el lenguaje, mayor será la rapidez con que pueda programar y podrá realizar más pruebas preliminares mentalmente.

Entre los pasos básicos de la programación cabe citar los siguientes:

  • Definir el problema.
  • Descomponer el problema en elementos discretos.
  • Construir los elementos.
  • Comprobar y perfeccionar los elementos.
  • Ensamblar los elementos.
  • Comprobar el programa en su conjunto.

A continuación se enumeran algunos aspectos que debe tener presentes al empezar a programar:

  • Defina claramente el problema antes de intentar resolverlo. Si no lo hace, acabará por realizar numerosos cambios, desechará código, tendrá que empezar de nuevo o bien terminará con un resultado que no es realmente lo que deseaba.
  • Desglose el problema en pasos manejables, en lugar de intentar resolver todo el problema de una sola vez.
  • Pruebe y depure secciones de código a medida que desarrolla el programa. Compruebe que el código hace lo que quiere que haga. La depuración es el proceso de encontrar y solucionar problemas que impiden que el código se ejecute correctamente.
  • Perfeccione los datos y el almacenamiento de datos para facilitar la manipulación de estos datos a través del código del programa. Esto suele implicar estructurar las tablas de forma adecuada.

En el resto de esta sección se describen los pasos que debe seguir para crear un pequeño programa de Visual FoxPro.

Definir el problema

Suponga que obtiene muchos datos de distintos orígenes. Si bien la mayoría de los datos son estrictamente numéricos, algunos valores contienen guiones y espacios en blanco además de números. Suponga que quiere eliminar todos los espacios en blanco y los guiones de dichos campos y guardar los datos numéricos.

En lugar de intentar eliminar los espacios en blanco y los guiones de los datos originales, podría formular el objetivo del programa como:

Objetivo   Reemplazar los valores existentes de un campo por otros valores que contengan todo lo que contenían los valores originales, excepto los espacios en blanco y los guiones.

Esta formulación evita la dificultad que supone manipular una cadena de caracteres que sigue cambiando su longitud a medida que trabaja con ella.

Descomponer el problema

Puesto que tiene que indicar instrucciones específicas a Visual FoxPro en términos de operaciones, comandos y funciones, debe descomponer el problema en pasos discretos. La tarea más discreta para este problema sería examinar cada carácter de la cadena. Hasta que pueda examinar un carácter individualmente, no podrá determinar si desea guardarlo.

Una vez que examine un carácter, deberá comprobar si se trata de un guión o de un espacio en blanco. En este momento, quizá desee perfeccionar la declaración del problema. ¿Y si obtuviera más adelante datos que contienen paréntesis de apertura y de cierre? ¿Y si desea deshacerse de los símbolos de moneda, las comas y los puntos? Cuanto más genérico pueda hacer el código, más trabajo se ahorrará de ahora en adelante; lo principal es ahorrar trabajo. He aquí una formulación del problema válida para una variedad mucho mayor de datos:

Objetivo perfeccionado   Reemplazar los valores existentes en un campo por otros valores que contengan únicamente los caracteres numéricos de los valores originales.

Con esta formulación, ahora puede volver a plantear el problema a nivel de carácter: si el carácter es numérico, guardar el carácter; si el carácter es no numérico, pasar al siguiente carácter. Cuando haya construido una cadena que sólo contenga los elementos numéricos de la cadena inicial, podrá reemplazar la primera cadena y pasar al siguiente registro hasta que haya terminado con todos los datos.

Para resumir, el problema se descompone en los siguientes pasos:

  1. Examinar cada carácter.
  2. Decidir si el carácter es numérico o no.
  3. Si es numérico, copiarlo a la segunda cadena.
  4. Cuando haya terminado con todos los caracteres de la cadena original, reemplazar la cadena original con la cadena que sólo contiene valores numéricos.
  5. Repetir estos pasos para todos los registros de la tabla.

Construir los elementos

Cuando sepa qué debe hacer, puede empezar a formular los elementos en términos de comandos, funciones y operadores de Visual FoxPro.

Como los comandos y funciones se usan para manipular datos, tiene algunos datos de prueba para trabajar con ellos. Los datos de prueba sirven para simular los datos verdaderos lo mejor posible.

Para este ejemplo puede almacenar en una variable una cadena de prueba introduciendo el siguiente comando en la ventana Comandos:

cTest = "123-456-7 89 0"

Examinar cada carácter

En primer lugar, desea examinar un único carácter de la cadena. Para obtener una lista de funciones que se pueden utilizar para manipular cadenas, vea Funciones de caracteres.

Verá tres funciones que devuelven determinadas secciones de una cadena: LEFT( ), RIGHT( ) y SUBSTR( ). De estas tres funciones, SUBSTR( ) devuelve caracteres de cualquier parte de la cadena.

SUBSTR( ) usa tres argumentos o parámetros: la cadena, la ubicación inicial dentro de la cadena y el número de caracteres que se deben devolver de la cadena, empezando por la ubicación inicial. Para comprobar si SUBSTR( ) va a hacer lo que usted quiere, podría escribir los siguientes comandos en la ventana Comandos:

? SUBSTR(cTest, 1, 1)
? SUBSTR(cTest, 3, 1)
? SUBSTR(cTest, 8, 1)

Resultados

1
3
-

Puede ver que en la ventana principal de Visual FoxPro se muestran el primer, el tercer y el octavo caracteres de la cadena de prueba.

Para hacer eso mismo varias veces, utilice un bucle. Puesto que la cadena de prueba tiene un número determinado de caracteres (14), puede utilizar un bucle FOR. El contador del bucle FOR se incrementa cada vez que se ejecuta el código del bucle, por lo que puede utilizar el contador de la función SUBSTR( ). En la ventana Comandos podría probar las construcciones de bucles, pero en algún momento deseará guardar su trabajo para crearlos más tarde. Esta sería una buena ocasión para crear un nuevo programa.

Para crear un programa nuevo

  1. Escriba el siguiente comando en la ventana Comandos:

    MODIFY COMMAND numonly
    
  2. En la ventana que aparecerá, escriba las siguientes líneas de código:

    FOR nCnt = 1 TO 14
       ? SUBSTR(cTest, nCnt, 1)
    ENDFOR
    

Ahora que ha creado un programa, ya puede ejecutarlo.

Para ejecutar un programa

  1. En la ventana del programa abierto, presione CTRL+E.
  2. Si aparece un cuadro de diálogo Guardar, elija Aceptar.

Cuando ejecute este programa, los caracteres individuales de la cadena de prueba se imprimirán en líneas distintas en la ventana principal de Visual FoxPro.

Ya ha completado la primera tarea. Ahora puede examinar cada carácter de la cadena.

Decidir si el carácter es numérico

Cuando tenga un único carácter de la cadena, debe saber si se trata de un número. Puede hacerlo con ISDIGIT( ).

Puede probar los siguientes comandos en la ventana Comandos:

? ISDIGIT('2')
? ISDIGIT('-')
? ISDIGIT(SUBSTR(cTest, 3, 1))

Resultados

.T.
.F.
.T.

De este resultado se desprende que ‘2’ es un número, ‘ – ’ no es un número y el tercer carácter en cTest, 3, es un número.

Si el carácter es numérico, copiarlo a la segunda cadena

Ahora que puede examinar los caracteres y determinar si son o no numéricos, necesita una variable para almacenar los valores numéricos: cNumOnly.

Para crear la variable, debe asignarle un valor inicial, una cadena de longitud cero:

cNumOnly = ""

A medida que el bucle FOR recorre la cadena, es conveniente crear otra variable para almacenar temporalmente cada carácter de la cadena a medida que ésta se manipula:

cCharacter = SUBSTR(cTest, nCnt, 1)

Sugerencia   Normalmente es mejor almacenar en una variable el resultado de un cálculo, evaluación o función. Entonces puede manipular la variable en lugar de tener que repetir el cálculo o la evaluación.

La siguiente línea de código puede utilizarse cada vez que se encuentra un número para sumar el número a la segunda cadena:

cNumOnly = cNumOnly + cCharacter

Hasta ahora, el programa es el siguiente:

cNumOnly = ""
FOR nCnt = 1 TO 14
   cCharacter = SUBSTR(cTest, nCnt, 1)
   IF ISDIGIT(cCharacter)
      cNumOnly = cNumOnly + cCharacter
   ENDIF
ENDFOR

Comprobar los elementos

Si agrega unos cuantos comandos al final para mostrar las cadenas y ejecutar el programa, podrá ver que el programa funciona con la cadena de prueba:

cNumOnly = ""
FOR nCnt = 1 TO 14
   cCharacter = SUBSTR(cTest, nCnt, 1)
   IF ISDIGIT(cCharacter)
      cNumOnly = cNumOnly + cCharacter
   ENDIF
ENDFOR
? cTest
? cNumOnly

Resultados

123-456-7 89 0
1234567890

El resultado parece correcto. Pero si cambia la cadena de prueba mientras comprueba los elementos, puede tener problemas. Escriba el siguiente comando en la ventana Comandos y ejecute de nuevo el programa:

cTest = "456-789 22"

El programa generará un mensaje de error. El bucle FOR ha intentado ejecutarse 14 veces, pero en la cadena sólo había 10 caracteres. Necesita una forma de ajustar las longitudes variables de las cadenas. Use LEN( ) para devolver el número de caracteres de una cadena. Si sustituye este comando en el bucle FOR, verá que el programa funciona correctamente con ambas cadenas de prueba:

cNumOnly = ""
FOR nCnt = 1 TO LEN(cTest)
   cCharacter = SUBSTR(cTest, nCnt, 1)
   IF ISDIGIT(cCharacter)
      cNumOnly = cNumOnly + cCharacter
   ENDIF
ENDFOR
? cTest
? cNumOnly

Agrupar los elementos

Para completar la solución de programación para este problema, quizá desee volver a leer sus datos de una tabla. Cuando tenga una tabla, explore los registros y aplique su código de programa a un campo de la tabla, en lugar de a una variable.

En primer lugar, podría crear una tabla temporal que contuviera diversas cadenas de prueba. Dicha tabla podría contener un único campo de caracteres llamado Testfield, y cuatro o cinco registros:

Contenido de Testfield  
123-456-7 89 0 -9221 9220 94321 99-
456-789 22 000001 98-99-234

Cuando sustituya el nombre del campo por el nombre de la cadena de prueba, el programa será similar al siguiente:

FOR nCnt = 1 TO LEN(TestField)
   cCharacter = SUBSTR(TestField, nCnt, 1)
   IF ISDIGIT(cCharacter)
      cNumOnly = cNumOnly + cCharacter
   ENDIF
ENDFOR
? TestField
? cNumOnly

Puede ajustar manualmente el puntero de registro si explora la tabla y se desplaza por ella. Cuando el puntero de registro esté en cada uno de los registros, el programa funcionará de la forma deseada. O bien, ahora puede realizar una búsqueda continua del código de desplazamiento por la tabla en el resto de su programa:

SCAN
   cNumOnly = ""
   FOR nCnt = 1 TO LEN(TestField)
      cCharacter = SUBSTR(TestField, nCnt, 1)
      IF ISDIGIT(cCharacter)
         cNumOnly = cNumOnly + cCharacter
      ENDIF
   ENDFOR
? TestField
? cNumOnly
?
ENDSCAN

Resultados

123-456-7 89 0
1234567890

456-789 22
45678922

 -9221 9220 94321 99-
922192209432199

000001 98-99-234
0000019899234

Comprobar todo el programa

En lugar de imprimir la cadena al final del programa, quizá desee guardarla en la tabla. Para ello, utilice la siguiente línea de código:

REPLACE TestField WITH cNumOnly

El programa completo será el siguiente:

SCAN
   cNumOnly = ""
   FOR nCnt = 1 TO LEN(TestField)
      cCharacter = SUBSTR(TestField, nCnt, 1)
      IF ISDIGIT(cCharacter)
         cNumOnly = cNumOnly + cCharacter
      ENDIF
   ENDFOR
   REPLACE TestField WITH cNumOnly
ENDSCAN

Cuando tenga el programa completo, necesitará probarlo con los datos de ejemplo antes de probarlo con los datos reales.

Aumentar la robustez del programa

Un programa robusto hace lo que usted quiere que haga, pero también se anticipa a posibles problemas y se encarga de ellos. Este programa hace lo que usted desea, pero realiza algunas suposiciones que deben ser verdaderas para que funcione:

  • Hay una tabla abierta en el área de trabajo actual.
  • La tabla tiene un campo de caracteres llamado TestField.

Si la tabla no está abierta en el área de trabajo actual o si la tabla no tiene un campo de caracteres con el nombre esperado, el programa generará un mensaje de error y no realizará la tarea prevista.

Programa para eliminar los caracteres no numéricos de todos los registros de un campo

Código Comentarios
lFieldOK = .F.
Esta variable determina si existen las condiciones necesarias para que el programa funcione. Inicialmente se establece la variable en el valor falso (.F.) para suponer que las condiciones necesarias no existen.
FOR nCnt = 1 TO FCOUNT( )
   IF FIELD(nCnt) = ;
     UPPER("TestField")
      IF TYPE("TestField") = "C"
         lFieldOK = .T.
      ENDIF
      EXIT
   ENDIF
ENDFOR
Esta sección de código recorre todos los campos de la tabla actual hasta que encuentra un campo de caracteres llamado TestField. En cuanto encuentra el campo correcto, lFieldOK se establece como verdadero (.T.) y EXIT finaliza el bucle (no hay ninguna razón para continuar con la comprobación una vez identificado el campo correcto). Si ningún campo cumple los criterios, lFieldOK seguirá siendo falso (.F.).
IF lFieldOK
La sección de conversión del programa sólo se ejecuta si en la tabla activa actualmente hay un campo de caracteres llamado TestField.
SCAN
   cNumOnly = ""
   FOR nCnt = 1 TO LEN(TestField)
     cCharacter = ;
    SUBSTR(TestField, nCnt, 1)
     IF ISDIGIT(cCharacter)
     cNumOnly = cNumOnly + ;
     cCharacter
     ENDIF
   ENDFOR
El código de conversión.
   REPLACE TestField WITH ;
  cNumOnly
ENDSCAN
 
ENDIF
Fin de la condición IF lFieldOK.

La mayor limitación de este programa es que sólo puede utilizarlo para un campo. Si desea eliminar los caracteres no numéricos de un campo distinto de TestField, tendrá que recorrer el programa y cambiar cada aparición de TestField por el nombre del otro campo.

Convertir el programa a una función le permite hacer que el código que ha escrito sea más genérico y más reutilizable, con lo que ahorrará trabajo más adelante.

Vea también

Procedimientos y funciones definidas por el usuario | Funciones de tipo Character | Conceptos básicos de programación | Crear programas frente a entrar manualmente | Crear programas | LEFT( ) | RIGHT( ) | SUBSTR( ) | ISDIGIT( )