Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Построение запросов / 5 сообщений из 5, страница 1 из 1
16.04.2016, 19:31
    #39217290
Alex Pancho
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение запросов
Помогите с построением запросов:

1) Надо починить запрос, чтобы он выбирал и добавлял только новые данные о времени работы (Чтобы не дублировало старые данные)
в модуле csvParser:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
strSQLchk = "SELECT SourceData.pid, SourceData.fday, SourceData.ftime, SourceData.punch " & _
"FROM (SELECT atWT.pid, atWT.fDay, atWT.fTime, atWT.punch " & _
"FROM atWT INNER JOIN SourceData ON (atWT.pid = SourceData.pid) AND (atWT.fDay = SourceData.fday) " & _
"WHERE ((SourceData.PID) Is Not Null) " & _
"GROUP BY atWT.pid, atWT.fDay, atWT.fTime, atWT.punch " & _
") as Q2 " & _
"RIGHT JOIN SourceData ON Q2.pid=SourceData.pid " & _
"WHERE ((Q2.fday) <> (SourceData.fday)) " & _
"GROUP BY SourceData.pid, SourceData.fday, SourceData.ftime, SourceData.punch "


Он работает, но не совсем хорошо - если данных по дате нет совсем - то добавляет только новые, но если данные по дате есть - добавляет дубль.

2) Контроль корректности данных при начальном импорте.
Сейчас при импорте данных из цсв работает контроль правильности, группируя данные по дате. Однако, если смена будет начинаться в один день и заканчиватся в другой - это работать не будет.
Реализовано запросом:
Код: vbnet
1.
2.
3.
strSql = "SELECT SourceData.pid, SourceData.Sname, SourceData.Fname, SourceData.fday " & _
    "FROM SourceData GROUP BY SourceData.pid, SourceData.Sname, SourceData.Fname, SourceData.fday " & _
    "HAVING ((Count(*) Mod 2)=1)"


Как поменять, чтоб работало для смен начинающихся в разные сутки?
...
Рейтинг: 0 / 0
17.04.2016, 08:21
    #39217460
Злой Бобр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение запросов
Alex Pancho,

Извини, но телепаты в отпуске. Указывай что в какой переменной, тип данных, ... Иначе никто тебе не поможет, т.к. тратить время на понимание "откуда ноги растут" глупо.
...
Рейтинг: 0 / 0
17.04.2016, 11:24
    #39217482
Alex Pancho
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение запросов
Злой Бобр,

Таблица SourceData
поля:
pid - персональный ИД пользователя (Длинное целое)

fDay - дата события (дата/время)

fTime - время события (дата/время)

punch - событие (1 - вход, 0 - выход)

Таблица atWT
поля:

id - счетчик, ключевое, для работы с запросами и пр.

pid - персональный ИД пользователя (Длинное целое)

fDay - дата события (дата/время)

fTime - время события (дата/время)

punch - событие (1 - вход, 0 - выход)

Собственно данные из SourceData запросом 1:1 переносятся в atWT после проверки корректности

Когда в atWT у меня такие данные:
Код: plaintext
1.
2.
pid	fday		ftime		punch
66	05.11.2015	13:57:00	1
66	05.11.2015	23:18:00	0

а в SourceData такие данные:
Код: plaintext
1.
2.
3.
4.
5.
pid	fday		ftime		punch
66	05.11.2015	13:57:00	1
66	05.11.2015	23:18:00	0
66	06.11.2015	10:01:00	1
66	06.11.2015	19:10:00	0

То запрос, который я привел добавляет только нужные мне новые строки:
Код: plaintext
1.
2.
3.
pid	fday		ftime		punch
66	06.11.2015	10:01:00	1
66	06.11.2015	19:10:00	0

Но, если файл обработать повторно ( а такое может быть - ошибочное нажатие, например)
то данные добавляются еще раз, причем обе строки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
pid	fday		ftime		punch
66	05.11.2015	13:57:00	1
66	05.11.2015	23:18:00	0
66	06.11.2015	10:01:00	1
66	06.11.2015	19:10:00	0
66	05.11.2015	13:57:00	1
66	05.11.2015	23:18:00	0
66	06.11.2015	10:01:00	1
66	06.11.2015	19:10:00	0

Поэтому, запрос мой неверен, а как нааписать правильный - уж мозг выкипел....
...
Рейтинг: 0 / 0
18.04.2016, 09:57
    #39217814
Злой Бобр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение запросов
Alex Pancho
Попробуй этот запрос. Делал "на коленке" поэтому могут быть ошибки. Сделай бекапчик перед экспериментами.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT *
FROM SourceData
WHERE (SourceData.pid NOT IN (
    SELECT atWT.pid
    FROM atWT
    WHERE ((atWT.pid=SourceData.pid) AND (atWT.fDay=SourceData.fDay) AND (atWT.fTime=SourceData.fTime) AND (atWT.punch=SourceData.punch))
    ))
GROUP BY SourceData.pid, SourceData.fday, SourceData.ftime, SourceData.punch
...
Рейтинг: 0 / 0
18.04.2016, 20:23
    #39218594
Alex Pancho
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение запросов
В общем то я понял, что без вложенных запросов - никак, но надо проверять два поля. Поэтому за основу взяв мысли Злого Бобра решил так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT SourceData.pid, SourceData.fday, SourceData.ftime, SourceData.punch
FROM SourceData
WHERE (
((SourceData.fday) Not In (
    SELECT DISTINCT a.fday
    FROM SourceData AS s INNER JOIN atWT AS a ON 
    (s.ftime=a.fTime) AND (s.pid=a.pid) AND (s.fday=a.fDay)
)) AND 
((SourceData.fTime) Not In (
    SELECT a.fTime
    FROM SourceData AS s INNER JOIN atWT AS a ON 
    (s.ftime=a.fTime) AND (s.pid=a.pid) AND (s.fday=a.fDay)
)));


Работает!
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Построение запросов / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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