powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / VB2010е, Access, Запрос к БД
25 сообщений из 54, страница 1 из 3
VB2010е, Access, Запрос к БД
    #39187129
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется таблица Таблица1:
Событие Дата рТ рССобытие1 01.01.2016 "" ""Событие1 05.01.2016 4 4Событие2 06.01.2016 "" ""Событие1 07.01.2016 2 3
Где рТ - Текущая разница с последней датой для данного события, дней
рС - средняя разница по всем рТ не равным ""(необязательное условие, можно и ноль добавить, правда среднее для второго события сократится вдвое, но на дистанции выравняется) для данного события, дней

При добавлении новой записи, нужно посчитать разницу с последней(наибольшей) датой для данного события - записать полученное значение в рТ и посчитать среднее для всех рТ по добавляемому событию и записать значение в рС.
Подскажите где ошибка?:
Код: vbnet
1.
SqlCom = New OleDbCommand("INSERT into Таблица1(Событие, Дата, рТ, рС) values('" & TextBox1.Text & "', '" & DateTimePicker1.Value.Date & "', '" & DateDiff("d", Max(Дата), Date()) &"', '" & Avg(рТ) & "' WHERE Событие = '" & TextBox1.Text & "'", Con)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187181
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Небольшое уточнение:
Событие - текстовый, Дата - Дата\Время, рС и рТ - Числовые. Двойными кавычками я пытался изобразить пустое поле) но можно заменить нулем.
Работа программы будет выглядеть следующим образом. На форме есть поля для добавления записей. Программа при старте должна делать прогноз - то есть, по прошествии с события дней больше чем рС, делать уведомление.
Если не делать запись значений рС, рТ в бд, то должно получится что-то типо такого:
Код: vbnet
1.
"Select * from Таблица1 where DateDiff(с последнего) > DateDiff(среднее)"


Сложность, для меня, в задании параметров для DateDiff.
Буду рад любой помощи.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187182
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win,
Вычисления в таблицах - неправильно. рТ и рС-есть излишествующие данные
Вычисления проводятся в запросах (с параметрами-в данном случае, [введите дату] на которую хотите получить данные, это параметр)
как-то так:
Код: vbnet
1.
2.
3.
4.
PARAMETERS[введите дату] DateTime;
SELECT Таблица1.событие, DCount("событие","таблица1","дата<=#" & Format([введите дату],"mm\/dd\/yyyy") & "# and событие='" & [событие] & "'") AS Выражение1
FROM Таблица1
GROUP BY Таблица1.событие;
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187189
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
SELECT Таблица1.*, DateDiff("d", Таблица1.Дата, Date()) AS DD, Q.AvgAvg
FROM Таблица1 INNER JOIN 
(SELECT PDKey, Avg(DateDiff("d", Дата, Date())) AS AvgAvg FROM Таблица1 GROUP BY Таблица1.Событие) AS Q 
ON Таблица1.Событие = Q.Событие
WHERE (((DateDiff("d", Таблица1.Дата, Date())) > Q.AvgAvg));
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187196
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_winпо всем рТ не равным ""В результате чего рТ = "" ?
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187199
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,
При добавлении в таблицу рТ будет равняться 0 дней. Не хотел ставить 0 потому что при второй дате, скажем с интервалом 10 дней, среднее значение будет равно 5, хотя по факту 10.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187202
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win,

А, не учла "разница с последней датой для данного события", брала с текущей датой.
Вместо Date() в запросе нужно ввести определение этой последней даты.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187255
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelleiddqd_win,

А, не учла "разница с последней датой для данного события", брала с текущей датой.
Вместо Date() в запросе нужно ввести определение этой последней даты.

В какой строке? И давайте пройдемся вместе по коду, чтобы я не тупо переписал, а понял что к чему) код в вб уже:

Код: vbnet
1.
2.
3.
4.
5.
SqlCom = New OleDbCommand("SELECT Таблица1.*(нужно заменить на "Select * from Таблица1" или нет?), DateDiff(""d"", Дата, Date()) AS DD, Q.AvgAvg" _ ' здесь задается переменная Q.AvgAvg и высчитываем текущую разницу(рТ)?
                                  & "FROM Таблица1 INNER JOIN" _ ' Объединение запросов
                                  & ("SELECT PDKey, Avg(DateDiff(""d"", Дата, Date())) AS AvgAvg FROM Таблица1 GROUP BY Событие) AS Q" _ ' Вот здесь начинается то что вызывает главные трудности) Для начала так понимаю Date() надо изменить здесь?(на что? Как обозначить следующую дату?) В этой строке считаем средний datediff для прошедших событий? Для чего PDKey нужен и сортировка? Всему этому присваиваем значение Q?  
                                  & "ON Событие = Q.Событие" _ 
                                  & "WHERE (((DateDiff(""d"", Дата, Date())) > Q.AvgAvg))", Con) ' Сравнивает два запроса и выводит строки подпадающие под условие?



Заранее спасибо.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187261
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если в такой форме, выдает ошибку:
Ошибка синтаксиса (пропущен оператор) в выражении запроса 'Q.AvgAvgFROM Таблица1 INNER JOINSELECT PDKey'.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SqlCom = New OleDbCommand("SELECT Таблица1.*, DateDiff(""d"", Дата, Date()) AS DD, Q.AvgAvg" _
                                & "FROM Таблица1 INNER JOIN" _
                                & "SELECT PDKey, Avg(DateDiff(""d"", Дата, Date())) AS AvgAvg FROM Таблица1 GROUP BY Событие) AS Q" _
                                & "ON Таблица1.Событие = Q.Событие" _
                                & "WHERE DateDiff(""d"", Дата, Date()) > Q.AvgAvg", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        DA = New OleDbDataAdapter(SqlCom)
        DA.Fill(DT)
        Grid.DataSource = DT
        Con.Close()
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187265
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_winОшибка синтаксиса (пропущен оператор) в выражении запроса 'Q.AvgAvgFROM Таблица1 INNER JOINSELECT PDKey'.
Во всех строках не хватает пробелов между частями выражения. И они сливаются в непонятное для компилятора запросов. Поставьте пробелы в конце или начале строк.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187266
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробелы забыл) Теперь так: Ошибка синтаксиса в предложении FROM
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187271
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win__Michelleiddqd_win,

А, не учла "разница с последней датой для данного события", брала с текущей датой.
Вместо Date() в запросе нужно ввести определение этой последней даты.
В какой строке?Простите, отвлекли.)))
Сейчас попробую показать...
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187279
iddqd_winЕсли в такой форме, выдает ошибку:
Ошибка синтаксиса (пропущен оператор) в выражении запроса 'Q.AvgAvgFROM Таблица1 INNER JOINSELECT PDKey'.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SqlCom = New OleDbCommand("SELECT Таблица1.*, DateDiff(""d"", Дата, Date()) AS DD, Q.AvgAvg" _
                                & "FROM Таблица1 INNER JOIN" _
                                & "SELECT PDKey, Avg(DateDiff(""d"", Дата, Date())) AS AvgAvg FROM Таблица1 GROUP BY Событие) AS Q" _
                                & "ON Таблица1.Событие = Q.Событие" _
                                & "WHERE DateDiff(""d"", Дата, Date()) > Q.AvgAvg", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        DA = New OleDbDataAdapter(SqlCom)
        DA.Fill(DT)
        Grid.DataSource = DT
        Con.Close()

перед SELECT PDKey скобки не хватает
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187280
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT T.*, 
DateDiff("d", T.Дата, (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)) AS DD, 
Q.AvgAvg
FROM Таблица1 AS T INNER JOIN 
(SELECT Событие, Avg(DateDiff("d", Дата, (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC))) AS AvgAvg FROM Таблица1 GROUP BY Событие) AS Q 
ON T.Событие = Q.Событие
WHERE (((DateDiff("d", T.Дата, (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC))) > Q.AvgAvg));

Ну вот, наскоро, надеюсь, без ошибок.
Здесь буква "T" - алиасное имя таблицы Таблица1 - латинская.
Попробуйте выполнить как запрос из окна БД.
Если результат будет похож на ожидаемый, тогда посмотрим, что дальше.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187302
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,
Если выполнять запрос в Access то просит ввести T.Событие. Если ввожу Событие1 то выводит следующее
Событие Дата DD AvgAvgСобытие1 27.02.2016 6 4Событие1 25.02.2016 8 4Событие2 27.02.2016 6 4Событие2 23.02.2016 10 4

Исходная таблица выглядит так

Событие Дата Событие1 25.02.2016 Событие1 27.02.2016 Событие1 29.02.2016 Событие1 02.03.2016 Событие1 04.03.2016 Событие2 23.02.2016 Событие2 27.02.2016 Событие2 03.03.2016 Событие2 06.03.2016

То есть что то не так) Да и ввод Т.События меня настораживает)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187312
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win,

