Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как TDataSet работает с датой / 7 сообщений из 7, страница 1 из 1
15.10.2003, 14:10
    #32294100
Артем1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как TDataSet работает с датой
Всем привет и наилучшие.

Заинтересовался одной статьей на RSDN-е.
http://www.rsdn.ru/article/delphi/dbcontrols.xml

Стал пробовать, и напоролся на грабли при работе с датой.
Может у нас кто сможет помочь.
Мой вопрос там в обсуждении статьи (ссылка вверху).
Если кто читал статью или сталкивался с этой темой, посмотрите плиз.
...
Рейтинг: 0 / 0
15.10.2003, 15:36
    #32294268
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как TDataSet работает с датой
Если кто читал статью или сталкивался с этой темой, посмотрите плиз.

Если есть проблемма, то излагай. А теорию мы и без подсказок почитаем.
...
Рейтинг: 0 / 0
15.10.2003, 15:49
    #32294290
Артем1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как TDataSet работает с датой
Есть проблема.
Просто в том форуме были ответы автора.
Может, они были бы полезны.

Вот сам вопрос. Немного длинновато, правда:
автор писал:Здравствуйте, Максим Гумеров.

Заинтересовался вашей статьей и решил попробовать Вашего наследника TDataSet.
При этом столкнулся с ошибкой при отображении даты.
Как правильно поместить значение даты в Data?
У меня такой код

Код: plaintext
TDateTime(Data) := TMyRecord(List[Index]).Date;


вызывает ошибку

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EConvertError with message ''0.37904' is not a valid timestamp'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Нашел, что ошибка возникает здесь:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
  function NativeToDateTime(DataType: TFieldType; Data: TDateTimeRec): TDateTime;
  var
    TimeStamp: TTimeStamp;
  begin
    case DataType of
      ftDate:
        begin
          TimeStamp.Time :=  0 ;
          TimeStamp.Date := Data.Date;
        end;
      ftTime:
        begin
          TimeStamp.Time := Data.Time;
          TimeStamp.Date := DateDelta;
        end;
    else
      try
        TimeStamp := MSecsToTimeStamp(Data.DateTime); // Попадает сюда
      except
        TimeStamp.Time :=  0 ;
        TimeStamp.Date :=  0 ;
      end;
    end;
    Result := TimeStampToDateTime(TimeStamp); // и здесь возникает ошибка 
  end;

function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;
asm
        PUSH    EBX
{$IFDEF PIC}
        PUSH    EAX
        CALL    GetGOT
        MOV     EBX,EAX
        POP     EAX
{$ELSE}
        XOR     EBX,EBX
{$ENDIF}
        PUSH    EAX
        CALL    ValidateTimeStamp // Вот тут вот
        POP     EAX
        MOV     ECX,[EAX].TTimeStamp.Time
        MOV     EAX,[EAX].TTimeStamp.Date
        SUB     EAX,DateDelta
        IMUL    [EBX].IMSecsPerDay
        OR      EDX,EDX
        JNS     @@ 1 
        SUB     EAX,ECX
        SBB     EDX, 0 
        JMP     @@ 2 
@@ 1 :    ADD     EAX,ECX
        ADC     EDX, 0 
@@ 2 :    PUSH    EDX
        PUSH    EAX
        FILD    QWORD PTR [ESP]
        FDIV    [EBX].FMSecsPerDay
        ADD     ESP, 8 
        POP     EBX
end;


В чем причина, никак не могу понять.

С уважением, Артем.

Там еще дальше были посты, но ответа мы так и не нашли,
так что их я не привожу. И так длинно получилось.
...
Рейтинг: 0 / 0
15.10.2003, 15:58
    #32294305
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как TDataSet работает с датой
2 Артем, с извинениями.

Ты не про стандартных наследников говорил, а про 3-party. Так что могу тока промолчать. Я предположил о немного другой проблемме, которая иногда возникает при работе с датами из Delphi c сиквелом. Еще раз куча извинений.
...
Рейтинг: 0 / 0
16.10.2003, 13:31
    #32295267
Артем1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как TDataSet работает с датой
Up.

Ну что, никаких мыслей нет ни у кого?
Жаль, идея была хорошей. (по крайне мере мне понравилась).
Или может вопрос непонятен/некорректно сформулирован?
...
Рейтинг: 0 / 0
16.10.2003, 14:16
    #32295343
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как TDataSet работает с датой
ну а чего тут военного-то. Вы текст той ф-и, где ошибка, смотрели?
Код: plaintext
1.
2.
3.
4.
5.
procedure ValidateTimeStamp(const TimeStamp: TTimeStamp);
begin
  if (TimeStamp.Time <  0 ) or (TimeStamp.Date <=  0 ) then
    ConvertErrorFmt(@SInvalidTimeStamp, [TimeStamp.Date, TimeStamp.Time]);
end;


а здесь дата принудительно обнуляется, так я понял, и срабатывает второе условие.
Сначала надо Validate вызывать, а уж потом дату обнулять. или не обнулять вообще.
...
Рейтинг: 0 / 0
17.10.2003, 08:37
    #32296090
Артем1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как TDataSet работает с датой
Привет.
Текст этой функции я знаю наизусть.
А где это у меня дата принудительно обнуляется?
Если вы имеете в виду этот кусочек,
Код: plaintext
1.
2.
3.
4.
5.
6.
      try
        TimeStamp := MSecsToTimeStamp(Data.DateTime); // Попадает сюда
      except
        TimeStamp.Time :=  0 ;
        TimeStamp.Date :=  0 ;
      end;
    end;

то в except программа не заходит. Проверял.
Я понимаю, что у меня TimeStamp.Date нулевая после строки
Код: plaintext
TimeStamp := MSecsToTimeStamp(Data.DateTime); 

но почему, убейте, понять не могу.

зы: может тупой савсем? :)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как TDataSet работает с датой / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]