Вычисляемое поле для RXDBLookupCombo или можно подругому?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Вычисляемое поле для RXDBLookupCombo или можно подругому?

Сообщение ViTality » 25.04.2008 10:17:14

Имеються таблицы
STUDS
STUD_ID
SURNAME
SURNAME_NEW
NAME
PATRONYMIC
SPEC_TYPE
...

где STUD_ID это первичный ключ, а SPEC_TYPE внешний ключ связанный в первичным ключем SPEC_TYPE_ID из таблицы SPECIALIZATION_TYPES
SPEC_TYPE_ID
FACULTY_TYPE
SPEC_TYPE_VALUE

где FACULTY_TYPE это внешний ключ связанный с первичным FACULTY_TYPE_ID из FACULTY_TYPES
FACULTY_TYPE_ID
FACULTY_TYPE_VALUE

Ну это собственно говоря Студенты, факультеты и их специальности.
При добавлении нового студента есть 2 RXDBLookupCombo в которых выбираются факультеты и специальности, их датасеты для списков подстановок настроены на мастер-детайл.
Собственно нужно чтоб при выборе факультета в списке специальностей были только специальности этого факультета. Оно так и работает.
Но проблема в том что данные факультета никуда не вписываются и поэтому DataField и DataSource не заданы. А из-за этого при выборе факультета из списка он не отображаеться в самом комбо. И чтоб отображалось я задаю в качестве DataField - вычисляемое поле созданное в датасете через который работаю с записями студентов, ну и задаю соответственный датасорс.

Может есть другой вариант, как избежать этой конители?
Пытался просто зациклить комбо самого на себя, но alexs недавно добавил проверку на CircularDataLink
ViTality
постоялец
 
Сообщения: 308
Зарегистрирован: 05.10.2007 15:12:02

Сообщение alexs » 25.04.2008 10:53:12

Два варианта:
1. После выбора факультет переоткрой запрос со список специальностей уже согласно выбранного факультета.
2. Либо, как вариант, используй ло кальную фильтрацию на список специальностей.

Если запесей - специальностей не очень много (100-200) - то лучше второй вариант - меньше нагружаеш сервер, т.к. вытягиваеш данные 1 раз и потом просто локально их фильтруеш.

Но если список специальностей большой - то лучше первый вариант - чтобы не сильно создавать трафик в сети и не раздувать требований к клиентским машинам.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение ViTality » 25.04.2008 11:10:01

alexs
Список специальностей согласно выбранному факультету у меня и так отображаеться(я просто сделал связку мастер-детайл между датасетами выпадающих списков как советовал Сергей Смирнов). Не отображается название выбранного из выпадающего списка факультета в самом комбо. а чтоб отображалось я и замутил вычисляемое поле, как написано постом выше
ViTality
постоялец
 
Сообщения: 308
Зарегистрирован: 05.10.2007 15:12:02

Сообщение alexs » 25.04.2008 11:47:24

Кинь компоненту RxMemTable - в ней объяви поле FACULTY_TYPE_ID
вот тебе и поле - при начале редактировании данных внеси в это поле значение из основного запроса
а потом работай как обычно.
Когда мне нужны временные таблицы - я именно так и делаю.

А можно проще - в основном запросе просто выбери селектом и ID факультета из таблиц специальностей - и вот тебе и поле.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение Attid » 25.04.2008 11:55:13

это какойто велосипед с квадратными колесами, или я чет не понял, картинку хотябы покажи.

ощущение что RXDBLookupCombo не там используешь, или не для того функционала, но алекс может это дело поправить если раскажешь как оно былобы хорошо и это будет логично.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Attid » 25.04.2008 11:56:48

alexs писал(а):А можно проще - в основном запросе просто выбери селектом и ID факультета из таблиц специальностей - и вот тебе и поле.

ну если дело действительно в этом то как раз колекции в датасети или гриде ему и нужны. а вычисляемое поле нет.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение ViTality » 25.04.2008 12:47:13

А можно проще - в основном запросе просто выбери селектом и ID факультета из таблиц специальностей - и вот тебе и поле.

точно! чтото я ступил. почемуто решил что у текущей специальности будет меняться ключ факультета.

Факультет теперь отображаеться, спс. Но в комбо специальностей после смены факультета остаеться выбранная специальность из предыдущего выбранного факультета(в выпадающем списке все нормально).
Для этого на событие OnChange комбо факультетов пишу
Код: Выделить всё
frmMain.quStuds.FieldByName('spec_type').AsInteger:=0; // пункт "выберите специальность"
Но это событие выполняеться при создании комбо и поэтому значение специальности всегда ставиться вноль при открытии формы редартирования записи студента.
А если
1. После выбора факультет переоткрой запрос со список специальностей уже согласно выбранного факультета.

Опятьже в OnChange комбо факультетов пишу
Код: Выделить всё
quSpec.CloseOpen(false);

, то вылетает aceess violation, опятьже при открытии формы

это какойто велосипед с квадратными колесами, или я чет не понял, картинку хотябы покажи.

зачем тут картинка, два просто два комбо(RXDBLookupCombo). один для факультетов другой для специальностей
ну если дело действительно в этом то как раз колекции в датасети или гриде ему и нужны. а вычисляемое поле нет.

вычисляемое поле я просто создавал чтоб было что указать для DataField у комбо факультетов. ну это уже не важно.

Остаеться только ввести глобальную переменную, чтоб узнавать добавляем мы запись или редактируем запись и использовать установку в ноль поля специальности при изменении значения в комбо факультетов, чтоб уже заданное значение специальности не менялось?
но алекс может это дело поправить если раскажешь как оно былобы хорошо и это будет логично.

думаю если добавить событие OnSelect как у обычного комбобокса, былоб хорошо :)
ViTality
постоялец
 
Сообщения: 308
Зарегистрирован: 05.10.2007 15:12:02

Сообщение ViTality » 25.04.2008 13:35:05

не стал делать никаких глобальных переменных
сделал проще
Код: Выделить всё
procedure TfrmStudEdit.cmbFacultyChange(Sender: TObject);
begin
if self.Visible then
begin
  unit1.frmMain.quStuds.FieldByName('spec_type').AsInteger:=0;
end;
ViTality
постоялец
 
Сообщения: 308
Зарегистрирован: 05.10.2007 15:12:02

Сообщение Attid » 25.04.2008 13:36:46

ViTality писал(а):Остаеться только ввести глобальную переменную, чтоб узнавать добавляем мы запись или редактируем запись и использовать установку в ноль поля специальности при изменении значения в комбо факультетов, чтоб уже заданное значение специальности не менялось?


когда добавляешь много студентов с одного факультета, заполненый последним значением факультет может быть полезен, у меня в ОЗ все кнопки добавить заполняются преведущими значениями для ускарения процесса и всем нравится =)
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение ViTality » 25.04.2008 13:50:58

Attid
хорошая мысля :)
спасибо за помощь.
осталось теперь только поиск организовать... но это позже. Нужно уже отдавать базу чтоб с понедельника начали "забивать" студентов.
ViTality
постоялец
 
Сообщения: 308
Зарегистрирован: 05.10.2007 15:12:02


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

Рейтинг@Mail.ru