Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2009, 12:01   #1
Botanik1987
Пользователь
 
Регистрация: 26.09.2008
Сообщений: 38
Вопрос SQL запрос с датой

Всем здрасти)
Вопрос по Access2007:
Допустим имеются 2 таблицы, связанные по полю Автомат
- Таблица1:
Автомат ДатаС ДатаПо Продажи Доход
1 01.08.2009 31.08.2009 500 5000
2 01.08.2009 31.08.2009 400 4000
3 01.08.2009 31.08.2009 300 3000
1 01.09.2009 30.09.2009 600 6000
То есть для Автомата 1 данные введены и за август и за сентябрь, а для остальных только за август. Как вы понимаете ДатаС-дата начала месяца, а ДатаПо-дата конца месяца
- Таблица2:
Автомат Место установки Дата установки (в указанное место)
1 Пункт1 01.05.2009
2 Пункт2 01.05.2009
3 Пункт3 01.05.2009
2 Пункт4 17.09.2009
То есть в сентябре автомат 2 находился в двух местах (до 16 числа включительно в Пункте 2, а с 17го в Пункте 4)

Имеется отчёт (ленточная форма) со следующими полями:
Автомат Место установки Продажи Доход
В свойстве "источник записей" данного отчёта указан SQL-запрос:
Код:
SELECT Таблица1.Автомат
 Таблица1.Продажи, Таблица1.Доход, Таблица2.[Место установки]
FROM [Таблица1] INNER JOIN [Таблица2]
ON Таблица1.Автомат = Таблица2.Автомат
WHERE  ((Abs([Таблица2].[Дата установки]-[Forms]![Форма1]![Поле1]))=
(SELECT MIN(Abs([r].[Дата установки]-[Forms]![Форма1]![Поле1]))  
FROM [Таблица2] [r] WHERE [r].[Автомат]=[Таблица2].[Автомат]  
And [r].[Дата установки]<[Forms]![Форма1]![Поле2])) 
AND ((Abs([Таблица1].[ДатаС]-[Forms]![Форма1]![Поле1]))=(SELECT MIN(Abs([g].[ДатаС]-[Forms]![Форма1]![Поле1])) 
FROM [Таблица1] g WHERE [g].[Автомат]=[Таблица1].[Автомат])) 
AND ((Abs([Таблица1].[ДатаПо]-[Forms]![Форма1]![Поле2]))=(SELECT MIN(Abs([g].[ДатаПо]-[Forms]![Форма1]![Поле2])) 
FROM [Таблица1] g WHERE [g].[Автомат]=[Таблица1].[Автомат])))
ORDER BY Таблица1.Автомат;
Допустим, я хочу просмотреть отчёт за сентябрь:
В форме1 у меня есть 2 поля для ввода дат:
в Поле1 ввожу "01.09.2009", в Поле2 ввожу "30.09.2009", нажимаю "Показать отчёт".
При моём запросе в отчёте отображаются следующие данные:
Автомат Место установки Продажи Доход
1 Пункт1 600 6000
2 Пункт4 400 4000
3 Пункт3 300 3000

Ошибки и Вопросы:
-для автомата 2 указывается место установки только с 17го числа.
Как сделать так, чтобы в Поле "Место установки" для данного автомата указывались бы Оба места его установки?
-для автоматов 2 и 3 в полях "Продажи" и "Доход" выводятся августовские данные.
Как сделать так, чтобы в случае отсутствия данных за требуемый месяц в указанных полях выводились бы нули?

Последний раз редактировалось Stilet; 23.03.2010 в 16:53.
Botanik1987 вне форума Ответить с цитированием
Старый 23.12.2009, 18:58   #2
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Botanik1987.
по поводу применения SQL конструкции с обращением к контролам формы (отчета) Вы можете прочесть здесь. Всё остальное (анализ и советы) возможны только после изучения Вашей конструкции.
Для увеличения вероятности оказания помощи, выкладывайте архив с заранее подготовленным файлом БД (подготовка подразумевает - избавление от переизбыточных данных, избавление от OLE объектов и сжатие средствами MS Access) на странице с вопросом.
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 25.12.2009, 15:27   #3
Botanik1987
Пользователь
 
Регистрация: 26.09.2008
Сообщений: 38
По умолчанию

Выкладываю исходник базы)вопрос остаётся в силе))
Вложения
Тип файла: rar Автоматы.rar (15.4 Кб, 22 просмотров)
Botanik1987 вне форума Ответить с цитированием
Старый 25.12.2009, 15:57   #4
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Botanik1987.
в существующем виде Ваша задача не может быть выполнена корректно.
1. не создано нормализованное отношение таблиц (отношение многие-к-многим не приемлемо)
2. отчетный период и период установки не соответствуют и потому вычисление "Продаж" и "Дохода" для "Места установки" не может быть выполнено.
такие впечатления.
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 25.12.2009, 16:41   #5
Botanik1987
Пользователь
 
Регистрация: 26.09.2008
Сообщений: 38
По умолчанию

Связь должна быть "Один ко многим"?
Что периоды не совпадают-это я понимаю,Для Таблицы2 пока вижу выход в том, что надо в начале каждого месяца обновлять информацию по месту установки.
Раньшн при отсутствии каких-либо данных у меня отчёт вообще не отображался.Потом условия отбора были слегка изменены.В случае полного заполнения всех данных (по каждому месяцу) отображается правильная информация, а вот при отсутствии данных по продажам в отчётном периоде отображаются данные предыдущего месяца-это не совсем верно))
А вот как сделать, чтобы при отсутствии этих самых данных показывались бы нули, я пока хз)))
Botanik1987 вне форума Ответить с цитированием
Старый 25.12.2009, 19:27   #6
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

"Связь должна быть "Один ко многим"?" - да, и только в такой конструкции возможна корректная работа.
"периоды не совпадают-это я понимаю..." - понимание и "в начале каждого месяца..." никак не решат проблему, необходим пересмотр структуры БД.
Обо всём остальном "рассуждать" можно только после корректировки Вашей конструкции.
Евгений.

Последний раз редактировалось Teslenko_EA; 25.12.2009 в 19:29.
Teslenko_EA вне форума Ответить с цитированием
Старый 29.12.2009, 11:07   #7
Botanik1987
Пользователь
 
Регистрация: 26.09.2008
Сообщений: 38
По умолчанию

Изменил немного структуру (хотя, в принципе, она такой и была-я просто сразу всё не выложил)База в архиве, вопрос всё тот же
Вложения
Тип файла: rar Автоматы.rar (17.0 Кб, 11 просмотров)
Botanik1987 вне форума Ответить с цитированием
Старый 30.12.2009, 18:10   #8
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Botanik1987.
Мои "соображения" в файле.
Удачи Вам.
С Новым Годом.
Евгений.
Вложения
Тип файла: rar Автоматы_вариант.rar (49.9 Кб, 22 просмотров)
Teslenko_EA вне форума Ответить с цитированием
Старый 23.03.2010, 16:30   #9
Botanik1987
Пользователь
 
Регистрация: 26.09.2008
Сообщений: 38
По умолчанию

Добрый день!
Подскажите, плз))
Имеется запрос:
SELECT Культуры_на_полях.Культура, Поля.Поле, Культуры_на_полях.[Дата посева]
FROM Поля INNER JOIN Культуры_на_полях ON Поля.Поле = Культуры_на_полях.Поле
WHERE (((Культуры_на_полях.[Дата посева])<=[Forms]![MenuCult]![Поле4]));

В условие надо добавить ещё >=(01.01.год из [Forms]![MenuCult]![Поле4]).Как это сделать, я не знаю...
Пример:поле4=23.03.2010=> условие должно быть >=01.01.2010 и <=23.03.2010
Заранее спасибо


И ещё вопрос:
в форме имеются два поля для ввода дат(поле1 и поле2) и свободное поле3
Допустим, поле1=первое число месяца любого года, а поле2-последнее число этого же месяца этого же года. Как сделать так, чтобы полю3 после ввода значения в поле2 автоматически присваивалось бы название этого месяца?
Заранее благодарю

Последний раз редактировалось Botanik1987; 23.03.2010 в 18:24.
Botanik1987 вне форума Ответить с цитированием
Старый 23.03.2010, 18:38   #10
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Botanik1987.
Если Вы откроете учебник, то наверняка найдете описание оператора Between, с помощью которого можно создать подобную конструкцию:
WHERE [Дата посева] Between [Forms]![MenuCult]![Поле4] and [Forms]![MenuCult]![Поле4]
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите сделать запрос с параметром-датой Herly Помощь студентам 9 22.12.2009 18:42
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
SQL запрос - проблема с датой Serval Помощь студентам 2 22.01.2009 19:35
нужно составить запрос с датой и временем! student90 БД в Delphi 5 26.09.2008 05:43
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15