Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск в подчиненной таблице [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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо