Не могу разобраться с запросами.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Не могу разобраться с запросами.

Сообщение alexskyeyes » 02.06.2011 09:53:48

Доброго времени суток, уважаемые программисты! Я новичок в Lazarus'е, точно так же, как и в Delphi.
У меня тут проблема и не могу понять что не так.
Значит так, имеются таблицы 'abonents', 'services' и 'order' и три DBGrid, соответственно. Нужно реализовать следующее: когда пользователь загружает все таблицы в DBGrid'ы (это работает правильно) и выбирает определенного человека из таблицы 'abonents', то при нажатии кнопки, должен осуществляться запрос к таблице 'order' и на форме должен заполниться DBGrid4: из 'order' в DBGrid4 выбираются поля 'rental_fee', 'internet', 'talks', а определение принадлежности строки к выбранному абоненту осуществляется по полю 'user_id'. Я попробовал сделать. Как загружаются таблицы, описывать не буду, т.к. это срабатывает верно, а вот с запросом застопорился.
Сделал следующее:
1. Разместил DBF1, DBGrid4, Order (это объект TDatasource).
2. В свойствах указал:
а) для DBGrid4: DataSource=Query
б) для Query: DataSet=Dbf1
в) для DBF1: FilePath={полный путь до файла order.dbf}, File=order.dbf
3. Написал следующую процедуру:
if Dbf1.Active then Dbf1.Close;
Код: Выделить всё
     Dbf1.TableName:='/media/DATA/OOT/Запросы/DATABASE/TABLES/order.dbf';
     if SqlQuery1.Active then SqlQuery1.Close;
     SqlQuery1.SQL.Clear;
     SqlQuery1.SQL.Add('SELECT rental_fee, internet, talks FROM order.dbf WHERE   user_id="'+DBGrid_abonents.SelectedField.AsString+'"');
    Dbf1.Open;
    SqlQuery1.Open;

4. После запуска загружаю таблицы. Нажимаю кнопку, и выходит сообщение [file not found:".../.../order.dbf"]. Хотя файл лежит на месте и путь к нему верный.

Помогите, пожалуйста...
alexskyeyes
незнакомец
 
Сообщения: 7
Зарегистрирован: 02.06.2011 08:42:26

Re: Не могу разобраться с запросами.

Сообщение Владимир » 02.06.2011 10:19:59

Доброго!
Для начала неплохо бы указать
1. ОС - впрочем, по Path похоже, что Linux.
2. Кодировку системы.
3. Версию Lazarus.
4. Компонент доступа к БД.

Для продолжения - проблема может быть в кириллице в пути к файлу таблицы - на форуме обсуждалось неоднократно.
Как-то так.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Не могу разобраться с запросами.

Сообщение alexskyeyes » 02.06.2011 12:03:48

Вообще, я сижу на Винде, но так как в ней не работало ни чего, попробовал запустить проект под Линуксом, но там то же самое. Вот и оставил путь от Линукса, остальное-то одно и то же...
Версия Лазаруса: 0.9.26
Доступ осуществляется через TDbf.

Добавлено спустя 4 минуты 43 секунды:
Вот изменил путь на латиницу и попробовал сделать простейший запросик на выборку всех записей и полей, получилось следующее:
Код: Выделить всё
if Dbf1.Active then Dbf1.Close;
Dbf1.TableName:='D:\DATABASE\order.dbf';
  if SqlQuery1.Active then SqlQuery1.Close;
  SqlQuery1.SQL.Clear;
  SqlQuery1.SQL.Add('SELECT * FROM order.dbf');
  Dbf1.Open;
  SqlQuery1.Open;


Выдается ошибка "Database not assigned". Не понимаю, почему не получается подключиться к таблице. Предыдущие же таблицы в DBGrid'ы выводятся нормально.
alexskyeyes
незнакомец
 
Сообщения: 7
Зарегистрирован: 02.06.2011 08:42:26

Re: Не могу разобраться с запросами.

Сообщение Nik » 02.06.2011 12:29:50

Версия Лазаруса: 0.9.26

Пора обновиться до 0.9.30. Ваша версия уже несколько лет как неактуальна.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Не могу разобраться с запросами.

Сообщение alexskyeyes » 02.06.2011 12:36:42

ОК, спасибо. Сейчас попробую...
alexskyeyes
незнакомец
 
Сообщения: 7
Зарегистрирован: 02.06.2011 08:42:26

Re: Не могу разобраться с запросами.

Сообщение Владимир » 02.06.2011 12:43:33

Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Не могу разобраться с запросами.

Сообщение Padre_Mortius » 02.06.2011 12:44:38

Меня вопрос один мучает... с каких пор tdbf стал уметь работать с sql-запросами?
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Не могу разобраться с запросами.

Сообщение alexskyeyes » 02.06.2011 12:51:33

А как по-другому сделать? Я нашел это в какой-то статье в интернете.
alexskyeyes
незнакомец
 
Сообщения: 7
Зарегистрирован: 02.06.2011 08:42:26

Re: Не могу разобраться с запросами.

Сообщение Padre_Mortius » 02.06.2011 13:05:50

Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Не могу разобраться с запросами.

Сообщение alexskyeyes » 02.06.2011 13:10:52

Padre_Mortius
Я понимаю все это дело вот так... TDbf подключается к таблице, но с запросами не работает, это выполняет TSqlQuery. Выводит результат в TDataSource и уже из последнего данные выводятся в TDBGrid.

Добавлено спустя 3 минуты 24 секунды:
Владимир
Padre_Mortius
Спасибо вам за статьи, но там по запросам ни чего нету :( . Честное слово, весь инет перерыл... Как-то все пытаются подключаться к серверам баз данных. А тут все элементарно и просто должно быть, но я до чего-то не додумываюсь...
alexskyeyes
незнакомец
 
Сообщения: 7
Зарегистрирован: 02.06.2011 08:42:26

Re: Не могу разобраться с запросами.

Сообщение Nik » 02.06.2011 13:55:32

2alexskyeyes
DBF - это не sql-база и таблиц там нет.

Делать нужно примерно вот что:

1. Бросаете на форму TDbf

2. Присваиваете путь к файлу, после чего включаете Dbf:

Код: Выделить всё
Dbf1.TableName:=Catalog_file; // полный путь к файлу
Dbf1.Active:=true;


3. Дальше работаете с БД примерно так:

Код: Выделить всё
Dbf1.First;

for i:=0 to Dbf1.RecordCount-1 do
  begin
   mydata:=Dbf1.FieldByName('name').AsString;
   myintdata:=Dbf1.FieldByName('id').AsInteger;
   Dbf1.Next;
  end;


Если нужно отсеивать данные - придётся в цикле вставлять обычные if'ы.

Вообще, если нужно активно работать с базой, луче сконвертировать её, к примеру в SQLite и дальше работать уже полноценными SQL-запросами.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Не могу разобраться с запросами.

Сообщение Kitayets » 02.06.2011 14:06:07

так доступ через sql и нет в TDbf.
TDbf это наследник TdataSet.
TSQLQuerry это тоже наследник TdataSet, но он сам по себе не может получать доступ к данным, ему нужен обязательно класс наследник TDBConnecton, который записывается в свойство DataBase. Если это свойство не заданно, то и выводится ошибка: "Database not assigned". Ну и как ты понимаешь записать туда наследника TDataSet не получится.

Соответственно, чтобы получить эквивалент select * from <table>, надо просто активировать TDbf, а выборки можно делать через свойство filter, или через masterSource.

в твоём случае:
tdbgrid -> tdatasource -> Tdbf
эквивалент select *:
Код: Выделить всё
if Dbf1.Active then Dbf1.Close;
Dbf1.TableName:='D:\DATABASE\order.dbf';
Datasource1.DataSet:=Dbf1;
Datasource1.Enabled:= True;
DBGrid1.DataSource:= Datasource1;
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Не могу разобраться с запросами.

Сообщение alexskyeyes » 02.06.2011 14:18:37

Nik, Kitayets
Большое вам спасибо! Сегодня попробую оба ваших способа... Вечером отпишусь. :D
alexskyeyes
незнакомец
 
Сообщения: 7
Зарегистрирован: 02.06.2011 08:42:26

Re: Не могу разобраться с запросами.

Сообщение vada » 02.06.2011 16:27:04

Выплюнь каку DBF. Перетащи все данные под SQL как-ойнибудь. Только учти, что у некоторых SQL есть зарезервированное слово ORDER. Не получится просто так работать с таблицей с таким именем.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Не могу разобраться с запросами.

Сообщение Kitayets » 02.06.2011 20:33:04

vada писал(а): Только учти, что у некоторых SQL есть зарезервированное слово ORDER. Не получится просто так работать с таблицей с таким именем.


да можно, просто надо будет в одинарные кавычки имя таблицы брать, у меня таким образом в Оракле таблица User есть.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 49

Рейтинг@Mail.ru