Наши преимущества

Не пойму..

B.Boy

Турист
Credits
0
Года 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;
Так вот.. не работает это :(( Вылетают сообщения, что поля с такими именами не существуют.. как быть?..
 
И еще долго не поймеш

Еще долго не поймеш если будеш использовать метод 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; без разницы.
 
Спасибо! Сейчас попробую. Я при INSERT'е использовал ExecSQL и думал, что для других (SELECT, UPDATE) тоже самое будет. ;)
 
А как сделать, чтобы можно было выбрать несколько записей вот жтим запросом:
Код:
  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? Как переходить потом к сдежующе записи?
 
FindFirst; //Спозицианируем на первую запись
While Not EOF Do
begin
....
Next; //Вот то что тебе нехватало
end;

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