| 
| 
 | Вопрос # 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 (статус: Посетитель)Вопрос отправлен: 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 (статус: 2-ой класс), 9 сентября 2011, 06:03 [#2]:Егор, хочешь сказать что такую фигню: #05.03.2011 2:00:00# компилятор дельфина переведет в нужный формат? |  
|   | 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 (статус: Посетитель), 12 сентября 2011, 18:14 [#6]: и ещё. а если только вторую часть запроса делать - возвратится хоть что-то? может, для второй части банально нет
подходящих данных? Данные есть:
 1.Запрос корректно отрабатывает в MS Access.
 2.Пробовал в только вторую часть запроса, данные есть.
 Смысл такого запроса в том что надо выбирать именно из двух таблиц, например:
 На начало месяца в остатке нет бланков, но был приход бланков в отчетном месяце, вот я этим запросом с UNION (UNION не выбирает повторяющиеся записи, UNION ALL - выбирает все записи) и получаю этот список.Таблиц 2 штуки - 1-я на приход бланков, 2-я на количество в остатке на 01 число каждого месяца.
 P.S. Думал может это такие косяки потому что использую форму с отчетом в dll, скомпилил с рантайм пакетами, ниче не сменилось, куда рыть=((
 |  
|   | Sonic-X (статус: Посетитель), 12 сентября 2011, 19:24 [#7]:Все, разобрался в чем проблема! Оказывается нельзя чтоб в двух подзапросах название параметров имели одно имя!!!! В первом запросе имя :StartDT и :EndDT
 Во втором запросе поставил имя :StartDT2 и :EndDT2 и все заработало.
 
 P.S. Чесно говоря непойму почему так, ведь даты что для первого селекта что и для второго совершенно одинаковые, а не робит такая конструкция...
 
 Спасибо за помощь.
 |  12 сентября 2011, 19:26: Статус вопроса изменён на решённый (изменил автор вопроса — Sonic-X) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |