AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.04.2008, 17:41   #1  
darmen is offline
darmen
Участник
 
3 / 10 (1) +
Регистрация: 30.04.2008
:( Цикл в цикле
Проблема вообще такая
(4-ая Аксапта, MS SQL)

X++:
while select PMPlaceSecurityTimetable
              exists join PlaceId from PMPlaceTimeBoard
                            where PMPlaceTimeBoard.DateStart == PMPlaceSecurityTimetable.DateSecure

       {

         timeList2 = new RecordSortedList(tablenum(PMPlaceTimeBoard));
         timeList2.sortOrder(fieldnum(PMPlaceTimeBoard, PlaceId),fieldnum(PMPlaceTimeBoard, DateStart),
                       fieldnum(PMPlaceTimeBoard, PlannedTimeStart));

        while select PMPlaceTimeBoard1
              where PMPlaceTimeBoard1.DateStart == PMPlaceSecurityTimetable.DateSecure &&
                    PMPlaceTimeBoard1.PlaceId == PMPlaceSecurityTimetable.PlaceId
                {
                   timeList2.ins(PMPlaceTimeBoard1);

                }
Этот код выполняется слишком долго из-за того, что select находиться в while select и поэтому вероятно происходит частое образение к базе, что сильно тормозит работу этого кода. Как можно в данном случае избежать использования второго while select? Подскажите плз..
Старый 30.04.2008, 17:47   #2  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Попробуйте написать для начала

while select forceplaceholders PMPlaceTimeBoard1

А вообще если выборка большая реально, то чего вы ожидаете от кода? Значит будет долго работать.
__________________
С уважением,
glibs®
Старый 30.04.2008, 17:52   #3  
Dozer is offline
Dozer
Участник
AxAssist
Соотечественники
 
107 / 24 (1) +++
Регистрация: 16.11.2004
Адрес: г. Калгари, Канада
Цитата:
Сообщение от darmen Посмотреть сообщение
Проблема вообще такая
(4-ая Аксапта, MS SQL)

X++:
while select PMPlaceSecurityTimetable
              exists join PlaceId from PMPlaceTimeBoard
                            where PMPlaceTimeBoard.DateStart == PMPlaceSecurityTimetable.DateSecure

       {

         timeList2 = new RecordSortedList(tablenum(PMPlaceTimeBoard));
         timeList2.sortOrder(fieldnum(PMPlaceTimeBoard, PlaceId),fieldnum(PMPlaceTimeBoard, DateStart),
                       fieldnum(PMPlaceTimeBoard, PlannedTimeStart));

        while select PMPlaceTimeBoard1
              where PMPlaceTimeBoard1.DateStart == PMPlaceSecurityTimetable.DateSecure &&
                    PMPlaceTimeBoard1.PlaceId == PMPlaceSecurityTimetable.PlaceId
                {
                   timeList2.ins(PMPlaceTimeBoard1);

                }
Этот код выполняется слишком долго из-за того, что select находиться в while select и поэтому вероятно происходит частое образение к базе, что сильно тормозит работу этого кода. Как можно в данном случае избежать использования второго while select? Подскажите плз..
X++:
timeList2 = new RecordSortedList(tablenum(PMPlaceTimeBoard));
timeList2.sortOrder(fieldnum(PMPlaceTimeBoard, PlaceId), 
    fieldnum(PMPlaceTimeBoard, DateStart), 
    fieldnum(PMPlaceTimeBoard, PlannedTimeStart));

while select PMPlaceSecurityTimetable
join PMPlaceTimeBoard
    where PMPlaceTimeBoard.DateStart == PMPlaceSecurityTimetable.DateSecure
    && PMPlaceTimeBoard.PlaceId == PMPlaceSecurityTimetable.PlaceId
{
    timeList2.ins(PMPlaceTimeBoard);
}
Вот так?
__________________
С уважением, Dozer

Последний раз редактировалось Dozer; 30.04.2008 в 22:25. Причина: Опечатка
Старый 30.04.2008, 18:08   #4  
darmen is offline
darmen
Участник
 
3 / 10 (1) +
Регистрация: 30.04.2008
2Dozer
Я так сам пробовал, но получается, что второй цикл просто отсутсвует. То есть происходит выборка не всех данных, которые нужны.

2glibs
Данных действительно много. Вот поэтому я и ищу способ избавиться от второго цикла или как-то его сделать без селекта, что ли...
Старый 30.04.2008, 18:16   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А если
X++:
while select PMPlaceSecurityTimetable
              exists join PlaceId from PMPlaceTimeBoard
                            where PMPlaceTimeBoard.DateStart == PMPlaceSecurityTimetable.DateSecure
        outer join PMPlaceTimeBoard1
              where PMPlaceTimeBoard1.DateStart == PMPlaceSecurityTimetable.DateSecure &&
                    PMPlaceTimeBoard1.PlaceId == PMPlaceSecurityTimetable.PlaceId
                {
                   if (PMPlaceTimeBoard1)
                       timeList2.ins(PMPlaceTimeBoard1);

                }
Код я не проверял - так просто, как идея.
Старый 30.04.2008, 18:20   #6  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от darmen
...
Данных действительно много. Вот поэтому я и ищу способ избавиться от второго цикла или как-то его сделать без селекта, что ли
...
Вы убедились, что время тратится на выборку, а не на обработку?

forceplaceholders не помог?
__________________
С уважением,
glibs®
Старый 30.04.2008, 18:34   #7  
darmen is offline
darmen
Участник
 
3 / 10 (1) +
Регистрация: 30.04.2008
Цитата:
Сообщение от glibs Посмотреть сообщение
Вы убедились, что время тратится на выборку, а не на обработку?

forceplaceholders не помог?
Не помог, а время тратиться имеено на выборку.
Старый 30.04.2008, 19:54   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от darmen Посмотреть сообщение
2Dozer
Я так сам пробовал, но получается, что второй цикл просто отсутсвует. То есть происходит выборка не всех данных, которые нужны.
Разумеется, отсутствует. Чего, собственно и добивались.

Только, почему Вы решили, что отбираются не все данные? Вы проверили содержимое timeList2 или это Ваше предположение?

Приведенный Dozer код точно соответствует Вашему же описанию. Или Вы что-то пропустили?

Кстати, уменьшить время выборки можно еще путем перечисления нужных полей. Даст существенный прирост производительности, если нужно несколько полей из нескольких десятков имеющихся в таблицах.
Старый 30.04.2008, 22:53   #9  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от kashperuk
...
Код я не проверял - так просто, как идея.
...
Врядли "в лоб" поможет.

Там внутри первого цикла постоянно переинициализируется RecordSortedList. Внутри одного запроса чтобы это сделать... как минимум придется добавлять сортировку.

А вообще чтобы что-то посоветовать, нужно описать задачу. В первом цикле связь организована не по ключевым полям. Вероятно, что не хватает индексов. И сама по себе такая связь вызывает подозрение в корректности кода.

Для чего потребовался RecordSortedList во втором запросе тоже не очевидно. Можно было бы просто на запросе сортировку поставить. Возможно, с группировкой. Т.к. опять же непонятно, что является ключем на PMPlaceTimeBoard (т.е. непонятно, будут ли в RecordSortedList записи выбивать друг друга).
__________________
С уважением,
glibs®
Старый 03.05.2008, 23:56   #10  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
На первый взгляд
Во-первых, странно, что во втором select есть связь по PlaceId, которой нет в первом select.
Во-вторых, нам трудно судить о том, что действительно тормозит работу кода. Это может быть неверный план испонения обоих запросов, сложный алгоритм обработки RecordSortedList или что-то еще, что вы упустили в своем примере.
Посомтрите планы исполнения запросов и индексы на PMPlaceTimeBoard.
В-третьих, может быть подумать о том, чтобы обрабатывались не ВСЕ данные из пары PMPlaceSecurityTimetable, PMPlaceTimeBoard? Зачем обрабатывать данные от начала времен?

Как вариант. Сделайте обычный join с сортировками по PlaceId и DateStart (или DateSecure - зависит от индексов), ограничьте список полей только необходимыми, формируйте и обрабатывайте свой RecordSortedList по смене значений полей в курсоре (PlaceId и DateStart)... и не забудьте по окончаению цикла обработать последний RSL.
кривовато, конечно, но что не сделаешь ради перфоманса

to kashperuk. Сомневаюсь, что такое вообще возможно в Аксапте.
Старый 05.05.2008, 12:50   #11  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Начните с выборки полей, я думаю это может немного сдвинуть скорость в большую сторону
Теги
ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как организовать цикл exodus DAX: Программирование 1 21.11.2007 10:50
Складская аналитика. Авторезервирование. Бесконечный цикл. andenis DAX: Функционал 8 27.06.2007 08:12
Цикл, ttsabort и continue PavelX DAX: Программирование 8 15.01.2007 07:11
Report в цикле с параметром kvg6 DAX: Программирование 3 20.06.2006 15:06
Перебор контролов в цикле Yurik DAX: Программирование 10 23.01.2003 14:00

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:48.