Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2009, 14:57   #1
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию DBGrid: Как сделать собственную сортировку данных?

Стоит задача, есть тысячи записей, с текстовым полем "обозначения", значения в нём вида "IZD1-LM-123456-789-00029"

отсортировать нужно, скажем, по последним пяти цифрам, или по предпоследним трём, в общем, если написать собственную функцию, распарсить - проблем с сортировкой не было бы.

Но! Вся логика программы (писал не я) построена на вывод в DBGrid, всё было прекрасно, но потребовались изменение: вот такую вот сортировку....

Остаётся только заменить DBGrid на простой грид, ручками в него выводить, и так во всех местах кода! (довольно корявого написанного)

может, кто-нибудь, предложит другой вариант? Выводимые записи предназначены только для чтения, т.е. устроила бы небольшая процедура сортировки строк DBGrid, сразу после вывода. Но он доступа к строкам не даёт....
AnTe вне форума Ответить с цитированием
Старый 16.02.2009, 15:14   #2
фЁдОр
Форумчанин
 
Аватар для фЁдОр
 
Регистрация: 06.09.2007
Сообщений: 908
По умолчанию

через какие компоненты выводите в дбгрид? тут можно запросом это делать. только не спрашивайте как. в любом справочнике по SQL такое описывается.
фЁдОр вне форума Ответить с цитированием
Старый 16.02.2009, 15:15   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Но он доступа к строкам не даёт...
Когда ж вы усвоите наконец?
DBGrid - это компонент тупого отображения информации и ничего сортировать в принципе не умеет.
Пишите свою программу, подцепляйтесь к этой базе и сортируйте хоть до посинения, но с помощью датасетов...
Или работайте с датасетами в существующей программе.
Проблема яйца выеденного не стоит, нужно просто понимать хотя бы азы...

Последний раз редактировалось mihali4; 16.02.2009 в 15:17.
mihali4 вне форума Ответить с цитированием
Старый 16.02.2009, 15:37   #4
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

Цитата:
Сообщение от фЁдОр Посмотреть сообщение
через какие компоненты выводите в дбгрид? тут можно запросом это делать. только не спрашивайте как. в любом справочнике по SQL такое описывается.
в SQL подобных запросов нет, т.е. языковыми средствами SQL осортировать "Ваня-5-Маша", "Петя-4-Федя" по цифре посредине невозможно

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Когда ж вы усвоите наконец?
DBGrid - это компонент тупого отображения информации и ничего сортировать в принципе не умеет.
Это я понял, поэтому и собрался вручную строки переставить. Оказалось, он и этого не умеет. Только отображение, "как получилось после запроса".

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Пишите свою программу, подцепляйтесь к этой базе и сортируйте хоть до посинения, но с помощью датасетов...
Или работайте с датасетами в существующей программе.
Проблема яйца выеденного не стоит, нужно просто понимать хотя бы азы...
Да, нужно доработать существующую. Вы правы, азы я с трудом. Нормальной книжки не нашёл, прочитал SQL, пока в автобусе ехал, и посмотрел, как в исходнике связаны данные

Dataset в программе - TOraQuery (используются компоненты оракла). Как перемещаться по датасету я вроде понял, например, чтение -
Код:
 while not(Query1.Eof)do
  begin
    showmessage(Query1.FieldByName('DOK').AsString);
    Query1.Next;
  end;
Запись невоможна, база в RO

А строки в нём как местами поменять? подскажите, плиз, или ткните носом в хорошую статью....

Последний раз редактировалось AnTe; 16.02.2009 в 15:42.
AnTe вне форума Ответить с цитированием
Старый 16.02.2009, 16:08   #5
фЁдОр
Форумчанин
 
Аватар для фЁдОр
 
Регистрация: 06.09.2007
Сообщений: 908
По умолчанию

Цитата:
Сообщение от AnTe Посмотреть сообщение
в SQL подобных запросов нет, т.е. языковыми средствами SQL осортировать "Ваня-5-Маша", "Петя-4-Федя" по цифре посредине невозможно
...
прочитал SQL, пока в автобусе ехал
наверно невнимательно прочитали, либо я не догоняю, что вы хотите. почитейте про оператор LIKE еще раз. на край посмотрите тему "Для уменьшения количества вопросов..." в самом верху этого раздела, а там справочник по SQL.

Последний раз редактировалось фЁдОр; 16.02.2009 в 16:12.
фЁдОр вне форума Ответить с цитированием
Старый 16.02.2009, 17:19   #6
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

Цитата:
Сообщение от фЁдОр Посмотреть сообщение
наверно невнимательно прочитали, либо я не догоняю, что вы хотите. почитейте про оператор LIKE еще раз.
А можно пример запроса?

Например, у меня есть БД Lovers с единственным полем - Names, и тремя записями:
"Ваня-5-Маша"
"Петя-2-Федя"
"Клава-1-Боря"
"Серёжа-3-Лена"

Чтобы отсортировать по алфавиту я сделаю запрос: SELECT Names FROM Lovers ORDER BY Names ASC

а если мне нужно получить сортировку по цифре в строке, между "-"и"-", чтобы получить следующее:

"Клава-1-Боря"
"Петя-2-Федя"
"Серёжа-3-Лена"
"Ваня-5-Маша"

какой запрос нужно написать?
AnTe вне форума Ответить с цитированием
Старый 16.02.2009, 17:38   #7
начинающий кодер
только учусь!
Форумчанин
 
Аватар для начинающий кодер
 
Регистрация: 08.02.2009
Сообщений: 124
По умолчанию

Синтаксис функции SUBSTRING:

SUBSTRING( FROM [, FOR ])
Где:
- имя колонки таблицы, из которой должна быть получена подстрока (substring).

место в значении колонки, начиная с которого извлекается подстрока.

длина извлекаемой подстроки.

Функция SUBSTRING в примере ниже возвратит второй, третий и четвертый символы из колонки с именем COMPANY:

SUBSTRING(COMPANY FROM 2 FOR 3)
Функция SUBSTRING может быть использована и для списка полей в SELECT-запросе, где ключевое слово WHERE допускает сравнение значения с определенным набором колонок. Функция SUBSTRING может использоваться только с колонками типа String (на языке SQL тип CHAR). Вот пример функции SUBSTRING, использующей список колонок в SELECT-запросе (используем демонстрационную таблицу Paradox CUSTOMER.DB):
Код:
SELECT (SUBSTRING(C.”COMPANY” FROM 1 FOR 3)) AS SS
FROM “CUSTOMER.DB” C
остальное http://develope-it.com/309
«Я знаю, что ничего не знаю, но многие не знают и этого».

Последний раз редактировалось начинающий кодер; 16.02.2009 в 17:41.
начинающий кодер вне форума Ответить с цитированием
Старый 16.02.2009, 19:22   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Еще одно замечание, если позволите.
Физически создать базу данных - минутное дело.
А вот тщательно продумать ее структуру (в том числе и структуру отдельных таблиц) - это требует времени. Приходится самому немножко поработать компьютером.
Поэтому, если есть такая возможность - переделывайте структуру базы, ибо одно поле в таблице, в котором записано "Клава-1-Боря" - чистейший идиотизм. Почему? Да хотя бы потому, что этот "Боря" будет там повторен несметное количество раз - а это дикая избыточность и увеличение размера базы, что, в свою очередь, влечет за собой замедление операций с ней.
Я уже не говорю об извращениях, которые придется применить для нужной вам сортировки...

Последний раз редактировалось mihali4; 16.02.2009 в 19:34.
mihali4 вне форума Ответить с цитированием
Старый 17.02.2009, 04:03   #9
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

Цитата:
Сообщение от начинающий кодер Посмотреть сообщение
Синтаксис функции SUBSTRING:
Спасибо, но даже если эта функция поддерживается сервером - она мне бесполезна, т.к. позиции "плавающие", как и в примере с "Ваня-5-Маша". Для отделения части, по которой необходимо произвести сортировку, строку нужно распарсить.

На паскале это делов на пять минут, а на SQL, по всей видимости, невозможно.
AnTe вне форума Ответить с цитированием
Старый 17.02.2009, 04:09   #10
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Еще одно замечание, если позволите.
Физически создать базу данных - минутное дело.
А вот тщательно продумать ее структуру (в том числе и структуру отдельных таблиц) - это требует времени. Приходится самому немножко поработать компьютером.
это я понял, как только прочитал, что такое "таблица".

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Поэтому, если есть такая возможность - переделывайте структуру базы, ибо одно поле в таблице, в котором записано "Клава-1-Боря" - чистейший идиотизм. Почему? Да хотя бы потому, что этот "Боря" будет там повторен несметное количество раз - а это дикая избыточность и увеличение размера базы, что, в свою очередь, влечет за собой замедление операций с ней.
Я уже не говорю об извращениях, которые придется применить для нужной вам сортировки...
Про идиотизм - согласен. Видимо, разработчики БД, создавшие цельное поле "обозначение", не предполагали, что через десять лет кому-то придёт в голову сортировать и отбирать по его частям. К тому же, составные части обозначения от изделия к изделию меняются, поэтому их понять можно.

Однако, что сделано - то сделано. Доступ к данным базе у меня только в RO, не говоря уж о её структуре. А вот извращение, которое возможно применить, для сортировки, по всей видимости одно - скидывать данные в массив, сортировать, и выводить вручную в StringGrid

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


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать сортировку (поиск) Delphi+Access Toska БД в Delphi 6 28.08.2008 22:32
Как создать собственную ДЛЛ на Дельфи SkyM@n Помощь студентам 5 02.12.2007 07:27
Как же мне это сделать? DBgrid khaz Компоненты Delphi 4 12.02.2007 08:58