loop con select single URGENTE

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

    #1

    loop con select single URGENTE

    Hola Foro,

    no consigo que me funcione este código:

    LOOP AT tab_dades INTO est_tj30t WHERE stspr IS NOT INITIAL.


    SELECT SINGLE *
    FROM jest
    INTO jest
    WHERE objnr EQ tab_dades-objnr AND stat LIKE cst_stat AND inact EQ ' '. " cst_stat ha de començar per 'E'

    IF sy-subrc = 0.
    * AND stsma EQ tab_dades-stspr.

    * SELECT SINGLE stsma estat spras txt04 txt30
    SELECT SINGLE *
    FROM tj30t
    INTO est_tj30t
    WHERE stsma EQ tab_dades-stspr AND estat EQ jest-stat AND spras EQ cst_spras AND txt04 IN so_txt04. "cst_spras = 'S'.

    IF sy-subrc = 0.

    MODIFY tab_tj30t FROM est_tj30t.
    ELSE.

    ENDIF.

    ENDIF.
    ENDLOOP.


    Quiero rellenar la tabla interna tab_dades a partir de otras bbdd por select singles.


    CUALQUIER IDEA SERÁ BIENVENIDA, SALUDOS
  • ifloresb
    Junior Member
    • dic
    • 29

    #2
    Espero te sirva

    Saludos,
    Que tal, bueno para empezar a mi no me gusta usar loops y select single juntos eso te reduce el performance de tu programa considerablemente, lo que puedes hacer es hacer la selección de los datos fuera del loop, esto te puede servir si hace un for all entries.
    Lo que pude ver en tu código es que en ningun lado modificas o llenas la tabla tab_dades y tambien estas usando la misma estructura del loop en uno de los selects esto te puede generar inconsitencias, por ultimo si estas llenando datos es mejor usar un append si es que tu tabla esta vacia; si esta llena puedes usar el modify pero añadiendole las llaves de tu tabla para que sepa que registro va a modificar.

    Espero te sirvan mis consejos.

    Comentario

    • romario2
      Senior Member
      • abr
      • 233

      #3
      thanks

      Hola Iflores,

      agradezco mucho tus consejos, siempre van bien.Te agradecería , si tienes un momento, si lo puedes plasmar en código.A nivel teórico tiene buena pinta aunque es un poco general para mi nivel.


      Un agradecido saludo!

      Comentario

      • martin89
        Member
        • may
        • 53

        #4
        Originalmente publicado por romario2
        Hola Foro,

        no consigo que me funcione este código:

        LOOP AT tab_dades INTO est_tj30t WHERE stspr IS NOT INITIAL.


        SELECT SINGLE *
        FROM jest
        INTO jest
        WHERE objnr EQ tab_dades-objnr AND stat LIKE cst_stat AND inact EQ ' '. " cst_stat ha de començar per 'E'

        IF sy-subrc = 0.
        * AND stsma EQ tab_dades-stspr.

        * SELECT SINGLE stsma estat spras txt04 txt30
        SELECT SINGLE *
        FROM tj30t
        INTO est_tj30t
        WHERE stsma EQ tab_dades-stspr AND estat EQ jest-stat AND spras EQ cst_spras AND txt04 IN so_txt04. "cst_spras = 'S'.

        IF sy-subrc = 0.

        MODIFY tab_tj30t FROM est_tj30t.
        ELSE.

        ENDIF.

        ENDIF.
        ENDLOOP.


        Quiero rellenar la tabla interna tab_dades a partir de otras bbdd por select singles.


        CUALQUIER IDEA SERÁ BIENVENIDA, SALUDOS

        Buen día, ojalá pueda aydarte.
        Lo mejor y más performance es hacer lo que dice ifloresb. Igualmente estaría bueno que entiendas masomenos por qué no te anda lo que vos planteas.
        Según lo que entiendo lo que vos queres es lo siguiente (corregime si me equivoco):
        - Modificar la tabla tab_dades. Según lo que veo vos la loopeas, esto quiere decir que ya tenes algunos registros en la tabla y lo que queres hacer es recuperar otros e ir completándola.

        En primer lugar hacés bien en loopearla en una estructura (siempre y cuando esa estructura se corresponda con la tabla). Al momento de hacer el loop se van a ir asignando los valores de cada uno de los registros (uno por cada vuelta) a la estructura que utilizás.
        Entonces, vos los datos los vas a tener en la estructura. Por lo tanto, en las condicioens de los selects debés utilizar la estructura.
        ej.
        SELECT SINGLE *
        FROM jest
        INTO jest
        WHERE objnr EQ tab_dades-objnr --> Utilizar la estructura
        AND stat LIKE cst_stat
        AND inact EQ ' '. " cst_stat ha de començar per 'E'


        Una vez que hayas termiando de recuperar todos los datos que te faltan, y que la estrucutra esté completita. Debés modificar la tabla (justo antes de terminar el loop) utilizando un MODIFY tablainterna FROM estructura. Creo qe le tenés qe agregar el índice también (INDEX) que lo sacás del sy-tabix.
        BUeno espero que te haya servido por lo menos para entender por qué no te andaba el código. El paso siguiente sería ver como mejorar la performance. Para eso hacele caso a ifloreb utilizando for all entries y algunos read tables.

        Bueno, espero no haberte aburrido jaja. Saludos!

        Comentario

        • ifloresb
          Junior Member
          • dic
          • 29

          #5
          Ejemplo

          Este seria un ejemplo del código:
          SELECT *
          FROM jest
          INTO CORRESPONDING FIELDS OF TABLE jest
          WHERE objnr EQ tab_dades-objnr AND stat LIKE cst_stat AND inact EQ ' '. " cst_stat ha de començar per 'E'

          SELECT SINGLE *
          FROM tj30t
          INTO CORRESPONDING FIELDS OF TABLE est_tj30t
          FOR ALL ENTRIES IN tab_dades
          WHERE stsma EQ tab_dades-stspr AND estat EQ jest-stat AND spras EQ cst_spras AND txt04 IN so_txt04. "cst_spras = 'S'.

          LOOP AT tab_dades INTO est_tj30t WHERE stspr IS NOT INITIAL.
          READ TABLE jest INTO estruc
          WHERE ( aqui van tus condiciones)

          IF sy-subrc = 0.
          READ TABLE est_tj30t INTO estruc
          WHERE ( aqui van tus condiciones)


          IF sy-subrc = 0.
          APPEND estruc TO tab_dades
          O tambien puedes usar el modify
          MODIFY tab_tj30t FROM est_tj30t.
          ELSE.

          ENDIF.

          ENDIF.
          ENDLOOP.

          Comentario

          • romario2
            Senior Member
            • abr
            • 233

            #6
            Muy Agradecido

            Hola Iflores y Martin 89,

            disculpad que no os haya contestado antes, ando super atareado.
            Voy a estudiar detenidamente vuestros consejos, ya os diré algo.Yo también pensé una solución ejje.
            Ahora mismo estoy con un module pool grandioso y tengo que crear un Table control que seleccione un registro y se vea el detalle.También debo crear un Custom control.Teneis algún código?

            He mirado en un pdf muy bueno de Blag pero no lo explica...

            Hasta pronto y gracias otra vez!

            Comentario

            Trabajando...