|
Jaime Villa Torres escribió: Aquí va un pequeño ejemplo de una función que implementa un chain. El equivalente para setll y read/e es muy similar // // asumiremos que fichero tiene una clave de acceso de dos campos Ffichero UF E K DISK usropn prefix(fic_) * // Ds con el formato de registro de nuestro fichero de referencia // de campos. La línea siguiente la tenemos en realidad en un fuente // a parte para incluir con /copy D ref E DS extname(ref) qualified based(@) // // Ds prototipo con el formato de registro del fichero. También está // en un fuente aparte para incluir con /copy D dsfichero_rf E DS extname(fichero) qualified based(@) // // DS en la que se exportan los datos del fichero. El puntero y la segunda // DS son para que se cargue la primera DS con los campos del fichero a cada // operación de lectura. D dsfichero DS likeds(dsfichero_rf) inz export D dsfichero@ S * inz(%addr(dsfichero)) D E DS extname(fichero) based(dsfichero) D prefix(fic_) // // Ejemplo de chain. En el nombre de la función, la ‘U’ significa que el fichero // está abierto para actualización y la ‘C’ indica que la operación es chain. P fichero_UC B export D PI 1N D ds likeds(fichero_RF ) options(*omit) D clave1 like(ref.clave1) value D clave2 like(ref.clave2) value * /free // // El programa de servicio solo abrirá los ficheros que se vayan a utilizar. En las operaciones de chain // y setll/setgt se abre el fichero si no está ya abierto. En read/e, update, write y delete se asume que // el fichero ya se ha abierto. if not %open(fichero); open fichero; endif; select; when %parms=2; chain clave1 fichero ; when %parms=3; chain (clave1: clave2) fichero ; other; return false; endsl; // // Si se encontró registro y se pasa ds en la que devolver los datos, // la cargo con los datos recuperados. El programa que llama a esta función // puede no pasar la ds y trabajar directamente con dsfichero, donde siempre // están los datos del último registro accedido. // en V5R3 se puede hacer chain para que devuelva directamente en una DS, pero // en V5R2 no hay una forma práctica de hacerlo. if %found and %addr(ds)<>*null; ds=dsfichero; endif; return (%found); /end-free * P fichero_UC E Y ahora el acceso desde un programa (asumiremos que se han hecho los /copy necesarios para tener las declaraciones de ds's prototipo utilizadas) D dsfichero DS likeds(dsfichero_rf) import * D ds2 DS likeds(dsfichero_rf) inz // /free // Chain por clave parcial y sin pasar DS. Se usan los datos de la DS importada if fichero_UC(*omit: c1) ; dsply dsfichero.campo1 ; endif ; // Chain pasando DS. Se usan los datos de la DS, pero también están en la DS importada if fichero_UC(ds2: c1: c2) ; dsply ds2.campo1 ; endif ; /end-free --
Fernando Pérez Cerámica Saloni. Dpto. Sistemas |
begin:vcard fn;quoted-printable:Fernando P=C3=A9rez n;quoted-printable:P=C3=A9rez;Fernando org:;Sistemas email;internet:[EMAIL PROTECTED] tel;work:Ext. 627 x-mozilla-html:TRUE version:2.1 end:vcard
