Cobol - Ayuda

 
Vista:

Ayuda

Publicado por Chica-Novata (1 intervención) el 25/08/2011 18:47:26
Hola, estoy estudiando cobol y estoy liada con algo, necesito ayuda haber si alguien me pueda echar una mano con este tema. Lo que pretendo es pasar 3 registro de un archivo sequencial llamado (alta) a un archivo indexado llamado (cliente). No tengo ni idea de como hacerlo, me confundo con la invalid key y no invalid key, alguien me puede echar una mano viendo el código por favor. Muchas gracias de antemano.


IDENTIFICATION DIVISION.
PROGRAM-ID. EJERCICIO.
AUTHOR. LA NOVATA.


ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.

INPUT-OUTPUT SECTION.
FILE-CONTROL.

SELECT ALTA ASSIGN TO DISK 'ALTAS.DAT'
ORGANIZATION LINE SEQUENTIAL
ACCESS SEQUENTIAL.

SELECT CLIENTE ASSIGN TO DISK 'CLIENTES.DAT'
ORGANIZATION INDEXED
ACCESS RANDOM
RECORD KEY CODIGO
ALTERNATE RECORD KEY NOMBRE DUPLICATES.


DATA DIVISION.
FILE SECTION.

FD ALTA
LABEL RECORD STANDARD.
01 REG-ALTA.
02 COD PIC X.
02 NOM PIC X(5).
02 IMP PIC X(25).

FD CLIENTE
LABEL RECORD STANDARD.
01 REG-CLI.
02 CODIGO PIC X(5).
02 NOMBRE PIC X(25).
02 POBLACION PIC X(25).
02 IMPORTE PIC 9(6)V9(2).
02 ALTA.
03 ANIO PIC X(4).
03 MES PIC X(2).
03 DIA PIC X(2).

WORKING-STORAGE SECTION.
77 FIN PIC X.

PROCEDURE DIVISION.
INICIO-PROGRAMA.
OPEN INPUT ALTA.
OPEN I-O CLIENTE.

MOVE 'N' TO FIN.

READ ALTA AT END MOVE 'S' TO FIN
END-READ.

PERFORM UNTIL FIN = 'S'
WRITE CLIENTE INVALID
MOVE COD OF REG-ALTA TO CODIGO
MOVE NOM OF REG-ALTA TO NOMBRE
MOVE IMP OF REG-ALTA TO IMPORTE
WRITE REG-CLI

NOT INVALID
DISPLAY ' El cliente YA existe'

END-WRITE

READ ALTA AT END MOVE 'S' TO FIN
END-READ
END-PERFORM.

DISPLAY SPACES ERASE
DISPLAY CODIGO '-' NOMBRE '-' I MPORTE

CLOSE ALTA.
CLOSE CLIENTE.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda

Publicado por Jose Ramon Castelo (11 intervenciones) el 31/08/2011 13:58:39
Hola, he modificado tu código para que funcione. Lo que estabas haciendo mal era el tema de la escritura. Te indico lo que he modificado como comentarios en el programa

IDENTIFICATION DIVISION.
PROGRAM-ID. EJERCICIO.
AUTHOR. LA NOVATA.


ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.

INPUT-OUTPUT SECTION.
FILE-CONTROL.

SELECT ALTA ASSIGN TO DISK 'ALTAS.DAT'
ORGANIZATION LINE SEQUENTIAL
ACCESS SEQUENTIAL.

SELECT CLIENTE ASSIGN TO DISK 'CLIENTES.DAT'
ORGANIZATION INDEXED
ACCESS RANDOM
RECORD KEY CODIGO
ALTERNATE RECORD KEY NOMBRE DUPLICATES.


DATA DIVISION.
FILE SECTION.

FD ALTA
LABEL RECORD STANDARD.
01 REG-ALTA.
02 COD PIC X.
02 NOM PIC X(5).
02 IMP PIC X(25).

FD CLIENTE
LABEL RECORD STANDARD.
01 REG-CLI.
02 CODIGO PIC X(5).
02 NOMBRE PIC X(25).
02 POBLACION PIC X(25).
02 IMPORTE PIC 9(6)V9(2).
02 ALTA.
03 ANIO PIC X(4).
03 MES PIC X(2).
03 DIA PIC X(2).

WORKING-STORAGE SECTION.
77 FIN PIC X.

PROCEDURE DIVISION.
INICIO-PROGRAMA.
OPEN INPUT ALTA.
OPEN I-O CLIENTE.

MOVE 'N' TO FIN.

* El DISPLAY SPACES ERASE borra la pantalla por lo que hay que ponerlo
* al principio del programa, no al final.

DISPLAY SPACES ERASE

READ ALTA AT END MOVE 'S' TO FIN
END-READ.

PERFORM UNTIL FIN = 'S'
* Lo primero que hay que hacer es comprobar si ya existe creado el
* cliente, para eso se mueve el valor del registro leido a la clave
* del fichero de clientes y se lee.

MOVE COD OF REG-ALTA TO CODIGO
READ CLIENTE
* En caso de que no exista el registro (INVALID KEY) se mueven los
* datos del fichero secuencial y se graba en el fichero de clientes.
* Es muy importante el END-WRITE que has puesto porque sino el
* NOT INVALID corresponderia al 'WRITE CLI-REG', no al 'READ CLIENTE'

INVALID
MOVE COD OF REG-ALTA TO CODIGO
MOVE NOM OF REG-ALTA TO NOMBRE
MOVE IMP OF REG-ALTA TO IMPORTE
WRITE REG-CLI
END-WRITE
* Aqui se pinta los datos del registro leido, donde lo tenias puesto tu
* solo apareceria el ultimo registro leido.

DISPLAY CODIGO '-' NOMBRE '-' I MPORTE
* En caso de que el registro ya exista en el fichero CLIENTE, muestra el
* mensaje en pantalla.

NOT INVALID
DISPLAY ' El cliente YA existe'
* Aqui termina todo lo relacionado con la lectura del registro CLIENTE
END-READ

READ ALTA AT END MOVE 'S' TO FIN
END-READ
END-PERFORM.

CLOSE ALTA.
CLOSE CLIENTE.


Espero haber ayudado.
Un saludo desde A Coruña (España).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda

Publicado por Chica-Novata (1 intervención) el 13/09/2011 12:18:36
Muchas gracias Jose Ramon por la explicación, muy útil para mí que soy una principiante.

Un saludo desde Madrid.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar