Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.08;
Скачать: CL | DM;

Вниз

Не работают 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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.041 c
1-1089611530
Pavelkq
2004-07-12 09:52
2004.08.08
ПрогрессБар в юните


3-1089902181
Leech
2004-07-15 18:36
2004.08.08
SQL запрос на Paradox


8-1085061971
Nic2
2004-05-20 18:06
2004.08.08
JPG ---> GIF


1-1090869200
ANT
2004-07-26 23:13
2004.08.08
Переменные


6-1084456127
Manulo
2004-05-13 17:48
2004.08.08
Доступ в интернет