Sei sulla pagina 1di 10

Una cadena de caracteres, es una secuencia de caracteres ASCII, encerrados entre comillas simples o dobles.

Sentencia INSPECT

Permite contar, reemplazar o contar y reemplazar ocurrencias de caracteres simples o grupos de caracteres
en un campo de datos.

Formato 1:

INSPECT identificador-1 TALLYING estructura-1 ...


Formato 2:
INSPECT identificador-1 REPLACING estructura-1 ...
Formato 3:
INSPECT identificador-1 TALLYING estructura-1 ... REPLACING estructura-2 ...
Formato 4:
INSPECT identificador-1 CONVERTING identificador-2 ... TO {identificador-3 | literal-1} {BEFORE | AFTER }
INITIAL { identificador-4 | literal-2 } ...
Estructura 1:
identificador-1 FOR {CHARACTERES estructura-1 {ALL | LEADING} {{identificador-2 | literal-1} estructura-
1}...}...
Estructura 2:
{CHARACTERES BY {identificador-1 | literal-1} estructura-1 | {ALL | LEADING | FIRST} {{identificador-1 |
literal-1} BY {identificador-2 | literal-2} estrucutra-1} ... }
Estructura 3:
[ {BEFORE | AFTER} INITIAL {identificador-1 | literal-1} ] ...
TALLYING indica que hay que contar el números de veces que aparece la cadena de caracteres designada
por identificador que acompañe a la instrucción.

CHARACTERS indica que hay que contar todos los caracteres del campo indicado.

Ejemplo:

CAMPO-A PIC 9(10) VALUE 102340567


INSPECT CAMPO-A TALLYING CONTA FOR CHARACTERS

Después de ejecutarse esta sentencia, el campo CONTA valdrá 10, ya que en CAMPO-A hay 10 dígitos
contando los 0 de relleno por la izquierda.

ALL indica que hay que contar todas las ocurrencias.

Ejemplo:

CAMPO-A PIC X(20) VALUE "111/1110ABBC"


INSPECT CAMPO-A TALLYING CONTA FOR ALL "11"

Después de ejecutarse esta sentencia, el campo CONTA valdrá 2, ya que en CAMPO-A la ocurrencia "11"
aparece dos veces. Después de la primera igualdad queda "1/111ABC" que da una segunda igualdad,
quedando "1ABC", donde no hay más repeticiones.
Cuando se da una igualdad, estos caracteres no se pueden volver a utilizar para verificar si se cumple una
segunda igualdad.

LEADING indica que sólo se desean contar las primeras ocurrencias contiguas.

Ejemplo:

CAMPO-A PIC X(20) VALUE "111/1110ABC"


INSPECT CAMPO-A TALLYING CONTA FOR LEADING "11"

Después de ejecutarse esta sentencia, el campo CONTA valdrá 1, yaque al principio de CAMPO-A,
consecutivamente, sólo se da una ocurrencia.

BEFORE INITIAL indica que el recuento se debe interrumpir después de la primera ocurrencia designada por
el identificador que le acompaña.

Ejemplo:

CAMPO-A PIC X(20) VALUE "111/1110ABC"


INSPECT CAMPO-A TALLYING CONTA FOR ALL "11" BEFORE INITIAL "/"

Después de ejecutarse esta sentencia, el campo CONTA valdrá 1, ya que hasta el carácter "/" sólo hay una
ocurrencia "11",

AFTER INITIAL indica que el recuento debe comenzar después de la primera ocurrencia designada por el
identificador que le acompaña.

REPLACING indica que en el campo denominado por el identificador que le acompaña hay que reemplazar
algunos o todos los caracteres por otros especificados en la sentencia INSPECT. Las opciones que se pueden
especificar con REPLACING son las mismas que se han especificado para TALLYING y tienen el mismo
significado, si pensamos que hay que reemplazar en lugar de contar. Aparece una opción más que es FIRST.

Ejemplo:

CAMPO-A PIC X(20) VALUE "111/1110ABC"


INSPECT CAMPO-A REPLACING ALL "11" BY "**" AFTER INITIAL "/"

Después de ejecutarse esta sentencia el campo CONTA valdrá "111/**10ABC".

FIRST indica que sólo se reemplaza la primera ocurrencia del campo denominado por identificador-1.

Ejemplo:

CAMPO-A PIC X(20) VALUE "111/1110ABC"


INSPECT CAMPO-A REPLACING FIRST "B" BY "A"

Después de ejecutar esta sentencia el campo CONTA valdrá "111/1110AABC".

Ejemplo:
CAMPO-A PIC X(20) VALUE "111/1111ABBC"
INSPECT CAMPO-A TALLYING CONTA FOR LEADING "11"
REPLACING FIRST "11" BY "**" AFTER INITIAL "/"

Después de ejecutarse esta sentencia, el campo CONTA valdrá 1 y CAMPO-A valdrá "111/**11ABBC".

Ejemplo:

CAMPO-A PIC X(20) VALUE "111/1111ABBC"


INSPECT CAMPO-A TALLYING CONTA FOR LEADING "11"
REPLACING BEFORE INITIAL "/" CONTA-1 FOR LEADING "11"
AFTER INITIAL "/"

Después de esta sentencia, el campo CONTA valdrá 1 y el campo CONTA-1 valdrá 2.

CONVERTING indica que hay que convertir cada carácter de una cadena de caracteres a los
correspondientes caracteres de otra. Ambas cadenas deben tener la misma longitud.

Ejemplo:

CAMPO-A PIC X(20) VALUE "10A/1110ABBC"


INSPECT CAMPO-A CONVERTING "1ª" TO "*/" AFTER INITIAL "/"

Después de ejecutarse esta sentencia CAMPO-A valdrá "10A/***0/BBC" ya que los caracteres "1" se
convertirán a "*" y las "A" a "/."

Ejemplo:

77 RESPUESTA PIC XX.


PERFORM TEST AFTER UNTIL RESPUESTA = "SI" OR RESPUESTA = "NO"

DISPLAY "Desea continuar SI/NO " LINE 24, POSITION 01

ACCEPT RESPUESTA LINE 24, POSITION 25

INSPECT RESPUESTA CONVERTING "sino" TO "SINO"


END-PERFORM

Para permitir que la respuesta pueda ser introducida indistintamente en mayúsculas o en minúsculas,
convertimos la respuesta dada a mayúsculas y realizamos entonces la comparación.

Sentencia STRING

Esta sentencia permite enlazar (concatenar) el contenido total o parcial de dos o más campos y almacenar el
resultado en un solo campo.

STRING {{identificador-1 | literal-1} ...

DELIMITED BY {identificador-2 | literal-2 | SIZE}} ...


INTO identificador-3 ...

[WITH POINTER identificador-4]

[ON OVERFLOW sentencia-1]

[NOT ON OVERFLOW sentencia-2]


[END-STRING]

identificador-1 o literal-1: Representa la cadena a concatenar.

identificador-3: Es el campo donde se almacenará el resultado (sin símbolos de edición).

Tanto los campos emisores como el receptor deben ser no numéricos.

DELIMITED BY: Indica hasta dónde se ha de concatenar (excluido este carácter).

SIZE: Si se especifica esta opción el número de caracteres a mover es como máximo igual al tamaño del
campo receptor.

POINTER: Por medio de identificador-4, se indica la posición en la que va a ser transferido. Por defecto es 1,
este valor se va incrementando automáticamente.

Si identificador-4 es menor que uno o mayor que el tamaño del campo receptor, la transferencia se
interrumpe y se ejecuta sentencia-1 si se ha especificado ON OVERFLOW. En caso contrario, la transferencia
se realiza totalmente y se ejecuta sentencia-2 si se ha especificado NOT ON OVERFLOW.

END-STRING: Indica el fin del ámbito de la sentencia STRING.

Ejemplo:

01 CAMPO-A PIC X(45) VALUE SPACES.


01 FECHA.

02 DIA PIC X(7) VALUE "DIA 15 ".

02 MES PIC X(10) VALUE "DEL MES 1 ".


01 ANNO PIC X(4) VALUE "1998".

STRING FECHA "correspondiente al año" SPACE ANNO

DELIMITED BY SIZE INTO CAMPO-A.

Resultado:

CAMPO-A: DIA 15 DEL MES 1 correspondiente al año 1998.

Ejemplo:
STRING FECHA "correspondiente al año" SPACE ANNO
DELIMITED BY "1" INTO CAMPO-A.

Resultado:

CAMPO-A: DIA correspondiente al año.

DELIMITED: Se aplica a todos los campos y literales que le preceden.

Ejemplo:

STRING DIA MES "correspondiente al año" SPACE ANNO

DELIMITED BY "1" INTO CAMPO-A.

Resultado:

CAMPO-A: DIA DEL MES correspondiente al año.

Ejemplo:

STRING FECHA DELIMITED BY SIZE "correspondiente al año"

SPACE ANNO DELIMITED BY "98" INTO CAMPO-A.

Resultado:

CAMPO-A: DIA 15 DEL MES 1 correspondiente al año 19.

Sentencia UNSTRING

Divide el contenido de un campo en varios.

UNSTRING identificador-1

[DELIMITED BY [ALL] {identificador-2 | literal-1}

[OR [ALL] {identificador-3 | literal-2}] ... ]

INTO {identificador-4

[DELIMITER IN identificador-5]

[COUNT IN identificador-6]

}...

[WITH POINTER identificador-7]


[TALLYING IN identificador-8]

[ON OVERFLOW sentencia-1]

[NOT OVERFLOW sentencia-2]


[END-SUBSTRING]

identificador-1: Es la cadena que hay que separar.

identificador-4: Es el campo o campos que almacenan el resultado.

identificador-2, literal-1, identificador-3, literal-2: Son campo elementales alfanuméricos que indican por
donde hay que separar la cadena.

Si se utiliza ALL las ocurrencias consecutivas indicadas por estos campos se tratan como si fueran una sola.
Es decir, con ALL "AB", las cadenas "AB", "ABAB", "ABABAB", ... son consideradas como una única ocurrencia
AB.

Si se utilizan dos o más delimitadores hay que hacer uso de la disyuntiva OR.

Ejemplo:

01 CADENA.

02 LITERAL PIC X(10) VALUE "FECHA:".

02 FECHA PIC X(10) VALUE "15/01/98".


77 POSICION PIC 99 VALUE 11.
77 DIA PIC XX.
77 MES PIC XX.
77 ANNO PIC XXXX.
77 DELI PIC X.
77 CONTA PIC 99.
77 CAMPOS PIC 9.

UNSTRING CADENA DELIMITED BY SPACE OR "/"

INTO DIA MES DELIMITER IN DELI ANNO COUNT IN CONTA

WITH PONTER POSICION

TALLYING CAMPOS.

Contenido después de ejecutar esta sentencia:

DIA: 15

MES: 01
DELI: / (delimitardor después del MES 01)

ANNO: 1998

CONTA: 04 (4 caracteres del año)

CAMPOS: 3 (número de campos afectados: DIA, MES y ANNO)

La exploración en CADENA comienza en el carácter 11, que corresponde a la primera cifra de DIA.

Los literales han de ser no numéricos o constantes figurativas.

Si se especifica la opción DELIMITER IN, los caracteres delimitadores son tratados como datos alfanuméricos
elementales y almacenados en los campos referenciados por identificador-5.

Si se especifica la opción COUNT IN, el valor correspondiente al número de caracteres examinados,


excluyendo los delimitadores, se almacena en el campo referenciado por identificador-6.

DELIMITER y COUNT solamente pueden utilizarse si se especifica la opción DELIMITED BY.

Si se especifica POINTER, la cadena identificada por identificador-1 es examinada a partir de la posición


especificada por el identificador-7. Esta posición por defecto es 1. Este campo es incrementado
automáticamente en una unidad por cada carácter examinado.

Si se especifica la opción TALLYING, el valor correspondiente al número de campos receptores activados


durante la ejecución de una sentencia UNSTRING se almacena en identificador-8.

Si se especifica la opción ON OVERFLOW y el valor del campo identificador-7 es menor que 1 o mayor que el
tamaño del campo emisor, o bien todos los campos receptores se han activado y aún quedan caracteres por
examinar en el campo emisor, la sentencia-1 se ejecuta. Si no se da una condición de ON OVERFLOW y se ha
especificado la opción NOT ON OVERFLOW, entonces se ejecuta la sentencia-2.

La cláusula END-UNSTRING delimita el ámbito de esta sentencia.

