|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.09.2012, 08:31 | #11 |
Пользователь
Регистрация: 25.09.2012
Сообщений: 30
|
хорошо, значит буду думать на счет подключения другой базы.
А в этом коде, что вы прислали, можно как либо прописать сортировку данных? Я знаю, что надо указывать order by [ФИО Пациента], но с опострофами у меня никак не получается расставить правильно. Вопрос конечно вне темы:В дальнейшем, для большого хранения данных, какую базу посоветуете использовать? if RadioGroup1.ItemIndex = 0 then begin qrOsmotr.SQL.Text := 'select * from Пациент where [ФИО пациента] LIKE '+ QuotedStr(Edit1.Text+'%'); qrOsmotr.Open; if not qrOsmotr.Eof then begin ADOOsmotr.Locate('КодПациента', qrOsmotr.FieldByName('КодПациента') .AsInteger, []); end; qrOsmotr.Close; end; Последний раз редактировалось Владимир1989; 27.09.2012 в 08:35. |
27.09.2012, 08:44 | #12 |
Форумчанин
Регистрация: 04.04.2009
Сообщений: 438
|
Нет, здесь не нужно предложение order by, т.к. результат поиска - это одна или несколько записей, в которых фамилия начинается на введенные буквы и это не поможет сортировке при показе в гриде.
Ведь поиск здесь - это локация на нужную запись не в ADOQuery, а в ADOTable и то что квери вернет никак не отразится на показе. Здесь поможет сортировка в ADOTable по полю, где происходит поиск. Тогда все "Петровы" будут показаны подряд и тот поиск, что сейчас реализован будет нормально для пользователя работать. Правда, сортировка по lookup полям затруднительна и приводит на большом объеме данных к тормозам. ----- СУБД по-мне, так FireBird. И бесплатная, и более-менее простая в использовании, и в Дельфи встроены компоненты доступа. Последний раз редактировалось Скандербег; 27.09.2012 в 09:09. |
27.09.2012, 09:24 | #13 |
Пользователь
Регистрация: 25.09.2012
Сообщений: 30
|
if RadioGroup1.ItemIndex=1 then begin
qrOsmotr.SQL.Text := 'select * from Врач where [ФИО Врача] LIKE '+ QuotedStr(Edit1.Text+'%'); qrOsmotr.Open; if not qrOsmotr.Eof then begin ADOOsmotr.Locate('КодВрача', qrOsmotr.FieldByName('КодВрача').As Integer, []); ADOOsmotr.Sort:='[КодВрача]'; end; qrOsmotr.Close; end; Написал так, сортировка удалась. Это тоже будет как то повлияет на торможение поиска при большом объеме данных? Последний раз редактировалось Владимир1989; 27.09.2012 в 09:30. |
27.09.2012, 09:31 | #14 | |
Форумчанин
Регистрация: 04.04.2009
Сообщений: 438
|
Не совсем правильно.
Устанавливать сортировку в таблице нужно тогда, когда выбирается поле в радиогруппе. В этом же варианте сортировка устанавливается на каждый чих (ввод символа). Что приведет, в конечном итоге (при большом количестве записей), к таким пляскам гриды, что никакому юзеру не понравиться. Второе. Это сортировка не по алфавиту, а по коду записи. Это приведет к тому, что все Петровы могут быть показаны раньше Александровых. Цитата:
Последний раз редактировалось Скандербег; 27.09.2012 в 09:41. |
|
27.09.2012, 09:50 | #15 |
Пользователь
Регистрация: 25.09.2012
Сообщений: 30
|
получается, что надо сортировку прописать в самом начале, до того где задаются чихи и при этом указать все поля которые находятся в ADOOsmotr?Или я что то не правильно понял.
|
27.09.2012, 09:59 | #16 |
Форумчанин
Регистрация: 04.04.2009
Сообщений: 438
|
Надо создать процедуру обработки события OnClick радиогруппы.
В этой процедуре отслеживать какая радиокнопка помечена и устанавливать сортировку по полю, соответствующему отмеченной радиокнопке. Перед установкой сортировки рекомендуется отключать прорисовку гриды. Например. Код:
Последний раз редактировалось Скандербег; 27.09.2012 в 10:08. |
27.09.2012, 10:06 | #17 |
Пользователь
Регистрация: 25.09.2012
Сообщений: 30
|
Спасибо. Сейчас попробую так сделать.
|
27.09.2012, 10:44 | #18 |
Пользователь
Регистрация: 25.09.2012
Сообщений: 30
|
Все получилось. Спасибо!
Последний раз редактировалось Владимир1989; 27.09.2012 в 11:18. |
28.09.2012, 11:30 | #19 |
Пользователь
Регистрация: 25.09.2012
Сообщений: 30
|
Скандербег
Вот если например чтобы при поиске именно выводились все записи (например только Петровы), я все оставил также, только подключил Adoquery к DBGrid, и написал код именно по записи, но программа ругается, что не может найти ФИО Пациента, хотя в связи я это прописал: procedure TForm1.Edit1Change(Sender: TObject); var str,z,x:string; begin z:=' (Пациент.[КодПациента]=Осмотр.[КодПациента]) and (Осмотр.[КодВрача]=Врач.[КодВрача]) '; x:=' (Осмотр INNER JOIN Пациент ON Осмотр.КодПациента = Пациент.КодПациента) INNER JOIN Врач ON Осмотр.КодВрача = Врач.КодВрача where '; str:=''; if RadioGroup1.ItemIndex = 0 then begin str:='and Осмотр.[ФИО Пациента] like '''+Edit1.Text+'%'''; end; qrOsmotr.Active:=false; qrOsmotr.SQL.Clear; qrOsmotr.SQL.Add('SELECT Пациент.[ФИО Пациента], Врач.[ФИО Врача], Осмотр.[Дата осмотра], Осмотр.Симптомы, Осмотр.Диагноз, Осмотр.[Предписания больному] FROM' +x+z+str); qrOsmotr.Active:=true; end; Просто я хочу чтобы именно в DBGrid выводились только те записи, которые я ищу, а не все записи в таблице. Хотя наверно так не получится, ведь редактировать я их не смогу наверно, а если наверно даже и смогу, то в DBGrid наверно придется как-то делать Timer, чтобы после редактирования данные обновлялись. А вообще реально? Последний раз редактировалось Владимир1989; 28.09.2012 в 11:49. |
28.09.2012, 12:25 | #20 |
Форумчанин
Регистрация: 04.04.2009
Сообщений: 438
|
Запрос составлен с ошибками и, разумеется, в таком виде он работать не будет.
Но дело даже не в этом. По идее (как это делается везде), нужно отказаться от редактирования непосредственно через ADOTable'ы. В гриде показывать результат запроса, объединяющего данные таблиц (кстати, и диагнозы и симптомы тоже бы надо выделить в отдельные таблицы). Ниже такой запрос показан. Для добавления и редактирования пользоваться той же формой, которая есть для редактирования, но записывать данные из этой формы тоже через ADOQuery (другой компонент, разумеется). Новая запись - это модифицирующий запрос INSERT, при редактировании - запрос UPDATE. На форме все компоненты, которые предназначены для непосредственного доступа к БД (их имена начинаются с DBxxx) заменить на обычные. После записи в БД данных (что при добавлении, что при редактировании существующей записи) основной компонент ADOQuery, который показывает данные в главной таблице, нужно будет просто переоткрыть (Close, затем Open). Это и позволит увидеть в главной гриде добавленное или исправленное. При такой организации работы с БД у нас несколько больше писанины, но контроль за сохранением данных стопроцентный. Это самая обычная практика разработки баз данных. Что касается запроса, то один из вариантов работающего такой: Код:
В списке полей, который поставляет такой запрос нужно обязательно включать и поля, через которые осуществляется отношения между таблицами (имеется в виду такие как [Код Пациента], к примеру). |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как реализовать такой поиск? | pеps | PHP | 3 | 22.01.2012 18:57 |
Как реализовать соединение мобилы с компом через Bluetooth. | Мастак | Общие вопросы по Java, Java SE, Kotlin | 0 | 30.10.2011 23:05 |
Как реализовать поиск по строкам. | shinta111 | БД в Delphi | 1 | 20.02.2011 22:34 |
Как копировать данные из ADOTable в ADOTable? | mauar | БД в Delphi | 1 | 10.05.2008 16:05 |
как реализовать поиск синонимов? | borsh | Помощь студентам | 24 | 16.12.2006 10:48 |