Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.21;
Скачать: CL | DM;

Вниз

Обсудим "Как сделать Редактор "Условий отбора"   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.014 c
15-1223975914
newbie
2008-10-14 13:18
2008.12.21
Как научится писать программы без ошибок


3-1211885281
Vlad Oshin
2008-05-27 14:48
2008.12.21
Транзакции осуществляются в соединении или как? ADO


15-1223761025
МемТест
2008-10-12 01:37
2008.12.21
Под Windows XP максимум памяти - это 2 или 4 Гб?


15-1224012169
guav
2008-10-14 23:22
2008.12.21
А мужики не знали


15-1224068636
Iris
2008-10-15 15:03
2008.12.21
Не работает debug