Форум: "Базы";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
ВнизНепонятки с запросом Найти похожие ветки
← →
Ozone © (2004-07-15 06:58) [0]Выполняю такой запрос:
UPDATE TABLE_NAME
SEL FIELD_NAME = 1
WHERE (ClientID = :ID)
AND (:PicTime BETWEEN BeginD and EndD)
Делаю:
//TADOQuery
Active := false;
Parameters.ParamValues["ID"] := ...;
Parameters.ParamValues["PicTime"] := ...;
ExecSQL;
Выдает ошибку - "Отсутствует значение одного или нескольких параметров".
Такой запрос с тем же вызовом проходит на ура:
SELECT *
FROM TABLE_NAME
WHERE (ClientID = :ID)
AND (:PicTime BETWEEN BeginD and EndD)
Где я чего не усмотрел?
← →
CHTR (2004-07-15 07:09) [1]Может просто ошибка синтаксиса? Типа вместо SET у тебя написано SEL
← →
CHTR (2004-07-15 07:11) [2]Хотя наврядли
← →
Ozone © (2004-07-15 07:50) [3]CHTR (15.07.04 07:09) [1]
Нет. Это я здесь обшипся...
← →
NAlexey © (2004-07-15 08:55) [4]>Ozone © (15.07.04 06:58)
Ну и правильно говорит. Сокрее всего у тебя названия параметров в запросе не совпадают с названиями которые ты используешь при присвоении. Попробуй присваивать по номерам, ну например:
Parameters[0].Value := ...;
Parameters[1].Value := ...;
← →
Ozone © (2004-07-15 08:55) [5]Нешел у себя косячек небольшой в запросе (поле обозвал не правильно).
Теперь запрос выглядит так:
UPDATE Sessions
SET SError = 1
WHERE (ClientID = :ID) AND (:PTime BETWEEN BeginD AND EndD)
И опять ошибка:
"Одно или несколько из введеных значений нарушают условие на значение "False", заданного для "Session.SError", введите значение, допускаемое для этого поля."
ЗЫ: Поле SError имеет числовой тип
← →
Ozone © (2004-07-15 08:57) [6]NAlexey © (15.07.04 08:55) [4]
Тогда бы он сказал, что такой параметр не найден...
← →
NAlexey © (2004-07-15 08:59) [7]Кстати, а это еще что за интересное условие?:
:PicTime BETWEEN BeginD and EndD
Ты наверное что то путаешь... BETWEEN используют в случаях когда хотят сказать: выбрать записи в которых значение поля таблицы находится между такимто и такимто значением. У тебя наоборот. Подумай над этим.
← →
NAlexey © (2004-07-15 09:00) [8]Ты объясни толком, что хочешь сделать то?
← →
Ozone © (2004-07-15 09:10) [9]NAlexey © (15.07.04 08:59) [7]
Но ведь SELECT работает...
NAlexey © (15.07.04 09:00) [8]
Есть 2 таблицы с полями:
1. ClientID, CTime
2. ClientID, BeginD, EndD
Этот запрос я выполняю в обработчике OnDblClick Grid"а (он привязан к 1-й) и хочу получить запись во 2-й, где CTime первой лежит в пределах BeginD и EndD 2-й.
← →
NAlexey © (2004-07-15 09:16) [10]Ну тогда и запрос наверное надо писать
CTime BETWEEN BeginD and EndD and CTime = :PTime
← →
ЮЮ © (2004-07-15 09:18) [11]>Этот запрос я выполняю в обработчике OnDblClick Grid"а
Тогда выкладывай, то что стоит справа
Parameters.ParamValues["ID"] := ...;
Parameters.ParamValues["PicTime"] := ...;
← →
NAlexey © (2004-07-15 09:22) [12]>NAlexey © (15.07.04 09:16) [10]
Не, бред я какой то написал. Извини запутался, тебе надо получить записи из таблицы 2 у которых BeginD меньше указанной даты, а EndD больше указанной даты? Значит условие будет такое:
BeginD <= :PTime and EndD >= :PTime. Думаю что применение BETWEEN здесь неуместно.
← →
Ozone © (2004-07-15 09:22) [13]ЮЮ © (15.07.04 09:18) [11]
Parameters.ParamValues["ID"] := Query.FieldByName("ClientID").AsInteger;
Parameters.ParamValues["PTime"] := Query.FieldByName("DateTime").AsDateTime;
... но он же на Session.SError ругается
← →
Ozone © (2004-07-15 09:28) [14]NAlexey © (15.07.04 09:22) [12]
А таким макаром SELECT ничего не находит...
← →
Ильш © (2004-07-15 09:36) [15]а Prepare не надо делать?
← →
Johnmen © (2004-07-15 09:37) [16]
"В потолке открылся люк.
Не волнуйтесь, это глюк !" (c)
← →
bushmen © (2004-07-15 09:39) [17]> (:PTime BETWEEN BeginD AND EndD)
По сути своей конструкция неправильная!
← →
Johnmen © (2004-07-15 09:41) [18]>bushmen © (15.07.04 09:39) [17]
>По сути своей конструкция неправильная!
Почему ?
← →
Ozone © (2004-07-15 09:42) [19]Johnmen © (15.07.04 09:37) [16]
Обидно, если это так...
← →
bushmen © (2004-07-15 09:45) [20]> Почему ?
Значение, находящееся в поле, может принимать значения "от" и "до", а не наоборот:
pole1 between :par1 and :par2
← →
Ozone © (2004-07-15 09:50) [21]bushmen © (15.07.04 09:45) [20]
Тогда обьясни, почему в таком случае работает простой SELECT
← →
Johnmen © (2004-07-15 09:53) [22]>bushmen © (15.07.04 09:45) [20]
>Значение, находящееся в поле, может принимать значения "от"
>и "до", а не наоборот:
Не понял.
И почему не может наоборот ? Кто запрещает ?
Вот, что говорит нам документация<value> [NOT] BETWEEN <value> AND <value>
← →
_ALEXey_ (2004-07-15 09:53) [23]
UPDATE Sessions
SET SError = 1
WHERE (ClientID = :ID) AND (:PTime BETWEEN BeginD AND EndD)
1. Судя по [9] поля SError нигде нету.
2. Поля BeginD, EndD неизвестно откуда брать.
3. Перед PTime убрать двоеточие.
← →
Johnmen © (2004-07-15 09:55) [24]>3. Перед PTime убрать двоеточие.
:))) Забавно...
← →
Ozone © (2004-07-15 09:55) [25]_ALEXey_ (15.07.04 09:53) [23]
>> 1. Судя по [9] поля SError нигде нету.
Есть. Забыл указать.
>> 2. AND 3.
???
← →
NAlexey © (2004-07-15 09:57) [26]>Johnmen © (15.07.04 09:53) [22]
Да, скорее всего ты прав. Конструкция не неправильная, а непревычная для глаза, я ниразу не использовал её в таком ключе. Потому как какой смысл писать:
select * from Table where 2 between 1 and 3...
← →
bushmen © (2004-07-15 10:03) [27]> Ozone © (15.07.04 09:55) [25]
Ты попробуй убрать 2 условие. Посмотри, что будет
← →
Ozone © (2004-07-15 10:05) [28]NAlexey © (15.07.04 09:57) [26]
Все когда-то бывает в первый раз...
А что думаете по-поводу Ozone [14]?
← →
Ozone © (2004-07-15 10:06) [29]bushmen © (15.07.04 10:03) [27]
То же самое...
← →
Johnmen © (2004-07-15 10:11) [30]>NAlexey © (15.07.04 09:57) [26]
>Потому как какой смысл писать:
>select * from Table where 2 between 1 and 3...
Ты несколько не прав...
То, что ты привел - бессмысленно. Но совсем не бессмысленноselect * from Table where 2 between field1 and field2...
← →
bushmen © (2004-07-15 10:13) [31]А поле SError у тебя какого типа?
← →
Ozone © (2004-07-15 10:34) [32]bushmen © (15.07.04 10:13) [31]
TIntegerField
← →
Johnmen © (2004-07-15 10:39) [33]А поле SError в таблице у тебя какого типа?
← →
bushmen © (2004-07-15 10:47) [34]> Ozone © (15.07.04 10:34) [32]
Привиди, пожалуйста полностью структуру таблицы
← →
Ozone © (2004-07-15 10:53) [35]1:
Number - TAutoIncField
ClientID - TIntegerField
CTime - TDateTimeField
Path - TWideStringField
2:
SessionID - TAutoIncField
ClientID - TIntegerField
BeginD - TDateTimeField
EndD - TDateTimeField
SError - TIntegerField
← →
Johnmen © (2004-07-15 10:57) [36]>Ozone © (15.07.04 10:53) [35]
Таких типов полей табл. не существует в природе...:)
← →
Ozone © (2004-07-15 11:03) [37]Johnmen © (15.07.04 10:57) [36]
:) А у меня вот есть - значь я обенный? И ошибки у меня особенные?
← →
Johnmen © (2004-07-15 11:08) [38]>Ozone © (15.07.04 11:03) [37]
>А у меня вот есть - значь я обенный? И ошибки у меня особенные?
Тебе кажется, что есть... Потому, что путаешь никак не связанные вещи: средство разработки программ Delphi с его типами TField, TIntegerField etc, и базу данных с таблицами, типа Аксесс etc...
← →
bushmen © (2004-07-15 11:09) [39]> Ozone © (15.07.04 11:03) [37]
И у тебя их быть не может. Ты пытаешься перечислить типы, к которым ты приводишь значения в Дельфях. А я тебя просил описать структуру так, как она представлена в Access"e
← →
Ozone © (2004-07-15 11:12) [40]Хорошо, привожу как в Access"e
1:
Number - Счетчик
ClientID - Числовой
CTime - Дата/Время
Path - Текстовый
2:
SessionID - Счетчик
ClientID - Числовой
BeginD - Дата/Время
EndD - Дата/Время
SError - Числовой
← →
bushmen © (2004-07-15 11:19) [41]> Johnmen © (15.07.04 09:53) [22]
Наконец, добрался до справки по Access. Там написано:
"Оператор Between...And
Определяет принадлежность значения выражения указанному диапазону. Этот оператор можно использовать в инструкциях SQL.
Синтаксис:
выражение [Not] Between значение_1 And значение_2
Элемент Описание
-------------------------------------------------------------
выражение Выражение, определяющее поле,
значение которого нужно вычислить.
значение_1, значение_2 Выражения, задающие границы диапазона. "
← →
Johnmen © (2004-07-15 11:23) [42]>bushmen © (15.07.04 11:19) [41]
Спасибо переводчикам с незаконченным средним...:)))
← →
bushmen © (2004-07-15 11:29) [43]> Johnmen © (15.07.04 11:23) [42]
Как звучит в оригинале, сказать не могу - нет англоязычного офиса под рукой
← →
NAlexey © (2004-07-15 11:30) [44]>Ozone
Такой вопрос. Какие значения принимают поля BeginD и EndD. Есть ли записи у которых BeginD равно EndD и есть ли записи у которых EndD меньше BeginD.
>А что думаете по-поводу Ozone [14]?
А думаю я вот что, надо попробывать подставлять значения не через параметры, а напрямую, т.е написать статичный запрос, посомтреть какие значения есть в таблице, вставить их напрямую в запрос и выполнить.
← →
NAlexey © (2004-07-15 11:42) [45]>Johnmen © (15.07.04 10:11) [30]
Хм... По моему это както неестественно. Всеравно что написать так:
select * from Table where 1 in (Field1, Filed2, Filed3). Короче ч.з одно место.
← →
Johnmen © (2004-07-15 11:50) [46]>NAlexey © (15.07.04 11:42) [45]
Ну почему же. Очень даже естественно. Ведь проверка на вхождение в диапазон, а не на точное совпадение...
← →
Ozone © (2004-07-15 11:51) [47]NAlexey © (15.07.04 11:30) [44]
Ничего что тобой перечислено там не наблюдается.
А насчет статического запроса - попробую.
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.042 c