![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск в подчиненной таблице [D6, Paradox]
Sp1r1t © (2007-03-19 04:19:00)У меня есть 2 связанных между собой таблицы. Например Таблица Master: Group (Key,GroupName)
Slave: Students(Key,GroupNumber,LastName,FirstName).
Мне необходимо найти студента по Фамилии(LastName), находящегося в определенной группе(GroupName).
Подскажите порядок поиска нужной фамилии.
Связь таблиц Students.GroupNumber -> Group.Key
Насчет правильности связи и индексов не беспокойтесь - проверил многократно.
Мой вариант:
Group.IndexFieldNames:='GroupName';
Group.SetKey;
Group.FieldByName('GroupName').AsString:='название_группы';
Group.GotoKey;
//до этого момента все впорядке
Students.IndexFieldNames:='GroupNumber';
Students.FindKey('Петров');
//далее эти 2 оператора (выше) почемуто игнорируются
Label3.Caption:=Students.FieldByName('LastName').AsString;
//выводится первая строка таблицы Students
Почему операторы игнорируются / что я не тек сделал.
Очень буду благодарен кто напишет правильный порядок поиска записи в зависимой таблице Students.
Mike Kouzmine (2007-03-21 00:25:00) [1]MsGuns © (20.03.07 23:33) [16] Для того, чтобы делать выборки из нескольких таблиц не sqlем надо лишь пощепетильней подойти к проектированию. Для большинства решений проходит. Для особо сложных случаев используются вьюшками. Разбивают сложный запрос на несколько более простых, если уж это не проходит, то тормоза.
MsGuns (2007-03-20 23:33:00) [2]>Mike Kouzmine ©
На единственной локальнойтаблице с индексамипарадокс отработает быстрее. А что делать, если поиск в нескольких таблицах по произвольным полям, да еще в совместно используемых несколькими юзерами (в т.ч. и на запись) ?
За скорость парадокса приходится платить надежностью, достоверностью и немасштабируемостью.
Mike Kouzmine (2007-03-20 20:45:00) [3]И количество записей хотя бы тысячь сто.
Mike Kouzmine (2007-03-20 20:42:00) [4]MsGuns © (20.03.07 19:43) [13] ну ну, не буду настаивать. Я ведь только хамить умею, в другом ничего не понимаю. Но если интересно, возьми файлик тестовый создай со строковыми полями 2 или 3, сделай любые индексы, какие считаешь нужными, и заполни его случайной информацией, и поищи sqlем, и с использованием ttable с его setrange. И честно для себя реши.
MsGuns (2007-03-20 19:43:00) [5]>Mike Kouzmine © (20.03.07 18:04) [12]
>Нет. Для парадокса sql нелюбимый пасынок.
>Ttable - это брат.
Заблуждение, причем очень опасное.
Mike Kouzmine (2007-03-20 18:04:00) [6]zdm © (20.03.07 08:28) [10]
Sergey13 © (20.03.07 08:30) [11]
MsGuns © (19.03.07 22:16) [8]
Нет. Для парадокса sql нелюбимый пасынок.
Ttable - это брат.
Sergey13 (2007-03-20 08:30:00) [7]> [10] zdm © (20.03.07 08:28)
Я как раз не упустил это в своем ЗЫ, только спутал нумерацию - [1] конечно же. 8-)))))))))))))))))))))
zdm (2007-03-20 08:28:00) [8]
> Sergey13 © (20.03.07 08:23) [9]
мы упускаем [2]
> Просьба ограничиться использованием методов SetKey,FindKey,
> GotoKey.
Хотя автору видимо уже перехотелось писать (или думать) ;)
Sergey13 (2007-03-20 08:23:00) [9]> [0] Sp1r1t (19.03.07 04:19)
Я тебе один умный вещь скажу, толко ты не обижайся. (с) Мимино
Твоя задача, ИМХО, или вовсе не имеет смысла либо решается чисто автоматически через интерфейс пользователя.
Откуда ты берешь 'название_группы'? Из головы? Или из списка групп (который у тебя все-таки перед глазами судя по коду)? Если из списка, то ты уже можешь спозиционироваться (а скорее всего уже сделал это) на запись нужной группы. Раз спозиционировался, то М-Д связь уже отсеяла (должна по крайней мере или может это сделать) студентов этой группы и в списке студентов осталось 20-25 человек максимум. В этом списке проще визуально найти Петрова (которых кстати может быть и не один) чем печатать фамилию в каком нибудь эдите (ну не в коде же ты эту фамилию пропишешь, я надеюсь).
Для поиска (да и вообще) лучше все таки прислушаться к [8] MsGuns © (19.03.07 22:16)
ЗЫ: Только скорее всего это очередная лаба (судя по [2]) которую не может решить очередной студент-прогульщик и ему все советы по барабану.
MsGuns (2007-03-19 22:16:00) [10]SQL лучший друг, товарищ и брат ;)
zdm (2007-03-19 22:00:00) [11]ой, блин, AnsiLowerCase AnsiUpperCase
zdm (2007-03-19 21:59:00) [12]IMHO, Ttable-надо удалить из стандартных компонент Delphi;))
связать запросом гораздо в конечном итоги и проще и лучще и "независемей".
> Sp1r1t
а если оператор ввёл не "Иванов" а "иВаНов"?
и еще от СУБД будет зависеть, "Регист введённых значений", следовательно запросом всё-равно, там есть LIKEи он может быть как
select * from qqq where fio LIKE : LowAnsiCase(Edit1.Text) or fio LIKE : UpperAnsiCase(Edit1.Text), это sql.add , ну и со скобочками там разобраться
Mike Kouzmine (2007-03-19 17:31:00) [13]Делаешь в студентах индекс по groupnumber, lastname. делаешь текущим, определяешься с номером группы и фамилией и делаешь студентам setrange(groupnumber, lastname, groupnumber, lastname) и получаешь всех lastname, которые в группе groupnumber.
Клара (2007-03-19 09:49:00) [14]Попробуй так:
Table2.IndexFieldNames:= 'Id_GR;Fam';
Table2.FindKey([Edit2.Text, Edit3.text]);
У меня работает только тематика другая.
Клара (2007-03-19 09:00:00) [15]
> Students.IndexFieldNames:='GroupNumber';
Сортировку подчиненной таблицы надо производить через связуемое поле.
Виталий Панасенко (2007-03-19 09:00:00) [16]
>1. Students.IndexFieldNames:='GroupNumber';
>2. Students.FindKey('Петров');
1.Делаем активным индекс по № группы
2.А ищем - по фамилии.
Прочитай в справке, как работает FindKey(по активному индексу). Используй Locate
Sp1r1t (2007-03-19 04:27:00) [17]Просьба ограничиться использованием методов SetKey,FindKey,GotoKey.