Aquí, tienes un sencillo ejemplo, lo he escrito directamente, así es que puede que tenga errores y no compile bien, pero aunque sintácticamente no funcione, la lógica de programación es correcta.
COBOL Código:
IDENTIFICATION DIVISION.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT OPTIONAL ORIGEN ASSIGN TO "C:\ORIGEN.DAT"
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS NUMERO
STATUS IS STORI
SELECT OPTIONAL DESTINO ASSIGN TO "C:\DESTINO.TXT"
ORGANIZATION IS LINE SEQUENTIAL
STATUS IS STDES.
DATA DIVISION.
FILE SECTION.
FD ORIGEN GLOBAL.
01 REG-ORI.
03 DATOS.
05 NUMERO PIC 9(5).
05 NOMBRE PIC X(50).
05 DIREC PIC X(50).
05 CP PIC X(5).
05 POB PIC X(30).
03 ECO.
05 ACUM1 PIC S9(9)V999 COMP-5.
05 ACTIVO PIC X.
05 ACUM2 PIC S9(9)V999 BINARY.
05 ACUM3 PIC S9(9)V999.
FD DESTINO GLOBAL
LABEL RECORD IS STANDARD.
01 LINEA PIC X(255).
WORKING-STORAGE SECTION.
01 STDES PIC XX.
01 STORI PIC XX.
01 P PIC 999 BINARY.
01 WSEP PIC X VALUE "|". *> Lo vamos a utilizar como separador de campos.
01 CINCO-EDI PIC ZZ.ZZ9.
01 NUEVE-EDI PIC --.---.---.---,---.
01 CONTA PIC 9(5).
PROCEDURE DIVISION.
INICIO.
OPEN INPUT ORIGEN.
OPEN OUTPUT DESTINO.
POSICIONAR.
MOVE 0 TO NUMERO CONTA.
START ORIGEN KEY NOT LESS NUMERO
INVALID KEY
INVOKE POW-SELF "DisplayMessage"
USING "*Error, el fichero está vacío ..."
"*ERROR"
POW-DMICONERROR
END-INVOKE
INVOKE POW-SELF "CloseForm"
EXIT PROGRAM
END-START.
LEER.
READ ORIGEN NEXT RECORD
AT END
GO FIN-LEER
END-READ.
PERFORM MONTAR-LINEA THRU FIN-MONTAR.
GO LEER.
FIN-LEER.
MOVE CONTA TO CINCO-EDI.
MOVE SPACES TO LINEA.
STRING "Fin del traspaso. Se han pasado "
CINCO-EDI
" Registros." DELIMITED BY SIZE INTO LINEA
END-STRING.
INVOKE POW-SELF "DisplayMessage"
USING LINEA
"Información"
POW-DMICONINFORMATION
END-INVOKE
CLOSE ORIGEN DESTINO.
INVOKE POW-SELF "CloseForm".
EXIT PROGRAM.
MONTAR-LINEA.
MOVE 0 TO CINCO-EDI NUEVE-EDI P.
MOVE SPACES TO LINEA.
MOVE NUMERO TO CINCO-EDI.
STRING CINCO-EDI
WSEP
NOMBRE
WSEP
DIREC
WSEP
CP
WSEP
POB
WSEP DELIMITED BY SIZE INTO LINEA
END-STRING.
*>
*> ---- Buscamos el tamaño total almacenado para poder hacer el siguiente string
*>
COMPUTE P = FUNCTION STORED-CHAR-LENGTH (LINEA) + 1.
*>
*> ---- Después, ya no nos hace falta saber el tamaño, porque se guarda automáticamente en el "puntero" P
*>
MOVE ACUM1 TO NUEVE-EDI.
STRING ACUM1
WSEP
ACTIVO
WSEP DELIMITED BY SIZE INTO LINEA WITH POINTER P
END-STRING.
MOVE ACUM2 TO NUEVE-EDI.
STRING ACUM2
WSEP DELIMITED BY SIZE INTO LINEA WITH POINTER P
END-STRING.
MOVE ACUM2 TO NUEVE-EDI.
STRING ACUM3
DELIMITED BY SIZE INTO LINEA WITH POINTER P
END-STRING.
WRITE LINEA.
ADD 1 TO CONTA.
FIN-MONTAR.
EXIT.
Si hay algo que no entiendas, no dudes en preguntar.
Un saludo.-
Marcadores