#1
|
|||
|
|||
Programa
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 |
#2
|
|||
|
|||
falta loop para borrar
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 |
#3
|
|||
|
|||
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. |
#4
|
|||
|
|||
programa
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 |
#5
|
|||
|
|||
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. |
#6
|
|||
|
|||
Muchas Gracias Amiga por tomarte toso ese tiempo en ayudarme.
Saludos AMAM |
#7
|
|||
|
|||
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. |
#8
|
|||
|
|||
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 |
Herramientas | Buscar en Tema |
Desplegado | |
|
|