imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 11.07.2006, 05:33     # 1
SteFF
Junior Member
 
Аватар для SteFF
 
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68

SteFF Путь к славе только начался
Question Подскажите.. Paradox

Года 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;
Так вот.. не работает это ( Вылетают сообщения, что поля с такими именами не существуют.. как быть?..
SteFF вне форума  
Старый 13.07.2006, 15:05     # 2
TRiPLE
Junior Member
 
Аватар для TRiPLE
 
Регистрация: 10.10.2003
Адрес: Москва
Сообщения: 136

TRiPLE Реально крут(а)TRiPLE Реально крут(а)TRiPLE Реально крут(а)TRiPLE Реально крут(а)
Я в таких случаях делаю следующее:
1. обязательно вывожу текст sql запроса перед его передачей в БД
2. проверяю его в какой-нить тулзе, чтобы увидеть ошибки выдаваемые самой БД, если она такое умеет (mssql, например, можно прямо в enterprise manager попытаться выполнить запрос)
Кстати, чем проверять на пустоту каждое окошко ввода, не лучше ли ставить флаги по событию редактирования объекта и потом по установленным флагам собирать запрос?
__________________
"Самое великое достижение Америки - каждый должен голосовать".
- Джордж Буш Мл.(Остин, 08.12.00).
TRiPLE вне форума  
Старый 14.07.2006, 08:34     # 3
SteFF
Junior Member
 
Аватар для SteFF
 
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68

SteFF Путь к славе только начался
1. Решение проблемы нашел ) Надо было делать Open, а не ExecSQL.
2. Это тоже вариант. Но мне сейчас главное сделать чтобы все требуемые операции с БД проходили нормально. Все остальное возможно переделаю Все равно спасибо!

И еще вопросы!
1.Как узнать сколько всего записей в таблице?
2.Гдето кажется читал, что, для того чтобы ускорить поиск поиск в БД надо сделать поля индексируемыми. Если не так, то как ускорить поиск? Можно ли все поля проиндексировать?
3.Какие еще есть команды SQL.. ну типа First - встать на первую запись, Next - следуюущая. Как узнать сколько всего записей в таблице? МОжно ли узнать сколько в таблице записей подходящих "по маске"?
Где можно обо всем жтом поподробнее почитать? На русском желательно
Спасибо
SteFF вне форума  
Старый 14.07.2006, 09:45     # 4
ЕЖ
::VIP::
 
Регистрация: 19.03.2004
Сообщения: 1 329

ЕЖ Бог с наворотамиЕЖ Бог с наворотами
ЕЖ Бог с наворотамиЕЖ Бог с наворотами
SteFF
Сейчас книжек по программированию БД в Delphi предостаточно, выкладывались и у нас на форуме. Методы First/Next - это не к SQL, а к классу TDataSet (родитель для TTable и TQuery). Есть свойство RecordCount для определения количества записей.

Индексировать нужно только те поля, по которым ты чаще всего делаешь поиск, т.е. пишешь в SELECT условие типа WHERE ID = ... Вот тогда ID стоит проиндексировать. Все индексировать не имеет смысла. Индексы дают выигрыш при выборках данных. Но есть и обратная сторона - при добавлении/изменении записей индексы вынуждены перестраиваться. Так что оценивай как часто будут у тебя данные меняться, или больше будут только выбираться.
ЕЖ вне форума  
Старый 15.07.2006, 23:07     # 5
kot_
Junior Member
 
Аватар для kot_
 
Регистрация: 19.11.2004
Адрес: Dnepropetrovsk
Пол: Male
Сообщения: 67

kot_ Путь к славе только начался
Цитата:
Сообщение от ЕЖ
SteFF
Сейчас книжек по программированию БД в Delphi предостаточно, выкладывались и у нас на форуме. Методы First/Next - это не к SQL, а к классу TDataSet (родитель для TTable и TQuery). Есть свойство RecordCount для определения количества записей.

Индексировать нужно только те поля, по которым ты чаще всего делаешь поиск, т.е. пишешь в SELECT условие типа WHERE ID = ... Вот тогда ID стоит проиндексировать. Все индексировать не имеет смысла. Индексы дают выигрыш при выборках данных. Но есть и обратная сторона - при добавлении/изменении записей индексы вынуждены перестраиваться. Так что оценивай как часто будут у тебя данные меняться, или больше будут только выбираться.
К вышесказанному добавлю - индекс имеет смысл устанавливать в том случае, если данные в поле изменяются в широком диапазоне. Т.е. если поле может содержать всего два значения, например "М" и "Ж" - индекс не нужен, даже если по этим полям выполняются сравнения.
__________________
kot_ вне форума  
Старый 19.07.2006, 09:06     # 6
SteFF
Junior Member
 
