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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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