![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
две связанные таблицы и editbox [D6, MSSQL]
ronwilson © (2005-02-02 12:28:00)Привет!
Задача такая: есть две таблицы - главная и подчиненная, связанная по полю. подчиненная связана по masterfield и подключена к mastersource главной таблицы. естественно, при выборе записи в главной, в подчиненной показываются записи, относящиеся к записи. проблема вот в чем: на форме есть еще editbox со updown компонентом, а в подчиненной таблице есть поле god, хранящее год. вопрос заключается в следующем: т.к. подчиненной таблице Filter сделать нельзя, насколько я понял, то надо чтобы в подчиненной таблице отображались лишь записи, относящиеся к записи из главной таблицы И с полем god из editbox. Так же нужно чтобы при добавлении новой записи в подчиненную таблицу в поле god автоматически заносилось текущее значение editbox. Все это добро завернуто на компонентах ADO.
Подскажите, плиз, как сделать, жел. поподробнее, а то я вообще-то не на delphi пишу в основном и не знаю как такое сделать :(
Sergey13 (2005-02-02 16:02:00) [1]2[15] ronwilson (02.02.05 15:55)
Читай из первой попавшейся. 8-)
ronwilson (2005-02-02 15:55:00) [2]завязал на запросе (AdoQuery) - а как в запросе узнать активную запись из master таблицы?
msguns (2005-02-02 15:22:00) [3]Не рекомендую пользоваться фильтром, т.к. многие фичи начинают "врать". Например, RecNo и RecordCount, Locate в некоторых случаях
ronwilson (2005-02-02 15:19:00) [4]сейчас поточнее скажу: onfilter вызывается только если если прямо менять Filtered на True, а почему он не вызывается в включенном состоянии при смене активной записи в мастер таблице? по идее, ведь подчиненная таблица меняется и должен вызваться onfilter :(
msguns (2005-02-02 15:19:00) [5]
procedure TfrmDB.adoMasterAfterScroll(DataSet: TDataSet);
begin
with adoqDetail do
begin
Tag := 0;
if RecorCount>0 then Tag := Fields[0].AsInteger; // ID тек.
try
Close;
ParamByName('IDM').AsSinteger := DataSet.Fields[0].AsInteger
ParamByName .. // Доп. условия выборки (год, например)
Open;
if Tag>0 then Locate('ID',Tag,[]) // Активировать текущую
except
ShowMessage('Ошибка переоткрытия детала');
exit;
end;
end;
// Вызов процедуры, реагирующей на смену записи в мастере
end;
stone (2005-02-02 15:10:00) [6]
> кстати, а как нормально сказать adotable чтобы она вызвала
> OnFilter? - а то я выключаю и включаю Filtered
А ты его не выключай
ronwilson (2005-02-02 15:06:00) [7]я по-другому сделал. все отлично работает. сделал через OnFilterRecord (фильтрую) и BeforePost (вставляю дату). при изменении editbox фильтрую (кстати, а как нормально сказать adotable чтобы она вызвала OnFilter? - а то я выключаю и включаю Filtered), а как сделать так, чтобы OnFilterrecord вызывался при изменении активной записи в мастер таблице?
Sergey13 (2005-02-02 14:52:00) [8]2[8] ronwilson (02.02.05 14:37)
Переведи.
Или, если я понял, то после моего кода (или своего аналогичного) и пиши чего хочешь.
ronwilson (2005-02-02 14:37:00) [9]пока ждал уже изобрел как все делать :) один вопрос остался: как получить управление в какой-нить процедуре при смене в мастер таблице рекорда так, чтобы в подчиненной уже был измененные данные в соответствии с мастером?
Sergey13 (2005-02-02 13:30:00) [10]На детальную таблицу строится запрос
Select * from det_table where master_id=:masterid and God=:god
В АфткрСкрол главной таблицы и на изменение твоего едитбокса ставишь
(псевдо код - копирование не пройдет 8-)
Query1.ParamByName('masterid').asInteger:=MasterId.AsInteger;
Query1.ParamByName('god').asInteger:=editbox.Value;
Query1.Close;
Query1.Open;
stone (2005-02-02 13:29:00) [11]
> т.к. подчиненной таблице Filter сделать нельзя
Можно. Для этого есть событие OnFilterRecord.
ronwilson (2005-02-02 13:23:00) [12]а поподробнее можно? а то не сильно понятно суть метода :(
ronwilson (2005-02-02 13:23:00) [13]а поподробнее можно? а то не сильно понятно суть метода :(
Sergey13 (2005-02-02 12:56:00) [14]Я его тебе описал уже в общих чертах. И он более человеческий чем тандартная связка. ИМХО конечно.
ronwilson (2005-02-02 12:53:00) [15]а есть более человеческий способ?
Sergey13 (2005-02-02 12:36:00) [16]Отказаться от стандартной связки мастер-детайл и нарисовать ее вручную с инициализацией по АфтерСкрол главной таблицы.