Аватар для SteFF
 
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68

SteFF Путь к славе только начался
У меня будет много полей.. имена, фамилии, адреса, телефоны, е-mail и еще много полей, в которых будут небольшие числа. Поиск будет происходить по: имя, фамилия, телефоны(3), емейл, адрес. Значит лучше будет сделать эти поля индексируемыми?
Слышал что в парадоксе индексы слетают.. чем это грозит? Полной потерей данных? Или их можно бдует восстановить?
SteFF вне форума  
Старый 19.07.2006, 09:49     # 7
Borland
СуперМод
IMHO Консультант 2005-2009
 
Аватар для Borland
 
Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отсек
Пол: Male
Сообщения: 14 498

Borland - Гад и сволочь
Цитата:
SteFF:
Значит лучше будет сделать эти поля индексируемыми?
Для нормальной работы поиска их просто необходимо проиндексировать.
Цитата:
SteFF:
Слышал что в парадоксе индексы слетают.. чем это грозит? Полной потерей данных?
Случается что и слетают. Но данным при этом ничего не грозит.
На случай "слёта" индексов обычно предусматривается процедура переиндексации.
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила!
Распространенье наше по планете
Особенно заметно вдалеке:
В общественном парижском туалете
Есть надписи на русском языке

В. Высоцкий

Borland вне форума  
Старый 21.07.2006, 12:09     # 8
_Lynx_
Junior Member
 
Регистрация: 11.10.2005
Сообщения: 63

_Lynx_ Путь к славе только начался
Индекс имеет смысл делать если после фильтрации по нему останется не более 5-10%. И не стоит делать более 5-7 индексов на таблицу. Так же разумно бывает делать составные индексы.
_Lynx_ вне форума  
Старый 22.07.2006, 04:59     # 9
SteFF
Junior Member
 
Аватар для SteFF
 
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68

SteFF Путь к славе только начался
Цитата:
_Lynx_:
Так же разумно бывает делать составные индексы.
А это как?))
SteFF вне форума  
Старый 22.07.2006, 06:57     # 10
SteFF
Junior Member
 
Аватар для SteFF
 
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68

SteFF Путь к славе только начался
Как искать подстроку в строке? Например: мне надо найти фамилию человека в БД.. а я помнб только пару букв его фамилии? Как можно это реализовать? И возможно ли?
SteFF вне форума  
Старый 22.07.2006, 09:25     # 11
ЕЖ
::VIP::
 
Регистрация: 19.03.2004
Сообщения: 1 329

ЕЖ Бог с наворотамиЕЖ Бог с наворотами
ЕЖ Бог с наворотамиЕЖ Бог с наворотами
Цитата:
Сообщение от SteFF
Как искать подстроку в строке? Например: мне надо найти фамилию человека в БД.. а я помнб только пару букв его фамилии? Как можно это реализовать? И возможно ли?
...WHERE SecondName LIKE '%буквы%'

При этом обрати еще внимание на регистр. Возможно лучше будет написать что-то типа ...WHERE UPPER(SecondName) LIKE '%БУКВЫ%'

Также отмечу, что при таком поиске с неизвестной первой буквой, даже MS SQL Server не использует индес по полю, а сканирует таблицу. Так что и Paradox вряд ли будет. Т.е. поиск по первым буквам должен теоретически быть эффективнее чем поиск по вхождению, если поле проиндексировано.

Последний раз редактировалось ЕЖ; 22.07.2006 в 09:32.
ЕЖ вне форума  
Старый 22.07.2006, 18:51     # 12
SteFF
Junior Member
 
Аватар для SteFF
 
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68

SteFF Путь к славе только начался
А как тогда мне в запросе указать, что '%буквы%' это как раз первые буквы слова (строки в БД), а не просто подстрока?
SteFF вне форума  
Старый 23.07.2006, 22:25     # 13
ЕЖ
::VIP::
 
Регистрация: 19.03.2004
Сообщения: 1 329

ЕЖ Бог с наворотамиЕЖ Бог с наворотами
ЕЖ Бог с наворотамиЕЖ Бог с наворотами
Для поиска по первым буквам пиши 'буквы%'. Тут % - это просто маска, означает произвольное количество каких-либо символов.
ЕЖ вне форума  
Старый 24.07.2006, 09:41     # 14
SteFF
Junior Member
 
Аватар для SteFF
 
Регистрация: 27.01.2005
Адрес: Пенза-City
Сообщения: 68

SteFF Путь к славе только начался
А. все. Теперь понял.
Спасибо!
SteFF вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 18:01.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.