PDA

Ver la Versión Completa : Programa


amam2605
16/05/12, 15:57:36
Hola a Todos !!!

Tengo un caso a ver si me puedes por favor ayudar, tengo que seleccionar informacion donde solo se imprima cuando tenga unicamente las areas 1000-10-67 y 1000-11-67 si esta acompañada por otra area no se debe imprimir.

Por ejemplo el codigo 42867 si se debe imprimir por que solo tiene esas dos areas.

Codigo Organizacion Canal Sector
42867 1000 10 67
42867 1000 11 67


Este codigo 18273 no se debe imprimir ya que aparte de las areas 1000-10-67 y 1000-11-67 tambien tiene el area 1000-10-11.

Codigo Organizacion Canal Sector
18273 1000 10 11
18273 1000 10 67
18273 1000 11 67

En el programa seleccione de la tabla knvv todas los codigos que esten en el area 1000 pero como extraer que solo sean los que tengan 1000-10-67 y 1000-11-67 unicamente. Si coloco que traiga los que tengan SPART = 67 tambien me trae los que tengan el SPART = 10.


El codigo que tengo actualmente es:


TABLES: KNVV,
KNA1.


*--------------------- PROGRAMA PRINCIPAL -----------------------------*

DATA: BEGIN OF TABLA OCCURS 0,
KUNNR LIKE KNVV-KUNNR,
VKORG LIKE KNVV-VKORG,
VTWEG LIKE KNVV-VTWEG,
SPART LIKE KNVV-SPART,
END OF TABLA.


DATA: BEGIN OF TABLA2 OCCURS 0,
KUNNR LIKE KNVV-KUNNR,
VKORG LIKE KNVV-VKORG,
VTWEG LIKE KNVV-VTWEG,
SPART LIKE KNVV-SPART,
END OF TABLA2.


START-OF-SELECTION.

WRITE: / 'Codigo',
013 'Nombre',
050 'Organizacion',
065 'Canal',
074 'Sector'.

SELECT KUNNR VKORG VTWEG SPART INTO (TABLA-KUNNR, TABLA-VKORG, TABLA-VTWEG, TABLA-SPART)
FROM KNVV
WHERE VKORG = '1000'
AND VTWEG IN ('10','11').

MOVE TABLA TO TABLA2.
IF TABLA2-SPART NE '67'.
DELETE TABLA2 WHERE KUNNR = TABLA-KUNNR.
CONTINUE.
ENDIF.

APPEND TABLA2.
SELECT SINGLE * FROM KNA1
WHERE KUNNR = TABLA-KUNNR.

WRITE: / TABLA2-KUNNR,
013 KNA1-NAME1,
050 TABLA2-VKORG,
065 TABLA2-VTWEG,
074 TABLA2-SPART.

ENDSELECT.

Si me pueden orientar ya que asi no esta respetando que traiga solo los codgos que tengan unicamnete las areas 1000-10-67 o 1000-11-67.

Gracias

Saludos

AMAM

rafa_fonseca
16/05/12, 17:02:38
buenas, creo que tu problema es este:

IF TABLA2-SPART NE '67'.
DELETE TABLA2 WHERE KUNNR = TABLA-KUNNR.
CONTINUE.
ENDIF.

no estas usando un loop para recorrer la tabla por ende no te va borrar el registro podrias hacer lo siguiente:

loop at tabla2
where spart ne '67'.
delete tabla2.
endloop.


saludos

Mari.Sole
16/05/12, 19:22:46
Hola Amam2605,
Si no entendí mal tu necesidad, debes obtener los datos comerciales de los clientes que tengan:
VKORG = '1000'.
VTWEG = '10' o '11'
SPART = '67'.

Y para todos estos clientes obtener luego su Nombre (NAME1).

Yo haría algo así:

* Obtener los datos comerciales de los clientes

SELECT KUNNR VKORG VTWEG SPART
FROM KNVV
INTO TABLE TABLA1
WHERE VKORG EQ '1000'
AND ( VTWEG EQ '10' OR VTWEG EQ '11')
AND SPART EQ '67'.

*Obtener el Nombre para todos los clientes

SELECT KUNNR NAME1
FROM KNA1
INTO TABLE TABLA2
FOR ALL ENTRIES TABLA1
WHERE KUNNR EQ TABLA1-KUNNR.


* Armo tabla FINAL a mostrar

LOOP AT TABLA1 INTO R_TABLA1
READ TABLE TABLA2 INTO R_TABLA2 WITH KEY KUNNR = R_TABLA1-KUNNR.

IF SY-SUBRC IS INITIAL.

MOVE R_TABLA1-KUNNR TO R_TABLA_FINAL-KUNNR.
MOVE R_TABLA2-NAME1 TO R_TABLA_FINAL-NAME1.
MOVE R_TABLA1-VKORG TO R_TABLA_FINAL-VKORG.
MOVE R_TABLA1-VTWEG TO R_TABLA_FINAL-VTWEG.
MOVE R_TABLA1-SPART TO R_TABLA_FINAL-SPART.

APPEND R_TABLA_FINAL TO TABLA_FINAL.
CLEAR R_TABLA_FINAL.

ENDIF.
ENDLOOP.

Luego sólo restaría imprimir en pantalla la TABLA_FINAL con Write o un ALV.

Espero te sirva,

Saludos.

amam2605
17/05/12, 12:43:27
Hola Mari.Sole como estas, si debe imprimir como dices pero si el codigo al seleccionar tiene aparte de las areas 1000-10-67 y/o 1000-11-67 tiene otra area ese codigo no se debe imprimir solo se imprimen los que tengas esas dos areas o una de ellas si esta acompañada por otras areas no se imprime.

El prgrama que me indicas las imprime sin tomar en cuenta esta condicion. cierto?

Muchas Gracias

Saludos

AMAM

Hola Amam2605,
Si no entendí mal tu necesidad, debes obtener los datos comerciales de los clientes que tengan:
VKORG = '1000'.
VTWEG = '10' o '11'
SPART = '67'.

Y para todos estos clientes obtener luego su Nombre (NAME1).

Yo haría algo así:

* Obtener los datos comerciales de los clientes

SELECT KUNNR VKORG VTWEG SPART
FROM KNVV
INTO TABLE TABLA1
WHERE VKORG EQ '1000'
AND ( VTWEG EQ '10' OR VTWEG EQ '11')
AND SPART EQ '67'.

*Obtener el Nombre para todos los clientes

SELECT KUNNR NAME1
FROM KNA1
INTO TABLE TABLA2
FOR ALL ENTRIES TABLA1
WHERE KUNNR EQ TABLA1-KUNNR.


* Armo tabla FINAL a mostrar

LOOP AT TABLA1 INTO R_TABLA1
READ TABLE TABLA2 INTO R_TABLA2 WITH KEY KUNNR = R_TABLA1-KUNNR.

IF SY-SUBRC IS INITIAL.

MOVE R_TABLA1-KUNNR TO R_TABLA_FINAL-KUNNR.
MOVE R_TABLA2-NAME1 TO R_TABLA_FINAL-NAME1.
MOVE R_TABLA1-VKORG TO R_TABLA_FINAL-VKORG.
MOVE R_TABLA1-VTWEG TO R_TABLA_FINAL-VTWEG.
MOVE R_TABLA1-SPART TO R_TABLA_FINAL-SPART.

APPEND R_TABLA_FINAL TO TABLA_FINAL.
CLEAR R_TABLA_FINAL.

ENDIF.
ENDLOOP.

Luego sólo restaría imprimir en pantalla la TABLA_FINAL con Write o un ALV.

Espero te sirva,

Saludos.

Mari.Sole
17/05/12, 16:25:39
Hola amam2605,
Ahora sí me queda más claro. Podríamos entonces hacer sl siguiente cambio al código que te pasé:

* Obtener los datos comerciales de los clientes

SELECT KUNNR VKORG VTWEG SPART
FROM KNVV
INTO TABLE TABLA1
WHERE VKORG EQ '1000'
AND ( VTWEG EQ '10' OR VTWEG EQ '11').

* Encontrar clientes con Sector (SPART) distinto a 67

LOOP TABLA1 INTO R_TABLA1.
IF R_TABLA1-SPART NE '67'.
MOVE R_TABLA1 -KUNNR TO R_TABLA3-KUNNR.
APPEND R_TABLA3 TO TABLA3.
CLEAR R_TABLA3.
ENDIF.
ENDLOOP.

* Eliminar clientes con Sector (SPART) distinto a 67

CLEAR D_INDEX.
LOOP TABLA1 INTO R_TABLA1.
D_INDEX = SY-TABIX.
READ TABLE TABLA3 INTO R_TABLA3 WITH KEY KUNNR = R_TABLA1-KUNNR.
IF SY-SUBRC IS INITIAL.
DELETE TABLA1 INDEX D_INDEX.
ENDIF.
ENDLOOP.


Luego continuaría con el resto del código donde obtiene a partir de la TABLA1 los nombres de los clientes, y por ultimo arma la tabla final a mostrar, ese código no debería sufrir ninguna modificación.
Se podrían ahorrar unos cuantos pasos volcando desde el comienzo todo a una tabla final y sólo ir modificando registros o eliminando pero traté de hacerlo así bien desglosado para que se entienda bien que se está haciendo.
Se puede optimizar muchísimo más sin problemas.
Espero te sea útil.

amam2605
18/05/12, 12:41:47
Muchas Gracias Amiga por tomarte toso ese tiempo en ayudarme.

Saludos

AMAM


Hola amam2605,
Ahora sí me queda más claro. Podríamos entonces hacer sl siguiente cambio al código que te pasé:

* Obtener los datos comerciales de los clientes

SELECT KUNNR VKORG VTWEG SPART
FROM KNVV
INTO TABLE TABLA1
WHERE VKORG EQ '1000'
AND ( VTWEG EQ '10' OR VTWEG EQ '11').

* Encontrar clientes con Sector (SPART) distinto a 67

LOOP TABLA1 INTO R_TABLA1.
IF R_TABLA1-SPART NE '67'.
MOVE R_TABLA1 -KUNNR TO R_TABLA3-KUNNR.
APPEND R_TABLA3 TO TABLA3.
CLEAR R_TABLA3.
ENDIF.
ENDLOOP.

* Eliminar clientes con Sector (SPART) distinto a 67

CLEAR D_INDEX.
LOOP TABLA1 INTO R_TABLA1.
D_INDEX = SY-TABIX.
READ TABLE TABLA3 INTO R_TABLA3 WITH KEY KUNNR = R_TABLA1-KUNNR.
IF SY-SUBRC IS INITIAL.
DELETE TABLA1 INDEX D_INDEX.
ENDIF.
ENDLOOP.


Luego continuaría con el resto del código donde obtiene a partir de la TABLA1 los nombres de los clientes, y por ultimo arma la tabla final a mostrar, ese código no debería sufrir ninguna modificación.
Se podrían ahorrar unos cuantos pasos volcando desde el comienzo todo a una tabla final y sólo ir modificando registros o eliminando pero traté de hacerlo así bien desglosado para que se entienda bien que se está haciendo.
Se puede optimizar muchísimo más sin problemas.
Espero te sea útil.

Mari.Sole
18/05/12, 14:42:51
De nada AMAM, espero te haya servido y se haya entendido el código.
Y esto es apenas un pequeño granito de arena que es mi manera de devolver toda la ayuda que siempre he encontrado aquí en el foro.

Saludos.

amam2605
18/05/12, 15:42:31
Hola Amiga

Donde puedo ver ejemplos de rutura de control en programas, tengo un caso con otro programa que coloque en el foro pero no he trabajado con ese procedimiento.

Muchas Gracias por tu ayuda.

Saludos

AMAM


De nada AMAM, espero te haya servido y se haya entendido el código.
Y esto es apenas un pequeño granito de arena que es mi manera de devolver toda la ayuda que siempre he encontrado aquí en el foro.

Saludos.