¿ Quieres imprimir esta página ? Volver a la página principal de Recursos iSeries AS400 ¿ Necesitas ayuda ? En pruebas
System i5 iSeries AS400 Recursos. Compartiendo generamos conocimiento
Novedades en Recursos iSeries AS400
Noticias tecnológicas
Documentos
Procedimiento en un programa de servicio.
Procedimiento para modificar formato númerico en campos de texto

El siguiente ejemplo se basa en la necesidad de migrar ficheros de textos a ficheros con DDS. En este caso me encontré que el formato numérico en los ficheros de texto originales estaban ajustados a la izquierda y sin rellenos de ceros. Para traspasarlos a los campos destinos (de texto también) se requería que estuviesen ajustados por la derecha y rellenados a ceros. Gráficamente serían los siguientes casos:

1 2         0 0 0 1 2
1 2 3       0 0 1 2 3

Esta casuística se producía en diversos campos con longitudes diferentes.

Como solución genere un procedimiento en un programa de servicio, que realizara este movimiento, independientemente de la longitud de los campos.
Para generar este procedimientos seguí los siguientes pasos:


1. Añadir al miembro COPY la definición de interfaz del procedimiento.

El código es el siguiente:

     

     DTRASPASO         PR         32767A
     D Campini                    32767A   OPTIONS(*VARSIZE) CONST
     D LongSal                        9  0 const
     D LongEnt                        9  0 const

     

Se observa que la interfaz contiene 3 parámetros que se corresponden a: la cadena de caracteres del campo a traspasar (del campo inicial) , la longitud del campo inicial, y la longitud del campo donde colocaremos la cadena traspasada (campo final). El resultado del procedimiento será la cadena traspasada. La longitud de la variables de trabajo con caracteres es la máxima permitida por el RPG IV, asegurándome que podré trabajar con campos de cualquier longitud permitida.

2. Código del programa de servicio.

El código de procedimiento realiza lo siguiente: busca el primer espacio en blanco en la cadena a traspasar, determinando así la longitud de dicho número. Se realizan las siguientes validaciones:

  • La longitud de los caracteres a traspasar no sea superior al campo inicial. Al trabajar con variables tan grandes y no estar inicializadas se rellenan con datos que pueden producir errores.
  • La longitud de caracteres a traspasar no sea superior a la longitud del campo final. Se recortara la cadena de caracteres a traspasar, en este caso se recorta por la derecha.

El código es el siguiente:

En RPG FREE:

     
      *------------------------------------------------------------
      *  Modulo PS0001 del programa de servicio PS0001
      *
      *  Fecha: 20/02/2003
      *
      *  Autor: Francesc J. Ordeix            FIHOCA
      *                                       TELF: 93 410 90 00
      *                                       BARCELONA - ESPAÑA
      *------------------------------------------------------------
     H COPYRIGHT('FIHOCA   Autor: Francesc J. Ordeix')
     H NOMAIN
      *
      * Definicion de procedimiento Traspaso
      /Define TRASPASO
      /Copy FRAN/QMBRCPY,DEFPRO001
      /Undefine TRASPASO
      *------------------------------------------------------------
      * PROCEDIMIENTO TRASPASO
      *------------------------------------------------------------
     PTRASPASO         B                   Export
     DTRASPASO         PI         32767A
     D Campini                    32767A   OPTIONS(*VARSIZE) CONST
     D LongSal                        9  0 const
     D LongEnt                        9  0 const
      * Variables locales
     D Campfin         S          32767A   Inz(*ZEROS)
     D PosInic         S              8  0
     D PosInir         S              8  0
     D PosBlk          S              8  0
     D TamCad          S              8  0

      * Proceso
      /Free
        Posblk = %Scan(' ':Campini) ;
        If Posblk>LongEnt ;
           Posblk=LongEnt+1 ;
        Endif ;
        If Posblk>LongSal ;
           PosInir=1;
           TamCad=LongSal ;
           PosInic=1 ;
        Else ;
           PosInir=LongSal-Posblk+2 ;
           TamCad=Posblk-1 ;
           PosInic=1 ;
        EndIf ;
        %Subst(Campfin:PosInir:Tamcad)=%Subst(Campini:Posinic:Tamcad);
       Return Campfin  ;
      /End-Free

     P                 E
En RPG ILE

     *---------------------------------------------------------------
      *  Modulo PS0001 del programa de servicio PS0001
      *
      *  Fecha: 20/02/2003
      *
      *  Autor: Francesc J. Ordeix            FIHOCA
      *                                       TELF: 93 410 90 00
      *                                       BARCELONA - ESPAÑA
      *--------------------------------------------------------------
     H COPYRIGHT('FIHOCA  Autor: Francesc J. Ordeix')
     H NOMAIN
      *
      * Definicion de procedimiento Traspaso
      /Define TRASPASO
      /Copy FRAN/QMBRCPY,DEFPRO001
      /Undefine TRASPASO
      *--------------------------------------------------------------
      * PROCEDIMIENTO TRASPASO
      *--------------------------------------------------------------
     PTRASPASO         B                   Export
     DTRASPASO         PI         32767A
     D Campini                    32767A   OPTIONS(*VARSIZE) CONST
     D LongSal                        9  0 const
     D LongEnt                        9  0 const
      * Variables locales
     D Campfin         S          32767A   Inz(*ZEROS)
     D PosInic         S              8  0
     D PosInir         S              8  0
     D PosBlk          S              8  0
     D TamCad          S              8  0
      *---------------------------------------------------------------
      * Proceso
     C     ' '           Scan      Campini       Posblk
     C                   If        Posblk>LongEnt
     C                   Eval      Posblk=LongEnt+1
     C                   EndIf
     C                   If        Posblk>LongSal
     C                   Z-add     1             PosInir           8 0
     C                   Eval      TamCad=LongSal
     C                   Eval      PosInic=1
     C                   Else
     C                   Eval      PosInir= LongSal-Posblk+2
     C                   Eval      TamCad=Posblk-1
     C                   Z-Add     1             PosInic
     C                   Endif
     C                   Eval      %subst(Campfin          :
     C                                  PosInir               :
     C                                  Tamcad              ) =
     C                             %subst(Campini          :
     C                                  PosInic            :
     C                                  Tamcad              )
     C                   Return    Campfin
     P                 E

Se genera el modulo mediante la instrucción CRTRPGMOD.

3. Creación del programa de servicio.

Se añada la siguiente línea al código del lenguaje enlazador:


EXPORT SYMBOL('TRASPASO')


Para crear el programa de servicio se utiliza el comando CRTSRVPGM.


4. Ejecución del programa de servicio y verificación.

En un programa simple se realizan llamadas al procedimiento y se verifica su correcto funcionamiento:




      *----------------------------------------------------------
      *  Modulo PRUEBA4_2 del programa de servicio PRUEBA4
      *
      *  Fecha: 20/02/2003
      *
      *  Autor: Francesc J. Ordeix            FIHOCA
      *                                       Av. Roma 25-27 
      *                                       Telf: 93 410 90 00  
      *----------------------------------------------------------
     H COPYRIGHT('FIHOCA  Autor: Francesc J. Ordeix')

      * Definicion de procedimiento Traspaso
      /Define TRASPASO
      /Copy FRAN/QMBRCPY,DEFPRO001
      /Undefine TRASPASO


     D Salida          S              4
     D Entrada         S              4    Inz('12  ')
      *
      *
     D Salida2         S             15
     D Entrada2        S             15    Inz('12345          ')
      *
     D Salida3         S             20
     D Entrada3        S             20    Inz('123456789           ')
      *
     D Salida4         S             18
     D Entrada4        S             20    Inz('123456789           ')
      *
     D Salida5         S             10
     D Entrada5        S             20    Inz('123456789012        ')
      *
     D Salida6         S             10
     D Entrada6        S              5    Inz('1234 ')
      *
     D Salida7         S             10
     D Entrada7        S              5    Inz('12345')
      *
     C                   Eval      Salida=Traspaso(Entrada:
     C                                %size(Salida):%size(Entrada))
      *                            Entrada='12  '
      *                            Salida='  12'
     C
     C                   Eval      Salida2=Traspaso(Entrada2:%size(Salida2):
     C                                             %size(Entrada2))
     C
     C                   Eval      Salida3=Traspaso(Entrada3:%size(Salida3):
     C                                             %size(Entrada3))
     C                   Eval      Salida4=Traspaso(Entrada4:%size(Salida4):
     C                                             %size(Entrada4))
     C                   Eval      Salida5=Traspaso(Entrada5:%size(Salida5):
     C                                             %size(Entrada5))
     C                   Eval      Salida6=Traspaso(Entrada6:%size(Salida6):
     C                                             %size(Entrada6))
     C                   Eval      Salida7=Traspaso(Entrada7:
     C                              %size(Salida7):%size(Entrada7))
     C
     C
     C                   SetOn                                        Lr


Si se debuga el programa de prueba los resultados son (a la izquierda el campo entrada y a la derecha el campo salida):

1.- Proceso de 20 a 20 posiciones:

1 2     0 0 1 2


2.- Proceso de 15 a 15 posiciones:

1 2 3 4 5                     0 0 0 0 0 0 0 0 0 0 1 2 3 4 5


3.- Proceso de 20 a 20 posiciones: 

1 2 3 4 5 6 7 8 9 0                     0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 0

4.- Proceso de 20 a 18 posiciones:

1 2 3 4 5 6 7 8 9 0                     0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 0

5.- Proceso de 20 a 10 posiciones: 

1 2 3 4 5 6 7 8 9 0 1 2                 1 2 3 4 5 6 7 8 9 0

6.- Proceso de 20 a 10 posiciones:

1 2 3 4             0 1 2 3 4

7.- Proceso de 20 a 10 posiciones:

1 2 3 4 5           1 2 3 4 5
 

Documento cedido por Francesc J. Ordeix

Abril 2003

Comentarios de usuarios

Nombre:
Mail:
Comentario:
 
Subir a la parte superior de la web
 

 

NUESTRA COMUNIDAD EN
ÚNETE Y.... ¡¡ PARTICIPA !!
Dossiers técnicos iSeries y AS400
- Seguridad
- Alta disponibilidad.
Nuestros links favoritos
- Tendencias tecnologías de la información
Expertos en tecnologías de la información, nos dan su punto de vista sobre las tendencias actuales y futuras
- Los últimos anuncios sobre hardware-software para iSeries AS400 realizados por IBM
- Freeware y shareware para el iSeries AS400
- Utilidades para el iSeries AS400 realizadas por profesionales
- Documentos. Trucos e ideas para resolver tus problemas
- Los manuales y links más interesantes del iSeries AS400

  Links patrocinados
  •  
  •  

[ Soy nuevo |   Profesionales |   AS qué |   Empresas |    Foros |   Recomiéndanos |    Productos ]
 
Recursos iSeries AS400. Es una web de: PUBLICACIONES HELP400, S.L. CIF:B-60-202827 Gran Vía de les Corts Catalanes, núm. 715, Entresuelo – 3ª - Barcelona - Tel.+34.932.310.049