|
Herramientas | Buscar en Tema | Desplegado |
#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!! |
#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!! |
#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. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|