Да, не должно ничего требовать.
Вот, попробуйте, пожалуйста.
Код: sql
1.
2.
3.
4.
5.
SELECT T.*, DateDiff("d",T.Дата,(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)) AS DD, Q.AvgAvg
FROM Таблица1 AS T INNER JOIN (SELECT Событие, Avg(DateDiff("d",Дата,(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC))) AS AvgAvg
FROM Таблица1 AS T
GROUP BY Событие) AS Q ON T.Событие = Q.Событие
WHERE (((DateDiff("d",T.[Дата],(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)))>Q.[AvgAvg]));
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187411
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,
Ни чего вводить не просит)
Событие Дата DD AvgAvgСобытие1 27.02.2016 6 4Событие1 25.02.2016 8 4Событие2 27.02.2016 8 575Событие2 23.02.2016 12 575
Но не то) Здесь DD взято от максимального события, а не от сегодня - это я подправил.
Событие Дата DD AvgAvgСобытие1 02.03.2016 6 4Событие1 29.02.2016 8 4Событие1 27.02.2016 10 4Событие1 25.02.2016 12 4Событие2 27.02.2016 10 575Событие2 23.02.2016 14 575
А вот средняя не правильно считается. Как я понимаю, тут главное правильно составить алгоритм определения предыдущей даты?
Что-то типа дата для события1 которая меньше даты события1 искомой и если их несколько то максимальная из дат и все это загнать сначала в DateDiff а потом в Avg. И нужно еще исключить повторения, то есть надо вывести максимальное для события попадающего под условия.
Заранее спасибо за оказанную помощь.
Ну и пользуясь случаем, с 8 марта Вас!)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187458
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win,

Спасибо за поздравление! Очень приятно!

Все-таки, "рТ - Текущая разница с последней датой для данного события" ( 18905198 ), или "с сегодняшней датой" ( 18907641 )?
Если "с сегодняшней датой", то вот результат в табличке, подходит?
Пока для наглядности выводятся все строки и добавлен столбец Res.Событие Дата DD AvgAvg ResСобытие1 25.02.2016 12 8 >Событие1 27.02.201610 8 >Событие1 29.02.2016 8 8 =Событие1 02.03.2016 6 8 <Событие1 04.03.2016 4 8 <Событие2 23.02.2016 14 7.75 >Событие2 27.02.2016 10 7.75 >Событие2 03.03.2016 5 7.75 <Событие2 06.03.2016 2 7.75 <
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187787
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,

Да рТ с сегодня разница, то есть пока событие не произошло еще раз, рС между событиями, средняя переодичность.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187838
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win,

То есть, "последняя дата" это не "максимальная для события", а "предыдущая относительно данной даты события"?
Тогда вариант:
Запрос 1. Определяем интервалы между датами события.
Код: sql
1.
2.
3.
4.
SELECT Событие, Дата, 
Avg(DateDiff("d",(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие AND Дата<T.Дата ORDER BY Дата DESC),Дата)) AS DD
FROM Таблица1 AS T
GROUP BY Событие, Дата;

РезультатСобытие Дата DDСобытие1 25.02.2016 Событие1 27.02.2016 2Событие1 29.02.2016 2Событие1 02.03.2016 2Событие1 04.03.2016 2Событие2 23.02.2016 Событие2 27.02.2016 4Событие2 03.03.2016 5Событие2 06.03.2016 3Запрос 2. Определяем среднее значение интервала для каждого события.
Код: sql
1.
2.
3.
SELECT Событие, Avg(DD) AS AvgAvg
FROM Запрос1
GROUP BY Событие;

РезультатСобытие AvgAvgСобытие1 2Событие2 4Запрос 3. Искомый результат. Выбираем записи с интервалами выше среднего для события.
Код: sql
1.
2.
3.
SELECT Запрос1.*, Запрос2.AvgAvg
FROM Запрос1 INNER JOIN Запрос2 ON Запрос1.Событие = Запрос2.Событие
WHERE Запрос1.DD > Запрос2.AvgAvg;

РезультатСобытие Дата DD AvgAvgСобытие2 03.03.2016 5 4
Ну как, подходит?)))
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187936
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Идеально) Огромное Вам спасибо!!!
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187985
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
))).
Оказалось, самое трудное - правильно понять (или сформулировать?) задачу.)))
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188604
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,
Поторопился маленько)) Забыли самое главное)) ввел еще один запрос(рТН) для определения DateDiff с события до сегодня
Код: plsql
1.
2.
3.
SELECT T.Событие, T.Дата, DateDiff("d",T.Дата,(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)) AS Текущая
FROM Таблица1 AS T
GROUP BY T.Событие, T.Дата;


И теперь последний запрос
Код: plsql
1.
2.
3.
SELECT рТН.*, рС.Средняя
FROM рТН INNER JOIN рС ON рТН.Событие=рС.Событие
WHERE рТН.Текущая>рС.Средняя;


И теперь не могу сгруппировать чтобы только самое последнее отображалось
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188609
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,

То есть чтобы получилось примерно следующее:
Событие ПоследняяДата ТекущаяРазница СредняяРазница
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188615
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win,

Правильно ли я понимаю, что требуется что-то вроде прогноза - каким был бы интервал, если событие произошло бы сегодня.
И средний интервал рассчитать с учетом полученного значения.
Так или нет?
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 1 из 3
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / VB2010е, Access, Запрос к БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]