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

Вниз

Не работают Lookup-поля, если есть поля вида fkInternalCalc !   Найти похожие ветки 

 
kaif ©   (2004-07-15 21:08) [0]

Ненормально работают Lookup-поля, если в DataSet есть поля вида fkInternalCalc
 При употреблении вычисляемых полей в базе данных IB столкнулся со странной вещью.
Компоненты IBDataSet перестали изменять значения lookup-полей полей в момент редактирования. Целый день не мог понять, что происходит, пока не обнаружил, что если в наборе данных имеется хотя бы одно поле с FieldKind=fkInternalCalc, то поля fkLookup при изменении ключевых значений (KeyFields) не отображают значений LookupResulField, а продолжают отображать старые значения, полученные еще при открытии запроса.

 Трассировка показала, что проблема заключается в файле db.pas Delphi.

1. Метод TField.CalcLookupValue формирует значение поля вида fkLookup
procedure TField.CalcLookupValue;
begin
 if FLookupCache then
   Value := LookupList.ValueOfKey(FDataSet.FieldValues[FKeyFields])
 else if (FLookupDataSet <> nil) and FLookupDataSet.Active then
   Value := FLookupDataSet.Lookup(FLookupKeyFields,
     FDataSet.FieldValues[FKeyFields], FLookupResultField);
end;


2. Этот метод вызывается в методе TDataSet.CalculateFields
procedure TDataSet.CalculateFields(Buffer: PChar);
var
 I: Integer;
begin
 FCalcBuffer := Buffer;
 if (State <> dsInternalCalc) and (IsUniDirectional = False) then
 begin
   ClearCalcFields(CalcBuffer);
   for I := 0 to FFields.Count - 1 do
     with FFields[I] do
       if FieldKind = fkLookup then
         CalcLookupValue;
 end;
 DoOnCalcFields;
end;


3. А этот в свою очередь вызывается в местной процедуре UpdateCalcFields метода TDataSet.DataEvent

procedure TDataSet.DataEvent(Event: TDataEvent; Info: Longint);

 procedure UpdateCalcFields;
 begin
   if State <> dsSetKey then
   begin
     if FInternalCalcFields and (TField(Info).FieldKind = fkData) then
       RefreshInternalCalcFields(ActiveBuffer)
     else if (FCalcFieldsSize <> 0) and FAutoCalcFields and
       (TField(Info).FieldKind = fkData) then
       CalculateFields(ActiveBuffer);
     TField(Info).Change;
   end;
 end;

.........


 Если  FInternalCalcFields = True (а это так, если хотя бы одно поле имеет вид fkInternalCalc), то CalculateFields после else не вызывается и значение lookup-полей не обновляются. Если заменить else точкой с запятой, то ошибка исчезает.
 Но весь вопрос в том, правильно ли исправлять db.pas? Или нужно добавлять что-то в IBX, чтобы принудительно вызывать метод CalculateFields в какой-то момент, несмотря на то, что
свойство InternalCalcFields = True?  Нигде в Help не сказано, что при InternalCalcFields = True поля типа lookup не будут
работать правильно. Поэтому я считаю это ошибкой в самой Delphi.
 Кто сталкивался с подобной проблемой? Версия Delphi 6 (в других пока не смотрел).


 
kaif ©   (2004-07-16 12:11) [1]

Неужели никто не сталкивался?


 
Johnmen ©   (2004-07-16 12:20) [2]

>kaif ©  

Лично я не сталкивался.
Думаю, если очень надо, то исходники можно подправлять. Не взирая на крик души от АП "Не трогай генофонд !"
:)))



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

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

Наверх




Память: 0.45 MB
Время: 0.034 c
4-1088449171
parovoZZ
2004-06-28 22:59
2004.08.08
OpenGL и WinApi


1-1090477286
PhAn
2004-07-22 10:21
2004.08.08
Буквы CD-приводов


14-1089997964
Undert
2004-07-16 21:12
2004.08.08
SQL + IP диапазон


3-1089926110
fxmike
2004-07-16 01:15
2004.08.08
софтовый выбор строк в TDBLookupComboBox


6-1085685232
Герцог
2004-05-27 23:13
2004.08.08
Компонент WebBrowser





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский