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

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


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

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


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

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