SubFicheros AS400
SubFicheros AS400
==============================================================================
Introduccin a los subficheros
------------------------------------------------------------------------------
Subficheros "completos"
En algunos programas puede ser ventajoso el leer y cargar en el subfichero todos los
registros a visualizar, facilitando as, la paginacin total de los datos hacia
adelante o hacia atrs. Codificar este tipo de subficheros "completos" es simple:
leer un registro de la base de datos, escribirlo en el subfichero, repetir hasta que
se llegue al final del fichero de datos y entonces visualizar el subfichero. Esta
tcnica es la mejor cuando se procesan un nmero relativamente pequeo de registros
(un mximo de 50 o 60) que suelen corresponder a ficheros de tipo tablas. Emplear
programas con subficheros completos no es aconsejable cuando se usa un mayor nmero
de registros dado que la cantidad de tiempo necesaria para cargar el subfichero
puede significar un tiempo de espera excesivo antes de efectuar la visualizacin, y
por otra parte, el usuario quizs no necesite ver todos los registros para tomar una
accin determinada. Desgraciadamente, muchos programas que tratan cientos de
registros, estn escritos bajo esta tcnica, por ser la ms cmoda en el momento de
codificar. En este tipo de programas, la paginacin est totalmente soportada por el
propio sistema operativo.
Para emplear subficheros completos deberemos, en la definicin del SFLCTL de la DDS,
especificar el tamao del subfichero (palabra clave SFLSIZ, que seala el total de
registros del SFL) mayor que el tamao de la pgina de visualizacin (palabra clave
SFLPAG, que indica el nmero de lineas a visualizar por pgina). Cuando el SFLSIZ es
mayor que el SFLPAG, el subfichero automticamente se extiende cuando grabamos ms
registros de los indicados en el tamao. Para que esta funcin tenga lugar, como
mnimo deber ser SFLSIZ = SFLPAG + 1. Ya que el SFLSIZ indica el nmero de
registros que el SFL puede contener, tambin especifica la cantidad de espacio
reservada en el disco en el momento de la creacin del SFL. Si el subfichero se
extiende, un espacio adicional del disco se reserva de nuevo para poder admitir ms
registros. Este puede ser un problema de rendimiento adicional en caso de
paginacin, puesto que estas extensiones no estn juntas. Es mejor estimar un
valor determinado para el tamao del SFL, pero tampoco demasiado grande, un gran
tamao tambin implica disminucin del rendimiento.
La codificacin de la figura 1 demuestra el concepto de subfichero completo. Los
campos de su registro de subfichero y los campos del registro de control debern
incluirse en donde se indica. El indicador 61 se ha asignado al SFLCLR. Esto
significa que el indicador 61 deber ponerse en ON en el programa cuando el SFL
tenga que borrarse. El indicador 62 se ha asignado al SFLDSP y se pone en OFF cada
vez que se borra subfichero y solamente se pone en ON si se graba uno o ms
registros en el subfichero. Cuando el EXFMT del programa (figura 2) tiene lugar, si
el *IN62 est en ON (al menos hay un registro en el SFL), el subfichero se
visualiza. Esta tcnica evita el error que se produce cuando se intenta visualizar
un subfichero vaco.
El cdigo RPG para borrar, leer y visualizar el subfichero completo se muestra en la
figura 2. El programa lee el fichero de base de datos FICHERO para visualizarlo
mediante SFL. Se asume que el registro de control WSFLCTL incorpora un campo llamado
ARG en donde el usuario puede entrar el argumento de bsqueda. En la sentencia 016,
este argumento se usa para situar el fichero en el primer registro a recuperar. (IBM
denomina a esta funcin "posicionar el cursor del fichero"). Cuando el programa se
inicia, el registro de control se visualiza, solicitando al operador un argumento de
bsqueda. En este punto el SFL no se visualiza porque no hay registros y por tanto,
el *IN62 est apagado. Despus de entrar el ARG y haber pulsado INTRO, el subfichero
se borra y se carga. Una vez cargado el subfichero, el programa regresa a la
sentencia 011, mediante un bucle controlado por un DOUNTIL (hasta que *INKC sea 1 -
pulsado F3), para visualizar el registro de control; los registros del subfichero se
visualizarn si el *IN62 se ha puesto en ON durante el proceso.
El subfichero se borra en las sentencias 020-023, se carga en las sentencias 027-036
y se visualiza en la sentencia 011. En RPG, el proceso mediante nmero relativo de
registro se define como parte de la definicin SFILE, palabra clave situada en las
columnas 54-59 de una lnea de continuacin (independiente) de las especificaciones
de descripcin de ficheros para el fichero WORKSTN descrito externamente. La
definicin SFILE implica un fichero de actualizacin controlado en clculo con ADD
para el subfichero. El nmero relativo de registro (NRR) se incrementa en la
sentencia 033 y se restaura a ceros en la 021, cuando se borra el subfichero. Como
el SFLSIZ es 20 y mayor que el SFLPAG, si se han procesado ms de 20 registros, el
subfichero se extiende automticamente para que puedan aadirse todos los registros
al SFL. El programa finaliza cuando el operador pulsa F3 (en la sentencia 011,
sentencias anidadas 007-015-037-038 y la 042).
==============================================================================
Eplogo a los subficheros
------------------------------------------------------------------------------
- Tipos de subficheros
- Leyendo subficheros
Ahora que ya conocemos los diferentes tipos de subficheros y el impacto que pueden
causar en el rendimiento del ordenador, echemos una mirada a las diferentes maneras
de usarlos. Muchas veces el subfichero se emplea como visualizacin de una lista de
registros para que el usuario pueda hacer una seleccin de entre los mismos. Por
ejemplo, podemos escribir un programa con un subfichero para que visualice, por
nmero de pedido, las notas de envo pendientes de confirmar e imprimir. En las
lneas del subfichero podramos poner el nmero de nota, la fecha, el nmero de
cliente, la cantidad de lneas de la nota y el valor actual de la misma.
Adicionalmente, podramos situar un campo de entrada de una sola posicin, a la
izquierda de cada registro del subfichero, para que el usuario pudiera entrar un
cdigo de accin. El usuario podra poner una "C" en varios de los registros
visualizados para confirmar e imprimir varias notas a la vez. Para que el proceso
pueda continuar, el programa ha de ser capaz de leer los registros que han sido
modificados en el subfichero.
El mtodo usado para leer los registros modificados es francamente cmodo. En RPG,
el cdigo de operacin usado para leer registros modificados de un subfichero es el
READC. La operacin READC, empleada dentro de un bucle, efecta una lectura de cada
registro modificado y hace que los datos del registro modificado del subfichero
"entren de nuevo" en el programa. Un registro se considera modificado si algn dato
(incluido blancos) se entra desde el teclado en un campo del registro del subfichero
que sea susceptible de entrada. El hecho de modificar uno o varios campos en un
registro de pantalla altera el contenido de un campo interno del registro de
pantalla, llamado "Modified Data TAG" (MDT -un simple bit por cada uno de los campos
de la pantalla). El bit correspondiente se pone en ON si el campo ha sido modificado
por el usuario de la pantalla.
Si un MDT est en ON para un campo del subfichero, el registro se considera
modificado y por tanto, el READC lo procesar. Si un registro no ha sido modificado
por el usuario, no podr ser recuperado usando el cdigo de operacin READC.
Asumamos que el mtodo empleado para cargar y representar el subfichero en pantalla
es el que hemos denominado "pgina a pgina", la figura 7 nos muestra la
codificacin del programa en RPG, resaltando la rutina empleada para leer y procesar
los registros cambiados del subfichero. Si se recupera un registro, el campo de
entrada SEL se compara mediante un grupo CASE con "C" y si coincide, se ejecutar la
subrutina correspondiente. Si el usuario ha entrado cualquier otro cdigo (incluido
blancos) en el campo de seleccin, el registro se considerar modificado y tambin
ser recuperado por el READC, por eso debe probarse el campo SEL con los valores
predeterminados. Por supuesto, se puede extender el grupo CASE para que ejecute
otras subrutinas en funcin de otros cdigos predeterminados para el programa, en
nuestro ejemplo podramos incorporar una "R" para revisar alguna nota de las no
confirmadas y, eventualmente, modificarla o completarla.
El uso ms generalizado de esta tcnica suele ser el empleado en subprogramas de
seleccin. En el programa principal hay una serie de campos que pueden ser llenados
a partir de un subprograma con un subfichero de seleccin. La tcnica empleada para
llamar al subprograma puede variar segn la metodologa de la empresa, pero el
mecanismo siempre es el mismo. Supongamos que el usuario desconoce el valor a
introducir. En el campo de entrada puede teclear un "?" y pulsar INTRO (como en los
mandatos de nuestro sistema operativo), el programa principal llama entonces al
subprograma adecuado que interrumpir la pantalla (o bien abrir una ventana en la
misma), ofreciendo un subfichero de seleccin. La recuperacin mediante READC del
registro seleccionado, permitir devolver al programa principal el valor adecuado
empleando PARMS.
Por ejemplo (figura 8), supongamos que el campo a rellenar corresponde al cdigo de
los diferentes lugares de entrega para un cliente determinado; el "?" llamar al
subprograma pasando el cdigo de cliente empleando un primer PARM. El subprograma,
mediante SETLL y READE, montar un subfichero con todos los lugares de entrega del
cliente indicado (en este caso parece indicado emplear la tcnica de subfichero
"completo") y los mostrar en pantalla para que el usuario seleccione el adecuado.
Despus de ledo y procesado el registro cambiado, el cdigo del lugar de entrega se
pasa al programa principal mediante un segundo PARM.
- Usando el SFLNXTCHG
- Otras consideraciones
Desde el momento en que sabemos controlar los posibles errores de una entrada de
datos efectuada a travs de un subfichero, podemos concebir programas cuya funcin
principal sea la entrada y/o modificacin de registros en un determinado archivo de
base de datos. Normalmente esta posibilidad inquieta a ms de un programador
experimentado que preferir emplear un registro de entrada/actualizacin al pie de
la pantalla y un subfichero que vaya representando los registros tratados. No es que
esta tcnica no sea vlida, al contrario, en muchos casos suele ser la mejor
solucin, pero nunca debemos descartar otras posibilidades por miedo a posibles
complicaciones que por otra parte, slo se presentarn en caso de tener poca
prctica.
Si la cantidad de registros a procesar es reducida y el riesgo de prdida de datos,
mnimo, el mejor sistema ser emplear un subfichero. Para ello usaremos un
subfichero "completo" que, si lo usamos para una entrada pura, deberemos inicializar
mediante el SFLINZ. El usuario ir aadiendo todos los datos de cada uno de los
registros y cuando pulse INTRO, estos se depurarn y procesarn adecuadamente
mediante un bucle de READC. Esta tcnica puede emplearse perfectamente en un
programa de entrada de pedidos en donde sabemos que la cantidad de lneas no ser
excesiva.
Un poco ms complejo resultar el programa de modificacin de ms de un registro a
la vez y que use un subfichero para ello. Mi tcnica favorita consiste en
inicializar primero el subfichero y luego cargarle, mediante CHAIN por NRR y UPDAT,
los registros ledos de la base de datos. La forma en que luego los registros del
subfichero "vuelven" al archivo de base de datos, depender principalmente de si han
habido supresiones y/o adiciones de nuevas lneas, si en el subfichero se han
aadido ms, estos debern adicionarse al archivo y si hay menos, los que sobran de
la base de datos debern suprimirse.
El mtodo usado depende de los requisitos del programa de la aplicacin que se est
desarrollando y de la forma en que los datos del subfichero sern representados. El
dominio de los subficheros puede representar un empujn significativo en la
productividad de programacin, y si se codifican y usan adecuadamente, la incidencia
en el rendimiento del ordenador ser mnima.
SUBFICHEROS
Permiten manejar en pantalla mltiples registros del mismo tipo mediante teclas ROLL
controladas desde el CPF o desde el PGM.
SFLCTL: Hace que tengan lugar las operaciones fsicas (preparacin, representacin,
lectura), puede adems, contener campos propios.
- MINIMO DE PALABRAS CLAVE ASOCIADAS (EN EL SFLCTL):
- FORMA SIMPLE: Control ROLLs por CPF (Slo para SFLs pequeos < 100 reg.) Las
prestaciones disminuyen si la carga inicial es grande o el espacio no es contiguo.
- FORMA MIXTA: Control ROLLUP por pgm y ROLLDOWN por CPF. En ambos casos se define
el SFLSIZ mayor que el SFLPAG. El CPF extiende el espacio del SFL automticamente
pero decrece el rendimiento.
- SUBFICHEROS EN RPG
Alberto C. Blanch
==============================================================================
HELPNET -> Un servicio informativo para los suscriptores de la revista HELP400
==============================================================================
Archivo: figura_01.dsp
Pgina: 1
Archivo: figura_02.rpg
Pgina: 1
Archivo: figura_02.rpg
Pgina: 2
Archivo: figura_03.dsp
Pgina: 1
Archivo: figura_04.rpg
Pgina: 1
Archivo: figura_04.rpg
C ENDIF
C ENDDO
C*-- TERMINAR PROGRAMA
C*--- TERMINAR
C MOVE '1' *INLR
Pgina: 2
Archivo: figura_05.dsp
Pgina: 1
Archivo: figura_06.rpg
Pgina: 1
Archivo: figura_07.rpg
Pgina: 1
Archivo: figura_07.rpg
C READ ARCHIVO 99
C*--- NO EOF
C *IN99 IFEQ '0'
C*--- HAY REGS
C ADD 1 NRR 62
C*--- WRITE SFL
C WRITEWSFL
C ENDIF
C*--->ENDDO
C N99 ENDDO
C*--- Situar
C*--- SFLRCDNBR
C Z-ADDNRR SFLRCD
C*--- INKC = 0
C ENDIF
C ENDDO
C*
C*--- Terminar PGM
C*
C*--- TERMINAR
C MOVE '1' *INLR
C RETRN
C*-------------------------------------------------------------------*
C*-- SRCONF: CONFIRMAR NOTAS / ACTUALIZAR ARCHIVO *
C*-------------------------------------------------------------------*
C SRCONF BEGSR
C*--...
Pgina: 2
Archivo: figura_08.rpg
Pgina: 1
Archivo: figura_08a.rpg
Pgina: 1
Archivo: figura_09.dsp
Pgina: 1
Archivo: figura_10.rpg
Pgina: 1
Archivo: figura_11.rpg
Pgina: 1