Programa

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • amam2605
    Senior Member
    • ene
    • 150

    #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
  • rafa_fonseca
    Junior Member
    • abr
    • 12

    #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

    Comentario

    • Mari.Sole
      Senior Member
      • nov
      • 121

      #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.

      Comentario

      • amam2605
        Senior Member
        • ene
        • 150

        #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

        Originalmente publicado por Mari.Sole
        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.

        Comentario

        • Mari.Sole
          Senior Member
          • nov
          • 121

          #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.

          Comentario

          • amam2605
            Senior Member
            • ene
            • 150

            #6
            Muchas Gracias Amiga por tomarte toso ese tiempo en ayudarme.

            Saludos

            AMAM


            Originalmente publicado por Mari.Sole
            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.

            Comentario

            • Mari.Sole
              Senior Member
              • nov
              • 121

              #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.

              Comentario

              • amam2605
                Senior Member
                • ene
                • 150

                #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


                Originalmente publicado por Mari.Sole
                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.
                Archivos Adjuntos

                Comentario

                Trabajando...