Curso de Cobol y PowerCobol

¿Cómo crear secuencias con PERFORM THRU y THROUGH?

Capítulo 38: Ejecutar múltiples párrafos PERFORM THRU y THROUGH

En esta ocasión vas a aprender una forma nueva de utilizar los PERFORM. Se trata de PERFORM THRU.

Metalenguaje COBOL de PERFORM THRU

Metalenguaje cobol de PERFORM THRU

¿Qué podemos hacer con PERFORM THRU?

Con PERFORM THRU, podemos ejecutar múltiples párrafos en un rango especificado. Es decir, si tenemos que ejecutar, por ejemplo, tres párrafos seguidos, podemos utilizar tres PERFORM o bien, crear un rango con PERFORM THRU que ejecute los tres en el orden en el que se encuentran en el código.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo38.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77  Nombre PIC X(15) VALUE SPACES.
       77  Apellidos PIC X(35) VALUE SPACES.

       PROCEDURE DIVISION.
       Saludo.
           DISPLAY "Hola".
      *> Con este PERFORM, llamamos a todos los párrafos que se
      *> encuentren entre los párrafos SolicitaNombre y
      *> SolicitaApellidos.
           PERFORM SolicitaNombre THRU SolicitaApellidos.
           DISPLAY "Hola " Nombre " " Apellidos.
           STOP RUN.

       SolicitaNombre.
           DISPLAY "¿Me puedes decir tu nombre?".
           ACCEPT Nombre.

       SolicitaApellidos.
           DISPLAY "¿Me puedes decir tus apellidos?".
           ACCEPT Apellidos.

       END PROGRAM Capitulo38.

Primero, el programa nos dice saluda. Acto seguido, con PERFORM THRU, nos lleva al párrafo SolicitaNombre. Aquí, se le pide el nombre al usuario. Seguimos con el siguiente párrafo, donde se le piden los apellidos. Se vuelve a la siguiente línea del PERFORM THRU. Se muestra un saludo con los datos del usuario y se finaliza la ejecución del programa.

Hola
¿Me puedes decir tu nombre?
Enrique
¿Me puedes decir tus apellidos?
Apellido Apellido
Hola Enrique         Apellido Apellido

Te dejo el código sin utilizar PERFORM, Con la finalidad de que compares lo que pasaría. Así podrás comparar y tener claras las diferencias.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo38.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77  Nombre PIC X(15) VALUE SPACES.
       77  Apellidos PIC X(35) VALUE SPACES.

       PROCEDURE DIVISION.
       Saludo.
           DISPLAY "Hola".
           DISPLAY "Hola " Nombre " " Apellidos.

       SolicitaNombre.
           DISPLAY "¿Me puedes decir tu nombre?".
           ACCEPT Nombre.

       SolicitaApellidos.
           DISPLAY "¿Me puedes decir tus apellidos?".
           ACCEPT Apellidos.

           STOP RUN.

       END PROGRAM Capitulo38.

Los puntos "·" después del segundo hola, los he puesto para que puedas ver que hay espacios en blanco. Eso es en realidad lo que aparece en la consola. Estos espacios son los que provocan los PICTURE de las variables (Ya veremos más adelante, como formatear el texto para que quede bien presentado). Puesto que no hay PERFORM, los párrafo se ejecutan con el flujo normal de COBOL, de arriba a abajo. En este caso, habría que modificar el programa y poner el segundo DISPLAY después de los párrafos.

También, he cambiado de posición el STOP RUN, ya que si lo dejaba en Saludo, ni siquiera le preguntaría al usuario por el nombre y los apellidos.

Hola
Hola····················································
¿Me puedes decir tu nombre?
Enrique
¿Me puedes decir tus apellidos?
Apellido

Ahora, probemos con un PERFORM a SolicitaNombre.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo38.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77  Nombre PIC X(15) VALUE SPACES.
       77  Apellidos PIC X(35) VALUE SPACES.

       PROCEDURE DIVISION.
       Saludo.
           DISPLAY "Hola".
           PERFORM SolicitaNombre.
           DISPLAY "Hola " Nombre " " Apellidos.
           STOP RUN.

       SolicitaNombre.
           DISPLAY "¿Me puedes decir tu nombre?".
           ACCEPT Nombre.

       SolicitaApellidos.
           DISPLAY "¿Me puedes decir tus apellidos?".
           ACCEPT Apellidos.

       END PROGRAM Capitulo38.

En este caso, me pide el nombre, pero no llega a ejecutarse el párrafo para los apellidos.

Hola
¿Me puedes decir tu nombre?
Enrique
Hola Enrique············································

Pues bien, para que funcionara esto exactamente como el primer ejemplo, pero sin PERFORM THRU, habría que poner dos PERFORM seguidos.

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo38.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77  Nombre PIC X(15) VALUE SPACES.
       77  Apellidos PIC X(35) VALUE SPACES.

       PROCEDURE DIVISION.
       Saludo.
           DISPLAY "Hola".
           PERFORM SolicitaNombre.
           PERFORM SolicitaApellidos.
           DISPLAY "Hola " Nombre " " Apellidos.
           STOP RUN.

       SolicitaNombre.
           DISPLAY "¿Me puedes decir tu nombre?".
           ACCEPT Nombre.

       SolicitaApellidos.
           DISPLAY "¿Me puedes decir tus apellidos?".
           ACCEPT Apellidos.

       END PROGRAM Capitulo38.

PERFORM THRU funciona con los párrafos que quieras. Solo piensa, que con esto, estamos haciendo que varios párrafos funcionen como uno solo. Es una ventaja, pero también una fuente de posibles errores.

Si yo escribo un programa con muchas líneas y muchos párrafos y utilizo PERFORM THRU corro el riesgo de cometer errores cuando retoque en el futuro el programa o lo hagan otros.

Aquí tienes un claro ejemplo:

⁠⁠       IDENTIFICATION DIVISION.
       PROGRAM-ID. Capitulo38.
       DATA DIVISION.
       FILE SECTION.
       WORKING-STORAGE SECTION.
       77  Nombre PIC X(15) VALUE SPACES.
       77  Apellidos PIC X(35) VALUE SPACES.

       PROCEDURE DIVISION.
       Saludo.
           DISPLAY "Hola".
           PERFORM SolicitaNombre THROUGH SolicitaApellidos.
           DISPLAY "Hola " Nombre " " Apellidos.
           STOP RUN.

       SolicitaNombre.
           DISPLAY "¿Me puedes decir tu nombre?".
           ACCEPT Nombre.

       ParrafoCualquiera.
           DISPLAY "Este es un mensaje de un párrafo cualquiera.".

       SolicitaApellidos.
           DISPLAY "¿Me puedes decir tus apellidos?".
           ACCEPT Apellidos.

       END PROGRAM Capitulo38.

Por cierto, he utilizado esta vez THROUGH en lugar de THRU. No hay diferencia, son sinónimos.

En este caso, tampoco es que rompa el programa, solo imprime una línea que no tiene nada que ver. Al funcionar todos los PERFORM simultáneos como un único bloque, los párrafos que haya entre medio, los va a ejecutar también, aunque los pongamos por error.

Esto es muy fácil de ver y de solucionar con pocas líneas. En un programa "real", puede convertirse en un suplicio.

Hola
¿Me puedes decir tu nombre?
Enrique
Este es un mensaje de un párrafo cualquiera.
¿Me puedes decir tus apellidos?
Apellido Apellido
Hola Enrique         Apellido Apellido                  

Mi recomendación, es que documentes muy bien los programas, de esa forma, no tendrás problemas ni con PERFORM THRU ni con nada.


Comentarios

Si te quedan dudas sobre el temario, sobre Cobol, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.