Title: Mensaje


Jaime Villa Torres escribió:
Este tema me parece muy interesante, pero poco estoy enterado, es posible un ejemplo de un programa que utilice un programa de servicio donde se utilice las operaciones de acceso de base de datos como setll, chain, etc., no se si es mucho pedir, pero de antemano agradezco esta información.
 
Jaime Villa T.
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

                                                  
   
--
Saludos.

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

Responder a