Sie sind auf Seite 1von 13

3/16/13

Cobol en espaol

Instr. de Variables Dar cabida en esta seccin a la explicacin de todas las instrucciones que hacen referencia a las variables y sus valores. Como todas, este grupo de instrucciones tiene su vital importancia en la programacin y son usadas habitualmente.

MOVE, es la instruccin que usaremos para enviar datos de una variable a otra u otras. Lo que en realidad hace es que la una variable adquiera un valor determinado, ya sea procedente de otra variable o bien desde un valor fijo o constante. Estos son los dos formatos que posee: Formato 1: MOVE variable, valor TOvariable, variable, variable, ....

Con el primer formato las variables que siguen al TO tomarn el dato de la variable o del valor que le preceden. De todo se ver al final una serie de ejemplos bien detallados. Siempre tendremos una serie de normas o restricciones para asegurarnos de que los valores han pasado correctamente. Los campos numricos siempre se van a alinear a la derecha, respetando la posicin del punto decimal si lo hubiera. Si la variable que recibe el campo es mas pequea, evidentemente se perdern los que no quepan y si es mas grande el resto se pondr a ceros. Si adems el campo al que se mueven los datos es de edicin, al hacer el paso del valor, este a su vez se formatear con la edicin declarada en la WORKING. Si son alfanumricos la alineacin se efectuar a la izquierda a menos que se haya especificado en la WORKING, al definirla, una justificacin a la derecha (JUST RIGHT). Al igual que en los numricos si es mas pequeo se perdern los caracteres que no quepan y si es mas grande el resto ir relleno de espacios en blanco.
www.escobol.com/modules.php?name=Sections&op=printpage&artid=18 1/13

3/16/13

Cobol en espaol

... WORKING-STORAGE SECTION. 77 NUMERO1 PIC 9(6). 77 NUMERO2 PIC 9(8)V99. 77 NUMERO3 PIC ZZZ.ZZZ,ZZ. 77 TEXTO1 PIC X(15) VALUE "LENGUAJE COBOL". 77 TEXTO2 PIC X(10). 77 TEXTO3 PIC X(20) JUST RIGHT. ... PROCEDURE DIVISION. INICIO. MOVE 1536 TO NUMERO1. MOVE NUMERO1 TO NUMERO2 NUMERO3. MOVE TEXTO1 TO TEXTO2 TEXTO3. ... Nota: Despus de aplicar estas sentencias, ste sera el resultado: NUMERO1=001536 NUMERO2=0000153600 (La coma decimal es virtual) NUMERO3= 1.536,00 TEXTO1=LENGUAJE COBOL TEXTO2=LENGUAJE C TEXTO3= LENGUAJE COBOL

Formato 2: MOVE CORR Identificador1 TO Identificador2 Agregando CORR a la instruccin conseguimos mover de una sola vez un valor entre identificadores siempre que los campos que contengan tengan el mismo nombre. Estos identificadores no pueden ir en niveles 66, 77 ni 88. El efecto es el mismo que si hicieramos tantos MOVE normales como campos iguales tuviera el identificador. No es muy usual, pero si hay casos en los que puede ser razonable su uso. No es necesario que tengan el mismo PIC, ni que estn en el mismo orden, solo que coincidan en su nombre.

www.escobol.com/modules.php?name=Sections&op=printpage&artid=18

2/13

3/16/13

Cobol en espaol

... WORKING-STORAGE SECTION. 01 DATOS1. 02 NOMBRE PIC X(30). 02 REGION PIC X(20). 02 PAIS PIC X(15). 01 DATOS2. 02 PAIS PIC X(10). 02 REGION PIC X(10). 02 NOMBRE PIC X(10). ... PROCEDURE DIVISION. INICIO. MOVE "ANDRES MONTES" TO NOMBRE IN DATOS1. MOVE "ANDALUCIA" TO REGION IN DATOS1. MOVE "ESPAA" TO PAIS IN DATOS1. MOVE CORR DATOS1 TO DATOS2. ...

