Форум: "Базы";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];
ВнизОбсудим "Как сделать Редактор "Условий отбора" Найти похожие ветки
← →
azamatufa © (2008-05-23 10:37) [0]Привет, Мастера!
Вот не знаю как быть, с чего начать. Кажется для меня задача не из легких. Прошу помощи, совета.
Задача Учет-кадров.
И так, у работника имеется множество различных характеристик:
- пол (муж,жен)
- дата рождения (Date)
- образование(высш,серд,нач.),
- категория (рук-ель, рабочий, служ.),
- воинское звание (генерал,полк-ник, майор, лейт....)
и так далее...
Так вот, надо сделать "Редактор "Условий отбора".
Например:
"Возраст" "больше" 30 И "Возраст" "меньше или равно" 50
И ("Звание" "равно" "Майор" ИЛИ "Звание" "равно" "лейтенант")
Может кто сталкивался с подобными делами?
Какова структура базы данных?
← →
Sergey13 © (2008-05-23 10:45) [1]А причем тут структура БД и "Условия отбора"? Какая между ними связь?
← →
Sergey13 © (2008-05-23 10:50) [2]> [0] azamatufa © (23.05.08 10:37)
> dBase, FoxPro
Вот это, ИМХО, ни в какие ворота не лезет. Особенно для такой конфиденциальной штуки как кадровая БД.
← →
Reindeer Moss Eater © (2008-05-23 10:59) [3]рисовать подобные редакторы - неблагодарное дело.
у меня все вышеперечисленное делается средствами грида.
← →
Игорь Шевченко © (2008-05-23 11:08) [4]
> рук-ель
Не сокращ.
← →
Reindeer Moss Eater © (2008-05-23 11:25) [5]http://img394.imageshack.us/img394/9882/gridls7.jpg
на запрос наложены пользовательские условия :
номер документа > 1 and номер документа < 700
and
(счет = x или счет равен y)
первое реализовано в ehlib"ом (ввод условия в заголовках столбца)
второе добавлено в наследнике (выбор по "или" по значению поля на котором стоит курсор в момент выбора)
во втором окне виден результирующий sql (первые четыре строки запроса от дизайнтайма)
← →
Stas © (2008-05-23 11:25) [6]cxGRID
← →
MsGuns © (2008-05-23 11:52) [7]Задачка несложная сама по себе, но реально усложняется, если ее универсализировать.
Надо соорудить некую формочку (можно динамически в библиотечной процедуре), куда передавать указатель на датасет. По открытию формочка рисует на себе две панельки - на левой - список доступных для фильтрации полей датасета, на правой - стрингрид из трех колонок: в первой имя выбранного в фильтр поля, во второй тип операции (я ограничивался "джентльментским" набором из ">", "<", ">=", "<=", "NOT" и "LIKE", в третий - значение маски. Ну и функционал добавления-удаления в фильтре.
Сложнее с добавлением введенных условий в запрос, тут сложно дать какие-либо ОБЩИЕ рекомендации, т.к. сильно зависит от SQL сервера и исходного запроса, в который может входить что угодно, начиная от Where и заканчивая всякими юнионами и группировками. Если ADO, то там проще. Исходный запрос вставляется в результирующий как подзапрос. Правда, если у него был Order By, то его надо вынести также вовне.
Короче, повозиться, конечно, придется, но результат, однозначно себя окупит, т.к. эта формочка может быть легко встроена в любое приложение и любую сетку.
← →
Reindeer Moss Eater © (2008-05-23 11:57) [8]сначала повозиться с формой, потом отправить всех "тетенек" получать второе высшее чтобы научились с ней обращаться.
← →
MsGuns © (2008-05-23 11:59) [9]Мои "тетеньки" учатся ловко шуровать фильтрами за неделю максимум. И только ПЕРВЫЙ раз. Все последующие проги имеют тот же интерфейс фильтрации и вопросов не вызывают изначально.
← →
Reindeer Moss Eater © (2008-05-23 12:02) [10]тетеньки у всех разные.
← →
Reindeer Moss Eater © (2008-05-23 12:10) [11]Это все к тому, что наглядность и интуитивная понятность таких решений уступает приведенному мной выше.
Условие фильтра введенное в заголовке всегда видно пользователю.
Если же он отбирает по "или" то все записи попадающие в фильтр сразу же подсвечиваются еже до того, как будет применен сам фильтр.
← →
MsGuns © (2008-05-23 12:36) [12]Тогда самое лучшее решение предлагал ИШ - нефиг писать какие-либо прибамбасы, -дать юзеру в зубы учебник по сиквелю и окошко с мемо.
← →
Reindeer Moss Eater © (2008-05-23 12:41) [13]у меня-то он не пишет sql.
он просто вводит значения или выражения > <
причем видит в какие колонки вводит, видит как они называются и что в них находится.
← →
MsGuns © (2008-05-23 12:44) [14]>Reindeer Moss Eater © (23.05.08 12:41) [13]
>он просто вводит значения или выражения > <
>причем видит в какие колонки вводит, видит как они называются и что в них находится.
И чем это отличается от моего способа, кроме того, что у тебя только 2 условия и напрочь отстутствует условия выбора подобных (Like) ? Подсветкой ? Может, он еще шепчет слова любви ?
Ладно, уговорил, твоя пипи ширше
← →
Reindeer Moss Eater © (2008-05-23 12:50) [15]Кто сказал, что лайка нету?
Если условие введено в заголовке стрингового поля, то формируется like вместо равенства.
← →
Reindeer Moss Eater © (2008-05-23 12:52) [16]И чем это отличается от моего способа
тем что у меня юзер видит сам набор данных и введенные условия, а у тебя отдельную форму оторванную от данных которая к тому же исчезает когда надо наложить фильтр.
← →
Reindeer Moss Eater © (2008-05-23 12:56) [17]Что происходит у тебя, если обнаруживается, что юзер ввел не совсем то, что ему надо?
Как ты в своей чудо-форме восстановишь текущие условия фильтрации введенные на предыдущем этапе?
"привет, тетеньки, вводите все заново!"
ага?
← →
MsGuns © (2008-05-23 13:00) [18]>Reindeer Moss Eater © (23.05.08 12:52) [16]
>тем что у меня юзер видит сам набор данных и введенные условия, а у тебя отдельную форму оторванную от данных которая к тому же исчезает когда надо наложить фильтр.
У тебя кроме телепатора есть еще и телевизор ? У меня формочка открывается не у горы, а поверх датасета, в котором и видны эти самые "данные". Так в чем отличие (кроме фанфарного трУба и фейерверков) ?
← →
Reindeer Moss Eater © (2008-05-23 13:02) [19]см. [17] чем еще.
← →
Reindeer Moss Eater © (2008-05-23 13:03) [20]а поверх датасета, в котором и видны эти самые "данные".
дай угадаю. и она канешна прозрачна как слеза младенца.
← →
Reindeer Moss Eater © (2008-05-23 13:14) [21]ну и на десерт главное отличие:
эргономика
что происходит у меня если надо вырать докменты "ООО "Рога и Копыта"":
встаем курсором поле с именем или другим идентификатором на любой документ "Рогов и копыт" и жмем серый плюс - раз.
нажиаем горячую для активации/деактивации фильтра - два.
готово.
что происходит у меня если надо вырать докменты клиентов, с именами начинающимися на "ООО":
встаем в колонку с именем и набираем "ООО" (курсор автоматом попал в заголовок) - раз.
жмем энтер или стрелку вниз - два.
готово.
← →
Игорь Шевченко © (2008-05-23 14:07) [22]Учитесь фильтру у Excel-я или у DevExpress - все тетеньки работают, ни одна еще не пожаловалась.
Еще в Access-е был неплохой простой фильтр с двумя условиями "Фильтр по выделенному" и "Исключить выделенное" (ну и расширенный фильтр, разумеется, где можно кучу условий задавать, но он уже для яйцеголовых)
← →
Reindeer Moss Eater © (2008-05-23 14:16) [23]у меня инверсия выделенного по горячей кстати тоже есть.
еще есть опция выделения "вот этой записи и вот той" (по PK).
опция "регистронезависимый поиск" и поиск по "неполному вхождению" (процент пририсовывается не только сзади но и спереди маски)
последние по дефотлту в false.
и все это сохраняется индивидульно для каждого экземпляра.
для яйцеголовых есть опция "просмотр sql" с помощью которой можно вообще писать и выполнять целиком свой запрос.
← →
azamatufa © (2008-05-23 14:21) [24]2 Reindeer Moss Eater
Твой вариант я так понял удобен для оперативности.
Мне же надо, чтобы этот фильтр еще и сохранить!!!
Например:
Фильтр 1 - "Годные офицеры кому за 50 лет".
"Дата рождения" <= "23.05.1958" AND "Звание" >= "Лейтенант" AND "Годность" = "Годен А"
Мало того сохранить, так чтоб потом его можно было применить! ))
MsGuns - я тебя понял. Согласен, что для применения фильтра в запрос надо учитывать специфику структуры БД и SQL... НО! Ведь можно заранее (до начала программирования) определиться с:
1. Как будут храниться "Характеристики" человека?
2. Как будут харниться варианты значений "Характеристик"?
2. Как будут храниться условия ">" ">=" "<" ... (т.е. дать им коды что ли)
Придется повозиться...
← →
azamatufa © (2008-05-23 14:24) [25]
> Sergey13
База на самом деле MS Access (*.mdb), ADO.
← →
Reindeer Moss Eater © (2008-05-23 14:26) [26]а в чем проблемы с сохранением?
все условия есть, берем и сохраняем куда хошь.
← →
Sergey13 © (2008-05-23 14:34) [27]> [25] azamatufa © (23.05.08 14:24)
> База на самом деле MS Access
Хрен редьки не слаще. Файловая БД - заходи в шару и бери.
← →
Reindeer Moss Eater © (2008-05-23 14:38) [28]azamatufa
мне кажется, что ты в своем случае пошел не по тому пути.
что будет в результате:
программа, которая все может, но в которой нет предопределенных фильтров.
И тебе придется теткам объяснять, что ты не жираф, а это им на самом деле надо сначала попотеть и накорябать фильтры прежде чем все поедет-зашевелится.
Если же они у тебя все же будут, то почему бы их не встроить в сам интерфейс программы чтобы работать можно было сразу после инстала?
← →
Игорь Шевченко © (2008-05-23 15:03) [29]Reindeer Moss Eater © (23.05.08 14:16) [23]
> опция "регистронезависимый поиск" и поиск по "неполному
> вхождению" (процент пририсовывается не только сзади но и
> спереди маски)
> последние по дефотлту в false.
Кстати, да, в одном из проектов у меня тоже был некий предварительный фильтр с несколькими криетриями и галкой "точно" напротив каждого критерия. Все, разумеется, на равенство, при галке "точно" ищем, что набили, при ее отсутствии, соответвенно LIKE и проценты спереди и сзади.
По моему опыту фильтром на равенство пользуются чаще всего, далее идет условие "от-до", а особые извращенцы уже задают "больше", "меньше" и т.п.
← →
azamatufa © (2008-05-23 15:09) [30]Reindeer Moss Eater
В том то и дело, что программа будет поставлятся в подведомственные организации без фильтров.
Каждая контора будет в самом начале набивать "свои условия" которые могут буть совершенно всякими... и после этого уже пойдет работа.
Если кто знает в кадрах - это называется "Перечень должностей и профессий" - он нужен для воинского учета и бронирования.
Так вот, каждая контора сугубо для себя вбивает (при помощи редактора) выписку из этого перечня.
← →
Reindeer Moss Eater © (2008-05-23 15:12) [31]Игорь Шевченко
а ишо у того грида есть волшебный метод:
function BatchProcess(ACallBack : TGridEhBetterCallBack; AUserData : Pointer; AWholeDataSet : boolean = False) : integer;
type
TGridEhBetterCallBack = function(AGrid : TDBGridEhBetter; AUserData : Pointer; var AMore : boolean) : boolean of object;
который избавил меня от циклов while not eof do begin next; end; в конечных формах.
просто но эффективно.
← →
MsGuns © (2008-05-23 16:24) [32]Удалено модератором
← →
Reindeer Moss Eater © (2008-05-23 16:41) [33]Удалено модератором
← →
clickmaker © (2008-05-23 17:11) [34]> для яйцеголовых есть опция "просмотр sql" с помощью которой
> можно вообще писать и выполнять целиком свой запрос
в том числе и "drop database" ? ))
← →
Reindeer Moss Eater © (2008-05-23 17:13) [35]в том числе и "drop database" ? ))
<Цитата>
ага. drop user sys cascade;
← →
Reindeer Moss Eater © (2008-05-23 17:25) [36]при использовании грида в приложениях его контекстное меню администрируется системой безопастности.
← →
Prohodil Mimo © (2008-05-23 19:29) [37]а я забил в таблицу структуру всей базы, со всеми связями.
Пользователь выбирает нужный параметр из комбобокса выбирает = <> > < <= >= и т.д.
затем выбирает значение из классификатора, если это классификатор, если нет, то вруную вписывает что надо. Добавляет построчно все условия для отбора и жмёт на "выбрать".
http://ddsoftpro.lv/pictures/izvel_01.jpg
Разбираются даже те, кто в экселе с трудом.
← →
azamatufa © (2008-05-24 06:56) [38]
Prohodil Mimo ©
а покажи, пож-ста, какая структура + как выглядит таблица, содержащая эту структуру.
у тебя то что я ищу ))
← →
Gadenysh (2008-05-27 08:59) [39]Уже сказали несколько раз - купи(укради) грид от DevExpress - там все твои хотелки уже реализованы, красиво и профессионально
← →
Prohodil Mimo © (2008-05-27 13:49) [40]Gadenysh (27.05.08 8:59) [39]
так уж и все? или только по тем данным, которые есть с таблице?
в моём варианте отбор абсолютно по любому параметру, независимо, отображён он с таблице или нет.
azamatufa © (24.05.08 6:56) [38]
врят-ли быстро разберёшься, я сам до этого доходил не один месяц. Но выглядит примерно так:
К примеру есть таблицы (приведу с русскими названиями, так что не пинаться)
Сотрудники (с_ид, с_имя, с_фам, проф_ид)
Профессии (проф_ид, проф_назв)
таблица с описанием структуры выглядет так:
стр_ид, п_стр_ид (указывает к кому принадлежит данная ветвь, для дерева), стр_таблица, стр_поле, стр_тип_поля, стр_название_для_юзера, стр_парам1
1, , Сотрудники, , 0 (корень), "Сотрудник", .
2, 1, Сотрудники, с_имя, 1 (строка), "Имя", .
3, 1, Сотрудники, с_фам, 1 (строка), "Фамилия", .
4, 1, Профессии, проф_назв, 2 (число), "Профессия", Сотрудники.проф_ид = Профессии.проф_ид.
ну а дальше программа, которая всё это обрабатывает.
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.058 c