AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 30.04.2008, 17:41   #1  
darmen is offline
darmen
Участник
 
3 / 10 (1) +
Join Date: 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? Подскажите плз..
Old 30.04.2008, 17:47   #2  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Join Date: 10.06.2002
Location: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Попробуйте написать для начала

while select forceplaceholders PMPlaceTimeBoard1

А вообще если выборка большая реально, то чего вы ожидаете от кода? Значит будет долго работать.
__________________
С уважением,
glibs®
Old 30.04.2008, 17:52   #3  
Dozer is offline
Dozer
Участник
AxAssist
Соотечественники
 
107 / 24 (1) +++
Join Date: 16.11.2004
Location: г. Калгари, Канада
Quote:
Originally Posted by darmen View Post
Проблема вообще такая
(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

Last edited by Dozer; 30.04.2008 at 22:25. Reason: Опечатка
Old 30.04.2008, 18:08   #4  
darmen is offline
darmen
Участник
 
3 / 10 (1) +
Join Date: 30.04.2008
2Dozer
Я так сам пробовал, но получается, что второй цикл просто отсутсвует. То есть происходит выборка не всех данных, которые нужны.

2glibs
Данных действительно много. Вот поэтому я и ищу способ избавиться от второго цикла или как-то его сделать без селекта, что ли...
Old 30.04.2008, 18:16   #5  
kashperuk is offline
kashperuk
Участник
kashperuk's Avatar
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Join Date: 30.05.2004
Location: 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);

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

forceplaceholders не помог?
__________________
С уважением,
glibs®
Old 30.04.2008, 18:34   #7  
darmen is offline
darmen
Участник
 
3 / 10 (1) +
Join Date: 30.04.2008
Quote:
Originally Posted by glibs View Post
Вы убедились, что время тратится на выборку, а не на обработку?

forceplaceholders не помог?
Не помог, а время тратиться имеено на выборку.
Old 30.04.2008, 19:54   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,724 / 1208 (44) ++++++++
Join Date: 13.01.2004
Blog Entries: 3
Quote:
Originally Posted by darmen View Post
2Dozer
Я так сам пробовал, но получается, что второй цикл просто отсутсвует. То есть происходит выборка не всех данных, которые нужны.
Разумеется, отсутствует. Чего, собственно и добивались.

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

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

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

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

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

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

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

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

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
Как организовать цикл 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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 00:51.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.