Главная страница
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.022 c
9-1078931622
DenKop
2004-03-10 18:13
2004.08.08
Примитивы opengl


14-1090177609
gn
2004-07-18 23:06
2004.08.08
ЧТО ЗА ЛАЖА??? Новый интернет-червь – дело рук Аль-Каеды?


14-1090751885
Гарри Поттер
2004-07-25 14:38
2004.08.08
Старый компас


6-1086697837
Григорьев Антон
2004-06-08 16:30
2004.08.08
Вопрос по версиям WinSock


3-1089718576
Shama_n
2004-07-13 15:36
2004.08.08
Как на SQL записать текстовую строку в BLOB поле?