![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно обрабатывать событие OnFilterRecord?
Term © (2003-10-20 16:41:00)
Сделал так:
procedure TDataModule1.UchenikiFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept:=DataModule1.Kurs.Locate("NUM_K;KURS",VarArrayOf([DataModule1.Ucheniki.FieldByname("NUM_K").AsInteger,SELECT_NODE .Text]),[]);
end;
но проблема в том что отфильтровывается только текущая запись, а все остальные нет...
как сделать так чтобы фильтровалась вся база???
посоветуйте плиз...
Johnmen (2003-10-21 11:31:00) [1]
"Многие-ко-многим" в твоем случае:
1. Таблица курсов. Есть поле IDC
2. Таблица учеников. Есть поле IDU
3. Таблица связи. Поля ID_C и ID_U, ссылающиеся на IDC и IDU соответственно.
Term (2003-10-21 11:06:00) [2]
ну как я мог понять, центральное звено в задаче, ученики а не изучаемые ими курсы, а то что получиться если человек захочет изучать два предмета, то что его данные вводить дважды???
проще наверное же в подчинённую таблицу добавить ему еще одно название предмета(или курса).... поэтому я сделал таблицу учеников мастер....
Johnmen (2003-10-21 10:55:00) [3]
>Term © (21.10.03 10:20)
>нет один ко многим, т.к. один ученик может посещать несколько курсов
А что, на одном курсе м.б. только один ученик ? :)))
Короче, определись со структурой и построй правильный, нужный тебе, запрос...
Term (2003-10-21 10:52:00) [4]
никто не знает..... или другие причины
Term (2003-10-21 10:41:00) [5]
есть у кого нить мнение...
Term (2003-10-21 10:20:00) [6]
> Johnmen © (21.10.03 10:17) [17]
нет один ко многим, т.к. один ученик может посещать несколько курсов, обычный мастер делать
Term (2003-10-21 10:18:00) [7]
примерная структура баз:
Ученики Курсы
Num_K(автоинкр)----------Num_K
FIO Kurs
...
...
предположим Иванов и Петров посещают программирование,
а Сидоров и Фёдоров курсы пользователей.
значения то Num_K для каждого ученика то разные...
если так:
> Ucheniki.Filter := "NUM_K="+ Kurs.FieldByname("NUM_K").Asstring;
то буду получать только 1-го какогото а нужно всеху кого в подчинённой таблице есть название выбранного в дереве курса
поэтому вначале делал так, получал в гриде список, вроде всё нормально всё отсеялось верно, но прочитать тут получалось только первую запись:
procedure TDataModule1.UchenikiFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept:=DataModule1.Kurs.Locate("NUM_K;KURS",VarArrayOf([DataModule1.Ucheniki.FieldByname("NUM_K").AsInteger,SELECT_NODE .Text]),[]);
end;
поэтому я и не знаю как поступить
Johnmen (2003-10-21 10:17:00) [8]
>Term ©
То есть связь "многие-ко-многим".
И как она реализована ?
Nikolay M. (2003-10-21 10:02:00) [9]
> отфильтровать УЧЕНИКОВ, а не курсы
А, т.е. наоборот? В дереве - курсы, рядом - ученики. При выборе курса фильтруем учеников.
?
Тогда с точностью до наоборот:
Ucheniki.Filter := "NUM_K="+ Kurs.FieldByname("NUM_K").Asstring;
И при чем тут еще SELECT_NODE.Text, если связь идет по целочисленному полю?
Имхо, блуждание в 3 соснах...
Term (2003-10-21 09:57:00) [10]
но тут должно быть так что один ученик ходит на несколько курсов, а наоборот то как???
Mike Kouzmine (2003-10-21 09:53:00) [11]
Надо наоборот. Курсы мастер - ученики деталь.
Term (2003-10-21 09:49:00) [12]
ктонить.... хелп
Term (2003-10-21 09:15:00) [13]
извиняюсь но может просто не могу объяснить....
ученики мастер она связанна, с курсами полем NUM_K(цифровое поле).
т.е. нужно отфильтровать УЧЕНИКОВ, а не курсы.
Если у учеников есть в подчинённой таблице курс который я выбрал в дереве, иначе я бы не задавал этот вопрос, т.к. отфильтровать нужно одну таблицу а данные находятся в другой, поэтому я стал мучиться с OnFilterRecord, и так и не решил этот вопрос...
Nikolay M. (2003-10-20 19:57:00) [14]
В дереве - ученики? Фильтруются - курсы? Некое соответствие кода и объяснения ситуации.
Если я все правильно понял, то что мешает сделать тупо фильтр по курсам
kurs.Filter := "(NUM_K=" + #39 + Ucheniki.FieldByname("NUM_K").AsInteger + #39 + ") AND (KURS=" + #39 + SELECT_NODE.Text + #39 + ")";
Term (2003-10-20 19:28:00) [15]
в общем на форме у меня TTreeView ветви значения из справочника.
Есть таблица Ученики и зависимая изучаемые ими курсы, вот в неё и заносятся значения из справочника.
Мне нужно отфильтровать тех Учеников у которых в подчинённой таблице есть значение, то которое выбрано в TTreeView.
поэтому
> with Ucheniki do
> begin
> Filtered := False;
> Filter := "num_k="+Kurs.FieldByName("num_k").AsString;
> Filtered := True;
> end
не подходит оно мне выдаст токо 1 запись, а надо все у кого есть соотв. курсы
Term (2003-10-20 19:18:00) [16]
так это и есть мастер-детайл токо, выбрать отфильтровать нужно мастер на основании того если в зависимой таблице запись удовлетворяющая определённому условию
Sandman25 (2003-10-20 18:03:00) [17]
Например, так:
with Ucheniki do
begin
Filtered := False;
Filter := "num_k="+Kurs.FieldByName("num_k").AsString;
Filtered := True;
end;
Но лучше сделать обычный master-detail.
Term (2003-10-20 17:54:00) [18]
а как тут тогда поступать???
мне нужно отфильтровать значения мастер таблицы по значениям зависимой, поле связи NUM_K
Nikolay M. (2003-10-20 17:46:00) [19]
> procedure TDataModule1. UchenikiFilterRecord(DataSet: TDataSet;
> var Accept: Boolean);
> begin
> Accept:=DataModule1.Kurs.Locate("NUM_K;KURS",VarArrayOf([DataModule1. Ucheniki.FieldByname("NUM_K").AsInteger,SELE CT_NODE
> .Text]),[]);
> end;
Дык а что ты хочешь? У тебя в фильтре используется значение фильтруемого датасета. Если я все правильно понял...
Term (2003-10-20 17:44:00) [20]
и вот еще такой вопрос я посмотрел скоко записей возвращает таблица.... оказалось что во всех случаях 1 ЗАПИСЬ, хотя
в гриде выводятся все записи которые нужны... а прочитать могу только первую.... почему...????