Текущее время: Сб, июл 19 2025, 22:29

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Сравнение таблиц
СообщениеДобавлено: Чт, ноя 23 2006, 14:00 
Гость
Задача.
Дано две таблицы с одинаковой структурой.
Необходимо проставить индикатор в тех строчках
таблиц, которые одинаковы и в 1-й, и во 2-й таблице.

Т.е.


Code:
DATA:  Begin of itab1 OCCURS 0,
             ch,
             matnr like mara-matnr,
           end of itab1,
           Begin of itab2 OCCURS 0,
             ch,
             matnr like mara-matnr,
           end of itab2.

loop at itab1.
     loop at itab2 where
                matnr = itab1-matnr
               and ch = space.
        itab2-ch = 'X'.
        itab1-ch = 'X'.
        modify itab2.
     endloop.
    modify itab1.
endloop.


и вроде просто, если бы не КРАЙНЯЯ медлительность
на больших объемах данных...

Собственно вопрос: Как лучше оптимизировать данную задачу?
Через таблицы с ключами, через field-symbols, и т.д.......


Заранее всем спасибо.


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, ноя 23 2006, 14:04 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пн, апр 17 2006, 11:03
Сообщения: 123
можно попробовать READ TABLE вместо внутренного цикла
или внутреннюю таблицу сделать сортированной по ключам
+ field-symbols


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, ноя 23 2006, 14:10 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
Первое что приходит в голову - можно отсортировать вторую табличку и вместо вложенного цикла использовать read table ... binary search.
Либо вторую таблицу можно попробовать сделать хешированной, и опять таки read table

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, ноя 23 2006, 14:20 
Гость
сейчас буду всё попробовать....

о результатах - доложу :)


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, ноя 23 2006, 14:26 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
ждем-с :)

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, ноя 23 2006, 14:27 
Президент
Президент
Аватара пользователя

Зарегистрирован:
Ср, янв 12 2005, 13:39
Сообщения: 2811
Откуда: замкадыш
С индексами главное не запутаться:))))

Вот что меня бесит в АБАПе, это то, что можно внутри LOOP-а удалить строку, на которой сейчас "стоишь", а потом, если ещё раз попробовать её удалить, то удаляется следующая строчка:((((. Один раз попался...

_________________
Что бы выловить случайную ошибку нужно добиться устойчивости её появления.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Чт, ноя 23 2006, 14:28 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
РМщик написал(а):
Дано две таблицы с одинаковой структурой.


matnr могут дублироваться в одной таблице?


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Чт, ноя 23 2006, 14:33 
Гость
sibrin написал:
РМщик написал(а):
Дано две таблицы с одинаковой структурой.


matnr могут дублироваться в одной таблице?


да, могут. Как раз задача чтобы не было отметок 1:N ,
а именно 1:1


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, ноя 23 2006, 14:39 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
ABAP, конечно, не С++. Циклы как правило работают медленно.
Но в качестве эксперимента предлагаю попробовать следующее:
Code:
field-symbols: <t1> like line of itab1,
               <t2> like line of itab2.

data: i1 type i, i2 type i, max1 type i, max2 type i.

describe table itab1 lines max1.
describe table itab2 lines max2.
sort itab1 by matnr.
sort itab2 by matnr.

i1 = '1'.
i2 = '1'.
   read table itab1 index i1 assigning <t1>.
   read table itab2 index i2 assigning <t2>.
do.
   if i1 > max1 or i2 > max2. exit. endif.
   if <t1>-matnr = <t2>-matnr.
      <t1>-ch = 'X'. <t2>-ch = 'X'.
      i1 = i1 + 1. i2 = i2 + 1.
      read table itab1 index i1 assigning <t1>.
      read table itab2 index i2 assigning <t2>.
   elseif <t1>-matnr > <t2>-matnr.
      i2 = i2 + 1.
      read table itab2 index i2 assigning <t2>.
   else.
      i1 = i1 + 1.
      read table itab1 index i1 assigning <t1>.
   endif.
enddo.


Причём порядок сравнения (= > или < >) следует выбирать в зависимиости от условий задачи: 2 совпадения из 10000 записей или же, наоборот, отличие только в двух строках.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:   Тема решена
СообщениеДобавлено: Чт, ноя 23 2006, 15:41 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
У меня получилось, что время только на расставление крестиков в цикле в 2 раза больше, чем READ TABLE ... BINARY SEARCH.

Однако, если учесть время на заполнение sorted table, то результаты примерно одинаковы.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, ноя 23 2006, 20:49 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
sibrin написал:
ABAP, конечно, не С++. .....


этот алгоритм напоминает симетричную разность ... ;)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 24 2006, 13:25 
Гость
вообщем заменил второй loop на read
и добавил assigning и в loop и в read

Раньше работало 3.5 часа,
теперь 1.5 часа....

так что лучше конечно, но далеко до идеала :(

Но всем, особенно sibrin - биг сэнкс!


Пометить тему как нерешенную
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 24 2006, 13:36 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пн, апр 17 2006, 11:03
Сообщения: 123
теперь сортируй табличку и делай READ TABLE ... BINARY SEARCH
и будет тебе счастье


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 24 2006, 13:41 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, авг 17 2004, 16:09
Сообщения: 202
loop at itab1.
itab2-ch = 'X'.
modify itab2 transporting ch
where
matnr = itab1-matnr
and ch = space.

check sy-subrc = 0.
itab1-ch = 'X'.
modify itab1.
endloop.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 24 2006, 14:28 
Гость
author написал(а):
теперь сортируй табличку и делай READ TABLE ... BINARY SEARCH
и будет тебе счастье



:!: :!: :!: :!: :!:

огромное спасибо!!! стало 40 секунд!Я ИДИЁТ, УБЕЙТЕ МИНЯ КТО-НИБУДЬ!


Пометить тему как нерешенную
Вернуться к началу
  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB