PDA

Ver la Versión Completa : [Sintaxis] SORT - colar datos registro precedente


SwimPiii
22 de abril de 2021, 13:37
Buenos días Coboleros,

Tengo la siguiente duda respecto a si es posible o no realizar lo siguiente:

Partiendo de un fichero de entrada A, cuyo formato es: tipo registro (2) + datos (n) + ID (10)

Entrada
01.....0000000001
01.....0000000002
01.....0000000003
02.....0000000000
02.....0000000000
01.....0000000004
02.....0000000000

Quisiera poder conseguir un fichero B con el siguiente formato:

Salida
01.....0000000001 0000000001
01.....0000000002 0000000002
01.....0000000003 0000000003
02.....0000000000 0000000003
02.....0000000000 0000000003
01.....0000000004 0000000004
02.....0000000000 0000000004

El sentido de esto es que necesito que los registros cuyo tipo sea distinto de '01', lleven al final el ID de su tipo de registro '01' anterior. Es como si los '02' estuvieran "englobados" en los tipo '01'.

No sé si esto se puede hacer con un paso de SORT, ICETOOL o herramienta similar. Sabría abordarlo con Easytrieve, pero estoy intentando aprender algo nuevo sobre SORT.

Mil gracias de antemano a todos!

Un saludo!

JCantero
23 de abril de 2021, 00:53
Para el ejemplo que has puesto si no he entendido mal, no hace falta un sort

La fd del fichero entrada:


01 reg-entrada.
02 id-e pic xx.
* suponiendo que n = 40
02 datos-e pic x(40).
02 cadena1-e pic x(10).


La fd del fichero salida:

01 reg-salida.
02 id-s pic xx.
* suponiendo que n = 40
02 datos-s pic x(40).
02 cadena1-s pic x(10).
02 cadena2-s pic x(10).


La variable de working cadena tendria el ultimo leido
y fs- entrada file status del fichero entrada


01 cadena pic x(10).
02 fs-entrada pic xx.
88 esta-entrada value '00' '02'.
88 n-esta-entrada value '23'.
88 fin-entrada value '46' '10'.
88 bloqueado-entrada value '99' '90'.
88 f-bloqueado-entrada value '38' '93'.
88 f-noexiste-entrada value '35'.



Y ya un bucle para leer el fichero entrada hasta el final


open input entrada
open output salida
initialize reg-entrada
move '0000000000' to cadena
read entrada next record end-read
perform until fin-entrada
initialize reg-salida
move reg-entrada to reg-salida
if id-e = '01' then
move cadena1-e to cadena
end-if
move cadena to cadena2-s
write reg-salida end-write
initialize reg-entrada
read entrada next record end-read
end-perform.
close entrada salida.



Esto es salvo error u omision, Pero eso seria la idea

SwimPiii
23 de abril de 2021, 10:40
Muchas gracias por tu respuesta!

No, la cuestión es que debería hacerlo mediante la herramienta SORT, para evitar la subida de programas COBOL.

¿Se os ocurre cómo?

Un saludo y mil gracias!

JCantero
23 de abril de 2021, 12:33
"para evitar la subida de programas COBOL." ?

No entiendo lo que dices. Desarrolla el objetivo del fichero de salida.

Si deseas utilizar "sort" seria un bucle parecido cambiando el write por release y luego realizar un bucle de lectura con return. Ademas meter un criterio de oden que no acabo de entender.

Lo quieres hacer en cobol, en un script .bat (windows), script en linux, c, php, java, js, .... ?

SwimPiii
26 de abril de 2021, 11:08
Buenas,

Lo que estoy intentando es, mediante la herramienta SORT (o ICETOOL o ICEMAN), en un paso de JCL, obtener el fichero de salida a partir del de entrada.

La dificultad recae en que necesito que los registros '02' lleven la referencia correcta. Dicha referencia correcta es la perteneciente al registro '01' anterior. Pero claro, pueden existir 'n' registros 02 pertenecientes al mismo 01.

Cito otro ejemplo

Entrada

01.....0000000001
01.....0000000002
01.....0000000003
02.....0000000000
02.....0000000000
02.....0000000000
01.....0000000004
02.....0000000000
02.....0000000000
01.....0000000005
02.....0000000000
02.....0000000000
02.....0000000000
02.....0000000000

Salida

01.....0000000001 0000000001
01.....0000000002 0000000002
01.....0000000003 0000000003
02.....0000000000 0000000003
02.....0000000000 0000000003
02.....0000000000 0000000003
01.....0000000004 0000000004
02.....0000000000 0000000004
02.....0000000000 0000000004
01.....0000000005 0000000005
02.....0000000000 0000000005
02.....0000000000 0000000005
02.....0000000000 0000000005
02.....0000000000 0000000005

Muchas gracias!

Un saludo

Kuk
26 de abril de 2021, 11:35
@SwimPiii, no puedes hacerlo con SORT. Debes pasar por ICETOOL, echale un ojo a la documentación del mismo y busca GROUP.
ICETOOL es una herramienta hiperpoderosa, pero un tanto compleja.

Mira este ejemplo, para darte una idea: [Sintaxis] ICETOOL - un ejemplo batsante potente - COBOL Foro (https://www.cobolforo.es/showthread.php?t=407)

Sobre todo esta parte:

OUTREC IFTHEN=(WHEN=GROUP,
BEGIN=(51,1,ZD,EQ,0),
END=(51,1,ZD,EQ,6),
PUSH=(7:52,17))


Si lo quieres hacer por herramienta IBM si o si, no te queda otra.

Lo que se podría hacer tambien es via varios steps de SORT, pero sería más bien una chapuza, aunque funcionar funcionaría, yo creo.

Llevo tiempo sin tocar el JCL :)