Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MS SQL в ХР и 2000 Вмндоусе. Почему работает по разному? [D6, MSSQL]


Страницы:   1 2

DimonS ©   (2006-04-26 05:20:00) 

Есть база в MS SQL (спутниковое наблюдение - GPS).
Есть программа для просмотра пробега авто за любой промежуток времени. Работает так: при запуске делается выборка данных, а затем из нее методом фильтрации выбирается нужный диапазон (база на серваке, который соединен радиомомедом, поэтому изначально делалось на фильтрации, т.к. не всегда есть доступ и иногда очень медленный).

Так вот...
Фильтр такой:
s:='TimeNav>='''+DateToStr(StrToDateTime(DateEdit1.Text+' '+MaskEdit3.Text))+''' and TimeNav<='''+DateToStr(StrToDateTime(DateEdit2.Text+' '+MaskEdit4.Text))+''' and UniqId='+QT.fieldByName('Uniq_ID').AsString;

QP.Filter:=s;

В ХР работает на ура! А в 2000 ни в какую - QP.Filter:=s; -  не присваивается значение s фильтру. Разборка полета дала, что ошибка где-то в преобразовании даты. Пробовал дату преобразовать в Float - то же самое.

Пошел по пути делать выборки.

QP.Close;
QP.SQL.Clear;
QP.SQL.Add('select TimeSys, TimeNav,UniqID,Distance from Distance_all where TimeNav>'+D1+' and TimeNav<='+D2+' and UniqId='+QT.fieldByName('Uniq_ID').AsString+' order by Timenav');
QP.Open;

Ругается на запятую в формате даты.
Сделал:
D1:=ReplaceStr(FloatToStr(StrToDateTime(DateEdit1.Text+' '+MaskEdit3.Text)),',','.');
D2:=ReplaceStr(FloatToStr(StrToDateTime(DateEdit2.Text+' '+MaskEdit4.Text)),',','.');
(заменил запятую на точку) - работает, НО! Выбираются данные на 2 дня позже почему-то... Да и кривой, конечно, способ заменять запятую, на другом серваке формат даты другой могет быть...

Вот и вопрос - что за трабл такой?


DimonS   (2006-05-11 16:03:00) [1]

ТО
> VadimSpb   (29.04.06 13:28) [26]


Спасибо, единственный, кто подсказал нормально, просто применил пример, которого я и ждал. Все работает отлично. (Хотя фильтрация не работает, но это уже не важно).

Через параметры проверил на машинах с 95, 98, 2000 и МЕ виндой, все работает!


DimonS   (2006-04-29 13:35:00) [2]

Спасибо всем, теперь понятно, в чем апшипкИ :). Негде попробовать сейчас, дома ХРю стоит, придется ждать допослепразников.


VadimSpb   (2006-04-29 13:32:00) [3]

И еще: РАБОТАЙ С ДАТОЙ ТОЛЬКО ЧЕРЕЗ ПАРАМЕТРЫ


VadimSpb   (2006-04-29 13:28:00) [4]

Посмотри пример для MSSQL:
          DataModule1.ADOCommand.CommandText := 'INSERT INTO HistoryConnect2 (AbonentID,ConnectDate,DisconnectDate) VALUES (:AbonentID,:ConnectDate,:DisconnectDate)';
          DataModule1.ADOCommand.Parameters.ParamValues['AbonentID']      := DataModule1.tbAbonentAbonentID.AsInteger;
          DataModule1.ADOCommand.Parameters.ParamValues['ConnectDate']    := Int(DateTimePicker1.Date);
          DataModule1.ADOCommand.Parameters.ParamValues['DisconnectDate'] := Int(DateTimePicker6.Date);
          DataModule1.ADOCommand.Execute;


DimonS   (2006-04-29 13:16:00) [5]


> дельфе дататайм это число с плавающей запятой, а в mssql
> (насколько помню) два составленных целых одно под дату другое
> под время

Вот наконец то подсказали, чем форматы отличаются! Получается, что региональные настройки и ни при чем. Буду пробовать после праздников :)


sniknik   (2006-04-29 13:11:00) [6]

> нужно обязательно переводить в число
в дататайм, а не число. тут тип имеет значение, хотя суть типа тоже число... вот если бы ты внутри одной системы манипуляции делал то было бы без разници.

там не только точки отсчета разные но и к примеру в дельфе дататайм это число с плавающей запятой, а в mssql (насколько помню) два составленных целых одно под дату другое под время. при передаче числом оно конечно может автоматически преобразовать тип, но потери в точности будут.


DimonS   (2006-04-29 13:02:00) [7]


> sniknik ©  


Спасибо, попробую. А ведь Акцесс не принимает дату в строковом виде, нужно обязательно переводить в число. А mssql число не принимает. Просто mssql почти не касался, а с Аксессом небыло таких траблов, вот и мучуюсь. :)


sniknik   (2006-04-29 10:37:00) [8]

> Дата вводится через DateEdit, из библиотеки RxLib, так что ввести неправильно ее невозможно.
зато после она у тебя преобразовывается в число... число это не дата (по типу, так то она конечно числом представлена), в принципе ничего страшного когда в одной системе, но у тебя идет передача между системами... точка отсчета даты (ноль) может быть разной, ты это не учитываеш и + обманываеш систему что это число а не дата... т.е. она тоже не учитывает.
ну тогда и не жалуйся
> НО! Выбираются данные на 2 дня позже почему-то...

> ведь на другой машине может оказаться другие настройки и опять будут те же ошибки, так ведь?
используй параметры (обязательно того типа который есть самом деле) либо передавай строкой в универсальном формате движка (для mssql это "yyyymmdd" или "yyyy-mm-dd", для аксесс #yyyy-mm-dd# уточни в справке)


DimonS   (2006-04-29 03:19:00) [9]

Ну вот еще добавлю.
Дата вводится через DateEdit, из библиотеки RxLib, так что ввести неправильно ее невозможно.

Доступ осуществляется через ADO.

ShortDateFormat и LongDateFormat не хотелось бы использовать, ведь на другой машине может оказаться другие настройки и опять будут те же ошибки, так ведь?


atruhin   (2006-04-27 16:07:00) [10]

Ну значит забыл. Сдаюсь.


Nikolay M.   (2006-04-27 16:04:00) [11]


> Хотя может я и не прав.


Еще в четверке был, как минимум.


atruhin   (2006-04-27 15:53:00) [12]


> На худой конец MaskEdit

Ну дак я его и имел ввиду.

> Палитра компонентов Win32 -> DateTimePicker.

А вот он мне кажется только в 7ке появился. Хотя может я и не прав.


Nikolay M.   (2006-04-27 15:23:00) [13]


> Использовал в D6 там вроде не было стандартного компонента
> ввода дат


Палитра компонентов Win32 -> DateTimePicker. На худой конец MaskEdit.


MOA   (2006-04-27 15:02:00) [14]

>региональные настройки на своей машине, на той, где стоит 2000 винда (где программа не работает) и на сервере. ВЕЗДЕ ОДИНАКОВЫЕ!!!
Похоже, компоненты доступа используют DB Library (BDE, например) - тогда региональные установки есть ещё в SQL Server Client Network Utility - вкладка "DB Library Options".
Удачи!


atruhin   (2006-04-27 14:57:00) [15]


> Зачем самому создавать проблемы там, где их нет?

Ну про периодически я переборщил :). Использовал в D6 там вроде не было стандартного компонента ввода дат, несколько раз нужно было написать модули без использования сторонних компонент.


Nikolay M.   (2006-04-27 14:33:00) [16]


> except
>  // вывод сообщения пользователю


Проблема будет с пользователи, которые будут вбивать правильную, по их мнению, дату, а потом окажется, что "эта дурацкая программа не понимает дату и выдает какие-то окошки".
Зачем самому создавать проблемы там, где их нет?


atruhin   (2006-04-27 14:18:00) [17]


> [1] Nikolay M. ©   (26.04.06 10:31)
> сплошь и рядом лепил такое
> > StrToDateTime(DateEdit1.Text)
> Поубивал бы, если бы его раньше не уволили

А в чем здесь проблемма? Я периодически использую для контроля правильности введенной даты.
try
 StrToDateTime(DateEdit1.Text)
except
 // вывод сообщения пользователю
end


Nikolay M.   (2006-04-27 10:07:00) [18]


> КАК СДЕЛАТЬ ТАК, чтобы программа работала на машинах с разными
> региональными настройками?


Ты ответы читаешь или будешь продолжать истерить?


> Не храни даты и вещественные числа в строках - и будет тебе
> счастье.


Для повышения образованности можешь почитать про ShortDateFormat и LongDateFormat, о чем тебе было сказано еще в [3] - в хелпе про StrToDateTime все это разжевано.


> > А StrToDateTime ('Пишу сюда все, что захочу')?
>
> Я надеялся получить дату-время в формате DateTime.


И какое же будет дата-время у StrToDateTime ('Пишу сюда все, что захочу')?


atruhin   (2006-04-27 03:51:00) [19]

См. использование параметров в хапросах. Это не просто, а очень просто! :)


DimonS   (2006-04-27 02:49:00) [20]


> Уже тут несколько раз говорили — региональные настройки.


Ну ясен пень, это я понял еще до того, как написал сюда. Вопрос в том, КАК СДЕЛАТЬ ТАК, чтобы программа работала на машинах с разными региональными настройками? Или никак?

ЗЫ. Проверил региональные настройки на своей машине, на той, где стоит 2000 винда (где программа не работает) и на сервере. ВЕЗДЕ ОДИНАКОВЫЕ!!! Но... Что-то видно еще влияет.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо