Modificar registro tabla interna con datos otra tabla interna.

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • kachalot
    Junior Member
    • ene
    • 9

    #1

    Modificar registro tabla interna con datos otra tabla interna.

    Hola, Buenas tardes,

    necesito ayuda... no sé como hacerlo.

    Para el que no quiera leer todo (la explicación con código que hay en lo último), lo resumo:

    - necesito tener una tabla interna con registros de MARA, MARC y /sapapo/matkey. Salen una cantidad de registros impresionantes.

    Como con join y left outer join tarda mucho he pensado en hacerlo con 2 tablas interna:
    - MARC y /sapapo/matkey

    - MARA y MARC

    Pero claro, cuando recorro la primera tabla interna, con el groso de registros, para modificar los campos que necesito, tambien tarda la vida.

    He pensado en hacerlo con una vista, y he probado, pero creo que no me salen todos los registros ya que entre MARC y /sapapo/matkey necesito un lef outer join.


    *** ¿Alguna sugerencia para hacerlo?

    *** ¿se puede actualizar líneas de forma masiva entre 2 tablas internas?
    + con MODIFY <itab> FROM <wa> TRANSPORTING <f1> <f 2> ... WHERE <cond>.
    + haciendo en los selects into un FOR ALL ENTRIES IN

    No tengo ni idea... ¡MUCHAS GRACIAS!


    EXPLICACIÓN CON CÓDIGO:


    Lo que me gustaría hacer es esto:

    SELECT
    ma~matnr
    mc~matnr mc~werks
    ma~ersda ma~ernam ma~laeda ma~aenam ma~serial
    mc~sernp mk~matid mk~serial mk~createutc mk~createuser
    mk~changeutc mk~changeuser
    INTO CORRESPONDING FIELDS OF TABLE git_listmat
    git_listmat-matnr git_listmat-werks git_listmat-ersda
    git_listmat-ernam git_listmat-laeda git_listmat-aenam
    git_listmat-serial git_listmat-sernp git_listmat-matid
    git_listmat-serial_ewm git_listmat-createutc
    git_listmat-createuser git_listmat-changeutc
    git_listmat-changeuser
    FROM mara AS ma
    INNER JOIN marc AS mc
    ON ma~matnr = mc~matnr
    LEFT OUTER JOIN /sapapo/matkey AS mk
    ON mk~matnr = mc~matnr
    .

    Como con este SELECT se puede tirar horas.

    He pensado en hacerlo por trozos, primero lo pongo en una tabla interna lo más gordo:

    SELECT
    mc~matnr mc~werks
    mc~sernp mk~matid mk~serial mk~createutc mk~createuser
    mk~changeutc mk~changeuser
    INTO CORRESPONDING FIELDS OF TABLE git_listmat
    FROM marc AS mc
    LEFT OUTER JOIN /sapapo/matkey AS mk
    ON mk~matnr = mc~matnr
    .

    y luego actualizo los campos que necesito de MARA:

    ma~ersda ma~ernam ma~laeda ma~aenam ma~serial.

    Pues esto útimo no se como hacerlo... he pensado con lo siguiente:

    SELECT
    ma~matnr
    mc~werks
    ma~ersda ma~ernam ma~laeda ma~aenam ma~serial
    mc~sernp
    INTO TABLE git_erp
    FROM mara AS ma
    INNER JOIN marc AS mc
    ON ma~matnr = mc~matnr
    .

    LOOP AT git_listmat.
    READ TABLE git_erp WITH KEY MATNR = git_listmat-matnr.

    git_listmat-matnr = git_erp-matnr.
    git_listmat-ersda = git_erp-ersda.
    git_listmat-ernam = git_erp-ernam.
    git_listmat-laeda = git_erp-laeda.
    git_listmat-aenam = git_erp-aenam.
    git_listmat-serial = git_erp-serial.

    modify git_listmat INDEX sy-tabix.
    ENDLOOP.


    pero también tarda una vida...



    ¡¡GRACIAS POR VUESTRO TIEMPO!!
  • kachalot
    Junior Member
    • ene
    • 9

    #2
    Bueno... he probado con eso:

    SELECT
    ma~matnr
    mc~matnr mc~werks
    ma~ersda ma~ernam ma~laeda ma~aenam ma~serial
    mc~sernp mk~matid mk~serial mk~createutc mk~createuser
    mk~changeutc mk~changeuser
    INTO CORRESPONDING FIELDS OF TABLE git_listmat
    * into TABLE git_erpmatkey
    * git_listmat-matnr git_listmat-werks git_listmat-ersda
    * git_listmat-ernam git_listmat-laeda git_listmat-aenam
    * git_listmat-serial git_listmat-sernp git_listmat-matid
    * git_listmat-serial_ewm git_listmat-createutc
    * git_listmat-createuser git_listmat-changeutc
    * git_listmat-changeuser
    FROM mara AS ma
    INNER JOIN marc AS mc
    ON ma~matnr = mc~matnr
    LEFT OUTER JOIN /sapapo/matkey AS mk
    ON mk~matnr = mc~matnr


    y no es tan lento 116.316 registros en un par de segundos.

    ahora tengo otro problema... que tengo que hacer 2 join más a dos tablas y claro... como lo hago:

    - recorro la tabla interna y modifico o añado líneas.

    Es que es muy complejo... son 3, 4 o 5 tablas que deben ir en la misma tabla interna dependiendo de checks y... da igual, dejarlo...GRACIAS POR TODO!!

    Comentario

    • rubendaga
      Junior Member
      • sep
      • 13

      #3
      Puedes probar meter la consulta dentro de un OPEN CURSOR, puede ayudar a mejorar el rendimiento de tu consulta desde que no se use FOR ALL ENTRIES, un ejemplo sencillo sería así:

      DATA: c1 TYPE cursor.

      OPEN CURSOR c1 FOR SELECT *
      FROM (tabla)
      WHERE (condición)
      ORDER BY PRIMARY KEY.

      DO.
      * Leer siguiente registro de cabcera.
      FETCH NEXT CURSOR c1 INTO (estructura).

      * Si encuentra el registro (Si existe).
      IF sy-subrc EQ 0.
      append.....
      else.
      exit.
      endif.
      ENDDO.

      Comentario

      Trabajando...