ELIMINAR ADYACENTES DUPLICADOS no funciona

Tengo una tabla interna que está lleno de 108 entradas. De 9 a 9 entradas es la repetición de las entradas y quería eliminar no duplicados. Ya que son exactamente el mismo que he usado el delete adjacent duplicates from itab comparing all fields. También lo intentó sin comparing all fields. Ningún éxito.
Si ayuda, mi tabla tiene 9 campos: burks, hkont, gjahr, belnr, budat, waers, shkzg, wrbtr, dmbtr y dmbe2. Son de BSIS y son, en este orden.
Este es el DO bucle en el que es el SELECCIONARenter code here. Me he puesto a DELETE fuera de la DO bucle.
Los dos primeros SELECT‘s están trabajando muy bien y que pertenecen al código anterior que existía.

DO 12 TIMES.
         lv_aux = lv_aux + 1.
         lv_tamanho = STRLEN( lv_aux ).
         IF lv_tamanho = 1.
           CONCATENATE '0' lv_aux INTO lv_aux.
         ENDIF.
         CONCATENATE p_gjahr lv_aux '01' INTO z_v_first_day.

         PERFORM get_last_day_of_month USING z_v_first_day
                                       CHANGING lv_last_day.

         " some other code irrelevant to the issue

         SELECT bukrs hkont gjahr belnr budat waers shkzg dmbtr wrbtr dmbe2 FROM bsis
           APPENDING CORRESPONDING FIELDS OF TABLE gt_bancbsis
           WHERE hkont = '0051100001'
           AND bukrs EQ p_bukrs
           AND budat <= lv_last_day.

         " some other code irrelevant to the issue
ENDDO.

DELETE ADJACENT DUPLICATES FROM gt_bancbsis COMPARING ALL FIELDS.

Esta es una foto de la tabla interna gt_bancbsis en el dubugger.
ELIMINAR ADYACENTES DUPLICADOS no funciona

  • Podría por favor proporcionar nosotros con un ejemplo de código y los datos reales que estamos viendo? Es difícil decir lo que está mal, sin más información.
  • Nuestra máquina está abajo en el momento, así que no puedo dar mucha más información ahora mismo. Tan pronto la máquina es de hasta voy a publicar el código.
  • Me pueden enviar la tabla interna con los datos recuperados.
  • Esto no ayuda. Por favor enviar EXACTAMENTE los datos que causa el problema, no algunos datos falsos. Y si es posible por favor enviar una captura de pantalla de la ABAP Depurador, porque un montón de conversión puede tener lugar cuando la exportación a excel.
  • Como ya he dicho, el sistema está inactivo. Lo único que tengo ahora mismo es esta ans la selección que se está llevando a cabo en 12 ocasiones.
  • Eva, eres lo que sugiere que un elemento del lenguaje utilizado por miles de desarrolladores en decenas de miles de programas de todo el mundo está libre de errores. Esto no es imposible, simplemente no es muy probable. Simplemente hurgando con palabras que no entiendo es peligroso (y una pérdida de tiempo así). Realmente me gustaría dar una respuesta útil, pero lo estás haciendo muy, muy duro para ayudar a usted.
  • No estoy entendiendo tu comentario. Si yo no publicar el código que tengo es porque no puedo, no porque no quiero. Estoy seguro de que sabes mucho más que yo (por eso estoy pidiendo ayuda), porque me’he sólo se ha de programación ABAP para unos 6 meses (que no es nada, creo). Lo siento si no acabo de entender a veces lo que tratas de decirme, pero estoy seguro de que usted va a entender que explicar las cosas a un novato no siempre tarta de cerezas.
  • Esto no es sobre mí saber más de usted, es acerca de usted, lo que hace innecesario duro para responder a sus preguntas por prestación incompleta o engañosa de la información. Por favor, eche un vistazo a catb.org/~esr/faqs/smart-questions.html y chiark.greenend.org.uk/~sgtatham/bugs.html para tener una idea de lo que estoy hablando.

InformationsquelleAutor Eva Dias | 2012-11-06

3 Kommentare

  1. 9

    La palabra ADJACENT en la declaración de DELETE ADJACENT DUPLICATES está ahí por una muy buena razón: Se establece que sólo las líneas duplicadas que están cerca unos de otros se retiran. Esto también se indica en la en línea, palabras clave documentación:

    Filas se considera duplicado si el contenido de los vecinos de fila es el mismo en los componentes examinados. En el caso de múltiples filas duplicadas siguiente el uno al otro, todas las filas (excepto la primera) son eliminados.

    Esto significa: Si la tabla contiene los valores

     A B
     C D
     A B
     C D
    

    contiene valores duplicados, pero ya que estas no son adyacentes, DELETE ADJACENT DUPLICATES no quitarlas, no importa lo que usted especifique.

    La SELECT declaración en el otro lado no garantiza un orden específico cuando la devolución de los conjuntos de datos seleccionados a menos que usted le diga que lo ORDER BY una o más columnas. Las filas son acabo de regresar en cualquier orden, y si el DELETE ADJACENT DUPLICATES declaración de obras, es pura coincidencia. Podría incluso trabajar en un sistema, dejar de trabajar en otro y quitar sólo la mitad de los duplicados en un tercer sistema. Así, el cardenal regla:

    Asegúrese de que el interior de la tabla está ordenada por los campos que desea comprobar duplicados ANTES de eliminar los duplicados.

    Para una mejor escalabilidad, usted debe utilizar el SORT declaración en lugar de tener la base de datos ordenar las filas con ORDER BY. Así que usted podría utilizar cualquiera de los

    SORT gt_bancbsis.
    DELETE ADJACENT DUPLICATES FROM gt_bancbsis.
    

    o, si sólo se desean comprobar ciertos campos,

    SORT gt_bancbsis BY foo bar baz.
    DELETE ADJACENT DUPLICATES FROM gt_bancbsis COMPARING foo bar baz.
    
    • Gracias. Yo creía que iba a eliminar todas las líneas que eran iguales, excepto por uno… mi único problema es sólo la ordenación. Gracias.
  2. 1

    En BSIS tabla, usted está utilizando 4 jey campos( burks, hkont, gjahr, belnr ). El uso de estas campo sólo para la clasificación.

    1. Tipo la tabla interna primero.

      SORT ITAB WITH KEY ITAB-FIELDS.
      
    2. Luego COMPARAR campos.

       DELETE ADJACENT DUPLICATES FROM ITAB
      

      Funcionará bien.

    • Gracias. Así, sólo tengo que reemplazar itab con el nombre de mi tabla interna, la derecha? Yo voy a probar entonces. Gracias.
  3. 0

    Si esta es la pieza exacta de código, no hay necesidad de proceso de filas duplicadas a través de ABAP. Usted puede eliminarlos por <where_clause> de la instrucción SQL: obtener el valor máximo de lv_last_day y utilizarlo en la condición (con distinct palabra clave, si la seleccione de la lista no contiene todos los campos de la clave). El proceso de varios p_bukrs poner a cada valor de p_bukrs y el correspondiente valor máximo de lv_last_day en el interior de la tabla y, a continuación, utilizar FOR ALL ENTRIES IN itab principal, la comparación de campo con itab componentes en where. Esto devolverá los datos sin información redundante y se tienen menos gastos generales, de ordenación de gran conjunto de resultados por el servidor de aplicaciones.

    De acuerdo con el «bicho» – no es un buen comentario anterior.

    Saludos,
    Andrew.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea