| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB6 > Отбор клиентов по дате рождения |
| Автор: Vic 4.11.2004, 15:08 |
| У кого есть желание и время, помогите, пожалуйста. Есть база в Access. Есть таблица клиентов, куда, в том числе, введены даты рождения. Мне нужна процедура, которая бы отбирала тех клиентов, у которых сегодня день рождения. То есть должны совпадать месяц и число с текущей датой, а год может отличаться. Всем буду благодарна за идеи и советы, но лучше хотя бы частично готовый код, а то я буду задавать глупые вопросы. Заранее всем спасибо. |
| Автор: boevik 4.11.2004, 15:14 | ||
Vic, простой select:
|
| Автор: Vic 4.11.2004, 15:23 |
| Все гениальное просто. Спасибо огромное, boevik. Я с этим столько парилась, нет, чтоб сразу обратиться к знающим людям |
| Автор: Akina 4.11.2004, 15:44 | ||
| Vic 1) завтра тебе понадобится отбирать тех у кого день рождения завтра-послезавтра (особенно в пятницу...) Если категорически охота своими руками делать, то делай сразу по-человечески, а именно:
2) Не лучше ли использовать готовые напоминалки? |
| Автор: Vic 4.11.2004, 15:59 |
| Я как-то давно искала готовые напоминалки, мне не подошло ничего. Не помню почему. На счет двух дней я подумаю. не уверена, что в этом есть необходимость. Правда мне удобнее с прошедшим поздравлять. Тогда надо писать BETWEEN -2 AND 0 ? Может тогда будут конкреные решения для учета выходных. Честно говоря, для меня дни рождения на несколько дней неудобны |
| Автор: Akina 4.11.2004, 16:09 | ||||||
может... я о принципе... Добавлено @ 16:11
ну сделай order by
почему нет? |
| Автор: Vic 4.11.2004, 16:55 | ||
Это был вопрос |
| Автор: boevik 4.11.2004, 16:58 | ||
Vic, поподробнее |
| Автор: Akina 4.11.2004, 17:11 | ||
а в чем сложности-то? получить день недели - не проблема, построить запрос в зависимости от оного - тоже... |
| Автор: Vic 4.11.2004, 17:35 |
| Boevik, поподробнее легко. В понедельник приходишь на работу и выдается список клиентов, у которых был ДР в субботу, воскресенье и в понедельник. Но в идеале надо, чтобы за три дня выдавался список только в понедельник, а во все остальные дни только за текущий день. Поэтому способ "BETWEEN 0 AND 2" является возможным, но не самым подходящим для меня. Akina, Я конечно понимаю, что сложностей особенно нет для тебя, но я потрачу на это кучу времени. Поэтому я и спрашиваю в этом форуме. Это быстрее Так что имейте снисхождение к новичкам. |
| Автор: Akina 4.11.2004, 18:08 |
| Vic Как получить день недели - знаешь? не знаешь? попробуй format(now(),"w"). Как строить запрос в зависимости от дня недели - знаешь? не знаешь? попробуй if format(now(),"w") = vbMonday |
| Автор: boevik 4.11.2004, 23:29 |
| Vic, а если были праздники? Может надо в программе запоминать когда (в какой день) последний раз заходили в программу и выдавать все дни рождения между этими датами? Подумай над этим. |
| Автор: Vic 5.11.2004, 10:43 |
| Вот свяжись только с профессионалами. Сразу начнут все усложнять Все правильно, я подумаю над всем, что было предложенно |
| Автор: Akina 5.11.2004, 11:31 |
| boevik |
| Автор: boevik 5.11.2004, 15:16 |
| Vic, извини, что усложняем тебе жизнь. |
| Автор: Vic 9.11.2004, 17:25 | ||||
| И снова здравствуйте От меня не так-то просто отделаться, так что напрягите мозги еще раз, пожалуйста. Может присоветуете что Как можно реализовать идею, брошенную Akin'ей
Я создаю поле где хранится дата последнего входа в БД. Как создать процедуру, или SQL запрос, который бы проверял, вчера ли был последний вход, и если нет, то выдавал бы данные за все последние дни. У меня следующий SQL запрос для вывода сегодняшних ДР:
Буду признательна за идеи или готовые решения |
| Автор: Akina 9.11.2004, 18:04 | ||
Vic
Или я не понимаю вопроса? |
| Автор: boevik 9.11.2004, 19:46 | ||
Позволю себе дополнить немного мысль Akina
анологично и второй select. |
| Автор: Vic 10.11.2004, 13:57 | ||
Дополнила я запрос предложенным образом, на что мне было выдано следующее сообщение:
Может, будут предложения по упрощению выражения |
| Автор: Akina 10.11.2004, 14:02 |
| Vic Поясняю - Аксесс хочет, чтобы вместо strSQL=" .... WHERE (((Month([ДатаРожденияАгента]))=Month(Now())) ....." DoCMD.RunSQL было strTmp=str(Month(Now())) strSQL=" .... WHERE (((Month([ДатаРожденияАгента]))=" & strTmp & " ....." DoCMD.RunSQL или хотя бы strSQL=" .... WHERE (((Month([ДатаРожденияАгента]))=" & str(Month(Now())) & " ....." DoCMD.RunSQL |
| Автор: boevik 10.11.2004, 14:06 |
| Vic, покажи select. |
| Автор: Vic 10.11.2004, 14:40 | ||
Select выглядит следующим образом:
Akina, сейчас попробую разобраться в том, что ты написал, а то до меня пока не очень доходит. Я все писала в запросе на SQL, VBA вообще не использовала, поэтому я пока не понимаю, как применть то, что ты написал. |
| Автор: boevik 10.11.2004, 15:31 | ||
| Vic, LastDatabaseAccessDate это переменная в проге содержащая дату последнего обращения к базе. Её надо подставить в SQL. Т.е. конечный SQL должен выглядеть примерно так
Обрати внимание на формат даты и на решетки (#) |
| Автор: Vic 10.11.2004, 16:02 |
| Это я поняла. Такое сообщение выдается, когда я уже ввела LastDatabaseAccessDate. |
| Автор: boevik 10.11.2004, 16:06 |
| Vic, тогда покажи кусок кода который формирует и отправляет запрос. И так же приложи получившийся SQL statment. Всё должно работать, проверенно. |
| Автор: Vic 10.11.2004, 16:21 |
| У меня в данном случае вообще нет кода. Я просто создала SQL-запрос в Access и, когда я пытаюсь его выполнить, у меня сначала спрашивается LastDatabaseAccessDate, а потом выдается такое сообщение. |
| Автор: boevik 10.11.2004, 16:31 |
| Vic, это так и будет работать или ты пишешь какие то формы и код? Попробуй это так, как должно быть в конечном виде. |
| Автор: Guest 11.11.2004, 14:13 | ||
| Boevik, честно говоря, я не поняла твой последний вопрос. А что касается предложенноженного запроса, то у меня по нему тоже есть вопросы.
Как я понимаю, DateSerial возвращает некоторую дату. В данном случае эта такая дата, у которой год текущий, а месяц и число совпадают с днем и месяцем рождения агента. Кроме того, здесь еще устанавливается ограничение, что DateSerial BETWEEN #10/30/2004# AND Now(). Я не понимаю, где в этом запросе сопоставляется, что надо выбрать именно тех агентов, у которых число и месяц рождения = DateSerial. В моем понимании в предложенном запросе чего-то не зватает: Select - выводятся некоторые данные об агенте From - откуда выводятся эти данные Where - выводится некоторое число, которое само по себе зависит от ДатыРожденияАгента, но никак не влияет на то, что выводится SELECTом Не знаю, на сколько понятно то, что я написала, но в общем это все к тому, что у меня не работает этот запрос |
| Автор: Vic 11.11.2004, 14:46 |
| Упс, это я забыла зарегистрироваться |
| Автор: boevik 11.11.2004, 14:47 |
| Хорошо, Vic, попробую объяснить. С Select и From всё понятно. Теперь про условие. Нам надо отобрать всех агентов у которых день рождения попадает в промежуток времени от последнего входа до сегедняшнего дня. Так появилось BETWEEN #10/30/2004# AND Now(), т.е зашли в базу в последний раз 30 октября. Теперь дальше, каждый агент он родился в какой то год и они отличаются друг от друга. Так давая устроим так, как будто они все родились в этом году, получилось DateSerial(Year(Now), Month(ДатаРожденияАгента), Day(ДатаРожденияАгента)) Вот в принципе и вся логика. |
| Автор: Vic 11.11.2004, 17:00 |
| У меня все равно не получается. Ну ладно, буду пытаться Спасибо большое за внимание к вопросу |