Nota: Para partir con unos valores, primero los he movido a las variables del primer grupo (DATOS1). Despus de aplicar el MOVE CORR, el valor de las variables de DATOS2 sera: DATOS2: PAIS=ESPAA REGION=ANDALUCIA NOMBRE=ANDRES MON Fijaros que aunque el orden ni el tamao era el mismo, el resultado es el que queramos. INITIALIZE, se utiliza para inicializar variables segn su descripcin, es decir pondr a ceros todas las variables numricas o de edicin y a espacios en blanco las alfabticas y alfanumricas. No funciona con campos definidos como FILLER, (evidente). Y puede ser muy til para inicializar tablas completamente cuando nos referimos al nivel mas alto de la misma. ... WORKING-STORAGE SECTION. 77 TEXTO PIC X(10) VALUE "HOLA MUNDO". 77 NUMERO PIC 9(8) VALUE "12345678". ... PROCEDURE DIVISION. INICIO. INITIALIZE TEXTO NUMERO. ...
www.escobol.com/modules.php?name=Sections&op=printpage&artid=18 3/13

3/16/13

Cobol en espaol

Nota: Despus de hacer INITIALIZE el valor de TEXTO ser igual a espacios y el de NUMERO igual a ceros. Es el mismo resultado que utilizar MOVE haciendo uso de las CONSTANTES FIGURATIVAS que vimos en la Introduccin de los manuales: MOVE SPACES TO TEXTO. MOVE ZEROS TO NUMERO. El resultado es el mismo en ambos casos, pero en el segundo tenamos que saber de que tipo eran las variables para moverles SPACES o ZEROS, mientras que en el primer caso, es el compilador quien se encarga se saber el tipo de la variable.

INSPECT, esta sentencia se utiliza para contar, reemplazar o contar y reemplazar caracteres o grupos de caracteres dentro de un campo. Se puede contar las veces que aparece un caracter, o cambiar todos esos caracteres por otros, etc ... Esta instruccin tiene formatos diferentes segn lo que se desee hacer, as que vamos a ver cada uno de ellos por separado. Formato 1: INSPECT campo1 TALLYING variable1 FOR ( CHARACTERS) (( BEFORE/AFTER) INITIAL) Cadena1 (ALL)(LEADING) Cadena2 ... (Se puede repetir de nuevo) Este formato es el utilizado para contar el nmero de veces que aparece Identificador1 en el campo1 y guardar el valor en la variable1 que previamente hayamos definido en la WORKING. CHARACTERS, indica que cuente todos los caracteres del campo incluso los espacios en blanco. ALL, indica que tiene que buscar en todos los caracteres del campo, la cadena especificada en Cadena2. LEADING, indica que tiene que buscar la cadena especificada en Cadena2, pero solo hasta que encontremos uno diferente, si nada mas
www.escobol.com/modules.php?name=Sections&op=printpage&artid=18 4/13

3/16/13

Cobol en espaol

empezar es diferente el resultado sera directamente 0. BEFORE INITIAL, busca solo hasta que aparezca la cadena especificada como Cadena1. AFTER INITIAL, empieza a buscar justo despus de la cadena especificada en Cadena1.

Veamos unos ejemplos para salir de dudas. Primero vamos a definir una WORKING-STORAGE.

... WORKING-STORAGE SECTION. 77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL". 77 CONTA PIC 9(8). ... PROCEDURE DIVISION. INICIO. INSPECT TEXTO TALLYING CONTA FOR CHARACTERS. ... El valor de conta ser de 15 que son los caracteres que tiene la variable TEXTO. INSPECT TEXTO TALLYING CONTA FOR ALL "A". ... El valor de conta ser de 2 que son las veces que aparece la letra A en la variable TEXTO. INSPECT TEXTO TALLYING CONTA FOR LEADING "A". ... El valor de conta ser de 0 porque no aparece ninguna A en el primer carcter de la variable TEXTO. INSPECT TEXTO TALLYING CONTA FOR ALL "A" BEFORE INITIAL "N". ... El valor de conta ser de 1 que son las veces que aparece la letra A en la variable TEXTO hasta la aparicin del caracter N. INSPECT TEXTO TALLYING CONTA FOR ALL "A" AFTER INITIAL "G". ... El valor de conta ser de 1 que son las veces que aparece la letra A en la variable TEXTO, empezando a contar desde el caracter G.
www.escobol.com/modules.php?name=Sections&op=printpage&artid=18 5/13

3/16/13

Cobol en espaol

Formato 2: INSPECT campo1 REPLACING variable1 CHARACTERS BY Cambio1 (( BEFORE/AFTER) INITIAL)Cadena1 (ALL)(LEADING)( FIRST) Cadena2... (Se puede repetir de nuevo) Con este formato podemos cambiar caracteres de Campo1, su funcionamiento es igual que el anterior formato solo que en vez de contar reemplaza. Se ha incluido solo FIRST, que indicara que solo se reemplazara la primera vez que coincidieran las condiciones. El tamao de la sustitucin debe de ser igual al tamao sustituido, ya que la variable campo1 no puede cambiar su tamao.

... WORKING-STORAGE SECTION. 77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL". 77 CONTA PIC 9(8). ... PROCEDURE DIVISION. INICIO. INSPECT TEXTO REPLACING CHARACTERS BY "H". ... El valor de TEXTO ser "HHHHHHHHHHHHHHH", es decir cambia todos los caracteres por el caracter H. INSPECT TEXTO REPLACING ALL "A" BY "I". ... El valor de TEXTO ser "PIGINI DE COBOL", es decir ha cambiado todas las A por I. INSPECT TEXTO REPLACING FIRST "A" BY "O". ... El valor de TEXTO ser "POGINA DE COBOL", solo cambia la primera A por una O. MOVE "PAGIPATOPETOPA" TO TEXTO. INSPECT TEXTO REPLACING ALL "PA" BY "--" AFTER INITIAL "G" BEFORE INITIAL "T". ... Complicando un poco mas, el valor de TEXTO despues de la sentencia INSPECT ser PAGI--TOPETOPA, es decir se cambia
www.escobol.com/modules.php?name=Sections&op=printpage&artid=18 6/13

3/16/13

Cobol en espaol

todas las PA por -- pero empezando a buscar a partir de la primera letra G y justo hasta la letra T. MOVE "PAGIPATOPETOPA" TO TEXTO. INSPECT TEXTO TALLYING CONTA FOR ALL "PA" REPLACING ALL "TO" BY "PO" AFTER INITIAL "OP". ... Aqu hemos mezclado ambos formatos y el resultado es el siguiente. El valor de CONTA es 3 que son las veces que aparece la cadena PA en TEXTO y despus se ejecuta el REPLACING y el resultado da que TEXTO vale PAGIPATOPEPOPA, ya que ha cambiado todos los TO por PO pero despus de la cadena OP.

Formato 3:

INSPECT campo1 CONVERTING Identificador1 TO Identificador2 (( BEFORE/AFTER) INITIAL) Cadena1 ... (Se puede repetir de nuevo) Con este formato convertimos los caracteres que se especifiquen en identificador1 por los que pongamos en identificador2, respetando el orden. Veamos algunos ejemplos, se suele utilizar mucho para que al aceptar un campo nos de igual se ha sido introducido en maysculas o en minsculas ya que lo convertiriamos a alguno de los formatos.

... WORKING-STORAGE SECTION. 77 TEXTO PIC X(15) VALUE "PAGINA DE COBOL". ... PROCEDURE DIVISION. INICIO. INSPECT TEXTO CONVERTING "AO"TO "12". ... El valor de TEXTO ser "P1GIN1 DE C2B2L", convertir todas las A por 1 y todas las O por 2. INSPECT TEXTO CONVERTING " ABCDEFGHIJKLMNOPQRSTUVWXYZ" TO "abcdefghijklmnopqrstuvwxyz".
www.escobol.com/modules.php?name=Sections&op=printpage&artid=18 7/13

