![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте, пытаюсь реализовать заполнение Дерева из БД, все данные пока что заполняются из одной таблицы, для простоты заполнения и чтобы разобраться. Среда: 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
|
||||
|
||||
|
Неверно формируете запрос:
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
|
|||
|
|||
|
Убрал вообще сортировку, все равно такая же ошибка, вернее вместо WHERE появилась буква Ф. Копирнул ваш код - все равно ошибка. Параметры NAME_FACULTETA : VARCHAR, кол-во символов 100, кодировка win1251
Последний раз редактировалось vivazz, 29.02.2012 в 12:21. |
|
#4
|
||||
|
||||
|
Ну правильно, вы же строку хотие сравнить. Надо это учитывать, обрамлять ее в кавычки или передавать параметром. Вот два варианта:
Обрамление кавычками: Код:
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
|
|||
|
|||
|
Такс...я попробовал приведенный вами код. В двух примерах сообщает об ошибках:
Код:
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;![]() |
|
#6
|
||||
|
||||
|
Цитата:
|
| Этот пользователь сказал Спасибо Ildar-tsr за это полезное сообщение: | ||
vivazz (01.03.2012)
| ||
|
#7
|
|||
|
|||
|
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
|
||||
|
||||
|
Цитата:
Код:
q2.SQL.ParamByName('Facultet').asStringКод:
q2.Params.ParamByName('Facultet').asStringА k для подсчета что ли, тогда можно просто использовать dm1.q2.RecordCount. Возвращает количество записей. Последний раз редактировалось Ildar-tsr, 01.03.2012 в 10:25. |
| Этот пользователь сказал Спасибо Ildar-tsr за это полезное сообщение: | ||
vivazz (01.03.2012)
| ||
|
#9
|
|||
|
|||
|
Уже сделал) Ваш вопрос про q2 меня осинил что я другой компонент использую =)
|
|
#10
|
|||
|
|||
|
Цитата:
Факультет ВМ ----Факультет ВМ Факультет СК ----Факультет CМ и т.д. А надо, так: Факультет ВМ ----Факультет ВМ ----Факультет СК ----------------- и т.д. Последний раз редактировалось vivazz, 01.03.2012 в 10:27. |
|
#11
|
||||
|
||||
|
Что за бред происходит? Тебе нужен набор одних и тех же факультетов в разных факультетах? Что понятнее:
Факультет ВМ ----Факультет ВМ ----Факультет СК Факультет СК ----Факультет ВМ ----Факультет СК Так что ли? P.S. Я сейчас могу тормозить, заранее извиняюсь. |
|
#12
|
||||
|
||||
|
тут было сообщение, но оно несколько запоздало. Стер его нафик. Теперь вот такое длинное объяснение которое никого не интересует.
Последний раз редактировалось Страдалецъ, 01.03.2012 в 10:37. |
|
#13
|
|||
|
|||
|
Вообще я собираюсь сделать так:
Факультет ВМ -----Группа 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
|
||||
|
||||
|
А на кой вам в коде переменная к? У вас-же после заполнения дерева будет количество элементов в TreeView1.Items.Count
И кстати, а как у вас реализована свзяь между таблицами Факультет,Группа,Студент. Или все в одной таблице? |
|
#15
|
||||
|
||||
|
Цитата:
Код:
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 |
| Этот пользователь сказал Спасибо Ildar-tsr за это полезное сообщение: | ||
vivazz (01.03.2012)
| ||