Не пойму..

B.Boy

Member
Joined
Jul 20, 2005
Messages
65
Reaction score
0
Age
37
Location
Пенза-City
Website
www.politex.pnz.ru
Года 2 назад делал курсач по программированию с базами данных.. Сейчас понял, что все совершенно забыл!.. Так тчо не бейте сильно...
Так вот! У меня следующая проблема.
Имеется база данных клиентов, в которой ведется поиск по введенным значениям. По каким именно полям - узнается после проверки, какие Edit'ы заполнены. Про кривость кода: пока сделал, чтобы хоть работало. Потом буду "шлефовать". Критику (с конкретными предложениями) принимаю!
Code:
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;
Потом делается запрос в этой же процедуре (сама эта процедура вызывается при нажатии кнопочки..):
Code:
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;
Так вот.. не работает это :(( Вылетают сообщения, что поля с такими именами не существуют.. как быть?..
 

SsEH

Member
Joined
Feb 24, 2006
Messages
26
Reaction score
7
Age
44
Location
Кривой Рог
И еще долго не поймеш

Еще долго не поймеш если будеш использовать метод ExecSQL который не возвращает результат.
Выдержка из хелпа.
Call ExecSQL to execute the SQL statement currently assigned to the SQL property. Use ExecSQL to execute queries that do not return a cursor to data (such as INSERT, UPDATE, DELETE, and CREATE TABLE).
Note:
For SELECT statements, call Open instead of ExecSQL.

Лучше будет если ты используеш либо Active:= True; или Open; без разницы.
 

B.Boy

Member
Joined
Jul 20, 2005
Messages
65
Reaction score
0
Age
37
Location
Пенза-City
Website
www.politex.pnz.ru
Спасибо! Сейчас попробую. Я при INSERT'е использовал ExecSQL и думал, что для других (SELECT, UPDATE) тоже самое будет. ;)
 

B.Boy

Member
Joined
Jul 20, 2005
Messages
65
Reaction score
0
Age
37
Location
Пенза-City
Website
www.politex.pnz.ru
А как сделать, чтобы можно было выбрать несколько записей вот жтим запросом:
Code:
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM client.db WHERE '+cl_srch_qry); //search in DB
    Open;
    c2.idn:=FieldByName('Clid').AsInteger;
    c2.name:=FieldByName('Name').AsString;
    c2.lname:=FieldByName('Lname').AsString;
    c2.hphone:=FieldByName('hphone').AsString;
    c2.ophone:=FieldByName('ophone').AsString;
    c2.cphone:=FieldByName('cphone').AsString;
    c2.email:=FieldByName('email').AsString;
    ...
    c2.building:=FieldByName('building').AsInteger;
    c2.comment:=FieldByName('comment').AsString;
    c2.sendemail:=FieldByName('sendemail').AsBoolean;
    c2.deleted:=FieldByName('deleted').AsBoolean;
  end;
Что вроде While not EOF? Как переходить потом к сдежующе записи?
 

SsEH

Member
Joined
Feb 24, 2006
Messages
26
Reaction score
7
Age
44
Location
Кривой Рог
FindFirst; //Спозицианируем на первую запись
While Not EOF Do
begin
....
Next; //Вот то что тебе нехватало
end;

Да и еще напоследок задумайся а возвратит ли тебе твой Query хоть один records.
- IsEmpty //Indicates whether the dataset contains no records.
Если не провериш в дальнейшем можеш получить Exception
 
Top