Баг с датами в FBDataSet

Модератор: Модераторы

Баг с датами в FBDataSet

Сообщение v-t-l » 30.05.2007 16:33:04

Поля типа TIME просматриваются нормально, но при изменении превращаются в бред (не конвертируются в формат Firebird?).

alexs, исправь, пожалуйста, или хоть подскажи в каком месте копать.

а то завтра программу сдавать, а тут такой баг выполз :(.

заранее спасибо.
v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение Attid » 30.05.2007 20:59:48

для быстрого решения предложу использовать что-то типа
Код: Выделить всё
select cast (ftime as varchar(10)) as ftime, * from ***

а ошибка эта где-то глубако, не знаю поправили ли в cvn или похоронили.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение alexs » 31.05.2007 10:34:53

это я уже исправил - выложу на днях
там была ошибка обновления в методе refresh
кому не терпится - вот код (ещё не облагорожен)
Код: Выделить всё
procedure TRecordsBuffer.RefreshRecordFromQuery(RecNo: integer;
  Sourse: TJvUIBQuery);
var
  j,k, ii:integer;
  P, FiPtr:Pointer;
  FieldHeader:TFieldHeader;
  S:string;
  Nulls : PBooleans;
  MyDBInfo : PMyDBInfo;
begin
  P:=Items[RecNo];
  MyDBInfo := PMyDBInfo(@(PBytes(P)^[FOwner.FRecordSize]));
  Nulls := PBooleans( @(PBytes(P)^[FOwner.FRecordSize + SizeOf(TMyDBInfo)]) );
  for j := 0 to FOwner.FFiledsHeader.Count-1 do
  begin
    FieldHeader:=FOwner.FFiledsHeader[j];
    K:=-1;
    for ii:=0 to Sourse.Fields.FieldCount-1 do
    begin
      if Sourse.Fields.AliasName[ii]=FieldHeader.FieldName then
      begin
        K:=ii;
        break;
      end
    end;
    if K<>-1 then
    begin
      if Sourse.Fields.IsNull[K] then
      begin
        Nulls^[K] :=true;
      end
      else begin
        Nulls^[K] :=false;
        FiPtr:=@(PBytes(P)[FieldHeader.FieldOffs]);
        case FieldHeader.FieldType of
          ftFloat:PDouble(FiPtr)^:=Sourse.Fields.AsDouble[k]; //Расширить !!!
          ftString:begin
                     S:=Sourse.Fields.AsString[k];
                     if poTrimCharFields in FOwner.FOption then
                       S:=TrimRight(S);
                     FillChar(FiPtr^, FieldHeader.FieldSize, 0);
                     System.Move(S[1], FiPtr^, Min(FieldHeader.FieldSize, Length(S)));
                   end;
          ftSmallint:PSmallInt(FiPtr)^:=Sourse.Fields.AsSmallint[k];
          ftInteger:PInteger(FiPtr)^:=Sourse.Fields.AsInteger[k];
          ftDateTime:
            begin
              {$IFDEF  LINUX}
              DecodeTimeStamp(PIscTimeStamp(Sourse.Fields.Data.sqlvar[k].sqldata),  Double(FiPtr^));
              {$ELSE}
              DecodeTimeStamp(PIscTimeStamp(Sourse.Fields.Data.sqlvar[k].sqldata),  TTimeStamp(FiPtr^));
              Double(FiPtr^) := TimeStampToMSecs(TTimeStamp(FiPtr^));
              {$ENDIF}
            end;
          ftDate:
            begin
(*              {$IFDEF FPC}
                {$IFDEF MSWINDOWS}
                PInteger(FiPtr)^:=PInteger(Sourse.Fields.Data.sqlvar[k].sqldata)^ - DateOffset + 693594;
                {$ELSE}
                PInteger(FiPtr)^:=PInteger(Sourse.Fields.Data.sqlvar[k].sqldata)^ - DateOffset;
                {$ENDIF}
              {$ELSE} *)
              PInteger(FiPtr)^:=PInteger(Sourse.Fields.Data.sqlvar[k].sqldata)^ - DateOffset + 693594;
//              {$ENDIF}
            end;
          ftTime:
            begin
(*              {$IFDEF FPC}
              PDouble(FiPtr)^ := Sourse.Fields.AsDateTime[k];
              {$ELSE} *)
              PInteger(FiPtr)^:=PCardinal(Sourse.Fields.Data.sqlvar[K].sqldata)^ div 10;
//              {$ENDIF}
            end;


          ftBlob,
          ftMemo: with PBLOBRecordData(FiPtr)^ do begin
            ISCQuad:=Sourse.Fields.AsQuad[K];
            if  ListIdx <> 0 then
              MyDBInfo^.BlobList.SetItem(
                ListIdx,
                TFBBlobStream(MyDBInfo^.BlobList.Item(ListIdx)).ChangeOrNil(ISCQuad)
              );
          end;{ftBlob,ftMemo}
          ftLargeint:PInt64(FiPtr)^:=Sourse.Fields.AsInt64[k];
          ftBoolean:PBoolean(FiPtr)^:=Sourse.Fields.AsBoolean[k];
        else
        end{case FieldHeader.FieldType}
      end;{else if Sourse.Fields.IsNull[K]}
    end;{if K<>-1}
  end;
  FOwner.GetCalcFields(P);
end;
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение alexs » 31.05.2007 15:29:25

Выложил на сайте исправления этого бага - вобщем
новые версии FBDataSet и RxFPC - нового функционала в них нет

по RX - тут тольо исправления для текущей версии LCL - обходим несовместимости из-за введения менеджера тем31.05.2007 - версия 1.1.2.77
- Исправлена компиляция модуля rxtoolbar.pas с поселдними версиями LCL
(после введения тем) - сам TToolPanel ещё не работает с темами
- Исправил компиляцию модуля rxlogin.pas - была ошибка на SetCursor

по FBDataSet - исправления багов рефрешей
31.05.2007
ver 1.22
- Исправлен вызов метода Refresh для полей типа ftDate (alexs)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение v-t-l » 31.05.2007 21:51:20

alexs

Надо бы исправить процедуру:

Код: Выделить всё
procedure TFBCustomDataSet.CloseOpen(AFetchAll: boolean);
begin
  DisableControls; // !
  Close;
  Open;
  if AFetchAll then
    FetchAll;
  EnableControls; // !
end;


Иначе не работают многоуровневые каскады Master-Detail.
v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l » 31.05.2007 22:00:37

И еще, не компилится в Lazarus 0.9.22/FPC 2.0.4
Код: Выделить всё
function TFBAnsiMemoField.GetIsNull: Boolean;
begin
  result := not DataSet.GetFieldData(Self,nil);
end;


меняю на
Код: Выделить всё
function TFBAnsiMemoField.GetIsNull: Boolean;
begin
  result := (GetDataSize = 0);
end;


не знаю, правильно ли. Не проверял.
v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l » 31.05.2007 22:16:59

А как правильно организовать связку Master-Detail, если поля, по которым нужно связать, имеют разные названия, но присутствуют поля с одинаковыми названиями и в Master, и в Detail? Не происходит ли коллизий?

Я ввел дополнительно два свойства MasterFields и LinkedFields (:string). Если оба заполнены, то связка организуется по ним, иначе - старым методом.

Может есть метод проще?
v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение alexs » 01.06.2007 11:46:53

1.
ошибки посмотрю - а ты какой версией компилиш FPC и лазаря
я пользуюсь поселдним снапшотом

2.
а причём тут поля - ты же именя параметрам можеш давать какие хочеш, и поле в запросе у тебя не обязательно должно называться как есть в БД:

мастер запрос:
Код: Выделить всё
select
  table1.field1 as aaaa_bbb
from
  table1



подчинённый запрос
Код: Выделить всё
select
  table2.field1
from
  table2
where
  table2.field2 = :aaaa_bbb

Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение v-t-l » 01.06.2007 15:45:27

Lazarus 0.9.22/FPC 2.0.4 (Win32)

Код: Выделить всё
function TFBAnsiMemoField.GetIsNull: Boolean;
begin
  result := not DataSet.GetFieldData(Self,nil);
end;


Выдает

Error: identifier idents no member "GetFieldData"

Если меняю на
Код: Выделить всё
function TFBAnsiMemoField.GetIsNull: Boolean;
begin
  result := (GetBlobSize = 0); // в прошлом посте ошибся "GetDataSize"
end;

то компилится нормально, а правильно ли работает - не знаю.
v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение alexs » 02.06.2007 10:11:18

на вскидку - GetBlobSize = 0 - у тебя может быть блоб просто равным '' - но не пустым
а почему не обновиш лазарь и фпс?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение v-t-l » 03.06.2007 10:55:28

Обычно, если поле пустое (=''), то лучше использовать NULL.

А Lazarus и FPC не обновляю - нет нового стабильного релиза. Как-то snapshot качнул, а там глюк на глюке. С моим dialup качать бесполезные 45МБ - скучно.
v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение Yogrik » 03.06.2007 12:25:30

Помойму на форуме обсуждалась тема обновления из svn....
Экономит и трафик и время...;)
Yogrik
постоялец
 
Сообщения: 116
Зарегистрирован: 23.03.2006 00:41:48

Сообщение alexs » 03.06.2007 16:43:11

v-t-l - а как твои полные ФИО? - а то я на тебя в благодарнастях ссылку даю - как тебя подписать :-)
а насчёт SVN - это самое то
и кстати последние релизы очень стабильны (за исключением сломанного и починенного SpinEdit)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение v-t-l » 04.06.2007 13:38:16

Качнул вчера snapshot Lazarus 0.9.23/FPC2.1.5
Пока полет нормальный. Даже на моем древнем домашнем Celeron 900 с 128МБ ОЗУ перекомпиливается при установке компонент всего около 15 минут. :D
Последний раз редактировалось v-t-l 08.12.2008 13:08:17, всего редактировалось 1 раз.
v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l » 05.06.2007 21:22:34

alexs
А поля типа TIME по-прежнему не работают.
v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 0

Рейтинг@Mail.ru