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

Вниз

MS SQL в ХР и 2000 Вмндоусе. Почему работает по разному?   Найти похожие ветки 

 
DimonS ©   (2006-04-26 05:20) [0]

Есть база в 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 дня позже почему-то... Да и кривой, конечно, способ заменять запятую, на другом серваке формат даты другой могет быть...

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


 
Nikolay M. ©   (2006-04-26 10:31) [1]

Работал у меня студент, сплошь и рядом лепил такое


> StrToDateTime(DateEdit1.Text)


Поубивал бы, если бы его раньше не уволили...

http://www.yandex.ru/yandsearch?rpt=rad&text=%F0%E5%E3%E8%EE%ED%E0%EB%FC%ED%FB%E5+%ED%E0%F1%F2%F0%EE%E9%EA%E8+delphi

PS
Скажи, что за система, думаю как раз GPS-навигатор приобретать, не дай вдруг наткнуться...


 
DimonS ©   (2006-04-26 16:04) [2]

Nikolay M. ©  
> StrToDateTime(DateEdit1.Text)

Ответ не понят. Если предложите другое - предлагайте, а не "Поубивал бы, если бы его раньше не уволили..."

Ответа на вопрос не озвучен, таких я услыщал много на разных форумах, НО НИКТО!!! НЕ СКАЗАЛ, ЧТО ЗА ОШИБКА!!!

Извиняйте, если залез не на тот форум, где не могут ответить на такой вопрос (ДЛЯ ВСЕХ, а не для Профи), то я пас... Звиняйте....


 
Johnmen ©   (2006-04-26 16:13) [3]

Всё очень просто. Достаточно почитать StrToDateTime+F1, подумать.
Изучить параметы в запросах.


 
DimonS ©   (2006-04-26 16:20) [4]


> Johnmen ©   (26.04.06 16:13) [3]

Пробовал, не помогает.

Если не сложно, объясните ошибку то? А то F1 и такие ответы не помогают.
Каюсь, в англицком я не силен. Если не трудно, объясните, как правильно?


 
Nikolay M. ©   (2006-04-26 17:11) [5]


> НО НИКТО!!! НЕ СКАЗАЛ, ЧТО ЗА ОШИБКА!!!


Я бы сказал, что ошибка в ДНК, но это грубо и не по сути.
Что ты надеешься получить, если напишешь StrToDateTime ("01.02.2006")? А StrToDateTime ("2006/02/02 12:34:56.789")? А StrToDateTime ("Пишу сюда все, что захочу")?
Не храни даты и вещественные числа в строках - и будет тебе счастье.


 
DimonS ©   (2006-04-27 00:23) [6]

В общем, понятно. Можно в этот форум не заглядывать больше. Одна болтовня и ни одного дельного ответа.

Я же попросил: ПОДСКАЖИТЕ, КАК ПРАВИЛЬНО!!! А не то, как я неправильно делаю. Я и сам вижу, что косяк вылез. Но, похоже, здесь или все такие умные, что не могут снизойти до того, чтобы написать ответ, или сами не знают. Второе скорее всего.


> Что ты надеешься получить, если напишешь StrToDateTime ("01.
> 02.2006")? А StrToDateTime ("2006/02/02 12:34:56.789")?
> А StrToDateTime ("Пишу сюда все, что захочу")?
> Не храни даты и вещественные числа в строках


Я надеялся получить дату-время в формате DateTime. Как ни странно, но срабатывает такой способ. По крайней мере, в Аксессовской базе таких траблов нет, ив парадоксе, и в дбф.


 
Джо ©   (2006-04-27 01:44) [7]

Ну, хотя бы использовать для ввода даты не TEdit, а TDateTimePicker и параметры для TQuery (или что ты там используешь).


 
DimonS ©   (2006-04-27 02:01) [8]


> Джо ©  

Я для ввода даты использую TDateEdit из библиотеки RxLib.
В том то и дело, в ХР переводит отлично, в 2000 не хотит.


> Nikolay M. ©

Что ты надеешься получить, если напишешь StrToDateTime ("01.02.2006")?
Я не понял юмора. А для чего тогда функция StrToDateTime существует? Не для перевода ли из строкового представления даты-времени в DateTime?


 
Джо ©   (2006-04-27 02:25) [9]

> Что ты надеешься получить, если напишешь StrToDateTime ("01.02.2006")
> ?

Да, в принципе, все, что угодно :) Включая исключение (но это как раз самое лучшее). Уже тут несколько раз говорили — региональные настройки. Прочитайте, в конце концов, справку по StrToDateTime.


 
DimonS ©   (2006-04-27 02:49) [10]


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


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

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


 
atruhin ©   (2006-04-27 03:51) [11]

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


 
Nikolay M. ©   (2006-04-27 10:07) [12]


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


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


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


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


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


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


 
atruhin ©   (2006-04-27 14:18) [13]


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

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


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


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


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


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


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

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


 
MOA ©   (2006-04-27 15:02) [16]

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


 
Nikolay M. ©   (2006-04-27 15:23) [17]


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


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


 
atruhin ©   (2006-04-27 15:53) [18]


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

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

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

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


 
Nikolay M. ©   (2006-04-27 16:04) [19]


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


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


 
atruhin ©   (2006-04-27 16:07) [20]

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


 
DimonS ©   (2006-04-29 03:19) [21]

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

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

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


 
sniknik ©   (2006-04-29 10:37) [22]

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

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


 
DimonS ©   (2006-04-29 13:02) [23]


> sniknik ©  


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


 
sniknik ©   (2006-04-29 13:11) [24]

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

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


 
DimonS ©   (2006-04-29 13:16) [25]


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

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


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

Посмотри пример для 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;


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

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


 
DimonS ©   (2006-04-29 13:35) [28]

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


 
DimonS ©   (2006-05-11 16:03) [29]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.05.28;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.052 c
15-1146415901
Хозяин
2006-04-30 20:51
2006.05.28
Джорж прикололся


3-1144241504
{Alex}
2006-04-05 16:51
2006.05.28
автокрименентное значение


2-1147288748
zxcv
2006-05-10 23:19
2006.05.28
hex editor


15-1146726507
Серебров Евгений Леонидович
2006-05-04 11:08
2006.05.28
Delphi 7


15-1146261312
lookin
2006-04-29 01:55
2006.05.28
Skype никто не желает?