Как удалить дубликаты записей в сетке? - PullRequest
1 голос
/ 26 июня 2009

Доброе утро!

Каков наилучший способ удалить дубликаты записей из сетки управления? Я использую Delphi 2009 и DevEx компонент QuanGrid.

Я попытался перебрать все записи, и когда найдется повторяющаяся запись, добавьте ее в список и примените фильтр к сетке. Я нашел это как трудоемкую логику. У этого подхода также есть два недостатка.

[1] Если количество повторяющихся записей значительно больше, скажем, 10K записей, тогда применение фильтра отнимает много времени из-за большого количества записей для фильтрации.

[2] Перебор всех записей сам по себе занимает много времени для большого результирующего набора, такого как строки 1М.

SQL-запрос возвращает мне отдельные строки, но когда пользователь скрывает какой-либо столбец в сетке, он выглядит так, как будто имеются дублированные записи (внутренне они различны).

Есть ли другой способ сделать это?

Любые идеи на этот счет очень полезны!

Спасибо и С уважением, Паван.

Ответы [ 4 ]

1 голос
/ 26 июня 2009

Можете ли вы изменить свой набор данных, чтобы не возвращать дублирующиеся записи? Обычно я возвращаю только те записи, которые я хочу отобразить, вместо того, чтобы возвращать нежелательные записи из базы данных, а затем использовать сетку базы данных, чтобы попытаться подавить нежелательные записи.

0 голосов
/ 26 июня 2009

С тысячами строк я бы добавил в БД дополнительное поле, которое называется скажем Sum или Hash, или, если вы не можете изменить БД, добавьте вычисляемое поле, если это ClientDataSet, но это несет накладные расходы во время отображения

Рассчитайте содержимое поля хеша с помощью чего-то быстрого и простого, например, суммы всех символов в вашем текстовом поле. Все обманщики теперь легко идентифицируются. Добавьте это поле в параметры уникального или уникального запроса или отфильтруйте его.

Просто идея.

0 голосов
/ 26 июня 2009

Я некоторое время работал с Quantum Grid от DevExpress, и его форма поддержки http://www.devexpress.com/Support/Center/ превосходна. Когда вы будете задавать вопросы, сотрудники DevExpress ответят вам напрямую. С учетом сказанного я быстро провел поиск и нашел несколько соответствующих статей.

как скрыть дублирующиеся значения строк: http://www.devexpress.com/Support/Center/p/Q142379.aspx?searchtext=Duplicate+Rows&p=T1|P0|83

выделить дубликаты записей в сетке: http://www.devexpress.com/Support/Center/p/Q98776.aspx

К сожалению, похоже, что вам придется перебирать таблицу, чтобы скрыть повторяющиеся значения. Я бы посоветовал вам попытаться очистить данные до того, как они попадут в сетку. В идеале вы должны обновить код / ​​sql, который производит данные. Если это невозможно, вы можете написать TcxCustomDataSource, который будет очищать данные при первой загрузке. Это должно иметь лучшую производительность, потому что вы не будете использовать API сетки для доступа к данным.

Редактировать

ExpressQuantumGrid не будет автоматически скрывать строки, которые выглядят как дубликаты, потому что пользователь скрыл столбец. Смотри: http://www.devexpress.com/Support/Center/p/Q205956.aspx?searchtext=Duplicate+Rows&p=T1|P0|83.

Плакат

Например, у меня есть набор данных, который содержит два поля ID и TXT. Идентификатор уникальное поле и поле TXT может содержат повторяющиеся значения. Итак, когда набор данных подключен к сетке с все столбцы видны, записи уникальный. Смотрите image1.bmp. Но если я скрыть столбец идентификатора, то сетка показывает повторяющиеся строки. Смотрите image2.bmp.

DevExpress Team

Извините, но наш ExpressQuantumGrid Suite не поддерживает такой функциональность, потому что эта задача очень конкретный Тем не менее, вы можете реализовать это вручную.

0 голосов
/ 26 июня 2009

Проверка на наличие дубликатов всегда немного сложна по причинам, которые вы только что упомянули. Лучший способ сделать это в данном конкретном случае - это, вероятно, выполнить фильтрацию до того, как данные достигнут сетки.

Если эта сетка получает свои записи из базы данных, попробуйте настроить запрос SQL, чтобы не возвращать дублирующиеся записи. (Здесь может быть полезно «отличное» ключевое слово.) Сервер базы данных обычно справляется с этим гораздо лучше, чем вы.

Если нет, то вы, вероятно, загружаете свой набор результатов из какого-то списка объектов. Попробуйте отфильтровать список и отбросить дубликаты объектов , прежде чем загрузить его в сетку. Тогда все кончено, и вам не нужно фильтровать саму сетку. Это намного меньше времени.

...