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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2012, 08:31   #11
Владимир1989
Пользователь
 
Регистрация: 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.
Владимир1989 вне форума Ответить с цитированием
Старый 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
Владимир1989
Пользователь
 
Регистрация: 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.
Владимир1989 вне форума Ответить с цитированием
Старый 27.09.2012, 09:31   #14
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Не совсем правильно.
Устанавливать сортировку в таблице нужно тогда, когда выбирается поле в радиогруппе. В этом же варианте сортировка устанавливается на каждый чих (ввод символа). Что приведет, в конечном итоге (при большом количестве записей), к таким пляскам гриды, что никакому юзеру не понравиться.

Второе. Это сортировка не по алфавиту, а по коду записи. Это приведет к тому, что все Петровы могут быть показаны раньше Александровых.
Цитата:
Это тоже будет как то повлияет на торможение поиска при большом объеме данных?
В том виде как предложено (внутри процедуры события OnChange компонента Edit1), то да, будут неприятные эффекты, в том числе и торможения.

Последний раз редактировалось Скандербег; 27.09.2012 в 09:41.
Скандербег вне форума Ответить с цитированием
Старый 27.09.2012, 09:50   #15
Владимир1989
Пользователь
 
Регистрация: 25.09.2012
Сообщений: 30
По умолчанию

получается, что надо сортировку прописать в самом начале, до того где задаются чихи и при этом указать все поля которые находятся в ADOOsmotr?Или я что то не правильно понял.
Владимир1989 вне форума Ответить с цитированием
Старый 27.09.2012, 09:59   #16
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Надо создать процедуру обработки события OnClick радиогруппы.
В этой процедуре отслеживать какая радиокнопка помечена и устанавливать сортировку по полю, соответствующему отмеченной радиокнопке.
Перед установкой сортировки рекомендуется отключать прорисовку гриды.
Например.
Код:
procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  ADOOsmotr.DisableControls;
  case RadioGroup1.ItemIndex of
    0 : ADOOsmotr.Sort:='[КодПациента]'; 
    1 : ADOOsmotr.Sort:='[КодВрача]';
  end;
  ADOOsmotr.EnableControls
end;

Последний раз редактировалось Скандербег; 27.09.2012 в 10:08.
Скандербег вне форума Ответить с цитированием
Старый 27.09.2012, 10:06   #17
Владимир1989
Пользователь
 
Регистрация: 25.09.2012
Сообщений: 30
По умолчанию

Спасибо. Сейчас попробую так сделать.
Владимир1989 вне форума Ответить с цитированием
Старый 27.09.2012, 10:44   #18
Владимир1989
Пользователь
 
Регистрация: 25.09.2012
Сообщений: 30
По умолчанию

Все получилось. Спасибо!

Последний раз редактировалось Владимир1989; 27.09.2012 в 11:18.
Владимир1989 вне форума Ответить с цитированием
Старый 28.09.2012, 11:30   #19
Владимир1989
Пользователь
 
Регистрация: 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.
Владимир1989 вне форума Ответить с цитированием
Старый 28.09.2012, 12:25   #20
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Запрос составлен с ошибками и, разумеется, в таком виде он работать не будет.
Но дело даже не в этом.
По идее (как это делается везде), нужно отказаться от редактирования непосредственно через ADOTable'ы.
В гриде показывать результат запроса, объединяющего данные таблиц (кстати, и диагнозы и симптомы тоже бы надо выделить в отдельные таблицы). Ниже такой запрос показан.

Для добавления и редактирования пользоваться той же формой, которая есть для редактирования, но записывать данные из этой формы тоже через ADOQuery (другой компонент, разумеется).
Новая запись - это модифицирующий запрос INSERT, при редактировании - запрос UPDATE.
На форме все компоненты, которые предназначены для непосредственного доступа к БД (их имена начинаются с DBxxx) заменить на обычные.

После записи в БД данных (что при добавлении, что при редактировании существующей записи) основной компонент ADOQuery, который показывает данные в главной таблице, нужно будет просто переоткрыть (Close, затем Open). Это и позволит увидеть в главной гриде добавленное или исправленное.
При такой организации работы с БД у нас несколько больше писанины, но контроль за сохранением данных стопроцентный.

Это самая обычная практика разработки баз данных.

Что касается запроса, то один из вариантов работающего такой:
Код:
SELECT Осмотр.Код, Осмотр.КодПациента, Пациент.[ФИО Пациента], Осмотр.КодВрача, Врач.[ФИО Врача], 
Осмотр.[Дата осмотра], Осмотр.Симптомы, Осмотр.Диагноз, Осмотр.[Предписания больному]
FROM (Осмотр INNER JOIN Пациент ON Осмотр.КодПациента = Пациент.КодПациента) 
INNER JOIN Врач ON Осмотр.КодВрача = Врач.КодВрача
Для того чтобы ограничить выборку нужно будет добавлять к этому тексту предложение WHERE <нужное поле> LIKE ...".

В списке полей, который поставляет такой запрос нужно обязательно включать и поля, через которые осуществляется отношения между таблицами (имеется в виду такие как [Код Пациента], к примеру).
Скандербег вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как реализовать такой поиск? 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