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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.10.2007, 06:18   #1  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
Есть поле, на которое я накладываю фильтр. Надо отсеять дубликаты в этом поле в результирующем НД. Аналог DISTINCT в запросах. Подскажите, можно ли так сделать, или придется все значения выбирать (и получать) и разбиратся с ними уже на клиенте?
Старый 31.10.2007, 12:45   #2  
Голышев Михаил is offline
Голышев Михаил
Участник
 
106 / 10 (1) +
Регистрация: 03.07.2006
Можно сделать в SQL View с distinct и связать его с таблицей в навижн (LinkedObject).
Либо сделать хранимую процедуру с distinct и вызывать её из навижн.

В любой случае, на стороне клиента это к сожалению решить нельзя.
Старый 31.10.2007, 12:59   #3  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Цитата:
Сообщение от smoyk Посмотреть сообщение
Есть поле, на которое я накладываю фильтр. Надо отсеять дубликаты в этом поле в результирующем НД. Аналог DISTINCT в запросах. Подскажите, можно ли так сделать, или придется все значения выбирать (и получать) и разбиратся с ними уже на клиенте?
Получить результирующий набор за один шаг не получится. Если делать на клиенте, то можно создать ключ по этому полю, отсортировать рек по этому ключу. Затем итерациями
Рек.FIND('-');
Рек.SETRANGE(Поле, Рек.Поле);
Рек.FIND('+')
Рек.SETRANGE(Поле);
Рек.NEXT();
Рек.SETRANGE(Поле, Рек.Поле);
Рек.FIND('+')
ну и тд ... То есть получив стопку записей с одинаковым значением вашего Поля фильтровать по значению, переходить на последнюю запись, снимать фильтр и выполнять NEXT для получения нового значения Поля.... Оформить все это в цикле.
Старый 31.10.2007, 14:10   #4  
Голышев Михаил is offline
Голышев Михаил
Участник
 
106 / 10 (1) +
Регистрация: 03.07.2006
Этот метод слишком не производителен.
Особенно если обрабатывать большие таблицы, лучше от него отказаться сразу, если есть такая возможность.
Старый 01.11.2007, 04:51   #5  
gennady is offline
gennady
Участник
 
92 / 11 (1) +
Регистрация: 27.09.2004
Адрес: Иркутск
Я в таких случаях закидываю отсортированные данные во временную таблицу, что-то вроде:
IF Source.FINDSET THE REPEAT
IF нет еще такой записи THEN BEGIN
TargetTmp := Source;
TargetTmp.INSERT;
END;
UNTIL Source.NEXT = 0;
И потом уже работаю с этой временной таблицей.
Я заметил, что временные таблицы в Наве можно частенько юзать
как некий аналог запросов.
Старый 01.11.2007, 09:12   #6  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Цитата:
Сообщение от golyshev Посмотреть сообщение
Этот метод слишком не производителен.
Особенно если обрабатывать большие таблицы, лучше от него отказаться сразу, если есть такая возможность.
Я бы сказал если РЕЗУЛЬТИРУЮЩИЙ НАБОР будет слишком большим - лучше от этого метода отказаться.
А так вполне хороший метод обеспечивающий достаточную производительность даже на ОЧЕНЬ БОЛЬШИХ таблицах.
Все таки для каждой задачи есть свои инструменты , имхо забивать гвоздики кувалдой не стоит.

Вьюхи дело конечно хорошее, НО имеются свои недостатки:
1. Теряется мультифирменность (можно избежать соединив все таблицы через UNION ALL, но слишком дорого выходит поддержка такого решения)
2. Само собой не будет работать на Native DB.
3. Усложняется обновление боевых баз.
Старый 01.11.2007, 12:12   #7  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Цитата:
Сообщение от Gennady Antropov Посмотреть сообщение
Я заметил, что временные таблицы в Наве можно частенько юзать
как некий аналог запросов.
Наблюдается ОЧЕНЬ сильное замедление работы с временной таблицей, когда число записей в ней находится в районе или превышает 10000 записей. Это на заметку. Ну и структура (число полей и размерность) имеет значение.
Старый 01.11.2007, 13:32   #8  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от Gennady Antropov Посмотреть сообщение
IF нет еще такой записи THEN BEGIN
TargetTmp := Source;
TargetTmp.INSERT;
END;
мне кажется будет быстрее INIT.. TRANSFERFIELDS.. INSERT

И если первичный ключ используется, то вообще GET можно узать (как мне кажется).
Старый 02.11.2007, 04:00   #9  
gennady is offline
gennady
Участник
 
92 / 11 (1) +
Регистрация: 27.09.2004
Адрес: Иркутск
Цитата:
Сообщение от romeo Посмотреть сообщение
Наблюдается ОЧЕНЬ сильное замедление работы с временной таблицей, когда число записей в ней находится в районе или превышает 10000 записей. Это на заметку. Ну и структура (число полей и размерность) имеет значение.
Да? Я пока этого не замечал. Ведь временная таблица хранится локально, не на сервере. Впрочем, может быть, столько записей я во временную, кажется, еще не грузил.
К тому же, для временной таблицы можно созать свой табличный объект с теми только полями и ключами, которые необходимы в данном случае.
Тогда вообще можно просто (если из полей сортировки исх. таблицы создать первичный ключ для временной):
TargetTmp := Source;
IF TargetTmp.INSERT THEN;
Собственно, именно такой вариант я и рассматриваю как некий навовский эквивалент запросам.
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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