Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 630

/ вопрос решён /

Здравствуйте!
Вопрос по дате в запросах к MS Access. Вот код формирования запроса к БД:

 
SQL_GET_BLANKS_LIST='SELECT CTR.[Название страны],RMS.[Страна] as [Код страны], '+
 'TBP.[Тип разрешения], RMS.[Тип разрешения] as [Код разрешения] '+
 'FROM (([Остатки разрешений] RMS '+
 'LEFT JOIN [Страны]  CTR  ON RMS.[Страна]=CTR.[Код Страны]) '+
 'LEFT JOIN [Тип разрешений]  TBP ON RMS.[Тип Разрешения]=TBP.[ID]) '+
 'WHERE RMS.[Дата] BETWEEN :StartDT AND :EndDT '+
 'UNION '+
 'SELECT CTR.[Название страны],ARV.[Страна] as [Код страны], '+
 'TBP.[Тип разрешения], ARV.[Тип разрешения] as [Код разрешения] '+
 'FROM (([Приход разрешений] ARV '+
 'LEFT JOIN [Страны]  CTR  ON ARV.[Страна]=CTR.[Код Страны]) '+
 'LEFT JOIN [Тип разрешений]  TBP ON ARV.[Тип Разрешения]=TBP.[ID]) '+
 'WHERE ARV.[Дата] BETWEEN :StartDT AND :EndDT '+
 'ORDER BY CTR.[Название страны], TBP.[Тип разрешения]  ASC ';
 
 LOADSQL.CommandText:=SQL_GET_BLANKS_LIST;
 LOADSQL.Parameters.ParamByName('StartDT').DataType:=ftDateTime;
 LOADSQL.Parameters.ParamByName('StartDT').Value:=DTMonthStart.Date;
 LOADSQL.Parameters.ParamByName('EndDT').DataType:=ftDateTime;
 LOADSQL.Parameters.ParamByName('EndDT').Value:=DTMonthEnd.Date;
 LOADSQL.Open;

Дата имеет формат "dd.mm.yyyy HH:mm:ss", т.е. 24 часа, например: StartDT -->01.08.2011 00:00:01, EndDT -->31.08.2011 23:59:59, в таком случае запрос возвращает данные только из первого селекта, до UNION.
Убираю параметры, прописываю в запрсе жестко дату в формате #08/01/2011 00:00:01# - ругается на то что <<Неправильно определен объект Parameter, предоставлены неполные или несовместимые сведения.>> Если убрать время из условия отбора, т.е. написать дату в формате #08/01/2011# все работает, но мне надо с временем! В самом Access дата с временем отрабатывает без проблем. Вопрос: что я делаю НЕ так?
Использую Delphi 2007, TADODataSet, провайдер MS JET

Sonic-X Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Sonic-X (статус: Посетитель)
Вопрос отправлен: 9 сентября 2011, 00:29
Состояние вопроса: решён, ответов: 1.

Ответ #1. Отвечает эксперт: corban

Здравствуйте, Sonic-X!
ты ставишь параметр как дату в формате #08/01/2011 00:00:01#, а это есть стринг, а параметр у тебя в формате DataTime. Вот тебе и косяк

Ответ отправил: corban (статус: 2-ой класс)
Время отправки: 9 сентября 2011, 02:42


Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 12 сентября 2011, 19:24; участников в обсуждении: 3.
Егор

Егор (статус: 10-ый класс), 9 сентября 2011, 05:25 [#1]:

corban: неправильно. строка вводится в кавычках.

Sonic-X: а если дату вводить через точку?
#05.03.2011 2:00:00#
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
corban

corban (статус: 2-ой класс), 9 сентября 2011, 06:03 [#2]:

Егор, хочешь сказать что такую фигню: #05.03.2011 2:00:00# компилятор дельфина переведет в нужный формат?
Sonic-X

Sonic-X (статус: Посетитель), 9 сентября 2011, 08:03 [#3]:

 ты ставишь параметр как дату в формате #08/01/2011 00:00:01#, а это есть стринг
А как ее кроме как стринг еще вставить в таком запросе:
 'SELECT CTR.[Название страны],RMS.[Страна] as [Код страны], '+
 'TBP.[Тип разрешения], RMS.[Тип разрешения] as [Код разрешения] '+
 'FROM (([Остатки разрешений] RMS '+
 'LEFT JOIN [Страны]  CTR  ON RMS.[Страна]=CTR.[Код Страны]) '+
 'LEFT JOIN [Тип разрешений]  TBP ON RMS.[Тип Разрешения]=TBP.[ID]) '+
 'WHERE RMS.[Дата] BETWEEN #08/01/2011 00:00:01# AND #08/31/2011 23:23:59# '+
 'UNION '+
 'SELECT CTR.[Название страны],ARV.[Страна] as [Код страны], '+
 'TBP.[Тип разрешения], ARV.[Тип разрешения] as [Код разрешения] '+
 'FROM (([Приход разрешений] ARV '+
 'LEFT JOIN [Страны]  CTR  ON ARV.[Страна]=CTR.[Код Страны]) '+
 'LEFT JOIN [Тип разрешений]  TBP ON ARV.[Тип Разрешения]=TBP.[ID]) '+
 'WHERE ARV.[Дата] BETWEEN #08/01/2011 00:00:01# AND #08/31/2011 23:23:59# '+
 'ORDER BY CTR.[Название страны], TBP.[Тип разрешения]  ASC ';


Это когда я жестко прописываю дату в самом запросе. Если использую параметры как в первом посте, то запрос отрабатывает без ошибок, но "наполовину", до UNION, т.е. если убрать UNION и второй селект, запрос вернет теже данные, из этого я делаю вывод что UNION и нижний SELECT не отрабатывает.

Вводить через точку дату неполучится, Access будет ругаццо.
Егор

Егор (статус: 10-ый класс), 12 сентября 2011, 16:35 [#4]:

гм. вот ещё структуру базы данных увидеть бы
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Егор

Егор (статус: 10-ый класс), 12 сентября 2011, 16:43 [#5]:

и ещё. а если только вторую часть запроса делать - возвратится хоть что-то? может, для второй части банально нет подходящих данных?
SELECT CTR.[Название страны],ARV.[Страна] AS [Код страны], 
TBP.[Тип разрешения], ARV.[Тип разрешения] AS [Код разрешения]
FROM (([Приход разрешений] ARV
LEFT JOIN [Страны]  CTR  ON ARV.[Страна]=CTR.[Код Страны])
LEFT JOIN [Тип разрешений]  TBP ON ARV.[Тип Разрешения]=TBP.[ID])
WHERE ARV.[Дата] BETWEEN :StartDT AND :EndDT
ORDER BY CTR.[Название страны], TBP.[Тип разрешения]  ASC
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Sonic-X

Sonic-X (статус: Посетитель), 12 сентября 2011, 18:14 [#6]:

и ещё. а если только вторую часть запроса делать - возвратится хоть что-то? может, для второй части банально нет
подходящих данных?

Данные есть:
1.Запрос корректно отрабатывает в MS Access.
2.Пробовал в только вторую часть запроса, данные есть.
Смысл такого запроса в том что надо выбирать именно из двух таблиц, например:
На начало месяца в остатке нет бланков, но был приход бланков в отчетном месяце, вот я этим запросом с UNION (UNION не выбирает повторяющиеся записи, UNION ALL - выбирает все записи) и получаю этот список.Таблиц 2 штуки - 1-я на приход бланков, 2-я на количество в остатке на 01 число каждого месяца.
P.S. Думал может это такие косяки потому что использую форму с отчетом в dll, скомпилил с рантайм пакетами, ниче не сменилось, куда рыть=((
Sonic-X

Sonic-X (статус: Посетитель), 12 сентября 2011, 19:24 [#7]:

Все, разобрался в чем проблема! Оказывается нельзя чтоб в двух подзапросах название параметров имели одно имя!!!!
В первом запросе имя :StartDT и :EndDT
Во втором запросе поставил имя :StartDT2 и :EndDT2 и все заработало.

P.S. Чесно говоря непойму почему так, ведь даты что для первого селекта что и для второго совершенно одинаковые, а не робит такая конструкция...

Спасибо за помощь.

12 сентября 2011, 19:26: Статус вопроса изменён на решённый (изменил автор вопроса — Sonic-X)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.03 сек.