leer valor con letra al final

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • romario2
    Senior Member
    • abr
    • 233

    #1

    leer valor con letra al final

    Hola,
    tengo que leer estos valores de una tabla interna y controlarlos,
    dependiendo de la letra final (D, E, P,)

    00000162|A-AA-00031-D
    00000162|A-AA-00031-E
    00000162|A-AA-00031-P
    00000162|A-AA-00031-PM

    Como puedo capturar estos valores y asignarlos a una variable.
    He probado un:

    CLEAR p_pskio.
    CLEAR tab_poski.
    LOOP AT tab_poski WHERE poski = '%O'.

    ENDLOOP.

    p_pskio = tab_poski-poski.


    Y no funciona
  • VLozano
    Senior Member
    • nov
    • 124

    #2
    Esa lista que nos das, ¿es un solo campo? ¿son varios campos? Si son varios campos, qué carácter ("|" o "-") de los que nos pasas son los que los delimitan?

    Voy a suponer que son un solo campo, por lo que veo en tu código. La condición que tienes que usar en el WHERE es "LIKE" y no "=". Luego viene el tema de si hay que usar "*" o "%", y que nunca soy capaz de recordar qué se usa dónde.

    Así que toca hacer pruebas con el LIKE y los % *
    "Porque algunos sabemos que somos parte del problema"
    - Pequeña guía para escribir mensajes en foros técnicos -

    Comentario

    • mysmb2
      Senior Member
      • ene
      • 406

      #3
      entiendo que el campo POSKI tiene los siguientes valores
      A-AA-00031-D
      A-AA-00031-E
      A-AA-00031-P
      A-AA-00031-PM

      si D,E ó P están siempre en la misma posición podes compararlo de la siguiente manera al recorrer la tabla
      Código:
      IF tab_poski-POSKI+13(1) EQ 'D' y así con los demas
      Sebastián Chiavia
      http://www.programacionabap.com.ar

      Comentario

      • DavidXD_XD
        Moderator
        • ago
        • 1255

        #4
        Holas, puedes hacerlo de la siguiente manera

        Código:
        [COLOR="Blue"]* Variables[/COLOR]
        DATA: l_int TYPE i.
        LOOP AT tab_poski.
          l_int = STRLEN( tab_poski-poski ).
          l_int = l_int - 1.
          IF tab_poski-poski+l_int(1) IN ('D','E','P').
        [COLOR="Blue"]*   Hacer logica[/COLOR]
          ENDIF.
        ENDLOOP.
        Hay otra forma que creo que puede ser mas optima dependiendo de la cantidad de datos que estas recuperando de la BD dentro de la tabla interna tab_poski, es creando un rango y colocando el valor I dentro del campo SIGN, CP dentro del campo OPTION y *D, *E, *P dentro del campo LOW del rango

        En total tendrias 3 lineas dentro del rango de esta forma
        I CP *D
        I CP *E
        I CP *P

        Y cuando consultes simplemente le das en la condicion del SELECT el valor del rango al campo determinado (IN), espero te pueda ayudar ^^
        David Carballido Córdova

        Comentario

        • romario2
          Senior Member
          • abr
          • 233

          #5
          thanks

          Hola Lozano, Mys y David,

          que lujo vuestros consejos! *_*

          Como habeis dicho, toca hacer pruebas, thanks!

          Comentario

          • romario2
            Senior Member
            • abr
            • 233

            #6
            1 campo

            Vlozano, supones bien, es un solo campo a tratar

            Comentario

            • romario2
              Senior Member
              • abr
              • 233

              #7
              se solapan

              Hola,

              vuestros consejos han sido de mucha ayuda,

              solo tengo una incidencia:

              Los casos :

              cst_prart_o LIKE prps-prart VALUE 'O',

              cst_prart_do LIKE prps-prart VALUE 'DO',

              SE SOLAPAN y no se como tratarlos para que funcione bien.



              Os paso el código:


              CLEAR: p_pskip, p_pskio,p_pskido, p_pskiat, p_pskiss, p_pskie,p_pskiom.
              CLEAR tab_poski.

              LOOP AT tab_poski.
              int_stlen = STRLEN( tab_poski-poski ).
              int_stlen = int_stlen - 1.
              int_stlen2 = int_stlen - 1.


              IF tab_poski-poski+int_stlen(1) EQ cst_prart_p.
              IF sy-subrc = 0.
              p_pskip = tab_poski-poski.
              est_nivel2p-poski = p_pskip.

              ELSE.

              ENDIF.

              ELSEIF tab_poski-poski+int_stlen(1) EQ cst_prart_o.

              IF sy-subrc = 0.
              p_pskio = tab_poski-poski.
              est_nivel2o-poski = p_pskio.

              ELSE.

              ENDIF.


              ELSEIF tab_poski-poski+int_stlen2(2) EQ cst_prart_do.

              IF sy-subrc = 0.

              p_pskido = tab_poski-poski.
              est_nivel2do-poski = p_pskido.

              ELSE.

              ENDIF.

              Comentario

              • romario2
                Senior Member
                • abr
                • 233

                #8
                alguna solución?

                Hola Foro,

                esta incidencia está casi resuelta,

                alguien tiene alguna solución?

                Comentario

                • nano_godoy
                  Junior Member
                  • abr
                  • 8

                  #9
                  Para mi que estas fallando al restarle solo 1 aca:

                  "int_stlen2 = int_stlen - 1."

                  Fijate de restarle 2 en vez de 1 o de poner asi:

                  "ELSEIF tab_poski-poski+11(2) EQ cst_prart_do.
                  IF sy-subrc = 0.
                  p_pskido = tab_poski-poski.
                  est_nivel2do-poski = p_pskido.
                  ENDIF."

                  Saludos!

                  Comentario

                  • DCErick
                    Moderator
                    • mar
                    • 1090

                    #10
                    Y si mejor te basas en los ultimos 2 caracteres del campo...

                    Código:
                    Loop at tab_poski.
                    
                         int_stlen = STRLEN( tab_poski-poski ).
                         int_stlen = int_stlen - 2.
                    
                         case tab_poski-poski+int_stlen(2).
                             when '-D'.
                                     *Logica.
                             when '-P'.
                                     *Logica.
                             when '-O'.
                                     *Logica.
                             when 'DO'.
                                     *Logica.
                         endcase.      
                    
                    EndLoop.
                    -------------------
                    ¿Dudas para descargar manuales? Ver este tema -> Cómo descargar manuales de la sección "Descargas" ?

                    Comentario

                    Trabajando...