El control Viewer: mostrar documentos, y ahora imprimir informes COBOL en él
El Viewer es el control que muestra documentos dentro del formulario. Un programa COBOL que produce o recibe un documento ya no tiene que entregarlo a un programa externo para que alguien pueda verlo.
1. Qué lee
- Texto plano — de cualquier tamaño, paginado. El control indexa el fichero y mantiene en memoria sólo una ventana de páginas, de modo que un registro de dos gigabytes se abre y se recorre sin detener el formulario.
- Markdown — títulos, párrafos, tablas, listas de tareas, notas al pie, tachado y bloques de código.
- Imágenes — PNG, JPEG, GIF, WebP, BMP, TIFF y SVG, incluida la animación.
- PDF — su texto, su geometría de página y su búsqueda. No es un calco fiel de una página compleja, y no incluye formularios ni anotaciones.
- HTML — un subconjunto: bloques, tipografía, colores, bordes, tablas e imágenes. No es un navegador: no ejecuta JavaScript ni CSS grid o flex.
- Mermaid — diagramas de flujo y de secuencia.
Source acepta una ruta o una dirección web. Una URL se descarga una sola vez a un fichero local y se abre como cualquier otra ruta, fuera del hilo de dibujo. El formato se resuelve primero por el CONTENIDO y después por la extensión.
2. Qué hace con lo que lee
- Layout — Raw (la fuente literal), Web (con formato, sin márgenes), Print (márgenes, borde y sombra de papel), Page (maquetación de impresión sobre un cuerpo negro sobre blanco) y Streamed (un solo panel sin cromo, para alojar una conversación).
- Vista dividida — dos documentos a la vez, cada uno con su propia página, zoom, desplazamiento, búsqueda y tira de miniaturas.
- Buscar, zoom, tamaño de letra independiente del zoom, rejilla de tarjetas con las páginas en miniatura y pantalla completa.
- Selección de texto con el ratón, y menú contextual para copiarlo.
- Save As escribe los BYTES ORIGINALES del documento, nunca una recodificación. Print entrega el documento al sistema de impresión del sistema operativo.
Todo lo que el operador puede hacer con el ratón lo puede hacer también el programa: cada propiedad se lee y se escribe desde COBOL.
3. Imprimir un informe COBOL directamente en el Viewer
Un informe COBOL tenía dos destinos: la impresora y un fichero. Ahora tiene un tercero, el propio control:
Código:
SELECT REPORT-FILE ASSIGN TO VIEWER "VWR-1"
ORGANIZATION IS MARKDOWN.
"VWR-1" es el
id del control Viewer tal y como aparece en el diseñador. De FD a CLOSE el programa es el COBOL de siempre: la misma descripción de registro, el mismo OPEN OUTPUT, el mismo WRITE. Sólo cambia el destino.
Lo que decide ORGANIZATION es cómo se LEEN las líneas:
- SEQUENTIAL — texto plano, con el control de página tradicional de un fichero de impresión.
- MARKDOWN — Markdown, representado: títulos, tablas, énfasis.
- HTML — HTML, representado en el subconjunto descrito arriba.
Un informe completo, de principio a fin:
Código:
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT REPORT-FILE ASSIGN TO VIEWER "VWR-1"
ORGANIZATION IS MARKDOWN
FILE STATUS IS WS-STATUS.
DATA DIVISION.
FILE SECTION.
FD REPORT-FILE.
01 REPORT-LINE PIC X(80).
WORKING-STORAGE SECTION.
01 WS-STATUS PIC XX.
01 WS-I PIC 9(4).
PROCEDURE DIVISION.
PRINT-REPORT.
OPEN OUTPUT REPORT-FILE
MOVE "# Ventas por region" TO REPORT-LINE
WRITE REPORT-LINE
MOVE "| Region | Unidades |" TO REPORT-LINE
WRITE REPORT-LINE AFTER ADVANCING 2 LINES
MOVE "|---|---:|" TO REPORT-LINE
WRITE REPORT-LINE
PERFORM VARYING WS-I FROM 1 BY 1 UNTIL WS-I > 500
MOVE "| Norte | 1,204 |" TO REPORT-LINE
WRITE REPORT-LINE
END-PERFORM
MOVE "**Total: 602.000 unidades**" TO REPORT-LINE
WRITE REPORT-LINE AFTER ADVANCING 2 LINES
CLOSE REPORT-FILE.
Cada WRITE aporta una línea, sin los espacios finales del registro. Los espacios iniciales e intermedios se conservan, que es de lo que están hechas las columnas de un informe.
Cuándo aparece. En el CLOSE, en la vista 1. No antes: un informe a medio escribir no es un documento. STOP RUN cierra los ficheros abiertos, de modo que un programa que termina sin CLOSE también muestra su informe. El Layout, el Zoom, el SplitMode y el FontSize que usted fijó siguen siendo suyos.
Es un fichero de verdad. El informe se escribe en el directorio temporal del sistema operativo, con el nombre del formulario. Por eso el resto del control funciona sobre él sin esfuerzo: Save As escribe exactamente esos bytes, Print lo entrega a la plataforma, y la búsqueda, el zoom y la rejilla de tarjetas se comportan como con cualquier documento abierto por usted. Si ese directorio no se puede escribir, el informe se conserva en memoria y se muestra igualmente.
Un informe paginado. Con ORGANIZATION IS SEQUENTIAL se conserva el control de página tradicional, y los saltos que usted escribe son las páginas que el lector pasa en el Layout Page:
Código:
PRINT-HEADINGS.
MOVE "SALES BY REGION" TO REPORT-LINE
WRITE REPORT-LINE AFTER ADVANCING PAGE.
PRINT-DETAIL.
MOVE DETAIL-LINE TO REPORT-LINE
WRITE REPORT-LINE AFTER ADVANCING 2 LINES.
AFTER ADVANCING 2 LINES deja una línea en blanco, como en el papel. En un informe MARKDOWN esa línea en blanco no es decoración: es lo que separa un párrafo, o una tabla, del siguiente, así que ADVANCING n LINES se acepta en las tres organizaciones. ADVANCING PAGE, la cláusula LINAGE y AT END-OF-PAGE describen una página impresa, y Markdown y HTML fluyen: escribir cualquiera de las tres en un informe representado se avisa al comprobar el programa, en lugar de perder en silencio los saltos que usted pidió.
Lo que un informe no hace. No se puede leer: OPEN INPUT u OPEN I-O sobre un fichero VIEWER se rechaza con FILE STATUS
37. Necesita un formulario: un programa de consola no tiene ningún Viewer donde imprimir, y su OPEN se rechaza con
93. ASSIGN TO VIEWER sin id de control es
31. Un segundo informe cerrado sobre el mismo Viewer sustituye al primero.
4. Documentación
La guía del desarrollador, con la sección completa del Viewer y la de los informes, está en el repositorio del proyecto, en docs/developers-guide-en.md
Anthropic Claude Codex Agent