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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2009, 23:12   #1
Ruschel
Пользователь
 
Регистрация: 06.10.2009
Сообщений: 16
Вопрос Вопрос по сортировке и отчет из таблиц

Всем привет! Объединил два интересующих вопроса в 1 тему, итак:
1.Имеется одна из 3-х таблиц адреса клиента, Houses, структура:
| HouseID | CityID | StreetID | House |
где House - строковый тип, это номер дома(строковый был выбран потому что дом может быть как в виде "12", так и "12А" или "12корп1")
HouseID - уникальный ID дома;
CityID - город, в котором нах-ся этот дом
StreetID - улица, в котором нах-ся этот дом
Две таблицы(с городами и улицами) сортируются посредством вторичного индекса без проблем и потом подставляются в DBLookupComboBox для выбора. С сортировкой домов проблемы, сортировать как числа не получается, а строковая сортировка здесь неправильно сортирует:
1
11
12
...
19

2
что-то в этом духе(точно не помню, но сортирует неверно)
Имеется идея создать доп стобец(невидимый для ДБГрид) где будет числовая часть дома и будет сортировка сначала по нему, потом по основному. Но я не знаю как SQL-запросом перенести из String-поля числовое значение с преобразованием в число в Integer-поле(к примеру HouseNum).
Если у кого есть другие предложения как отсортировать дома буду очень рад услышать!
2. Имеется сетка DBGrid. Требуется каким-нибудь удобным способом отметить нужные строки(несколько!) и передать на печать(либо в отчет, либо еще как-нибудь). Вопросы:
1) Для этого можно использовать QReport и ему подобные или возможно как-то передавать в .doc или .xls формат? Как это сделать?))
2) Как установить выбор многих значений в сетке я знаю(multiselect), а как передать весь фокус в отчет?
3) Слышал про продвинутую DBGrid не то от ehLib или как-то так и там есть функции отметки строк галочками и.т.д. Скажите, трудоёмко будет переписать под этот компонент программу?

Заранее очень благодарен!!
Ruschel вне форума Ответить с цитированием
Старый 07.10.2009, 08:27   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

1.
Вариант. Поделить House на два поля (колонки), где в первой числовое значение номера дома (соответственно это поле
должно быть числового типа). Во второй колонке другая часть номера (корпус), если есть.
Даже если номер дома будет вида 24/5 и тогда можно разделять такой номер на две части (25 и /5).
Это переносит "разделение" номера на уровень пользователя и разработчику не надо париться над тем, чтобы
разделять его при записи данных или при составлении запроса.

Другой вариант. Используя только одно строковое поле для номера дома подставлять перед номером пробелы,
так чтобы вместе с ними строка с номером содержала не менее определенного количества символов.
Примерно так: " 1", " 54" или "102". Такой прием обеспечивает "правильную" сортировку номеров в строковом представлении.

2.
В DBGridEh (библиотека EhLib) есть возможность сохранять таблицу в файлы разных форматов.
Их не так много, но вполне достаточно для многих применений. Форматы такие: Text, HTML, RTF (Word), XLS, Csv (Excel).
Переделка DBGrid на DBGridEh не такая уж и сложная. Заново придется создавать колонки в гриде, если они, конечно, были
в DBGrid (это те, которые если не создавать, они в гриде автоматом формируются по DataSet'у).
И, если есть событийные процедуры, связанные с гридой или ее колонками, то их тоже надо будет немного подправить.
Скандербег вне форума Ответить с цитированием
Старый 07.10.2009, 12:35   #3
Ruschel
Пользователь
 
Регистрация: 06.10.2009
Сообщений: 16
По умолчанию

по поводу первого предложения: я так и думал, но как оно будет сортироваться уже между 12А, 12Б,...,12/3...,12корп1, т.е. где доп части разные, а числовые одинаковые. Составной индекс отсортирует правильно?
И вопрос к обоим предложениям: sql-запросом это можно реализовать? Просто база уже заполнена по большей части, в ручную это очень долго исправлять.... а вот перевод из строкового формата в числовой, разделение строки на части и подобные функции я в хелпе и фаронове по sql не нашел((
Ruschel вне форума Ответить с цитированием
Старый 07.10.2009, 14:23   #4
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Если база заполнена, то есть два пути.
Один, сделать программу, которая разделит, модифицирует уже существующие данные как требуется, а в основном проекте учесть эти изменения в базе.
Второй, использовать хранимые процедуры, где можно использовать любые функции SQL. Во всяком случае, в диалекте 3 SQL функции преобразования точно есть. В ХП можно реализовать и разделение строки на части. Тогда и базу модифицировать не придется.
А в запросе то что вы хотите сделать, вряд ли получится.
Скандербег вне форума Ответить с цитированием
Старый 17.10.2009, 16:42   #5
Ruschel
Пользователь
 
Регистрация: 06.10.2009
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Скандербег Посмотреть сообщение
1.
Другой вариант. Используя только одно строковое поле для номера дома подставлять перед номером пробелы,
так чтобы вместе с ними строка с номером содержала не менее определенного количества символов.
Примерно так: " 1", " 54" или "102". Такой прием обеспечивает "правильную" сортировку номеров в строковом представлении.
Такая вещь не работает, сортирует все равно не правильно
Но сортировку в общем то я сделал

Последний раз редактировалось Ruschel; 17.10.2009 в 18:05.
Ruschel вне форума Ответить с цитированием
Старый 22.10.2009, 09:07   #6
DariaPolka
Заблокирован
 
Регистрация: 19.10.2009
Сообщений: 3
По умолчанию Вопрос по сортировке и отчет из таблиц

Так значит, и с этим вопросом я разобрался. Все дело в верхнем регистре. Тогда возникает вопрос следущего плана: буква A находится в таблице аски выше, чем _, НО буква а находится ниже Тогда ведь правильно сортировать по алфавиту опираясь на таблицу. Т.е., если есть ники Alex, alex и _alex, то по идее они должны быть расположены так: Alex, _alex, alex. Но, используя мою сортировку получим Alex, alex и _alex, используя метод sort - _alex, Alex, alex. Т.к. сортирует по нижнему регистру. Так вот и возникает вопрос: правильно ли это? Кто же тогда принял такой стандарт? Ведь Эксцель и прочие программы сортирует так же, как и метод sort.
DariaPolka вне форума Ответить с цитированием
Старый 24.10.2009, 20:15   #7
Ruschel
Пользователь
 
Регистрация: 06.10.2009
Сообщений: 16
По умолчанию

да и не говори, все через *опу( Ну собсно свои проблемы я уже решил, решаются новые)
Ruschel вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по пересчету таблиц. Klim Bassenger Microsoft Office Excel 2 18.06.2009 11:53
Нужна помощь в сортировке 777Артём777 Общие вопросы Delphi 4 14.03.2009 09:39
Вопрос с формой и связью таблиц Broodstar Microsoft Office Access 2 13.11.2008 17:01
Вопрос по сортировке Ermiss БД в Delphi 5 17.02.2008 17:32
Ошибка в сортировке Veiron Общие вопросы Delphi 14 21.01.2008 21:35