Anuncio

Colapsar
No hay anuncio todavía.

Consulta SQL

Colapsar
X
 
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes

  • Consulta SQL

    Buenos dìas, en mi trabajo me indicaron como mejorar esta consulta, agradeceria bastante me puedan ayudar, tengo poco tiempo en programacion abap es por eso que recurro a uds.... gracias de antemano.

    SELECT coep~belnr coep~buzei coep~vrgng cobk~budat coep~objnr coep~wkgbtr coep~mbgbtr coep~matnr cobk~refbn cobk~aworg coep~meinb cobk~awtypcoep~perio coep~gjahr coep~wrttp coep~kstar coep~parob coep~uspob coep~beknz coep~werks coep~wogbtr coep~owaer coep~megbtr
    INTO CORRESPONDING FIELDS OF TABLE ti_cobk_coep3
    FROM coep
    INNER JOIN cobk ON coep~mandt = cobk~mandt AND coep~kokrs = cobk~k okrs AND coep~belnr = cobk~belnr
    WHERE cobk~budat IN so_budat AND
    coep~kokrs EQ 'GAND' AND
    coep~wrttp EQ '04' AND
    coep~lednr EQ '00' AND
    coep~objnr IN r_objnr AND
    coep~vrgng NE 'KOAO'.

  • #2
    Usar FOR ALL ENTRIES

    Buen día,

    Yo utilizaría la adición FOR ALL ENTRIES, es mucho más rápido. Deberás utilizar 2 tablas internas auxiliares, una de cada tabla de la BD (COEP y COBK).

    1. Haces la consulta de la tabla COEP y la almacenas en su tabla auxiliar, con las condiciones que utilizas sólo para esa tabla.

    2. Ordenas la tabla it_coep por mandt, kokrs y belnr

    3. Haces la consulta a la tabla COBK y almacena en su tabla auxiliar, utilizando la adición FOR ALL ENTRIES y los campos con lo que están relacionados.

    4. Con las 2 tablas internas auxilires, recorres las tablas para realizar la relación y llenas la tabla ti_cobk_coep3.

    Espero me haya dado a entender.
    Saludos!

    Comentario


    • #3
      Hell o

      Gracias cgroque , el punto 4 no lo comprendo bien me podrias dar un alcance mayor, el resto esta perfecto.

      Saludos

      Comentario


      • #4
        Usar FOR ALL ENTRIES

        Buen día,

        Bien, primero ordenas la tabla IT_COBK, igual también por los campos mandt, kokrs y belnr

        Con un LOOP AT, recorres la tabla IT_COEP, dependiendo como lo hayas declarado, con Header Line o utilizando una work area, yo te recomiendo que lo hagas con work area.

        Dentro del LOOP, utilizas un READ TABLE a la tabla interna IT_COBK WITH KEY mandt, kokrs y belnr y almacenas en su correspondiente work area.
        Una vez que tengas el registro, uitliza un MOVE CORRESPONDING (la verdad, yo trato de no utilizarlo) o bien asignarlo uno a uno a la tabla final, en tu caso es ti_cobk_coep3. Es un poco tedioso cuando son muchos campos, pero te aseguras que se estén llenando los campos.

        Espero haya quedado más claro, acá andamos.
        Saludos.

        Comentario


        • #5
          Hola

          Saludos cgroque cambien lo q me indicaste:

          SELECT objnr kokrs wrttp lednr belnr vrgng buzei wkgbtr mbgbtr matnr aworg meinb perio gjahr kstar parob uspob beknz werks wogbtr owaer megbtr
          FROM COEP
          WHERE coep~objnr IN r_objnr AND
          coep~kokrs EQ 'GAND' AND
          coep~wrttp EQ '04' AND
          coep~lednr EQ '00' AND
          coep~vrgng NE 'KOAO'.


          SORT TI_COBK_COEP2 BY mandt kokrs belnr.
          DELETE ADJACENT DUPLICATES FROM TI_COBK_COEP2 COMPARING mandt.


          SELECT budat kokrs aworg awtyp FROM COBK
          INTO TABLE st_cobk_coep
          FOR ALL ENTRIES IN TI_COBK_COEP3
          WHERE cobk~budat IN so_budat.

          nota: los campos kokrs, mandt lednr se deben declarar.
          SORT TI_COBK_COEP3 BY mandt kokrs belnr.

          LOOP AT ti_cobk_coep2 into st_cobk_coep.
          READ TABLE TI_COBK_COEP3 INTO st_cobk_coep2 WITH KEY mandt = st_cobk_coep2-mandt and
          st_cobk_coep2-kokrs and
          st_cobk_coep2-belnr.
          binary search

          IF sy-subrc = 0.
          MOVE-CORRESPONDING st_cobk_coep to st_cobk_coep2.
          APPEND st_cobk_coep2 to ti_cobk_coep2.
          ENDIF.

          Te agradeceria bastante lo analices y me indiques en que estoy fallando. Muchas gracias

          Comentario


          • #6
            Análisis

            Van mis comentarios sobre el código


            " Al momento de hacer consulta a la BD, revisa en la T-code SE11 el orden en la tabla, parece que el orden
            " de la siguiente consulta no es la misma que en la BD.

            SELECT objnr kokrs wrttp lednr belnr vrgng buzei wkgbtr mbgbtr matnr aworg meinb perio gjahr kstar parob uspob beknz werks wogbtr owaer megbtr
            FROM COEP
            WHERE coep~objnr IN r_objnr AND "Faltaría la adición INTO TABLE ti_coep
            coep~kokrs EQ 'GAND' AND
            coep~wrttp EQ '04' AND
            coep~lednr EQ '00' AND
            coep~vrgng NE 'KOAO'.


            SORT TI_COBK_COEP2 BY mandt kokrs belnr. "No veo el campo MANDT en la consulta, debería estar.
            " Otro comentario, yo cambiaría el nombre de la ti a ti_coep

            DELETE ADJACENT DUPLICATES FROM TI_COBK_COEP2 COMPARING mandt. " Cuidado, si dejas esta sentencia solo con el campo MANDT t eliminará muchos registro, regularmente se ocupan los mismos campos de la sentencia SORT, así que debes agregarle campos.


            SELECT budat kokrs aworg awtyp FROM COBK " Debes agregar los campos que ocupas en el JOIN (mandt, kokrs y belnr, kokrs ya lo agregaste.
            "Mismo comentario que en la consulta, revisa el orden con el que están declarados en la SE11.
            INTO TABLE st_cobk_coep "Recomiendo cambiar nombre a TI_COBK.
            FOR ALL ENTRIES IN TI_COBK_COEP3 " Cambiaría el nombre de TI a ti_coep.
            WHERE cobk~budat IN so_budat. " Agregar los campos kokrs y belnr a la condición

            nota: los campos kokrs, mandt lednr se deben declarar.
            SORT TI_COBK_COEP3 BY mandt kokrs belnr.

            LOOP AT ti_cobk_coep2 into st_cobk_coep. "Considerar cambio de nombre a IT_COEP, también su work area
            READ TABLE TI_COBK_COEP3 INTO st_cobk_coep2 WITH KEY mandt = st_cobk_coep2-mandt and "Considerar cambio de nombre de a IT_COBK, también su work area
            st_cobk_coep2-kokrs and
            st_cobk_coep2-belnr.

            " La sentencia WITH KEY, para el campo KOKRS y BELNR debes agregar KOKRS = y BELNR =

            binary search

            IF sy-subrc = 0.
            MOVE-CORRESPONDING st_cobk_coep to st_cobk_coep2. " eL MOVE-CORRESPONDING debe hacerse con las 2 workarea, la de la tabla COEP y la tabla COBK. Te faltaría una.
            APPEND st_cobk_coep2 to ti_cobk_coep2.
            ENDIF.

            Comentario


            • #7
              Consulta modificada

              Saludos cgroque modifique la consulta, cual es tu opinion

              SELECT mandt kokrs belnr buzei perio wogbtr wkgbtr megbtr mbgbtr lednr objnr gjahr wrttp kstar
              vrgng parob uspob beknz owaer meinb werks matnr
              FROM COEP
              INTO TABLE ti_coep
              WHERE objnr IN r_objnr AND
              kokrs EQ 'GAND' AND
              wrttp EQ '04' AND
              lednr EQ '00' AND
              vrgng NE 'KOAO'.

              NOTA: AWORG NO EXISTE,

              SORT ti_coep BY mandt kokrs belnr.
              DELETE ADJACENT DUPLICATES FROM ti_coep COMPARING mandt kokrs belnr.

              SELECT mandt kokrs belnr budat awtyp aworg
              FROM COBK
              INTO TABLE ti_cobk
              FOR ALL ENTRIES IN ti_coep
              WHERE budat IN so_budat and
              kokrs EQ 'GAND'.
              SORT ti_cobk BY mandt kokrs belnr.

              LOOP AT ti_coep into st_coep.
              READ TABLE INTO ti_cobk WITH KEY mandt = st_cobk-mandt and st_cobk-kokrs and
              st_cobk-belnr binary search.

              IF sy-subrc = 0.
              MOVE-CORRESPONDING st_cobk to st_coep.
              APPEND st_coep to ti_coep.
              ENDIF.

              IF sy-subrc = 0.
              MOVE-CORRESPONDING st_coepto st_cobk.
              APPEND st_cobk to ti_cobk.
              ENDIF.
              ENDLOOP.

              Muchas gracias por el apoyo.

              P.D. Es bueno utilizar funciones en vez de for all entries, me comentaron que buscara dichas funciones, buen dia.

              Comentario

              Trabajando...
              X