MUNDOSAP

Regresar   MUNDOSAP > DESARROLLO > Programación ABAP IV
Nombre de Usuario
Contraseña
Home Descargas Registrar FAQ Miembros Calendario Buscar Temas de Hoy Marcar Foros Como Leídos




 
Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Viejo 14/02/13, 11:20:20
kachalot kachalot is offline
Junior Member
 
Fecha de Ingreso: ene 2013
Mensajes: 9
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!!
Responder Con Cita
  #2  
Viejo 14/02/13, 12:44:03
kachalot kachalot is offline
Junior Member
 
Fecha de Ingreso: ene 2013
Mensajes: 9
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!!
Responder Con Cita
  #3  
Viejo 14/02/13, 22:41:43
rubendaga rubendaga is offline
Junior Member
 
Fecha de Ingreso: sep 2011
Mensajes: 13
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Reglas de Mensajes
no puedes crear nuevos temas
no puedes responder temas
no puedes adjuntar archivos
no puedes editar tus mensajes

El código vB está On
Las caritas están On
Código [IMG] está On
Código HTML está Off
Saltar a Foro


Husos Horarios son GMT. La hora en este momento es 00:19:51.


www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web