Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Подскажите где ошибка в запросе


Автор: panzer 9.1.2007, 15:07
Подскажите где ошибка в запросе? Нужно организовать поиск в базе по фамилии имени и отчеству, 
их берем из полей для ввода при активации запроса выдает ошибку!

Вот код 

Код

procedure TForm4.Button1Click(Sender: TObject);  {Нажимаем кнопку поиск}
var
 form1 : TForm1;
begin
Form1.Query1.Active:=false;
Form1.Query1.Params[0].AsString:=Form4.Edit4.Text;
Form1.Query1.Params[1].AsString:=Form4.Edit5.Text;
Form1.Query1.Params[2].AsString:=Form4.Edit6.Text;
Form1.Query1.Active:=true;
  with form1.Query1 do begin
  Close;       // закрыть файл-результат выполнения предыдущего запроса
  SQL.Clear;   // удалить текст предыдущего запроса
  // записываем новый запрос в свойство SQL
  SQL.Add('SELECT fam, imj, otch');
  SQL.Add('FROM ":fedroz.dbf');
  SQL.Add('WHERE fam=:param[0]');
  SQL.Add('WHERE imj=:param[1]');
  SQL.Add('WHERE otch=:param[2]');
  SQL.Add('ORDER BY Fam, imj,otch');
  Open;         // активизируем выполнение запроса
  end;
  if form1.Query1.RecordCount <> 0 then
              form1.DataSource1.DataSet:=form1.Query1 // отобразить рез-т выполнения  запроса
            else
   begin
              ShowMessage('В БД нет записей, удовлетворяющих критерию запроса.');

            end;
      end;
end.



а ошибка access violation at address 004B6A19 in module prodject1.exe. Read of address 40868BFF 


Автор: Rodman 9.1.2007, 15:11
Код

procedure TForm4.Button1Click(Sender: TObject);  {Нажимаем кнопку поиск}
var
 form1 : TForm1;
begin
Form1.Query1.Active:=false;
Form1.Query1.Params[0].AsString:=Form4.Edit4.Text;
Form1.Query1.Params[1].AsString:=Form4.Edit5.Text;
Form1.Query1.Params[2].AsString:=Form4.Edit6.Text;
Form1.Query1.Active:=true;
  with form1.Query1 do begin
  Close;       // закрыть файл-результат выполнения предыдущего запроса
  SQL.Clear;   // удалить текст предыдущего запроса
  // записываем новый запрос в свойство SQL
  SQL.Add('SELECT fam, imj, otch');
  SQL.Add('FROM ":fedroz.dbf');//вот тут я не уверен, что можно так передавать
  SQL.Add('WHERE fam='+Form4.Edit4.Text);// они же не существуют, надо так...
  SQL.Add('WHERE imj='Form4.Edit4.Text);
  SQL.Add('WHERE otch='Form4.Edit4.Text);
  SQL.Add('ORDER BY Fam, imj,otch');
  Open;         // активизируем выполнение запроса
  end;
  if form1.Query1.RecordCount <> 0 then
              form1.DataSource1.DataSet:=form1.Query1 // отобразить рез-т выполнения  запроса
            else
   begin
              ShowMessage('В БД нет записей, удовлетворяющих критерию запроса.');
            end;
      end;
end.


Добавлено @ 15:12 
смотри коментарии

Автор: Vas 9.1.2007, 16:24
Скорее всего здесь
Код

SQL.Add('FROM ":fedroz.dbf');


Вот еще вариант, зачем открывать и закрывать сразу запрос. И еще параметры в запрос обычно передаются после того как написали текст запроса  smile 
Код

procedure TForm4.Button1Click(Sender: TObject);  {Нажимаем кнопку поиск}
var
 form1 : TForm1;
begin
with form1.Query1 do 
  begin
  Close;       // закрыть файл-результат выполнения предыдущего запроса
  SQL.Clear;   // удалить текст предыдущего запроса
  // записываем новый запрос в свойство SQL
  SQL.Add('SELECT fam, imj, otch');
  SQL.Add('FROM fedroz.dbf');
  SQL.Add('WHERE fam=:fam');
  SQL.Add('WHERE imj=:imj');
  SQL.Add('WHERE otch=:otch');
  SQL.Add('ORDER BY Fam, imj,otch');
  //передаем описанным в запросе параметрам значения
  Params.ParamByName('fam').AsString:=Form4.Edit4.Text;
  Params.ParamByName('imj').AsString:=Form4.Edit5.Text;
  Params.ParamByName('otch').AsString:=Form4.Edit6.Text;
  Open;         // активизируем выполнение запроса
  end;
  if form1.Query1.RecordCount <> 0 then
     form1.DataSource1.DataSet:=form1.Query1 // отобразить рез-т выполнения  запроса
  else
     ShowMessage('В БД нет записей, удовлетворяющих критерию запроса.');
end.

Автор: Dremlin 9.1.2007, 16:33
Цитата(Vas @  9.1.2007,  15:24 Найти цитируемый пост)
И еще параметры в запрос обычно передаются после того как написали текст запроса

 smile 

+ есть мнение, что второй и третий WHERE в запросе следует заменить на AND и проставить пробелы (не акцес вайолэйшн, конечно, но все равно неприятно) smile 

Автор: panzer 9.1.2007, 17:15
Поробывал все варианты, но к сожалению айцесс виолейшин повторяется

кстати а почему

"Скорее всего здесь"

код Pascal/Delphi 
 
Код

1: SQL.Add('FROM ":fedroz.dbf');" 



Автор: Rodman 9.1.2007, 17:33
А ты каким образом подключаешься или просто работаешь как с фалом??? я имею ввиду fedroz.dbf...

Автор: panzer 9.1.2007, 18:12
это имя таблицы которая лежит на форме

Автор: Rodman 9.1.2007, 19:58
ты можешь чем нить проверить следующие запросы
Код

SELECT * FROM fedroz.dbf;


Код

SELECT * FROM fedroz;



Автор: Vas 9.1.2007, 20:49
Цитата(Dremlin @  9.1.2007,  16:33 Найти цитируемый пост)
+ есть мнение, что второй и третий WHERE в запросе следует заменить на AND и проставить пробелы (не акцес вайолэйшн, конечно, но все равно неприятно)

Да уж недосмотрел, сорри  smile

А по F7 на какой строчке то Access violation?

Автор: panzer 10.1.2007, 13:00
по F7 на SQL Clear ошибка!

я уже начинаю грешным делом думать, что может быть потому глюк, что у меня базы в fox'е 2.6 написаны?

хотя поробывал в sql мониторе сделать запрос руками на какую-то отдельно взятую фамилию "ИВАНОВ" например, выбрал гад все что надо выбрал!

TO RODMAN: я уже просто отвлеченно писал form1.Table1 - без свяких других ориентиров!

 smile  smile  smile 

кстати может подскажите как старые мои базы в виндовую кодировку перетащить??? никогда этим не занимался!

Автор: Mephisto 10.1.2007, 13:11
Цитата(panzer @  9.1.2007,  19:12 Найти цитируемый пост)
это имя таблицы которая лежит на форме 

Названия таблиц нельзя передавать параметрм.

Автор: panzer 10.1.2007, 13:18
как это?
у меня есть в папке файл fedroz.dbf на форма лежит table1 с указанием что это таблица принадлежит fedroz.dbf. А если не так то как тогда?
подскажите плиз! smile 

Автор: SergeBS 10.1.2007, 14:53
№1:
Код

procedure TForm4.Button1Click(Sender: TObject);  {Нажимаем кнопку поиск}
var
 form1 : TForm1;
begin
Form1.Query1.Active:=false;
Form1.Query1.Params[0].AsString:=Form4.Edit4.Text;
Form1.Query1.Params[1].AsString:=Form4.Edit5.Text;
Form1.Query1.Params[2].AsString:=Form4.Edit6.Text;
Form1.Query1.Active:=true;

Последняя строка не нужна.

№2:
Код

  SQL.Add('FROM ":fedroz.dbf');

Что здесь делают ":  ? Они должны быть убраны. 

Mephisto, 
Цитата
Названия таблиц нельзя передавать параметрм. 

Можно. Но не так как написано. Тут нет параметра, а есть ошибка в строке запроса, т.к. Query1 (или кто там еще) получит строки
SELECT fam, imj, otch 
FROM ":fedrozdbf
WHERE ...
и естественно на ": сильно обидится smile.

Автор: panzer 11.1.2007, 09:35
испробовал все, все равно access violetion  smile 

Автор: DimW 11.1.2007, 13:31
так попробуй:

Код

  Close;     
  SQL.Clear;
  SQL.Add('SELECT fam, imj, otch');
  SQL.Add('FROM fedroz');
  SQL.Add('WHERE fam= '+ Form4.Edit4.Text);
  SQL.Add('  AND imj= '+ Form4.Edit5.Text);
  SQL.Add('  AND otch= '+ Form4.Edit6.Text);
  SQL.Add('ORDER BY fam, imj,otch');
  Open;


если не отработает то строку "SQL.Add('FROM fedroz');" замени на SQL.Add('FROM fedroz.dbf');
если и это не прокатит то напиши:

Код

  Close;     
  SQL.Clear;
  SQL.Add('SELECT *');
  SQL.Add('FROM fedroz');
  Open;


если и это не заработает то фиг знает что ты и как подключил...

Автор: SergeBS 11.1.2007, 18:21
panzer, 
Ну блин, долго вы будете х.. маяться? Создал строку - посмотри в showmessage. Еще ошибка:
SQL.Add('WHERE fam= '+ Form4.Edit4.Text);
Где кавычки вокруг текстового? И обрезание пробелов?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)