Pasar un rango a una subrutina

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • jtristan
    Senior Member
    • oct
    • 240

    #1

    Pasar un rango a una subrutina

    Hola:

    Quiero crearme una subrutina genérica que me llene los rangos. Para ello quiero pasarle por referencia un rango y por valor el signo, la opción, el valor máximo y el mínimo o una lista de valores. Bueno, el problema le tengo, al declarar el valor del rango. Me devuelve un error indicándome que mi rango no tiene la propiedad sign y no sé como decirle que se trata de un tipo rango.

    Muchas gracias.

    Saludos.
  • ibecerra

    #2
    para ello utiliza los define.
    *----------------------------------------------------------------------*
    * DEFINE load_sel *
    *----------------------------------------------------------------------*
    DEFINE load_sel.
    * Clear header
    clear: &1.
    * Fields initialize
    &1-sign = &2.
    &1-option = &3.
    &1-low = &4.
    &1-high = &5.
    * Append...
    append &1.
    END-OF-DEFINITION. "load_sel.


    y como lo llamas desde tu programa facil
    EJEMPLO 1
    load_sel ZT_RAN33 'I' 'EQ' 'KD' ' '.
    load_sel ZT_RAN33 'I' 'EQ' 'KE' ' '.
    load_sel ZT_RAN33 'I' 'EQ' 'KG' ' '.
    EJEMPLO 2
    LOAD_SEL: R_BLART 'I' 'EQ' 'VR' ' ',
    R_BLART 'I' 'EQ' 'KR' ' ',
    R_BLART 'I' 'EQ' 'VG' ' ',
    R_BLART 'I' 'EQ' 'KG' ' ',
    R_BLART 'I' 'EQ' 'VD' ' '.

    EJEMPLO 3

    SELECT BLART INTO VBLARTA
    FROM ZTSRICLA
    WHERE GRUPO IN S_GRUPO
    AND BLART IN S_BLART.
    LOAD_SEL R_BLART 'I' 'EQ' VBLARTA ' '.
    ENDSELECT.

    Comentario

    • DavidXD_XD
      Moderator
      • ago
      • 1255

      #3
      Hola ... puedes crear un tipo local de esta manera:

      Código:
      TYPES: BEGIN OF ty_rango,
               sign(1),
               option(2),
               low TYPE tabla-campo,
               high TYPE tabla-campo,
             END OF ty_rango.
      la tabla y campo debera estar apuntando al tipo de dato que quieres, ahora crear una variable simple como tabla interna:

      Código:
      DATA: ti_rango TYPE TABLE OF ty_rango.
      Y cuando quieras llamar a la subrutina la haces de esta manera:

      Código:
      PERFORM rutina_1 TABLES r_rango.
      
      FORM rutina_1 TABLES pr_rango LIKE ti_rango[].
      ENDFORM.
      Ahi ya te admitirá los campos sign., option, low y high dentro de la subrutina, espero pueda servir
      David Carballido Córdova

      Comentario

      • jtristan
        Senior Member
        • oct
        • 240

        #4
        Muchas gracias a los dos. Voy a probar ambas opciones. No conocía los define y tienen buena pinta.
        Un saludo.

        Comentario

        • osoro
          Junior Member
          • jul
          • 2

          #5
          Otra manera

          Hola, lo que yo hago por ejemplo:

          START-OF-SELECTION.
          SELECTION-SCREEN BEGIN OF BLOCK 1 WITH FRAME TITLE text-y01.
          SELECT-OPTIONS:
          ......
          seldatab FOR wa_seltrip-DATB1.
          SELECTION-SCREEN END OF BLOCK 1.
          .....
          AT SELECTION-SCREEN.
          .....
          PERFORM SELDATAB_Ini TABLES seldatab[].
          .....

          FORM SELDATAB_INI TABLES P_SELDATAB.
          DATA: ....
          * tr_seldatab LIKE RANGE OF wa_seltrip-DATB1 "Esta es otra manera
          * wr_seldatab LIKE LINE OF tr_seldatab.
          RANGES: tr_seldatab FOR wa_seltrip-DATB1.
          .....
          * Creo el criterio de seleccion
          tr_seldatab-sign = 'I'.
          tr_seldatab-option = 'BT'.
          tr_seldatab-low = vl_Ini_Data_Sel.
          tr_seldatab-high = vl_Fin_Data_Sel.
          APPEND tr_seldatab.
          p_seldatab[] = tr_seldatab[].
          ENDFORM. " SELDATAB_INI
          Editado por última vez por osoro; 16/01/2014, 21:29:00.

          Comentario

          Trabajando...