Comparación de cadenas de caracteres

Cobol, permite comparar cadenas de caracteres, para hacer uso de esta característica hay que saber que
una cadena de caracteres es menor que otra si la primera está antes que la otra alfanuméricamente. Hay
que tener presente que las letras mayúsculas son menores que las minúsculas y los dígitos son menores que
las letras.

Un carácter es menor que otro si está antes que él en el juego de caracteres que estemos utilizando.

En una comparación, todos los caracteres ASCII son válidos, esto es, el carácter nulo (ASCII 0), el carácter
blanco (ASCII 32), etc., son caracteres válidos que se deben tener en cuenta.

Ejemplo: Realizar un segmento de programa que partiendo de dos nombres los escriba ordenados
alfabéticamente por apellidos.
01 NOM-AP-1.

02 NOMBRE PIC X(15).

02 APELLIDOS PIC X(20).


01 NOM-AP-2.

02 NOMBRE PIC X(15).

02 APELLIDOS PIC X(20).


77 CADENA PIC X(35).
PROCEDURE DIVISION.
INICIO.

MOVE "Francisco" TO NOMBRE IN NOM-AP-1.

MOVE "Anasagasti Sola" TO APELLIDOS IN NOM-AP-1.

MOVE "Javier" TO NOMBRE IN NOM-AP-2.

MOVE "Anasagasti Rubio" TO APELLIDOS IN NOM-AP-2.

IF APELLIDOS IN NOM-AP-1 > APELLIDOS IN NOM-AP-2

MOVE NOM-AP-1 TO CADENA

MOVE NOM-AP-2 TO NOM-AP-1

MOVE CADENA TO NOM-AP-2

END-IF.

DISPLAY NOM-AP-1.

DISPLAY NOM-AP-2.

STOP RUN.

La comparación se realiza por el campo elemental APELLIDO, mientras que la permutación de los nombres
completos se hace utilizando los campos compuestos correspondientes y apoyándonos en un tercer campo
denominado CADENA.

Validar para aceptar solo letras y números


Publicado por gatomalo (21 intervenciones) el 13/07/2014 02:54:47
INSPECT CAMPO-INGRESO-DATOS CONVERTING '=?¡¿?'&%$#!"()= 'TO " ".
poner todos los caracteres que desees y en poner la misma cantidad de espacios en blanco
como correspondencia ejem.si son 20 caracteres en to " " 20 espacios en blancos.
0
Comentar

Validar para aceptar solo letras y números


Publicado por SuperIndio (1 intervención) el 30/07/2014 21:23:45
VALIDA-ALGUNOS-CARCTERES.

INITIALIZE U--CONTADOR, U-CHARR-NO-PERM


INITIALIZE U--MENSAJE-ERROR.
*>>
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL "@" .
ADD U--CONTADOR TO U-CHARR-NO-PERM
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL "=" .
ADD U--CONTADOR TO U-CHARR-NO-PERM
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL "?" .
ADD U--CONTADOR TO U-CHARR-NO-PERM
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL "¡" .
ADD U--CONTADOR TO U-CHARR-NO-PERM
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL "¿" .
ADD U--CONTADOR TO U-CHARR-NO-PERM
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL "?" .
ADD U--CONTADOR TO U-CHARR-NO-PERM
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL "'" .
ADD U--CONTADOR TO U-CHARR-NO-PERM
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL "&" .
ADD U--CONTADOR TO U-CHARR-NO-PERM
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL "%" .
ADD U--CONTADOR TO U-CHARR-NO-PERM
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL "$" .
ADD U--CONTADOR TO U-CHARR-NO-PERM
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL "#" .
ADD U--CONTADOR TO U-CHARR-NO-PERM
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL "!" .
ADD U--CONTADOR TO U-CHARR-NO-PERM
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL """ .
ADD U--CONTADOR TO U-CHARR-NO-PERM
INSPECT W--APELLIDO TALLYING U--CONTADOR FOR ALL "(" .")"
IF U-CHARR-NO-PERM > 0 THEN
STRING "ERR-9122 - "
"CARACTERES NO "
"PERMITIDOS EN EL APELLIDO"
DELIMITED BY SIZE U--MENSAJE-ERROR
END-STRING
END-IF