Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
6-1086280860
Pavel
2004-06-03 20:41
2004.08.08
WSASocket


3-1089697360
Nero
2004-07-13 09:42
2004.08.08
Создание БД


9-1082144201
Shopot
2004-04-16 23:36
2004.08.08
Биллиард.


14-1090415669
Dimka Maslov
2004-07-21 17:14
2004.08.08
Degauss


3-1089824163
Junior
2004-07-14 20:56
2004.08.08
Большой размер базы из за картинок





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский