Cargar de dos tablas a una - SELECT INTO TABLE FROM

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • zayas555@gmail.com
    Junior Member
    • ene
    • 13

    #1

    Cargar de dos tablas a una - SELECT INTO TABLE FROM

    Buenos días, estoy queriendo realizar la siguiente operación quiero cargar datos de dos tablas distintas a una para luego mostrar en un reporte pero me sale el siguiente error en mi código:

    Err.tmpo.ejec.: ITAB_DUPLICATE_KEY
    A row with the same key already exists.

    Este es mi código:

    SELECT Z~mandt Z~kunnr K~name1 Z~zsd_fecha_nac Z~zsd_doc_ident Z~zsd_dom_parti
    Z~zsd_dom_comer Z~zsd_est_civil Z~zsd_nacional Z~zsd_ruc
    Z~zsd_telefono Z~zsd_celular Z~zsd_email Z~zsd_localidad
    INTO TABLE gt_det_cliente
    FROM zsd_det_cliente AS Z
    JOIN KNA1 AS K
    ON Z~name1 = K~name1
    WHERE Z~kunnr IN p_kunnr
    AND K~name1 IN so_name1
    AND zsd_fecha_nac IN so_fnaci
    AND zsd_doc_ident IN so_dni
    AND zsd_dom_parti IN so_dompa
    AND zsd_dom_comer IN so_domco
    AND zsd_est_civil IN so_estci
    AND zsd_nacional IN so_nacio
    AND zsd_ruc IN so_ruc
    AND zsd_telefono IN so_telef
    AND zsd_celular IN so_celul
    AND zsd_email IN so_email
    AND zsd_localidad IN so_local.


    El error me señala en la primera línea que expuse aquí.
    Las tablas de donde deseo sacar los datos son KNA1 y zsd_det_cliente, los dos contienen el campo name1 pero solo está cargado en la tabla KNA1.
    Les agradecería que me den una manito.

    Desde ya muchas gracias.
    Editado por última vez por zayas555@gmail.com; 08/04/2015, 12:03:21.
    Zayas
  • oskymoreok
    Junior Member
    • jul
    • 25

    #2
    Proba lo siguiente

    Siempre mante un orden, primero pone todos los Z y despues lo K no mesclado

    SELECT z~mandt z~kunnr z~zsd_fecha_nac z~zsd_doc_iden z~zsd_dom_parti z~zsd_dom_comer z~zsd_est_civil z~zsd_nacional z~zsd_ruc z~zsd_telefono z~zsd_celular z~zsd_email z~zsd_localidad K~name1

    Ahora utiliza este
    INTO CORRESPONDING FIELDS OF gt_det_cliente "Esta tabla debe estar declara con header

    FROM zsd_det_cliente AS Z
    JOIN KNA1 AS K
    ON Z~name1 = K~name1
    WHERE Z~kunnr IN p_kunnr
    AND K~name1 IN so_name1
    AND zsd_fecha_nac IN so_fnaci
    AND zsd_doc_ident IN so_dni
    AND zsd_dom_parti IN so_dompa
    AND zsd_dom_comer IN so_domco
    AND zsd_est_civil IN so_estci
    AND zsd_nacional IN so_nacio
    AND zsd_ruc IN so_ruc
    AND zsd_telefono IN so_telef
    AND zsd_celular IN so_celul
    AND zsd_email IN so_email
    AND zsd_localidad IN so_local.

    Avisame si sigue el error!

    Comentario

    • coloso
      Senior Member
      • feb
      • 110

      #3
      Hola compañero, el problema es que en la tabla que estás montando el resultado estás intentando metes dos veces o más el mismo registro, como has definido la tabla gt_det_cliente ?????

      Has probado hacer un appending corresponding fields ....

      SELECT budat hkont belnr shkzg wrbtr FROM bsas
      APPENDING CORRESPONDING FIELDS OF TABLE it_temp
      WHERE hkont = w_glacct "wa_cb-gl_account
      AND bukrs IN (so_bukrs-low)
      AND budat < so_date-low.

      Luego ordena los registros y tienes que tener registros duplicados, es decir coinciden todos los campos...

      Salu2.

      Comentario

      • zayas555@gmail.com
        Junior Member
        • ene
        • 13

        #4
        Hola oskymoreok, muchas gracias por responder.. al colocar este codigo:

        SELECT K~name1 Z~mandt Z~kunnr Z~zsd_fecha_nac Z~zsd_doc_ident Z~zsd_dom_parti
        Z~zsd_dom_comer Z~zsd_est_civil Z~zsd_nacional Z~zsd_ruc
        Z~zsd_telefono Z~zsd_celular Z~zsd_email Z~zsd_localidad
        INTO CORRESPONDING FIELDS OF gt_det_cliente
        FROM zsd_det_cliente AS Z
        JOIN KNA1 AS K
        ON Z~name1 = K~name1
        WHERE Z~kunnr IN p_kunnr
        AND K~name1 IN so_name1
        AND zsd_fecha_nac IN so_fnaci
        AND zsd_doc_ident IN so_dni
        AND zsd_dom_parti IN so_dompa
        AND zsd_dom_comer IN so_domco
        AND zsd_est_civil IN so_estci
        AND zsd_nacional IN so_nacio
        AND zsd_ruc IN so_ruc
        AND zsd_telefono IN so_telef
        AND zsd_celular IN so_celul
        AND zsd_email IN so_email
        AND zsd_localidad IN so_local.


        El mensaje que me lanza es el siguiente:
        Error sintaxis
        Programa ZSD_REPORTE_CLIENTES
        You cannot use an internal table as a work area.

        PD: adjunto a esta respuesta el codigo completo del programa --» https://dl.dropboxusercontent.com/u/...S_original.txt
        Editado por última vez por zayas555@gmail.com; 08/04/2015, 14:24:55.
        Zayas

        Comentario

        • zayas555@gmail.com
          Junior Member
          • ene
          • 13

          #5
          Hola coloso
          Para que veas el codigo completo de como esta declarado te lo dejo en este link: https://dl.dropboxusercontent.com/u/...S_original.txt

          Voy a leer sobre el método que me sugeris.. porque soy nuevo en codigo abap..

          Gracias!..
          Zayas

          Comentario

          • zayas555@gmail.com
            Junior Member
            • ene
            • 13

            #6
            Quizas no fui claro con lo que busco realizar..

            Lo que pasa es que cuando se ejecuta el reporte Z, en la columna nombre (campo name1) no muestra algunos nombres de clientes.. pero cuando se ingresa en el registro si existe..

            Verifiqué y se debe a que en el reporte se carga el valor de la tabla Z (zsd_det_cliente) que no tiene cargado este campo (nombre) pero en el registro si muestra porque estira de la tabla KNA1..

            Mi idea es hacer que cuando carga en la tabla gt_det_cliente carge del campo de la tabla KNA1 y no de zsd_det_cliente.

            El codigo sin editar es el siguiente: https://dl.dropboxusercontent.com/u/...S_original.txt
            Zayas

            Comentario

            • coloso
              Senior Member
              • feb
              • 110

              #7
              Hola compañero para empezar el error que te daba al principio es por la declaración del tipo de tabla

              gt_det_cliente TYPE SORTED TABLE OF zsd_det_cliente WITH UNIQUE KEY kunnr,

              Al ser una tabla con unique key, si se repite el mismo nº de kunnr te debe de dar el error por eso, has probado con

              gt_det_cliente like standard table of zsd_det_client with header line, si te salen luego algún kunnr repetido ?????

              Haz lo que te dice oskymoreok, pero declara la tabla como te digo yo.

              Salu2.

              Comentario

              • oskymoreok
                Junior Member
                • jul
                • 25

                #8
                Primero declara la tabla como te dice coloso, es importante que mantegas un orden poner los campos en el select

                si Z es la primera tabla y el que mas campos en el select lleva, primero van esos ordenados dependiendo como estan declarados en la tabla zsd_det_cliente

                SELECT

                Z~mandt Z~kunnr Z~zsd_fecha_nac Z~zsd_doc_ident Z~zsd_dom_parti Z~zsd_dom_comer Z~zsd_est_civil Z~zsd_nacional Z~zsd_ruc Z~zsd_telefono Z~zsd_celular Z~zsd_email Z~zsd_localidad

                "Despues irian todos los correspondiente a la segunda tabla kna1, en tu caso es uno solo

                K~name1

                INTO CORRESPONDING FIELDS OF gt_det_cliente
                FROM zsd_det_cliente AS Z
                JOIN KNA1 AS K
                ON Z~name1 = K~name1




                En el codigo que me dijiste pusiste K~name1 primero y va ultimo, te explico, cuando pones into corresponding field va a buscar por cada campo de select en tu tabla donde se encuentra pra guardarla, pero si pones into to buscaria de a uno y no seria optimo, es importante que respetes siempre el orden

                Comentario

                • zayas555@gmail.com
                  Junior Member
                  • ene
                  • 13

                  #9
                  Buenas tardes amigos.. despues de colocar el codigo:
                  SELECT Z~mandt Z~kunnr Z~zsd_fecha_nac Z~zsd_doc_ident Z~zsd_dom_parti
                  Z~zsd_dom_comer Z~zsd_est_civil Z~zsd_nacional Z~zsd_ruc
                  Z~zsd_telefono Z~zsd_celular Z~zsd_email Z~zsd_localidad
                  K~name1
                  INTO CORRESPONDING FIELDS OF gt_det_cliente
                  FROM zsd_det_cliente AS Z
                  JOIN KNA1 AS K
                  ON Z~name1 = K~name1
                  WHERE Z~kunnr IN p_kunnr
                  AND K~name1 IN so_name1
                  AND zsd_fecha_nac IN so_fnaci
                  AND zsd_doc_ident IN so_dni
                  AND zsd_dom_parti IN so_dompa
                  AND zsd_dom_comer IN so_domco
                  AND zsd_est_civil IN so_estci
                  AND zsd_nacional IN so_nacio
                  AND zsd_ruc IN so_ruc
                  AND zsd_telefono IN so_telef
                  AND zsd_celular IN so_celul
                  AND zsd_email IN so_email
                  AND zsd_localidad IN so_local.


                  me sigue saliendo el mismo mensaje

                  Error sintaxis
                  Programa ZSD_REPORTE_CLIENTES
                  You cannot use an internal table as a work area.

                  Mi idea original fue la de cargar los datos desde las dos tablas (zsd_det_cliente y Kna1) en una gt_det_cliente.

                  Pero tambien creo que se puede realizar cargando primero de una y luego cargar solo un campo del otro, verdad?.. lo quise hacer así:

                  SELECT mandt kunnr name1 zsd_fecha_nac zsd_doc_ident zsd_dom_parti
                  zsd_dom_comer zsd_est_civil zsd_nacional zsd_ruc
                  zsd_telefono zsd_celular zsd_email zsd_localidad
                  FROM zsd_det_cliente
                  INTO TABLE gt_det_cliente
                  WHERE kunnr IN p_kunnr
                  AND name1 IN so_name1
                  AND zsd_fecha_nac IN so_fnaci
                  AND zsd_doc_ident IN so_dni
                  AND zsd_dom_parti IN so_dompa
                  AND zsd_dom_comer IN so_domco
                  AND zsd_est_civil IN so_estci
                  AND zsd_nacional IN so_nacio
                  AND zsd_ruc IN so_ruc
                  AND zsd_telefono IN so_telef
                  AND zsd_celular IN so_celul
                  AND zsd_email IN so_email
                  AND zsd_localidad IN so_local.

                  SELECT mandt kunnr name1
                  FROM kna1
                  INTO TABLE gt_det_cliente
                  WHERE kunnr IN p_kunnr
                  AND name1 IN so_name1.


                  Y FUNCIONA!.. me carga los datos del nombre en el reporte pero me borra los campos de fecha de nacimiento, telefono y otros.. Entiendo que es porque sobreescribe.. como puedo hacer para actualizar el campo name1 sin eliminar los otros campos?..
                  Quizas esta solucion es más fácil
                  Zayas

                  Comentario

                  • ayaxrojo
                    Junior Member
                    • feb
                    • 14

                    #10
                    Ya lo solucionaste pero me parece que el error que te mandaba es por que estas intentando metesr una WA en una tabla.

                    INTO CORRESPONDING FIELDS OF gt_det_cliente

                    Tendrias que usar :
                    INTO CORRESPONDING FIELDS OF TABLE gt_det_cliente

                    Comentario

                    • sconoredhot
                      Senior Member
                      • feb
                      • 341

                      #11
                      hola

                      para que no te sobreescriba, deberias guardar el segundo select en otra tabla interna. y tambien tener declarada una tabla interna final

                      entonces luego recorres la primera,
                      dentro del loop, haces un read table a la segunda, entonces tienes disponibles
                      todos los datos, y vas pasando todos los campos que necesitas
                      a la tabla final y le haces un append.
                      Sebas

                      Desarrollador ABAP.

                      Comentario

                      • FFARRO
                        Junior Member
                        • nov
                        • 11

                        #12
                        La forma correcta de hacerlo es:

                        Primero: Haces tu select para traer todos tus registros con casi todos los campos que necesitas.

                        SELECT mandt kunnr name1 zsd_fecha_nac zsd_doc_ident zsd_dom_parti
                        zsd_dom_comer zsd_est_civil zsd_nacional zsd_ruc
                        zsd_telefono zsd_celular zsd_email zsd_localidad
                        FROM zsd_det_cliente
                        INTO TABLE gt_det_cliente
                        WHERE kunnr IN p_kunnr
                        AND name1 IN so_name1
                        AND zsd_fecha_nac IN so_fnaci
                        AND zsd_doc_ident IN so_dni
                        AND zsd_dom_parti IN so_dompa
                        AND zsd_dom_comer IN so_domco
                        AND zsd_est_civil IN so_estci
                        AND zsd_nacional IN so_nacio
                        AND zsd_ruc IN so_ruc
                        AND zsd_telefono IN so_telef
                        AND zsd_celular IN so_celul
                        AND zsd_email IN so_email
                        AND zsd_localidad IN so_local.

                        Segundo: Llenas otra tabla con el codigo de cliente y el nombre.

                        if gt_det_cliente is not initial.

                        SELECT mandt kunnr name1
                        FROM kna1
                        INTO TABLE t_kna1
                        FOR ALL ENTRIES gt_det_cliente
                        WHERE kunnr EQ gt_det_cliente-kunnr.

                        endif.

                        Finalmente: recorres tu tabla colocandole el valor correcto en name1.

                        LOOP AT gt_det_cliente ASSIGNING <fs_det>.

                        read table t_kna1 into wa_kna1 with key kunnr = <fs_det>-kunnr.
                        if sy-subrc = 0.
                        <fs_det>-name1 = wa_kna1-name1.
                        endif.

                        ENDLOOP.

                        Espero te ayude.

                        Freddy Farro
                        Programador ABAP
                        ________________________

                        Saludos,

                        Freddy Farro
                        Desarrollador ABAP

                        Comentario

                        Trabajando...