Iniciar Sesión

Ver la Versión Completa : Obtener la longitud del contenido de una variable


Kuk
16 de junio de 2020, 16:15
Amigos, hay una maravilla en Cobol que muchos desconocen. Así que he pensado en compartirla.

En Fujitsu hay una función, que es la STORED-CHAR-LENGTH la que nos dice la longitud del valor de un campo. Pero en otros Cobol esta función no existe.

Pero lo que muchos no saben, es que el verbo STRING de Cobol puede decirnoslo si lo usamos con el añadido WITH POINTER! :yess:

Ejemplo:

IDENTIFICATION DIVISION.
PROGRAM-ID. PROGRAM1.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC X(15) VALUE "ABCDE 12".
01 WS-C PIC X(15).

01 IDX-1 PIC 99 VALUE 1.

PROCEDURE DIVISION.

STRING WS-A
DELIMITED BY " "
INTO WS-C
WITH POINTER IDX-1

DISPLAY IDX-1

GOBACK
.


En IDX-1 vamos a tener el número correspondiente al primer caracter "libre" después de haber realizado el STRING, o sea en el caso del ejemplo, vamos a tener un 9.

Con lo cual, la longitud del contenido siempre será IDX-1 - 1.

Evidentemente este ejemplo es para una cadena con espacios en medio (por eso en DELIMITED hay 2 espacios) pero se puede adaptar según necesitad.

Espero que sirva a alguien.

:hi:

Gusaiello
16 de junio de 2020, 22:39
Yo hago algo parecido, pero previendo que entre medio de los datos útiles haya mas de un espacio mando cualquier cosa al final de la variable. Ejemplo :

INSPECT WS-A REPLACING TRAILING SPACES BY "!"

Se que en esta variable no puede haber "!", de lo contrario reemplazo por cualquier otro caracter.
Y si necesito la variable como estaba al inicio :

INSPECT WS-A REPLACING ALL "!" BY " "

Y todo queda como estaba.

Y en el puntero, como bien dice @Kuk, queda el número de caracteres útiles del campo.

JCantero
16 de junio de 2020, 22:53
Gracias @Kuk

Rm/cobobl lo tiene
OpenCobol acabo de probarlo y tambien.

Nitzer
16 de junio de 2020, 23:08
YO siempre utilizo STORED-CHAR-LENGTH , pero muchísimas veces :)

Kuk
17 de junio de 2020, 09:48
El de Micro Focus no lo tiene (cosa que me parece muy rara porque el Cobol de MF es el más rico normalmente), y el de IBM para Mainframes tampoco.

Gusaiello
17 de junio de 2020, 13:42
AcuCobol tampoco. Tiene funciones de todo tipo, pero esto no lo tiene.

Me refiero a la versión 5.1, no se si alguna posterior lo tendrá.

Pero bueno, con un par de pasitos extra se soluciona.

JCantero
17 de junio de 2020, 23:21
AcuCobol tampoco. Tiene funciones de todo tipo, pero esto no lo tiene.

Me refiero a la versión 5.1, no se si alguna posterior lo tendrá.

Pero bueno, con un par de pasitos extra se soluciona.


Acucobol tambien lo lleva.

https://www.microfocus.com/documentation/extend-acucobol/925/BKRFRFPROC00000001S223.html


La version rm/cobol 5.35 con la cual yo empece hace 30 años (1990) ya lo llevaba.

"string" es un estandard (COBOL-85) y en todos los cobol esa caracteristica debe de llevarla integrada al menos si es compatible COBOL-85

Gusaiello
17 de junio de 2020, 23:38
@JCantero, no me refería a STRING.

STRING viene de larga data.

Me refería a que Acu no tiene la forma de saber cuanto miden los datos útiles de una variable, y por eso hay que usar otros recursos.

JCantero
18 de junio de 2020, 09:13
@JCantero, no me refería a STRING.

STRING viene de larga data.

Me refería a que Acu no tiene la forma de saber cuanto miden los datos útiles de una variable, y por eso hay que usar otros recursos.

Lo que ha puesto @Kuk al inicio del hilo este, para ver los datos útiles de esa forma, funciona en Acu.

Kuk
18 de junio de 2020, 12:20
funciona en Acu
Debe de funcionar en cualquier Cobol.

Paulo
25 de junio de 2020, 12:57
Costumo usar a function stored-char-length.
Funciona muito bem.

dmosca
19 de marzo de 2021, 16:51
hay que cargar alguna librería? para usar el "stored-chat-length"

Josber
19 de marzo de 2021, 19:49
stored-chat-length

No, no hay que cargar ninguna librería, ero, no es "stored-chat-length", si no "stored-char-length"

Además, la manera de usarlo es con el verbo COMPUTE

como ejemplo, supongamos que la variable CLI_DIR, contiene el valor " Gran Avenida, 1", (sin las comillas y con los 5 espacios que lleva por delante)

COMPUTE WS_LEN = FUNCTION STORED-CHAR-LENGTH (CLI_DIR)

en WS_LEN, tendremos el tamaño en uso de la variable CLI_DIR, en éste caso, 20

En el manual de COBOL que hice, y que anda por el foro, hay ejemplos de casi todas las funciones intrínsecas, entre las que se encuentra ésta, búscalo y descárgatelo si quieres.

Un salu2.-