PDA

Ver la Versión Completa : Dato perdido.


DCErick
13/05/06, 15:24:59
Hola a todos. tengo un problema con el siguiente segmento de código....



LOOP AT t_zekko.
v_tabix = sy-tabix.

SELECT belnr ebeln bewtp bwart
FROM ekbe
INTO CORRESPONDING FIELDS OF TABLE t_zekbe_del
WHERE ebeln = t_zekko-ebeln
GROUP BY belnr ebeln bewtp bwart
ORDER BY belnr DESCENDING.

IF t_zekbe_del[] IS INITIAL.
DELETE t_zekko INDEX v_tabix.
CLEAR t_zekbe_del.
ELSE.
LOOP AT t_zekbe_del.
IF t_zekbe_del-bewtp = 'U' AND t_zekbe_del-bwart = '351'.
MOVE : t_zekbe_del-belnr TO t_zekko-belnr.
ELSE.
CLEAR t_zekbe_del.
DELETE t_zekko INDEX v_tabix.
ENDIF.
EXIT.
ENDLOOP.
CLEAR t_zekbe_del.
ENDIF.

ENDLOOP.


Cuando yo lo ejecuto en modo debug.... la siguiente linea
MOVE : t_zekbe_del-belnr TO t_zekko-belnr.

Si hace lo que tiene que hacer pro cuando salgo de LOOP "LOOP AT t_zekko."

El campo t_zekko-belnr por obra del espiritu santo sale sin nada, cuando en modo debug yo vi que si se le asignaron valores...

Alguna idea.... Falta alguna instruccion para aceptar cambios o en que estoy mal...:confused:

erp
13/05/06, 15:46:42
Hola DCErick,

Tu problema es que solo has modificado el registro de cabecera de la tabla interna t_zekko no el registro en si. Necesitas un append o un modify.

De todas formas un consejo. Nunca borres ni añadas registros en una tabla interna sobre la que estas haciendo un loop. Usa una tabla auxiliar.

Ej:


LOOP AT t_zekko.

SELECT belnr ebeln bewtp bwart
FROM ekbe
INTO CORRESPONDING FIELDS OF TABLE t_zekbe_del
WHERE ebeln = t_zekko-ebeln
GROUP BY belnr ebeln bewtp bwart
ORDER BY belnr DESCENDING.

IF SY-SUBRC = 0 THEN.
LOOP AT t_zekbe_del.
IF t_zekbe_del-bewtp = 'U' AND t_zekbe_del-bwart = '351'.
MOVE : t_zekbe_del-belnr TO t_zekko-belnr.
.
.
LLena los valores de una tabla auxiliar t_zekbe_aux con los valores del select y los de t_zekbe y luego añade el registro con APPEND
.
APPEND t_zekbe_aux.
.
.

ENDIF.
ENDLOOP.
CLEAR t_zekbe_del.
ENDIF.

ENDLOOP.

Un saludo

DCErick
13/05/06, 15:56:10
Hola ya mas o menos te entendi y yo lo habia logrado así...



LOOP AT t_zekko.
v_tabix = sy-tabix.

****Esta consulta se usa tamb. para ver si un 351 ya fue cancelado con un 352.
****Se supone que los movimientos 101 no se cancelan.
****Checar como es el proceso de cancelado

SELECT belnr ebeln bewtp bwart
FROM ekbe
INTO CORRESPONDING FIELDS OF TABLE t_zekbe_del
WHERE ebeln = t_zekko-ebeln
GROUP BY belnr ebeln bewtp bwart
ORDER BY belnr DESCENDING.

IF t_zekbe_del[] IS INITIAL.
DELETE t_zekko INDEX v_tabix.
CLEAR t_zekbe_del.
ELSE.
LOOP AT t_zekbe_del.
IF t_zekbe_del-bewtp = 'U' AND t_zekbe_del-bwart = '351'.
MOVE: t_zekbe_del-belnr TO t_zekko_-belnr,
t_zekko-ebeln TO t_zekko_-ebeln,
t_zekko-aedat TO t_zekko_-aedat,
t_zekko-reswk TO t_zekko_-reswk,
t_zekko-ekgrp TO t_zekko_-ekgrp,
t_zekko-bedat TO t_zekko_-bedat.
APPEND: t_zekko_.
ELSE.
DELETE t_zekko INDEX v_tabix.
ENDIF.
EXIT.
ENDLOOP.
ENDIF.

ENDLOOP.

CLEAR t_zekko[].
t_zekko[] = t_zekko_[].



Pero ya con tu consejo, creo que podré simplificar eso del delete en loop. gracias amigo, creo que al final de cuentas no ando tan perdido jeje....

DCErick
13/05/06, 16:40:06
Listo ya salio con menos codigo....



LOOP AT t_zekko.
SELECT belnr ebeln bewtp bwart
FROM ekbe
INTO CORRESPONDING FIELDS OF TABLE t_zekbe_del
WHERE ebeln = t_zekko-ebeln
GROUP BY belnr ebeln bewtp bwart
ORDER BY belnr DESCENDING.

IF sy-subrc = 0.
READ TABLE t_zekbe_del.
IF t_zekbe_del-bewtp = 'U' AND t_zekbe_del-bwart = '351'.
MOVE-CORRESPONDING t_zekko TO t_zekko_.
MOVE: t_zekbe_del-belnr TO t_zekko_-belnr.
APPEND: t_zekko_.
ENDIF.
ENDIF.

CLEAR t_zekbe_del.
REFRESH t_zekbe_del.
ENDLOOP.



Gracias erp por tus consejos....:D