VB2010е, Access, Запрос к БД

iddqd_win
Дата: 07.03.2016 13:05:43
Имеется таблица Таблица1:
Событие Дата рТ рС
Событие1 01.01.2016 "" ""
Событие1 05.01.2016 4 4
Событие2 06.01.2016 "" ""
Событие1 07.01.2016 2 3

Где рТ - Текущая разница с последней датой для данного события, дней
рС - средняя разница по всем рТ не равным ""(необязательное условие, можно и ноль добавить, правда среднее для второго события сократится вдвое, но на дистанции выравняется) для данного события, дней

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

Сложность, для меня, в задании параметров для DateDiff.
Буду рад любой помощи.
sdku
Дата: 07.03.2016 15:00:13
iddqd_win,
Вычисления в таблицах - неправильно. рТ и рС-есть излишествующие данные
Вычисления проводятся в запросах (с параметрами-в данном случае, [введите дату] на которую хотите получить данные, это параметр)
как-то так:
PARAMETERS[введите дату] DateTime;
SELECT Таблица1.событие, DCount("событие","таблица1","дата<=#" & Format([введите дату],"mm\/dd\/yyyy") & "# and событие='" & [событие] & "'") AS Выражение1
FROM Таблица1
GROUP BY Таблица1.событие;
__Michelle
Дата: 07.03.2016 15:23:45
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));
__Michelle
Дата: 07.03.2016 15:34:18
iddqd_win
по всем рТ не равным ""
В результате чего рТ = "" ?
iddqd_win
Дата: 07.03.2016 15:38:32
__Michelle,
При добавлении в таблицу рТ будет равняться 0 дней. Не хотел ставить 0 потому что при второй дате, скажем с интервалом 10 дней, среднее значение будет равно 5, хотя по факту 10.
__Michelle
Дата: 07.03.2016 15:43:28
iddqd_win,

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

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


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

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) ' Сравнивает два запроса и выводит строки подпадающие под условие?


Заранее спасибо.
iddqd_win
Дата: 07.03.2016 17:42:53
Если в такой форме, выдает ошибку:
Ошибка синтаксиса (пропущен оператор) в выражении запроса 'Q.AvgAvgFROM Таблица1 INNER JOINSELECT PDKey'.
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()
mds_world
Дата: 07.03.2016 17:54:28
iddqd_win
Ошибка синтаксиса (пропущен оператор) в выражении запроса 'Q.AvgAvgFROM Таблица1 INNER JOINSELECT PDKey'.

Во всех строках не хватает пробелов между частями выражения. И они сливаются в непонятное для компилятора запросов. Поставьте пробелы в конце или начале строк.