Текущее время: Вс, июл 20 2025, 14:18

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Подскажите, как ускорить работу программы
СообщениеДобавлено: Пт, мар 09 2007, 11:16 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, янв 10 2006, 12:01
Сообщения: 89
Подскажите, если не сложно

1. Есть таблица счетов (Z_TACC)
Номер счета | Параметр1 | Параметр2 | Параметр3 |

2. Есть таблица, для опеределения параметров счета (Z_TMASK)
Маска счета | Параметр1 | Параметр2 | Параметр3 |Приоритет


Нужно написать программу, которая будет для каждого счета по маске искать запись в таблице для определения параметров и соответственно устанавливать такие параметры для счета.

Маска может задавать соответственно не только полностью номер счета, но и его маску

Пока алгоритм работы такой
1. LOOP по всей таблице счетов
2. LOOP по всей таблице определения параметров счетов (так как тут cp не удается указать)
3. Ну и соответствено установка для счета параметров

Работает это все очень долго

Может кто подскажет как можно оптимизировать работу данного алгоритма, чтобы убыстрить работу

Если что не понятно - спрашивайте

Заранее спасибо


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подскажите, как ускорить работу программы
СообщениеДобавлено: Пт, мар 09 2007, 12:31 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, авг 04 2006, 20:56
Сообщения: 1006
Откуда: 37 МИКРОРАЙОН
Пол: Мужской
А так не покатит?

* Entries: 100 (ITAB1), 1000 (ITAB2)
* Line width: 100
* Both tables sorted by key K

I = 1.
LOOP AT ITAB1 INTO WA1.
LOOP AT ITAB2 INTO WA2 FROM I.
IF WA2-K <> WA1-K.
I = SY-TABIX.
EXIT.
ENDIF.
" ...
ENDLOOP.

ENDLOOP.
Если я не вкурил вопроса поясни примером :D
_______________________________________
Не бейте меня я ведь тока учусь :(


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, мар 09 2007, 13:14 
Ассистент
Ассистент

Зарегистрирован:
Ср, окт 06 2004, 12:06
Сообщения: 35
Пол: Мужской
Наверное, все-таки лучше сначала
LOOP по z_tmask
а для Z_TACC в условиях для номера счета правильно сформировать
маску для отбора по LIKE.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, мар 09 2007, 13:56 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
1. Для начала выбрать все записи без масок (т.е. где номер счета = маске счета) обычным join'ом.
2. Потом выбрать все маски (где номер счета <> маске счета) с помощью загнанной в range полученной на предыдущем шаге таблицей (если влезут...)
3. Луп по резалту второго шага с LIKE'ом.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Подскажите, как ускорить работу программы
СообщениеДобавлено: Пт, мар 09 2007, 18:44 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
А если так:
0.Сортируете таблицу счетов.
1. LOOP по всей таблице определения параметров счетов
2. LOOP по маске счета,
3. Запись параметров в новую таблицу.
4. Удаление добавленных записей из таблицы счетов.

Вопросы по маске:
Есть только значения:
1.Полный счет
2.[Левая часть счета]*

или есть и такие варианты:
3.[Левая часть счета]*[правая часть счета]
4.*[правая часть счета]

Есть смысл обрабатывать таблицу определения параметров отчета в указанном порядке.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, мар 09 2007, 19:17 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Ага, даже еще проще.
1. Для начала выбрать все записи по условию маска счета = номер счета left outer join'ом (т.е. получим заполненное поле номер счета в случе тривиального маска = номер и пустое, если иначе).
2. Копируем результирующую табличку. Копию делитим по условию NOT INITIAL в поле номера.
3. Начальную табличку из шага 1 делитим по INITIAL в поле номера.
4. Имеем готовые данные для тривиальных случаев и набор масок, которые необходимо сопоставить с номерами.
5. Выбираем все записи по условию номер счета = маска счета left outer join'ом.
6. Делитим полученную табличку по условию маска NOT INITIAL.
7. Имеем табличку номеров, которые нужно сопоставить с масками.
Дальше уже просто все.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, мар 12 2007, 09:52 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
По-моему все углубились в оптимизацию частного случая, когда тривиальных масок очень много. Но из постановки задачи мне видится, что таблицу масок создавали не для того, чтобы тривиальные случаи там коллекционировать. Маски для того и создали, чтобы руками меньше заполнять. Автор вопроса нас рассудит.

И не стоит забывать, что время, потраченное на оптимизацию алгоритма не должно превышать выигрыш во времени исполнения программы.

Простейшая оптимизация, про которую все забыли, — loop ... assigning.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, мар 12 2007, 17:35 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, янв 10 2006, 12:01
Сообщения: 89
По поводу масок: 10 000 тривиальных, 400 нетривиальных.
Соответственно: типы масок
1.Полный счет
2.[Левая часть счета]*
3.[Левая часть счета]+[следующая часть счета]*

Предложенные варианты вечером попробую.

Можно поподробнее каким образом assigning поможет и где можно примерчик посмотреть?

Всем спасибо за предложения


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, мар 12 2007, 17:50 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Ср, сен 22 2004, 08:42
Сообщения: 1079
Откуда: Москва
Пол: Мужской
Посмотрите как в стандарте - генерация наборов в FI, на основе тех же самых масок генерируется подпрограммы проверки вхождения.Программа RGUGBR00 галка "Генерация наборов". Только аккуратно, а то FI щики очень сильно настучат по голове.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, мар 12 2007, 17:50 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Assign используй вместо INTO в конструкции LOOP ... ENDLOOP.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

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


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

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


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

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