Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];

Вниз

DBLookupComboBox и его потомки   Найти похожие ветки 

 
Desdechado   (2003-07-30 11:17) [0]

Пишу компонент-наследник, ибо раздражает такое поведение, когда при отсутствии ключа в справочнике он показывает пустое поле.
Вопрос: как узнать (событие или еще что-то), что нужный ключ из просматриваемой таблицы DataSource отсутствует в справочнике ListSource?
Можно ли сделать к этому событию внешний обработчик, чтобы при необходимости перечитать справочник?


 
Соловьев   (2003-07-30 11:21) [1]


> когда при отсутствии ключа в справочнике он показывает пустое
> поле.

что же это за справочник? ты id ручками пишешь и считаешь?


 
Desdechado   (2003-07-30 11:34) [2]

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


 
ЮЮ   (2003-07-30 11:56) [3]

>Вопрос: как узнать (событие или еще что-то), что нужный ключ из просматриваемой таблицы DataSource отсутствует в справочнике ListSource?

Ты же пишешь наследника, значит смотри код методов родителя, где что-то заставляет это "писать"(искать), а если пишется "пусто", а поле не пусто, там и переоткрывай источник. Если метод можно перекрыть, перекрой, и делай, что хочешь.

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

Но основной запрос ты же переоткрыл, коль попали записи с пустыми полями, почему бы при этом не переоткрывать запросы к справочникам?


 
Sergey13   (2003-07-30 11:56) [4]

То все гриды у людей сами не обновлялись. Теперь очередь до комбобоксов дошла. 8-)


 
Desdechado   (2003-07-30 12:13) [5]

2 Sergey13 © (30.07.03 11:56)
Только не надо ерничать. Лучше бы дело посоветовал.
Справочники большие и их много, а лишний траффик ни к чему.

2 ЮЮ © (30.07.03 11:56)
Дело в том, что TDBLookupComboBox - это всего лишь визуальный наследник другого класса, который весь такой lookup-поиск попрятал в private-методах. От него наследоваться тоже смысла нет, а дублировать иерархию классов в своем модуле только ради этой фишки не очень хочется.
Основной запрос может быть разный в разных местах программы, а справочник к нему может быть и один.


 
Desdechado   (2003-07-30 12:30) [6]

2 ЮЮ © (30.07.03 11:56)
> основной запрос ты переоткрыл, коль попали записи с пустыми полями
Записи не с пустыми полями, а заполненные легитимными кодами из справочника. Но программа о них еще не знает. А надо, чтоб узнала. И хотелось бы именно через TDBLookupComboBox, поскольку он все равно такой поиск соответствий проводит.


 
ЮЮ   (2003-07-30 12:40) [7]

Смотрим метод предка:

function TDBLookupControl.LocateKey: Boolean;
var
KeySave: Variant;
begin
Result := False;
try
KeySave := FKeyValue;
if not VarIsNull(FKeyValue) and FListLink.DataSet.Active and
FListLink.DataSet.Locate(FKeyFieldName, FKeyValue, []) then
begin
Result := True;
FKeyValue := KeySave;
end;
except
end;
end;

Перекрываем своим

function T DesdechadoDBLookupСombobox.LocateKey: Boolean;
var
KeySave: Variant;
begin
Result := False;
try
KeySave := FKeyValue;
if not VarIsNull(FKeyValue) and FListLink.DataSet.Active then
( FKeyFieldName, FKeyValue, [])
Смотрим метод предка:

function TDBLookupControl.LocateKey: Boolean;
var
KeySave: Variant;
begin
Result := False;
try
KeySave := FKeyValue;
if not VarIsNull(FKeyValue) and FListLink.DataSet.Active and
FListLink.DataSet.Locate(FKeyFieldName, FKeyValue, []) then
begin
Result := True;
FKeyValue := KeySave;
end;
except
end;
end;

Перекрываем своим

function TDesdechadoDBLookupСombobox.LocateKey: Boolean;
var
KeySave: Variant;
begin
Result := False;
try
KeySave := FKeyValue;
if not VarIsNull(FKeyValue) and FListLink.DataSet.Active then
if FListLink.DataSet.Locate(FKeyFieldName, FKeyValue, []) then
begin
Result := True;
FKeyValue := KeySave;
end
else
begin
// здесь переоткрываем FListLink.DataSet и делаем Locate
end;
except
end;
end;


 
Desdechado   (2003-07-30 17:09) [8]

2 ЮЮ © (30.07.03 12:40)
Спасибо за наводку, стормозил - можно же переопределять методы деда, а не только отца :)
В итоге получилось так (хотя за абсолютную корректность не поручусь):
function TfvDBLookupComboBox.LocateKey(): Boolean;
var
xKeySave: Variant;
begin
result := False;
if( FRefreshing ) then
Exit;
with( ListLink.DataSet ) do
try
xKeySave := KeyValue;
if( Active and ( not VarIsNull( KeyValue ) ) ) then
if( Locate( KeyField, KeyValue, [] ) ) then
begin
result := True;
KeyValue := xKeySave;
end
else if( FListRefreshable ) then
begin
FRefreshing := True;
Close;
Open;
FRefreshing := False;
if( Locate( KeyField, KeyValue, [] ) ) then
begin
result := True;
KeyValue := xKeySave;
end
else
DatabaseError( rc_DataKeyNotInList, Self );
end
else
( rc_DataKeyNotInList, Self )
2 ЮЮ © (30.07.03 12:40)
Спасибо за наводку, стормозил - можно же переопределять методы деда, а не только отца :)
В итоге получилось так (хотя за абсолютную корректность не поручусь):
function TfvDBLookupComboBox.LocateKey(): Boolean;
var
xKeySave: Variant;
begin
result := False;
if( FRefreshing ) then
Exit;
with( ListLink.DataSet ) do
try
xKeySave := KeyValue;
if( Active and ( not VarIsNull( KeyValue ) ) ) then
if( Locate( KeyField, KeyValue, [] ) ) then
begin
result := True;
KeyValue := xKeySave;
end
else if( FListRefreshable ) then
begin
FRefreshing := True;
Close;
Open;
FRefreshing := False;
if( Locate( KeyField, KeyValue, [] ) ) then
begin
result := True;
KeyValue := xKeySave;
end
else
DatabaseError( rc_DataKeyNotInList, Self );
end
else
DatabaseError( rc_DataKeyNotInList, Self );
except
end; // try & with
end;

FRefreshing нужно потому, что при Open вызывается опять LocateKey и будет зацикливание



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.01 c
1-81668
HardClubber
2003-08-11 17:53
2003.08.25
Название программы


6-81866
GoldMedium
2003-06-15 17:04
2003.08.25
Как программно изменить IP-адрес


9-81527
Антон
2003-02-18 04:51
2003.08.25
Помогите кто может


14-81922
Е-Моё имя
2003-08-07 11:23
2003.08.25
ржать


1-81769
Всеволод Соловьёв
2003-08-14 10:34
2003.08.25
Интерфейсы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский