Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   NetCOBOL (https://www.cobolforo.es/forumdisplay.php?f=2)
-   -   [Sintaxis] Crear Rutina que exporte archivos DAT a TXT? (https://www.cobolforo.es/showthread.php?t=723)

KalEl 21 de septiembre de 2017 19:41

Crear Rutina que exporte archivos DAT a TXT?
 
Que tal amigos, soy muy nuevo en cobol, pero lo único que necesito es crear un pequeño programa que exporte la información de los archivos .dat a txt, con los respectivos nombres de columna.

Tengo los archivos CPY y FD, que creo son necesarios para poder hacer la exportación.
El fin de todo esto es poder tomar la información para trabajarla con sistemas de Business Intelligence.

Como puedo empezar a hacerlo? Alguien tiene alguna rutina de ejemplo?

Desde ya muchas gracias.

Josber 21 de septiembre de 2017 20:26

KalEl, No hay rutinas ya hechas para eso, es muy sencillo de hacer, abres el fichero origen para lectura, (OPEN INPUT fichero_origen), el de destino para escritura, (como tiene que ser un fichero LINE SEQUENTIAL, has de abrirlo con OPEN EXTEND fichero_destino), y después, te posicionas en el fichero_origen con un START, lo lees de manera secuencial con un READ NEXT, montas en una variable alfanumérica los campos con un STRING, grabas esa variable en el fichero destino con un WRITE y cuando termines, haces un CLOSE de los dos ficheros y ya lo tienes.

Sólo has de tener en cuenta, si los campos en el fichero destino, son de longitud fija o variable, porque lo que yo te he puesto es para longitud fija.

Si no lo entiendes bien, dilo e intentaremos poner algún ejemplo sencillo.

Un saludo.-

KalEl 21 de septiembre de 2017 23:39

1 Archivos Adjunto(s)
@Josber, Gracias por responder.
Lo voy a probar.
Te paso un .dat de ejemplo, para ver si me puedes orientar con este y hacer algunas pruebas. Y Así sigo yo con todos los demas. Lo deje adjunto en este mensaje.


Muchas gracias!

Kuk 21 de septiembre de 2017 23:55

KalEl, es un fichero indexado RMKF, o sea que puede ser perfectamente tratado por PowerCOBOL.

¿Tú lo que quieres es aprender COBOL o simplemente una "herramienta" que te haga la conversión? Si quieres aprender, intenta ir haciendo cosas y te iremos guiando y ayudando. Si es una necesidad puntual, podemos hacerte el programa nosotros.

¿Los ficheros CPY y FD que tienes son los mismos para todos los ficheros o hay juego para cada fichero de datos?

Para poder ver el fichero de datos que has colgado, tienes que pasarnos también esos 2 ficheros CPY y FD que corresponden al mismo.

KalEl 22 de septiembre de 2017 01:37

1 Archivos Adjunto(s)
No me interesa mucho aprender Cobol, solo necesito poder extraer las información de los ficheros siempre que lo necesite a TXT.
Ya se otros lenguajes como PHP, Basic, JScript, etc. Asíque creo que puedo entender la lógica si logro tener al menos un ejemplo funcional de este tipo de extractores.

Tengo un CPY que es general y los FD son por cada archivo.

Acá los adjunto.

Kuk 22 de septiembre de 2017 08:34

KalEl, de todos estos ficheros, el único que nos interesa es el FD, que contiene lo siguiente:

Código COBOL:
  1.        FD  LOCA.
  2.        01  R86.
  3.            02 CO86 PIC 9999.
  4.            02 DE86 PIC X(25).
  5.            02 HS86 PIC 999.

Lo cual quiere decir, que:
  • Los primeros 4 bytes es númro
  • Los siguientes 25 bytes es texto
  • Los siguientes 3 bytes es númro

Siendo tán pequeño, te puede interesar el siguiente programa genérico que extrae los datos: [Información] Visor archivos RM/COBOL modo texto - COBOL Foro

Luego según la información que te he dado, puedes formatear el fichero de texto en Excel.

Ya nos cuentas qué tal te ha ido.

KalEl 22 de septiembre de 2017 13:26

Gracias Kuk, acabo de probar el link que me pasaste al programita genérico, pero no me extrae la información.. Solo me muestra un resumen del archivo que abro, O no lo estoy usando bien jeje.

Al menos no me extrajo la información en ningún lado.

Luego de saber como es la estructura del archivo, como puedo indicarle esto a un script para que me genere un txt?

Kuk 22 de septiembre de 2017 14:01

KalEl, en cuanto que abras el fichero, en el mismo directorio te aparece un nuevo fichero con el mismo nombre terminando por *.out. Es decir, te generará AR86.DAT.out

Lo he comprobado y extrae bien las primeras 2 columnas, la tercera por lo visto simepre contiene nulos.

KalEl 22 de septiembre de 2017 15:51

Perfecto, ahora lo que necesitaría es el código de ese programa, ya que necesito pasar unos 15 archivos a txt cada 2 días.
O al menos que ese programa se pueda usar por línea de comando con un .bat digamos y así armarle el script para que pase uno por uno atomaticamente.

Kuk 22 de septiembre de 2017 17:02

KalEl, entonces este programa no te sirve.

Como has dicho que todos los ficheros tienen el mismo formato, te puedo crear el programa que necesitas. Eso sí, ando un poco mal de tiempo, a ver si este fin de semana te lo puedo hacer.

KalEl 23 de septiembre de 2017 00:58

Muy amable Kuk, me gustaría tener el código de esta rutina para poder usarla en los demas archivos.

Muchas Gracias!

Kuk 23 de septiembre de 2017 07:45

KalEl, ¿tú tienes el compilador?

Por cierto, la estructura que has publicado no corresponde con el fichero, porque el fichero según el programa de antes, es de longitud 59 y la estructura 4+25+3=32

KalEl 23 de septiembre de 2017 21:30

1 Archivos Adjunto(s)
Tienes Razon, encontre otro FD nuevo para ese archivo. Y da 59 el total.

Kuk 24 de septiembre de 2017 10:14

KalEl, aquí tienes el programa. Lo he probado y funciona. En la salida te crea fichero de texto plano, separando los campos por punto-coma, es decir formato CSV para poder verlo en Excel.

Desde el script CMD/Batch debes pasar los nombres de los ficheros separados por punto-coma:

Código:

CONVF001 "fichero.dat;fichero_salida.csv"
Código COBOL:
  1.  IDENTIFICATION DIVISION.
  2.  PROGRAM-ID.    CONVAR86.
  3.  
  4.  ENVIRONMENT DIVISION.  
  5.  INPUT-OUTPUT SECTION.
  6.  FILE-CONTROL.
  7.      
  8.      SELECT AR86-FILE
  9.      ASSIGN TO ZZZ-AR86
  10.      ORGANIZATION IS INDEXED
  11.      ACCESS MODE IS SEQUENTIAL
  12.      RECORD KEY IS RE-CO86
  13.      ALTERNATE RECORD RE-DE86 WITH DUPLICATES
  14.      FILE STATUS IS SW-FS.
  15.      
  16.      SELECT TXT-FILE
  17.      ASSIGN TO ZZZ-TXT
  18.      ORGANIZATION IS LINE SEQUENTIAL
  19.      FILE STATUS IS SW-FS.
  20.  
  21.  DATA DIVISION.
  22.  FILE SECTION.
  23.  FD  AR86-FILE.
  24.  01  RE-AR86.
  25.      02  RE-CO86      PIC 9999.
  26.      02  RE-DE86      PIC X(25).
  27.      02  RE-AMPLI86   PIC X(30).
  28.  
  29.  FD  TXT-FILE.
  30.  01  RE-TXT           PIC X(62). *> campos entrada + los ";"
  31.  
  32.  WORKING-STORAGE SECTION.
  33.  01  SW-FS            PIC X(2).
  34.      88  SW-FS-OK             VALUE '00' '02' '05'.
  35.      88  SW-FS-EOF            VALUE '10'.
  36.          
  37.  01  ZZZ-AR86         PIC X(50).
  38.  01  ZZZ-TXT          PIC X(50).
  39.  
  40.  01  CNT-1            PIC S9(9) COMP-5.
  41.  01  CNT-2            PIC S9(9) COMP-5.
  42.  
  43.  LINKAGE SECTION.
  44.  01  CMD-LINE.
  45.      05   CMD-LENGTH  PIC S9(4) COMP-5.
  46.      05   CMD-CONTENT PIC X(100).
  47.  PROCEDURE DIVISION USING CMD-LINE.
  48.  
  49.  DECLARATIVES.
  50.  ERR SECTION.
  51.      USE AFTER ERROR PROCEDURE ON AR86-FILE.
  52.  END DECLARATIVES.
  53.  
  54.      IF  CMD-LENGTH = 0
  55.          DISPLAY "No hay parametros en entrada. EXIT"
  56.          
  57.          GOBACK
  58.      END-IF
  59.      
  60.      UNSTRING CMD-CONTENT DELIMITED BY ";"
  61.          INTO ZZZ-AR86, ZZZ-TXT
  62.      
  63.      DISPLAY "Fichero AR86: " ZZZ-AR86
  64.      DISPLAY "Fichero TXT : " ZZZ-TXT
  65.      
  66.      PERFORM ABRIR-FICHEROS
  67.      PERFORM READ-AR86            
  68.      
  69.      PERFORM UNTIL SW-FS-EOF                
  70.          STRING RE-CO86 ";"
  71.                 RE-DE86 ";"
  72.                 RE-AMPLI86 ";"
  73.                 DELIMITED BY SIZE INTO RE-TXT
  74.          
  75.          WRITE RE-TXT
  76.          
  77.          IF  SW-FS-OK
  78.              ADD 1 TO CNT-2
  79.              
  80.          ELSE
  81.              DISPLAY "ERROR WRITE TXT, FS: " SW-FS
  82.          
  83.              GO TO 9999-ABEND
  84.          END-IF
  85.                                
  86.          PERFORM READ-AR86
  87.      END-PERFORM
  88.      
  89.      DISPLAY "Registros leidos AR86 : " CNT-1
  90.      DISPLAY "Registros escritos TXT: " CNT-2
  91.      
  92.      CLOSE AR86-FILE, TXT-FILE
  93.      
  94.      DISPLAY "Tratamiento de datos OK"
  95.      
  96.      GOBACK
  97.      .            
  98.      
  99.  ABRIR-FICHEROS.
  100.  
  101.      OPEN INPUT AR86-FILE
  102.      
  103.      IF  NOT SW-FS-OK
  104.          DISPLAY "ERROR OPEN AR86, FS: " SW-FS
  105.          
  106.          GOBACK
  107.      END-IF
  108.      
  109.      OPEN OUTPUT TXT-FILE
  110.      
  111.      IF  NOT SW-FS-OK
  112.          DISPLAY "ERROR OPEN TXT, FS: " SW-FS
  113.          
  114.          GOBACK
  115.      END-IF
  116.      .
  117.      
  118.  READ-AR86.
  119.      
  120.      READ AR86-FILE
  121.      
  122.      IF  SW-FS-OK
  123.          ADD 1 TO CNT-1
  124.          
  125.      ELSE
  126.          IF  NOT SW-FS-EOF
  127.              DISPLAY "ERROR READ AR86, FS: " SW-FS
  128.          
  129.              GOBACK
  130.          END-IF
  131.      END-IF
  132.      .
  133.          
  134.  9999-ABEND.
  135.      
  136.      DISPLAY "ABEND - exit"
  137.      
  138.      CLOSE AR86-FILE, TXT-FILE
  139.      
  140.      MOVE 8 TO RETURN-CODE
  141.      
  142.      GOBACK
  143.      .
  144.          

KalEl 24 de septiembre de 2017 22:30

Kuk, muchisimas gracias, al compilarlo estoy recibiendo los siguientes errores:
(seguramente estoy armando mal el proyecto en general)

Código:

Create Type Library for compilation...

Create H:\XXX\Red.cob...
Redexcel Redexcel-Opened(-3) : F5DC410305I-W There is no PROCEDURE DIVISION.
STATISTICS: HIGHEST SEVERITY CODE=W

Revise line information into H:\XXX\Red.cob ...
STATISTICS: HIGHEST SEVERITY CODE=I

Compile H:\XXX\Red.cob...
** DIAGNOSTIC MESSAGE ** (REDEXCEL)
Redexcel Redexcel-Opened(145) :  JMN1044I-S  The program contained within program 'POW-SCRIPTLET1' must end with an end program header. An end program header is assumed.
STATISTICS: HIGHEST SEVERITY CODE=S, PROGRAM UNIT=1

** The build has failed **


Kuk 24 de septiembre de 2017 22:43

KalEl, este programa no lo tienes que compilar en PowerCOBOL sino en NetCOBOL (Eclipse) porque es un programa Batch.

luisbago 20 de junio de 2022 16:42

algo parecido para rm/cobol, tengo el fd

JCantero 21 de junio de 2022 09:13

@luisbago, Si, puedes utilizar el ejemplo anterior (el fuente) lo modificas poniendo tu SELECT y FD para reemplazar (AR86-FILE) por el el tuyo.

Lo compilas en rmcobol y lo ejecutas.

jmeza 21 de junio de 2022 18:01

1 Archivos Adjunto(s)
KaIEI, este programa ejemplo te puede ayudar, leer un archivo .DAT y lo traspaso a TXT
slds

luisbago 23 de junio de 2022 18:01

1 Archivos Adjunto(s)
Cita:

Citación del post de JCantero (Mensaje 7925)
@luisbago, Si, puedes utilizar el ejemplo anterior (el fuente) lo modificas poniendo tu SELECT y FD para reemplazar (AR86-FILE) por el el tuyo.

Lo compilas en rmcobol y lo ejecutas.

Pues no pude, corregí varios errores pero me quedaron 2 y varios warnig, ya no se como corregir. :perdon:

mando cbl, fd.cbl y el lst

JCantero 23 de junio de 2022 19:09

Te adjunto fichero modificado.

JCantero 23 de junio de 2022 19:11

1 Archivos Adjunto(s)
Fichero subido

JCantero 23 de junio de 2022 19:19

Te envio fichero modificado sin errores ni warnings.


Cosas modificadas:

- Los warning no tienen importancia pero te lo he solucionado.
  • te faltaban palabras reservadas en las deraclaratives,
  • te faltaba la seccion inicial,
  • te faltaba un nombre de parrafo inicial
  • haces displays de campos tipos comp-3 y hay que usar la palabra reservada convert o movelos a variables de edicion.

- En una sentencia string ...... no puedes poner campos computacionales, lo he movido a un campo de edicion
- tenias varios comentarios. Si no usas directivas de compilacion los comentarios deben de empezar con un * en la columna 7 o posicionar el comentario a partir de la columana 73.

Bueno, ahi lo tienes pruebalo y ya nos dices......

luisbago 28 de junio de 2022 19:45

Código:

runcobol.exe idx2cvs 211.idx;cosa.txt
2 options no valid

runcobol.exe idx2cv
COBOL data reference error 104 at line 106 in idx2cvs
106    000013              IF  CMD-LENGTH = 0

runcobol.exe idx2cvs '211.idx;cosa.txt'
' options no valid

compilado
rmcobol 6.07 y rmcobol 7.00.02

no ejecuta el programa

JCantero 28 de junio de 2022 22:39

@luisbago, si lo ejecuta y te da una excepción de opción no válida.

Tienes que indicar al runtime que le envias parametros externos.

Prueba de esta forma: (respetando los espacios en blanco)

Código:

runcobol.exe idx2cvs a=' 211.idx; cosa.txt'

luisbago 5 de julio de 2022 16:20

Gracias, funciono con unos arreglos.

Después paso lo siguiente:

Un campo declarado en el FD "NSS PIC 9(11) COMP-3." marca el siguiente error 0147: E Data item with DISPLAY usage expected

hay varios registros declarados como comp-3, comp y comp-6, como se convierte a texto para colocarlo en el archivo declarado como *.txt (cosa.txt)

JCantero 5 de julio de 2022 16:42

@luisbago, ya te lo dije cuando te envié el .cbl arreglado.

Cita:

Citación del post de JCantero (Mensaje 7934)
- En una sentencia string ...... no puedes poner campos computacionales, lo he movido a un campo de edicion

Tienes que moverlo a un campo de edición y adjuntar ese campo.

Código COBOL:
  1.       * Si tienes este campo numerico
  2.           01 NSS PIC 9(11) COMP-3.
  3.  
  4.        * defines uno de edicion en working
  5.           01 nss-e  pic z(11).
  6.  
  7.        * en la procedure division
  8.                 move nss to nss-e.
  9.  
  10.        * y haces uso de nss-e en vez de nss

El anterior campo de edición te deja un string con espacios en blanco a la izquierda(_________123) si lo quieres así (000000000123) pon pic 9(11) en vez de pic z(11). Tambien te puede interesar pic z(10)9


La franja horaria es GMT +2. Ahora son las 13:47.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.