3/16/13

Cobol en espaol

... El valor de TEXTO ser "pagina de cobol" ya que ha convertido todas las letras maysculas por minsculas.

Para finalizar con el comando INSPECT, decir que es un comando muy particular y cada uno deber decidir en cada momento y con que situaciones utilizarlo. STRING, se utiliza para unir o concatenar campos o partes de estos y el resultado almacenarlo en otro campo. En la unin se pueden incluir tanto variables como literales o constantes de texto. STRING campo1, literal1 DELIMITED BY (campo2, literal2)(SIZE) INTO Campo3 (WITH POINTER Identificador1) ( ON OVERFLOW Sentencia1) ( NOT ON OVERFLOW Sentencia2) DELIMITED BY, indica hasta donde vamos a "coger" del campo para concatenar sin contar ese caracter o cadena que se especifique en campo2 o literal2, es decir si tenemos un campo con un valor = "HOLA" y especificamos DELIMITED BY "L" a la hora de la concatenacin nos hubiera cogido solo el HO, ya que al encontrarse la primera L hubiera parado. SIZE, indica que se pasar todo el contenido del campo1 o literal1 sin limitaciones. INTO, con esto indicamos en que variable se guardar el resultado, campo3. WITH POINTER, si incluimos esta clusula el valor de identificador1 ser en la posicin en que empezar a contener datos la variable que recibe el STRING. Ese identificador1 debe estar definido como binario. Por defecto el valor es 1. ON OVERFLOW, se ejecutara Sentencia1 si hubiera habido un error al hacer la concatenacin, por ejemplo si se especifica Identificador1 con un valor superior al tamao del Campo3. NOT ON OVERFLOW, se ejecutar Sentencia2 si no existe error en la operacin. Vamos a ver unos ejemplos y adems vamos a comparar como se hubiera hecho utilizando la Working si no existiera el STRING. ... WORKING-STORAGE SECTION. 01 LAFECHA. 02 FILLER PIC X(7) VALUE "HOY ES ". 02 LDIA PIC Z9. 02 FILLER PIC X(4) VALUE " DE ".
www.escobol.com/modules.php?name=Sections&op=printpage&artid=18 8/13

3/16/13

Cobol en espaol

02 LMES PIC X(10). 02 FILLER PIC X(4) VALUE "DE ". 02 LANIO PIC 9999. 01 FECHA. 02 DIA PIC 99 VALUE 22. 02 MES PIC 99 VALUE 06. 02 ANIO PIC 9999 VALUE 2001. 01 CONSTRING PIC X(40). 01 TABLAMES. 02 FILLER PIC X(30) VALUE "ENERO FEBRERO MARZO ". 02 FILLER PIC X(30) VALUE "ABRIL MAYO JUNIO ". 02 FILLER PIC X(30) VALUE "JULIO AGOSTO SEPTIEMBRE". 02 FILLER PIC X(30) VALUE "OCTUBRE NOVIEMBREDICIEMBRE ". 01 LATABLA REDEFINES TABLAMES. 02 TMES PIC X(10) OCCURS 12 TIMES. 01 PUNTO PIC 9(4) BINARY. ... PROCEDURE DIVISION. INICIO. MOVE DIA TO LDIA. MOVE TMES (MES) TO LMES. MOVE ANIO TO LANIO. STRING "HOY ES " DIA " DE " TMES (MES) " DE " ANIO DELIMITED BY SIZE INTO CONSTRING. ...

El valor de LAFECHA sera: HOY ES 22 DE JUNIO El valor de CONSTRING sera: HOY ES 22 DE JUNIO

DE 2001. DE 2001.

Fijaros que el resultado es el mismo pero en cambio gracias a STRING no hemos tenido que definir ninguna linea en la WORKING ni tampoco tener que mover campos de unas variables a otras. La clusula DELIMITED BY se ha puesto al final porque dicha clusula se aplica a todos los campos que la preceden, si hubieramos querido coger otra limitacin para un campo en concreto habra que haberlo especificado, por ejemplo vamos a afinar mas el ejemplo y conseguir que entre el mes JUNIO y el DE no exista mas que un espacio. En el ejemplo anterior ha unido los 10 caracteres que tiene la variable TMES.
www.escobol.com/modules.php?name=Sections&op=printpage&artid=18 9/13

3/16/13

Cobol en espaol

STRING "HOY ES " DIA " DE " DELIMITED BY SIZE TMES (MES) DELIMITED BY " " " DE " ANIO DELIMITED BY SIZE INTO CONSTRING. El valor que tendr ahora CONSTRING ser el siguiente: HOY ES 22 DE JUNIO DE 2001. Como veis la diferencia est en los espacios que le sobran al mes, que al poner DELIMITED BY " " los ha evitado porque solo ha concatenado hasta que ha encontrado el primer caracter en blanco.

MOVE 4 TO PUNTO. STRING "HOY ES " DIA " DE " DELIMITED BY SIZE TMES (MES) DELIMITED BY " " " DE " ANIO DELIMITED BY SIZE INTO CONSTRING WITH POINTER PUNTO.

El valor que tendr ahora CONSTRING ser el siguiente: HOY ES 22 DE JUNIO DE 2001. Es decir habr empezado a concatenar a partir de la posicin 4 del campo CONSTRING. Si el valor de CONSTRING previamente era espacios habra dejado 3 espacios en blanco y si hubiera sido cualquier otro hubiera respetado los 3 primeros caracteres que tuviera. UNSTRING, hace exactamente lo contrario de que hemos visto que haca STRING, es decir divide el contenido de un campo en otros. UNSTRING campo1, literal1 DELIMITED BY (campo2, literal2)(ALL) OR (campo2, literal2)(ALL) (Se puede repetir de nuevo) INTO Campo3, Campo4, .... ( DELIMITER Identificador1) ( COUNT Identificador2) (Se puede repetir de nuevo) (WITH POINTER Identificador3) (TALLYING Identificador4)
www.escobol.com/modules.php?name=Sections&op=printpage&artid=18 10/13

3/16/13

Cobol en espaol

( ON OVERFLOW Sentencia1) ( NOT ON OVERFLOW Sentencia2) DELIMITED BY, indica el lmite hasta donde vamos cogiendo el campo1 para partirlo. Igual que en STRING, solo que con la funcin a la inversa. OR, es igual que DELIMITED y se utiliza si hay varios delimitadores sobre los que buscar. INTO, indica en que campo o campos se guardar la informacin que vaya fragmentando. DELIMITER, va a contener en cada caso el elemento separador, si hemos incluido en DELIMITED varios, Identificador1 guardar el carcter que de los elegidos ha sido el causante de la fragmentacin. COUNT, cuenta el nmero de caracteres incluidos en la fragmentacin. DELIMITER y COUNT, se podrn usar si se ha especificado DELIMITED. Podemos usar tantos DELIMITER y COUNT como campos se vayan a crear en la fragmentacin. TALLYING, si especificamos esta opcin la instruccin nos guardar en Identificador4 el nmero de campos que se han utilizado en la fragmentacin. POINTER, indica desde que posicin va a ser examinado el campo que desea desfragmentar, por defecto su valor es 1, es decir desde el primer caracter. ON OVERFLOW, se ejecutara Sentencia1 si hubiera habido un error al hacer la operacin. NOT ON OVERFLOW, se ejecutar Sentencia2 si no existe error en la operacin. Vamos a hacer lo contrario de antes y conseguir una fecha numrica de una frase con la fecha: ... WORKING-STORAGE SECTION. 01 LAFECHA PIC X(30) VALUE "HOY ES 22 DE JUNIO DE 2001". 01 FECHA. 02 DIA PIC 99. 02 MES PIC 99. 02 ANIO PIC 9999. 01 CONSTRING PIC X(40). 01 TABLAMES. 02 FILLER PIC X(30) VALUE "ENERO FEBRERO MARZO ". 02 FILLER PIC X(30) VALUE "ABRIL MAYO JUNIO ". 02 FILLER PIC X(30) VALUE "JULIO AGOSTO SEPTIEMBRE". 02 FILLER PIC X(30) VALUE "OCTUBRE NOVIEMBREDICIEMBRE ".
www.escobol.com/modules.php?name=Sections&op=printpage&artid=18 11/13

3/16/13

Cobol en espaol

01 LATABLA REDEFINES TABLAMES. 02 TMES PIC X(10) OCCURS 12 TIMES. 01 CONTA PIC 99. 01 PALABRAS PIC 99. 01 LETRAS PIC 99. 01 TEXTOS. 02 TEXTO1 PIC X(20). 02 TEXTO2 PIC X(20). 02 TEXTO3 PIC X(20). 02 TEXTO4 PIC X(20). 02 ELMES PIC X(10). ... PROCEDURE DIVISION. INICIO. UNSTRING LAFECHA DELIMITED BY " " INTO TEXTO1 TEXTO2 DIA TEXTO3 ELMES COUNT LETRAS TEXTO4 ANIO. PERFORM VARYING CONTA FROM 1 BY 1 UNTIL ELMES = TMES (CONTA) OR CONTA = 12 TALLYING PALABRAS END-PERFORM ... El valor de LAFECHA era: HOY ES 22 DE JUNIO DE 2001. Despus de aplicar las instrucciones siguientes el contenido de los campos sera el siguiente: TEXTO1 = HOY TEXTO2 = ES TEXTO3 = DE TEXTO4 = DE ELMES = JUNIO DIA = 22 ANIO = 2001 FECHA = 22062001 LETRAS = 5 PALABRAS = 7 La variable PALABRAS nos ha guardado el nmero de variables utilizadas en la fragmentacin, en este caso 7. La variable LETRAS ha guardado el nmero de caracteres que ha cogido en la separacin que ha guardado en ELMES, que han sido 5 (JUNIO). Podiamos haber puesto un COUNT para cada una.

www.escobol.com/modules.php?name=Sections&op=printpage&artid=18

12/13

3/16/13

Cobol en espaol

El PERFORM de despus lo hemos hecho para encontrar en la tabla la posicin que ocupaba el nombre del mes y as poder construir la variable FECHA completa en nmerico. Vamos a hacer un ejemplo de como podramos separar un nombre completo, por ejemplo para el nuevo modelo de la Seguridad Social (en Espaa) y el sistema R.E.D.: ... WORKING-STORAGE SECTION. 01 TEXTO PIC X(30) VALUE "MONTES ROBLES, ANDRES". 01 APELLI1 PIC X(20). 01 APELLI2 PIC X(20). 01 NOMBRE PIC X(20). 01 SEPARA PIC X. 01 SEGURIDAD. 02 AP1 PIC XX. 02 AP2 PIC XX. 02 NOM PIC X. ... PROCEDURE DIVISION. INICIO. UNSTRING TEXTO DELIMITED BY " " OR ", " INTO APELLI1 APELLI2 NOMBRE. Aqu conseguimos separar cada apellido y el nombre en campos diferentes. (APELLI1, APELLI2, NOMBRE) MOVE APELLI1 TO AP1 MOVE APELLI2 TO AP2 MOVE NOMBRE TO NOM. ...

Aqu la variable SEGURIDAD tendra el valor: MOROA. Vlido para el sistema RED.

Este artculo proviene de Cobol en espaol http://www.escobol.com La direccin de esta noticia es: http://www.escobol.com/modules.php?name=Sections&op=viewarticle&artid=18
www.escobol.com/modules.php?name=Sections&op=printpage&artid=18 13/13

Das könnte Ihnen auch gefallen