Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.02.2012, 11:44
vivazz vivazz вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 14
Репутация: 10
Вопрос Treeview из БД что не так?

Здравствуйте, пытаюсь реализовать заполнение Дерева из БД, все данные пока что заполняются из одной таблицы, для простоты заполнения и чтобы разобраться. Среда: Embarcadero RAD Studio 2010.
Таблица состоит из 3 столбцов:
COD_FACULTETA, NAME_FACULTETA, ABBR_FACULTETA

Привожу пример кода:
Код:
procedure TForm1.FormActivate(Sender: TObject);
var
s: string;
begin
  if FileExists(ExtractFileDir(ParamStr(0))+'\settings.txt') then
    begin
      AssignFile(f, ExtractFileDir(ParamStr(0))+'\settings.txt');
      Reset(f);
      Read(f, s);
      CloseFile(f);
    end
    else
      s:= ExtractFileDir(ParamStr(0))+'\bd_d.fdb';
      with dm1 do
      begin
        SQLConnection1.Connected:=false;
        SQLConnection1.Params.Clear;
        SQLConnection1.Params.Values['DataBase']:=s;
        SQLConnection1.Connected:=true;
        LoadTreeView1;
      end; // тут тупо настройка соединения с бд, если нет файла, то пытаться загрузить бд из папки
end;

procedure TForm1.LoadTreeview1;
var
i,k : integer;
begin
  flag:=false;
  i:=0;
  TreeView1.Items.Clear;
  with dm1.q do
  begin
    Active:=false;
    SQL.Clear;
    SQL.Add('SELECT * FROM FACULTET ORDER BY COD_FACULTETA');
    Active:=true;
    First;
    while not Eof do
    begin
      TreeView1.Items.Add(nil, FieldByName('NAME_FACULTETA').AsString);// тут обращение к бд работает
      with dm1 do
      begin
        q2.Active:=false;
        q2.SQl.Clear;
        q2.SQL.Add('SELECT * FROM FACULTET ORDER BY COD_FACULTETA WHERE NAME_FACULTETA='+ FieldByName(
          'NAME_FACULTETA').AsString); // вот с этим запросом беда
        q2.Active:=true;
        q2.First;
        k:=0;
        while not dm1.q2.Eof do
        begin
          TreeView1.Items.AddChildObject(TreeView1.Items.Item[i],
            dm1.q2.FieldByName('NAME_FACULTETA').AsString, Pointer(
              dm1.q2.FieldByName('COD_FACULTETA').AsInteger));    //(это для примера опять идут факультеты, т.к. ничего в бд не заполнено)
              inc(k);
        end;
        i:=i+k+1;
        Next;
      end;
         // по идеи должно получаться так:
         //Факультет Вм
               //остальные факультеты
         //Факультет Ск
               //и т.д.
    end;
  end;
  flag:=true;
end;
Выдает следующую ошибку:

Сильно не пинать, первый раз этим занимаюсь)
Ответить с цитированием
  #2  
Старый 29.02.2012, 11:58
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Неверно формируете запрос:
SELECT * FROM FACULTET ORDER BY COD_FACULTETA WHERE NAME_FACULTETA=
Сортировка не может стоять до ограничения - поменяйте местами.
Примерно так:
Код:
q2.SQL.Add('SELECT * FROM FACULTET WHERE NAME_FACULTETA='+ FieldByName('NAME_FACULTETA').AsString);
q2.SQL.Add('ORDER BY COD_FACULTETA'); 
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 29.02.2012 в 12:01.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
vivazz (29.02.2012)
  #3  
Старый 29.02.2012, 12:11
vivazz vivazz вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 14
Репутация: 10
По умолчанию

Убрал вообще сортировку, все равно такая же ошибка, вернее вместо WHERE появилась буква Ф. Копирнул ваш код - все равно ошибка. Параметры NAME_FACULTETA : VARCHAR, кол-во символов 100, кодировка win1251

Последний раз редактировалось vivazz, 29.02.2012 в 12:21.
Ответить с цитированием
  #4  
Старый 29.02.2012, 17:36
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Ну правильно, вы же строку хотие сравнить. Надо это учитывать, обрамлять ее в кавычки или передавать параметром. Вот два варианта:
Обрамление кавычками:
Код:
q2.SQL.Add('SELECT * FROM FACULTET WHERE NAME_FACULTETA='''+ FieldByName('NAME_FACULTETA').AsString)+'''';
q2.SQL.Add('ORDER BY COD_FACULTETA'); 
Запрос с параметром:
Код:
q2.SQL.Add('SELECT * FROM FACULTET WHERE NAME_FACULTETA=:Facultet';
q2.SQL.Add('ORDER BY COD_FACULTETA'); 
q2.SQL.ParamByName('Facultet').asString := FieldByName('NAME_FACULTETA').AsString;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
vivazz (01.03.2012)
  #5  
Старый 01.03.2012, 08:10
vivazz vivazz вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 14
Репутация: 10
По умолчанию

Такс...я попробовал приведенный вами код. В двух примерах сообщает об ошибках:
Код:
q2.SQL.Add('SELECT * FROM FACULTET WHERE NAME_FACULTETA='''+ FieldByName('NAME_FACULTETA').AsString)+'''';
q2.SQL.Add('ORDER BY COD_FACULTETA'); 
Тут ругается на выделенный знак + в коде


Код:
q2.SQL.Add('SELECT * FROM FACULTET WHERE NAME_FACULTETA=:Facultet';
q2.SQL.Add('ORDER BY COD_FACULTETA'); 
q2.SQL.ParamByName('Facultet').asString := FieldByName('NAME_FACULTETA').AsString;
Тут ругается на ParamByName среде неизвестно что это такое
Ответить с цитированием
  #6  
Старый 01.03.2012, 08:17
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от vivazz
Тут ругается на ParamByName среде неизвестно что это такое
q2 что такое у тебя? TADOQuery?
__________________
Google в помощь
Ответить с цитированием
Этот пользователь сказал Спасибо Ildar-tsr за это полезное сообщение:
vivazz (01.03.2012)
  #7  
Старый 01.03.2012, 09:41
vivazz vivazz вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 14
Репутация: 10
По умолчанию

q и q2 это TSQLQuery
Вот так сделал:
Код:
    while not Eof do
    begin
      TreeView1.Items.Add(nil, FieldByName('NAME_FACULTETA').AsString);// тут обращение к бд работает
      with dm1 do
      begin
        q2.Active:=false;
        q2.SQl.Clear;
        q2.SQL.Add('SELECT * FROM FACULTET WHERE NAME_FACULTETA=:Facultet');
        q2.SQL.Add('ORDER BY COD_FACULTETA');
        q2.Params.ParamByName('Facultet').asString := FieldByName('NAME_FACULTETA').AsString;
        q2.Active:=true;
        q2.First;
        k:=0;
        while not dm1.q2.Eof do   Тут беда! Не выходит из условия...Почему?
        begin
          TreeView1.Items.AddChildObject(TreeView1.Items.Item[i],
            dm1.q2.FieldByName('NAME_FACULTETA').AsString, Pointer(
              dm1.q2.FieldByName('COD_FACULTETA').AsInteger));    //(это для примера опять идут факультеты, т.к. ничего в бд не заполнено)
              inc(k);
        end;
        i:=i+k+1;
        Next;
      end;

Последний раз редактировалось vivazz, 01.03.2012 в 09:52.
Ответить с цитированием
  #8  
Старый 01.03.2012, 09:55
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от vivazz
q и q2 это TSQLQuery
Тогда поменяй
Код:
q2.SQL.ParamByName('Facultet').asString
на
Код:
q2.Params.ParamByName('Facultet').asString
После inc(k) добавь dm1.q2.Next;
А k для подсчета что ли, тогда можно просто использовать dm1.q2.RecordCount. Возвращает количество записей.
__________________
Google в помощь

Последний раз редактировалось Ildar-tsr, 01.03.2012 в 10:25.
Ответить с цитированием
Этот пользователь сказал Спасибо Ildar-tsr за это полезное сообщение:
vivazz (01.03.2012)
  #9  
Старый 01.03.2012, 09:59
vivazz vivazz вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 14
Репутация: 10
По умолчанию

Уже сделал) Ваш вопрос про q2 меня осинил что я другой компонент использую =)
Ответить с цитированием
  #10  
Старый 01.03.2012, 10:06
vivazz vivazz вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 14
Репутация: 10
По умолчанию

Цитата:
Сообщение от Ildar-tsr
После inc(k) добавь dm1.q2.Next;
А k для подсчета что ли, тогда можно просто использовать dm1.q2.RecordCout. Возвращает количество записей.
Если использую dm1.q2.Next;, то добавляется только один факультет в родителя, вот так:
Факультет ВМ
----Факультет ВМ
Факультет СК
----Факультет CМ
и т.д.
А надо, так:
Факультет ВМ
----Факультет ВМ
----Факультет СК
-----------------
и т.д.

Последний раз редактировалось vivazz, 01.03.2012 в 10:27.
Ответить с цитированием
  #11  
Старый 01.03.2012, 10:30
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Что за бред происходит? Тебе нужен набор одних и тех же факультетов в разных факультетах? Что понятнее:
Факультет ВМ
----Факультет ВМ
----Факультет СК
Факультет СК
----Факультет ВМ
----Факультет СК

Так что ли?
P.S. Я сейчас могу тормозить, заранее извиняюсь.
__________________
Google в помощь
Ответить с цитированием
  #12  
Старый 01.03.2012, 10:35
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

тут было сообщение, но оно несколько запоздало. Стер его нафик. Теперь вот такое длинное объяснение которое никого не интересует.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 01.03.2012 в 10:37.
Ответить с цитированием
  #13  
Старый 01.03.2012, 10:36
vivazz vivazz вне форума
Прохожий
 
Регистрация: 05.05.2011
Сообщения: 14
Репутация: 10
По умолчанию

Вообще я собираюсь сделать так:
Факультет ВМ
-----Группа 1
--------Студент 1
--------Студент 2
-----группа 2
--------Студент 1
Факультет СК
-----Группа 1
--------Студент 1
--------Студент 2
-----группа 2
--------Студент 1

Но пока хотя бы на таблице факультеты эту задумку реализовать )

Сделал вот так:
Код:
 TreeView1.Items.Clear;
  with dm1.q do
  begin
    Active:=false;
    SQL.Clear;
    SQL.Add('SELECT * FROM FACULTET ORDER BY COD_FACULTETA');
    Active:=true;
    First;
    while not Eof do
    begin
      TreeView1.Items.Add(nil, FieldByName('NAME_FACULTETA').AsString);// тут обращение к бд работает
      with dm1 do
      begin
        q2.Active:=false;
        q2.SQl.Clear;
        q2.SQL.Add('SELECT * FROM FACULTET WHERE NAME_FACULTETA=:Facultet');
        q2.SQL.Add('ORDER BY COD_FACULTETA');
        q2.Params.ParamByName('Facultet').asString := FieldByName('NAME_FACULTETA').AsString;
        q2.Active:=true;
        q2.First;
        k:=0;
        while (not dm1.q2.Eof) do   //бесконечность получается...
        begin
          TreeView1.Items.AddChildObject(TreeView1.Items.Item[k],
          dm1.q2.FieldByName('NAME_FACULTETA').AsString, Pointer(
          dm1.q2.FieldByName('COD_FACULTETA').AsInteger));    //(это для примера опять идут факультеты, т.к. ничего в бд не заполнено)
          inc(k);
          dm1.q2.Next;
        end;
        i:=i+k+1;
        Next;
      end;
Первый факультет заполняет нормально, получаю:
Факультет ВМ
---остальные факультеты (ВМ, СК, ЭЭ)
Факультет СК
пусто
Факультет ЭЭ
пусто

Последний раз редактировалось vivazz, 01.03.2012 в 10:41.
Ответить с цитированием
  #14  
Старый 01.03.2012, 10:43
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

А на кой вам в коде переменная к? У вас-же после заполнения дерева будет количество элементов в TreeView1.Items.Count
И кстати, а как у вас реализована свзяь между таблицами Факультет,Группа,Студент. Или все в одной таблице?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #15  
Старый 01.03.2012, 10:50
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от vivazz
Но пока хотя бы на таблице факультеты эту задумку реализовать )
Тогда на данном этапе попробуй заменить
Код:
q2.SQL.Add('SELECT * FROM FACULTET WHERE NAME_FACULTETA=:Facultet');
q2.SQL.Add('ORDER BY COD_FACULTETA');
q2.Params.ParamByName('Facultet').asString := FieldByName('NAME_FACULTETA').AsString;
на
Код:
q2.SQL.Add('SELECT * FROM FACULTET ORDER BY COD_FACULTETA');

А вообще что тебе понадобиться:
1. Таблица FACULTET (ID-уникальный (то есть ключевое поле) номер факультета, NAME - наименование факультета):
Код:
ID       NAME
1   Факультет ВМ
2   Факультет СК
3   Факультет ЮР

2. Таблица GROUPS (ID аналогично, Name - наименование группы, FAC_ID - номер факультета, к которому привязана группа):
Код:
ID      NAME          FAC_ID
1    Группа 1001        1
2    Группа 1101        2
3    Группа 1102        2
4    Группа 1201        1
5    Группа 1202        3
6    Группа 1203        1

3. Таблица STUDENTS (GROUP_ID привязывает к группе):
Код:
ID     {куча столбцов с персональными данными}     GROUP_ID
1                   ...                              1
2                   ...                              1
3                   ...                              2
4                   ...                              5
5                   ...                              6
6                   ...                              3
7                   ...                              3
8                   ...                              4
__________________
Google в помощь
Ответить с цитированием
Этот пользователь сказал Спасибо Ildar-tsr за это полезное сообщение:
vivazz (01.03.2012)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter