Un ejemplo de entrada-salida
Este ejemplo muestra la definición del mapa para un programa sencillo de introducción de datos denominado "actualización rápida".
Antes de explicar los detalles de la estructura de entrada, vuelva a examinar el ejemplo de "comprobación rápida" en Un ejemplo de salida BMS. Supongamos que es contrario a la política dejar que un cliente cargue hasta el límite una y otra vez entre las ejecuciones nocturnas, cuando se contabilizan nuevos cargos en las cuentas. Se necesita otra transacción para aumentar el procesamiento de "cheques rápidos" manteniendo un total corriente para el día.
QUP Quick Account Update
Current charge okay; enter next
Account: _______
Charge: $ _______
QUP Quick Account Update
Charge exceeds maximum; do not approve
Account: 482554
Charge: $ 1000.00
Para facilitar la explicación, la información aquí presentada se ha simplificado en exceso para que los mapas sean breves.
Definición del mapa de entrada-salida
QUPSET DFHMSD
TYPE=MAP,STORAGE=AUTO,MODE=INOUT,LANG=COBOL,TERM=3270-2
QUPMAP DFHMDI SIZE=(24,80),LINE=1,COLUMN=1,CTRL=FREEKB
DFHMDF POS=(1,1),LENGTH=3,ATTRB=(ASKIP,BRT),INITIAL='QUP'
DFHMDF POS=(1,26),LENGTH=20,ATTRB=(ASKIP,NORM), X
INITIAL='Quick Account Update'
MSG DFHMDF LENGTH=40,POS=(3,1),ATTRB=(ASKIP,NORM)
DFHMDF POS=(5,1),LENGTH=8,ATTRB=(ASKIP,NORM), X
INITIAL='Account:'
ACCTNO DFHMDF POS=(5,14),LENGTH=6,ATTRB=(UNPROT,NUM,IC)
DFHMDF POS=(5,21),LENGTH=1,ATTRB=(ASKIP),INITIAL=' '
DFHMDF POS=(6,1),LENGTH=7,ATTRB=(ASKIP,NORM),INITIAL='Charge:'
CHG DFHMDF POS=(6,13),ATTRB=(UNPROT,NORM),PICIN='$$$$0.00'
DFHMDF POS=(6,21),LENGTH=1,ATTRB=(ASKIP),INITIAL=' '
DFHMSD TYPE=FINAL
- La opción MODE en la definición del conjunto de mapas DFHMSD es INOUT, lo que indica que los mapas de este conjunto de mapas se utilizan tanto para entrada como para salida. INOUT hace que BMS genere una estructura simbólica tanto de entrada como de salida para cada mapa del conjunto de mapas. Si éste hubiera sido un mapa sólo de entrada, habríamos dicho MODE=IN, y BMS habría generado sólo las estructuras de entrada.
- Se ponen nombres a los campos de los que se quiere entrada (ACCTNO y CHG) así como a los que se envía salida (MSG). Al igual que en un mapa de sólo salida, evite nombrar los campos constantes para ahorrar espacio en el mapa simbólico.
- Los campos de entrada, ACCTNO y CHG, están desprotegidos (UNPROT), para permitir que el operador introduzca datos en ellos.
- IC (cursor de inserción) se especifica para ACCTNO. Sitúa el cursor al principio del campo del número de cuenta cuando se visualiza el mapa por primera vez, listo para el primer elemento que el operador tiene que introducir. (Puede anular esta colocación cuando envíe el mapa; IC sólo proporciona la posición por defecto)
- Justo después del campo ACCTNO, hay un campo constante consistente en un solo espacio en blanco, y otro similar después del campo CHG. Se denominan campos "tapón". Normalmente, se colocan después de cada campo de entrada que no va seguido inmediatamente por algún otro campo. Evitan que el operador introduzca datos más allá del espacio que usted ha proporcionado, en una zona no utilizada de la pantalla.
Si define el campo de tope como "autoskip", el cursor salta al siguiente campo no protegido después de que el operador haya rellenado el campo de entrada precedente. Esto es conveniente si la mayoría de los campos de entrada son de longitud fija, porque el operador no tiene que avanzar el cursor para pasar de un campo a otro.
Si define el campo de tope como "protegido", pero no como "autoskip", el teclado se bloquea si el operador intenta teclear más allá del final del campo. Esta opción puede ser preferible si la mayoría de los campos de entrada son de longitud variable, donde normalmente hay que utilizar la tecla de avance del cursor de todos modos, porque avisa al operador del desbordamiento inmediatamente. Sea cual sea su elección, debería utilizar la misma opción en toda la aplicación si es posible, para que el operador vea una interfaz coherente.
- El campo CHG tiene la opción PICIN. PICIN produce una máscara de edición en el mapa simbólico, útil para COBOL y PL/I, e implica la longitud del campo. Véase la macro DFHMDF de BMS para más detalles sobre el uso de PICIN.
Mapa simbólico
01 QUPMAPI.
02 FILLER PIC X(12).
02 FILLER PICTURE X(2).
02 MSGL COMP PIC S9(4).
02 MSGF PICTURE X.
02 FILLER REDEFINES MSGF.
03 MSGA PICTURE X.
02 MSGI PIC X(40).
02 ACCTNOL COMP PIC S9(4).
02 ACCTNOF PICTURE X.
02 FILLER REDEFINES ACCTNOF.
03 ACCTNOA PICTURE X.
02 ACCTNOI PIC X(6).
02 CHGL COMP PIC S9(4).
02 CHGF PICTURE X.
02 FILLER REDEFINES CHGF.
03 CHGA PICTURE X.
02 CHGI PIC X(7) PICIN '$,$$0.00'.
01 QUPMAPO REDEFINES QUPMAPI.
02 FILLER PIC X(12).
02 FILLER PICTURE X(3).
02 MSGO PIC X(40).
02 FILLER PICTURE X(3).
02 ACCTNO PICTURE X(6).
02 FILLER PICTURE X(3).
02 CHGO PIC X.
La primera parte de la estructura, bajo la etiqueta QUPMAPI, es el mapa de entrada simbólica, la estructura necesaria para leer datos de una pantalla formateada con el mapa QUPMAP. Véase El mapa de entrada simbólica.
La segunda parte de esta estructura, que comienza en QUPMAPO, es el mapa de salida simbólica, la estructura necesaria para enviar datos de vuelta a la pantalla. Aparte de los campos que hemos redefinido, tiene casi el mismo aspecto que el que cabría esperar si hubiéramos especificado MODE=OUT en lugar de MODE=INOUT. Véase la Figura 1 para una comparación. La principal diferencia es que parece que falta el subcampo de atributos de campo (A), pero lo explicaremos en un momento.
El mapa de entrada simbólica
El mapa de entrada simbólica contiene la estructura necesaria para leer datos de una pantalla formateada con el mapa QUPMAP.
- L
- La longitud de la entrada en el campo de mapa.
- F
- El byte de bandera, que indica si el operador borró el campo y si el cursor se encontraba allí.
- I
- Los propios datos de entrada.
Las estructuras de entrada y salida se definen de forma que se superpongan campo a campo. Es decir, el subcampo de entrada (I) de un campo de mapa determinado siempre ocupa el mismo espacio de almacenamiento que el subcampo de salida (O) correspondiente. Del mismo modo, el subcampo de bandera de entrada (F) se superpone al subcampo de atributos de salida (A). (Por razones de implementación, el orden de las definiciones de los subcampos varía ligeramente de un idioma a otro. En COBOL, la definición del subcampo A se mueve a la estructura de entrada en un mapa INOUT, pero todavía se aplica a la salida, al igual que lo hace en un mapa de sólo salida. En ensamblador, las definiciones de subcampos de entrada y salida se intercalan para cada campo de mapa)
BMS utiliza campos ficticios para dejar espacio en una parte de la estructura para subcampos que no aparecen en la otra parte. Por ejemplo, siempre hay un relleno de 2 bytes en el mapa de salida que corresponde al subcampo de longitud (L) en el mapa de entrada, incluso en los mapas de sólo salida. Si hay subcampos de salida para atributos extendidos, como color o resaltado, BMS genera campos ficticios en el mapa de entrada para que coincidan. Puede ver ejemplos de estos campos (FILLERs en COBOL) tanto en la Figura 1 como en la Figura 4.
La correspondencia de campos en las estructuras de mapas de entrada y salida es muy conveniente para los procesos en los que se utiliza un mapa para la entrada y luego se escribe de vuelta en el mismo formato, como se hace en las transacciones de entrada de datos o cuando se obtiene una entrada errónea y hay que solicitar una corrección al operador.