| imho.ws |
![]() |
|
|
|
# 1 |
|
Junior Member
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68
![]() |
Года 2 назад делал курсач по программированию с базами данных.. Сейчас понял, что все совершенно забыл!.. Так тчо не бейте сильно...
Так вот! У меня следующая проблема. Имеется база данных клиентов, в которой ведется поиск по введенным значениям. По каким именно полям - узнается после проверки, какие Edit'ы заполнены. Про кривость кода: пока сделал, чтобы хоть работало. Потом буду "шлефовать". Критику (с конкретными предложениями) принимаю! Код:
procedure client_from_db(var cldb: clientzap);
BEGIN
With Form1 do
begin
cl_srch_qry:='';
if Edit12.Text<>'' then
begin
cl_srch_qry:=cl_srch_qry+'name="'+Edit12.Text+'" AND ';
end;
if Edit13.Text<>'' then
begin
cl_srch_qry:=cl_srch_qry+'lname="'+Edit13.Text+'" AND ';
end;
if MaskEdit5.Text<>'( ) - ' then
begin
cl_srch_qry:=cl_srch_qry+'hphone="'+MaskEdit5.Text+'" AND ';
end;
if MaskEdit6.Text<>'( ) - ' then
begin
cl_srch_qry:=cl_srch_qry+'ophone="'+MaskEdit6.Text+'" AND ';
end;
if MaskEdit7.Text<>'( ) - ' then
begin
cl_srch_qry:=cl_srch_qry+'cphone="'+MaskEdit7.Text+'" AND ';
end;
if Edit14.Text<>'' then
begin
cl_srch_qry:=cl_srch_qry+'email="'+Edit14.Text+'" AND ';
end;
//udalyaem nenujnii ' AND '
if length(cl_srch_qry)<>0 then
begin
cl_srch_qry:='('+cl_srch_qry;
delete(cl_srch_qry,length(cl_srch_qry)-4,5);
cl_srch_qry:=cl_srch_qry+')';
end;
end;
Код:
With Form1.Query3 do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM client.db WHERE '+cl_srch_qry); //search in DB
ExecSQL;
cldb.idn:=FieldByName('CLid').AsInteger;
cldb.name:=FieldByName('Name').AsString;
cldb.lname:=FieldByName('Lname').AsString;
cldb.hphone:=FieldByName('hphone').AsString;
cldb.ophone:=FieldByName('ophone').AsString;
cldb.cphone:=FieldByName('cphone').AsString;
cldb.email:=FieldByName('email').AsString;
...
cldb.sendemail:=FieldByName('sendemail').AsBoolean;
cldb.deleted:=FieldByName('deleted').AsBoolean;
end;
( Вылетают сообщения, что поля с такими именами не существуют.. как быть?..
|
|
|
|
|
# 2 |
|
Junior Member
Регистрация: 10.10.2003
Адрес: Москва
Сообщения: 136
![]() ![]() ![]() ![]() |
Я в таких случаях делаю следующее:
1. обязательно вывожу текст sql запроса перед его передачей в БД 2. проверяю его в какой-нить тулзе, чтобы увидеть ошибки выдаваемые самой БД, если она такое умеет (mssql, например, можно прямо в enterprise manager попытаться выполнить запрос) Кстати, чем проверять на пустоту каждое окошко ввода, не лучше ли ставить флаги по событию редактирования объекта и потом по установленным флагам собирать запрос?
__________________
"Самое великое достижение Америки - каждый должен голосовать". - Джордж Буш Мл.(Остин, 08.12.00). |
|
|
|
|
# 3 |
|
Junior Member
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68
![]() |
1. Решение проблемы нашел
) Надо было делать Open, а не ExecSQL.2. Это тоже вариант. Но мне сейчас главное сделать чтобы все требуемые операции с БД проходили нормально. Все остальное возможно переделаю Все равно спасибо! ![]() И еще вопросы! 1.Как узнать сколько всего записей в таблице? 2.Гдето кажется читал, что, для того чтобы ускорить поиск поиск в БД надо сделать поля индексируемыми. Если не так, то как ускорить поиск? Можно ли все поля проиндексировать? 3.Какие еще есть команды SQL.. ну типа First - встать на первую запись, Next - следуюущая. Как узнать сколько всего записей в таблице? МОжно ли узнать сколько в таблице записей подходящих "по маске"? Где можно обо всем жтом поподробнее почитать? На русском желательно ![]() Спасибо
|
|
|
|
|
# 4 |
|
::VIP::
Регистрация: 19.03.2004
Сообщения: 1 329
![]() ![]() ![]() ![]() |
SteFF
Сейчас книжек по программированию БД в Delphi предостаточно, выкладывались и у нас на форуме. Методы First/Next - это не к SQL, а к классу TDataSet (родитель для TTable и TQuery). Есть свойство RecordCount для определения количества записей. Индексировать нужно только те поля, по которым ты чаще всего делаешь поиск, т.е. пишешь в SELECT условие типа WHERE ID = ... Вот тогда ID стоит проиндексировать. Все индексировать не имеет смысла. Индексы дают выигрыш при выборках данных. Но есть и обратная сторона - при добавлении/изменении записей индексы вынуждены перестраиваться. Так что оценивай как часто будут у тебя данные меняться, или больше будут только выбираться. |
|
|
|
|
# 5 | |
|
Junior Member
Регистрация: 19.11.2004
Адрес: Dnepropetrovsk
Пол: Male
Сообщения: 67
![]() |
Цитата:
__________________
|
|
|
|
|
|
# 6 |
|
Junior Member
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68
![]() |
У меня будет много полей.. имена, фамилии, адреса, телефоны, е-mail и еще много полей, в которых будут небольшие числа. Поиск будет происходить по: имя, фамилия, телефоны(3), емейл, адрес. Значит лучше будет сделать эти поля индексируемыми?
Слышал что в парадоксе индексы слетают.. чем это грозит? Полной потерей данных? Или их можно бдует восстановить?
|
|
|
|
|
# 7 | ||
|
СуперМод
IMHO Консультант 2005-2009 Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отсек
Пол: Male
Сообщения: 14 498
![]() |
Цитата:
Цитата:
На случай "слёта" индексов обычно предусматривается процедура переиндексации.
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила! Распространенье наше по планете Особенно заметно вдалеке: В общественном парижском туалете Есть надписи на русском языке В. Высоцкий |
||
|
|
|
|
# 11 | |
|
::VIP::
Регистрация: 19.03.2004
Сообщения: 1 329
![]() ![]() ![]() ![]() |
Цитата:
При этом обрати еще внимание на регистр. Возможно лучше будет написать что-то типа ...WHERE UPPER(SecondName) LIKE '%БУКВЫ%' Также отмечу, что при таком поиске с неизвестной первой буквой, даже MS SQL Server не использует индес по полю, а сканирует таблицу. Так что и Paradox вряд ли будет. Т.е. поиск по первым буквам должен теоретически быть эффективнее чем поиск по вхождению, если поле проиндексировано. Последний раз редактировалось ЕЖ; 22.07.2006 в 09:32. |
|
|
|