Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.56 MB
Время: 0.039 c
8-1188408194
chipper
2007-08-29 21:23
2008.12.21
Реализация лимба виртуального прибора


2-1224144320
lewka
2008-10-16 12:05
2008.12.21
Форма по верх всех окон


2-1226748565
Вовчик
2008-11-15 14:29
2008.12.21
Поиск по полям DBmemo


9-1176119436
ElectriC
2007-04-09 15:50
2008.12.21
CD3DFont текст


15-1224211471
Slider007
2008-10-17 06:44
2008.12.21
С днем рождения ! 17 октября 2008 пятница





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский