2016-02-08 3 views
1

Я имел дамп недавноТип конфликт в таблице удаления записей из внутренней таблицы

DATA: gt_data TYPE SORTED TABLE OF ty_data WITH NON-UNIQUE KEY bukrs gaapnm, 
    ... 
    lt_tabdel TYPE standard TABLE OF ty_data. 

    LOOP AT gt_data ASSIGNING <gf_data>. 
    IF <gf_data>-KANSW + <gf_data>-KAUFW = 0. 
     APPEND <gf_data> TO lt_tabdel. 
    ENDIF. 
    ENDLOOP. 

    IF lt_tabdel IS NOT INITIAL. 
    DELETE gt_data FROM lt_tabdel. 
    ENDIF. 

А на линии с удалением таблицы из внутренней таблицы - я имел дамп: В заявлении объекта Преобразовать в целое число Объекты данных с числовым типом поддерживаются в позиции аргумента «объект». В данном случае операнд «объект» имеет нечетный тип данных «ТАБЛИЦА OF TY_DATA». Я просто не могу понять - почему? Оба они имели один и тот же тип ... Итак, будет здорово, если бы вы могли дать несколько советов и немного объяснений происхождения ошибок.

ответ

4

У вас (непреднамеренно) используется this variant of the DELETE statement, который использует FROM и TO для указания индексов, i. е. номера строк таблицы. В некотором смысле, вы кодируете , удаляете все строки в gt_data под номером, указанным номером строки, в lt_tabdel, и система пытается взломать содержимое файла lt_tabdel на целое число.

Насколько я вижу - i. E. Если вы предоставили полный образец кода - это должно быть достаточно:

LOOP AT gt_data ASSIGNING <gf_data>. 
    IF <gf_data>-KANSW + <gf_data>-KAUFW = 0. 
    DELETE gt_data. 
    CONTINUE. " safety measure 
    ENDIF. 
ENDLOOP. 

Для объяснения CONTINUE заявления, проверить this answer.

+0

И если я хочу удалить все содержимое из таблицы, которое представлено в другом, что я должен использовать в этом случае? – AlexanderK

+0

Почему вы используете отдельный цикл в первую очередь? – vwegert

+0

Может возникнуть необходимость в новых проверках, и я полагаю, что существующая таблица слишком велика для удаления строк в цикле. Таким образом, чтобы избежать дополнительной нагрузки на серверы - я предпочитаю заполнять дополнительную таблицу и удалять ее из предыдущей основной таблицы позже. Таким образом, отдельный цикл был всего лишь первой идеей, которую я имел в виду. Если есть лучший способ сделать это - я все в одном. – AlexanderK

-1

Хорошо, я нашел решение. Удалить - была неправильная команда. Поэтому я использовал этот вместо этого:

LOOP AT gt_data ASSIGNING <gf_data>. 
    IF <gf_data>-KANSW + <gf_data>-KAUFW <> 0. 
     append <gf_data> to lt_data. 
    ENDIF. 
    ENDLOOP. 

    gt_data[] = lt_data[]. 

Только что заполнил другую таблицу и присвоил ее содержимому основному столу.

+0

... потенциально удваивает требования времени выполнения и памяти. Ницца. * slowclap * – vwegert

+1

Умм, просто не мог найти другого пути. Если бы вы могли дать несколько советов, я был бы признателен. – AlexanderK

+1

См. Выше ...... – vwegert