Форум: "Начинающим";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.01 c