Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Отбор клиентов по дате рождения


Автор: Vic 4.11.2004, 15:08
У кого есть желание и время, помогите, пожалуйста.

Есть база в Access. Есть таблица клиентов, куда, в том числе, введены даты рождения. Мне нужна процедура, которая бы отбирала тех клиентов, у которых сегодня день рождения.
То есть должны совпадать месяц и число с текущей датой, а год может отличаться.

Всем буду благодарна за идеи и советы, но лучше хотя бы частично готовый код, а то я буду задавать глупые вопросы.

Заранее всем спасибо.

Автор: boevik 4.11.2004, 15:14
Vic, простой select:
Код

SELECT *
FROM Table1
WHERE month(birthday) = month(now) and day(birthday) = day(now)

Автор: Vic 4.11.2004, 15:23
Все гениальное просто.
Спасибо огромное, boevik.
Я с этим столько парилась, нет, чтоб сразу обратиться к знающим людям

Автор: Akina 4.11.2004, 15:44
Vic
1) завтра тебе понадобится отбирать тех у кого день рождения завтра-послезавтра (особенно в пятницу...) smile
Если категорически охота своими руками делать, то делай сразу по-человечески, а именно:

Код

SELECT *
FROM Table1
WHERE (Now - DateSerial(Year(Now), Month(birthday), Day(birthday))) BETWEEN 0 AND 2


2) Не лучше ли использовать готовые напоминалки?

Автор: Vic 4.11.2004, 15:59
Я как-то давно искала готовые напоминалки, мне не подошло ничего. Не помню почему. На счет двух дней я подумаю. не уверена, что в этом есть необходимость. Правда мне удобнее с прошедшим поздравлять.
Тогда надо писать
BETWEEN -2 AND 0 ?
Может тогда будут конкреные решения для учета выходных. Честно говоря, для меня дни рождения на несколько дней неудобны


Автор: Akina 4.11.2004, 16:09
Цитата
Тогда надо писать
BETWEEN -2 AND 0 ?

может... я о принципе...
Добавлено @ 16:11
Цитата
для меня дни рождения на несколько дней неудобны

ну сделай order by

Цитата
Может тогда будут конкреные решения для учета выходных.

почему нет?

Автор: Vic 4.11.2004, 16:55
Цитата
Может тогда будут конкреные решения для учета выходных.


Это был вопрос smile . Я просто не правильно сформулировала. Может у кого-то есть конктретные предложения по поводу выходных?


Автор: 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, Я конечно понимаю, что сложностей особенно нет для тебя, но я потрачу на это кучу времени. Поэтому я и спрашиваю в этом форуме. Это быстрее smile .
Так что имейте снисхождение к новичкам.

Автор: 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
Вот свяжись только с профессионалами. Сразу начнут все усложнять smile
Все правильно, я подумаю над всем, что было предложенно

Автор: Akina 5.11.2004, 11:31
boevik smile smile smile

Автор: boevik 5.11.2004, 15:16
Vic, извини, что усложняем тебе жизнь. smile

Автор: Vic 9.11.2004, 17:25
И снова здравствуйте smile
От меня не так-то просто отделаться, так что напрягите мозги еще раз, пожалуйста. Может присоветуете что

Как можно реализовать идею, брошенную Akin'ей
Цитата
а если были праздники?
Может надо в программе запоминать когда (в какой день) последний раз заходили в программу и выдавать все дни рождения между этими датами?


Я создаю поле где хранится дата последнего входа в БД. Как создать процедуру, или SQL запрос, который бы проверял, вчера ли был последний вход, и если нет, то выдавал бы данные за все последние дни.
У меня следующий SQL запрос для вывода сегодняшних ДР:

Код

SELECT  [ФамилияАгента] & " " & [ИмяАгента] & " " & [ОтчествоАгента] AS ФИОагента, ДатаРожденияАгента, Пометки
FROM tblАгент
WHERE (((Month([ДатаРожденияАгента]))=Month(Now())) AND ((Day([ДатаРожденияАгента]))=Day(Now())))
UNION SELECT [ФамилияКонтрагента] & " " & [ИмяКонтрагента] & " " & [ОтчествоКонтрагента] AS ФИОконтрагента, ДатаРожденияКонтрагента, Пометки
FROM tblКонтрагент
WHERE (((Month([ДатаРожденияКонтрагента]))=Month(Now())) AND ((Day([ДатаРожденияКонтрагента]))=Day(Now())));


Буду признательна за идеи или готовые решения

Автор: Akina 9.11.2004, 18:04
Vic
Код

BETWEEN LastDatabaseAccessDate AND Now()

Или я не понимаю вопроса?

Автор: boevik 9.11.2004, 19:46
Позволю себе дополнить немного мысль Akina

Код

SELECT  [ФамилияАгента] & " " & [ИмяАгента] & " " & [ОтчествоАгента] AS ФИОагента, ДатаРожденияАгента, Пометки
FROM tblАгент
WHERE DateSerial(Year(Now), Month(ДатаРожденияАгента), Day(ДатаРожденияАгента)) BETWEEN LastDatabaseAccessDate AND Now()

анологично и второй select.

Автор: Vic 10.11.2004, 13:57
Дополнила я запрос предложенным образом, на что мне было выдано следующее сообщение:

Цитата
Выражение неверно введено или является слишком сложным для расчета. Например, числовое выражение может содержать слишком много элементов. Попытайтесь упростить выражения, определив его части как переменные.


Может, будут предложения по упрощению выражения smile

Автор: 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 выглядит следующим образом:

Цитата
SELECT  [ФамилияАгента] & " " & [ИмяАгента] & " " & [ОтчествоАгента] AS ФИОагента, ДатаРожденияАгента, Пометки
FROM tblАгент
WHERE DateSerial(Year(Now), Month(ДатаРожденияАгента), Day(ДатаРожденияАгента)) BETWEEN LastDatabaseAccessDate AND Now()
UNION SELECT [ФамилияКонтрагента] & " " & [ИмяКонтрагента] & " " & [ОтчествоКонтрагента] AS ФИОконтрагента, ДатаРожденияКонтрагента, Пометки
FROM tblКонтрагент
WHERE DateSerial(Year(Now), Month(ДатаРожденияКонтрагента), Day(ДатаРожденияКонтрагента)) BETWEEN LastDatabaseAccessDate AND Now();


Akina, сейчас попробую разобраться в том, что ты написал, а то до меня пока не очень доходит. Я все писала в запросе на SQL, VBA вообще не использовала, поэтому я пока не понимаю, как применть то, что ты написал.

Автор: boevik 10.11.2004, 15:31
Vic, LastDatabaseAccessDate это переменная в проге содержащая дату последнего обращения к базе. Её надо подставить в SQL.
Т.е. конечный SQL должен выглядеть примерно так

Код

SELECT  [ФамилияАгента] & " " & [ИмяАгента] & " " & [ОтчествоАгента] AS ФИОагента, ДатаРожденияАгента, Пометки
FROM tblАгент
WHERE DateSerial(Year(Now), Month(ДатаРожденияАгента), Day(ДатаРожденияАгента)) BETWEEN #10/30/2004# AND Now()

Обрати внимание на формат даты и на решетки (#)

Автор: 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, честно говоря, я не поняла твой последний вопрос.
А что касается предложенноженного запроса, то у меня по нему тоже есть вопросы.

Цитата
SELECT  [ФамилияАгента] & " " & [ИмяАгента] & " " & [ОтчествоАгента] AS ФИОагента, ДатаРожденияАгента, Пометки
FROM tblАгент
WHERE DateSerial(Year(Now), Month(ДатаРожденияАгента), Day(ДатаРожденияАгента)) BETWEEN #10/30/2004# AND Now()


Как я понимаю, DateSerial возвращает некоторую дату. В данном случае эта такая дата, у которой год текущий, а месяц и число совпадают с днем и месяцем рождения агента.
Кроме того, здесь еще устанавливается ограничение, что DateSerial BETWEEN #10/30/2004# AND Now().
Я не понимаю, где в этом запросе сопоставляется, что надо выбрать именно тех агентов, у которых число и месяц рождения = DateSerial.
В моем понимании в предложенном запросе чего-то не зватает:
Select - выводятся некоторые данные об агенте
From - откуда выводятся эти данные
Where - выводится некоторое число, которое само по себе зависит от ДатыРожденияАгента, но никак не влияет на то, что выводится SELECTом

Не знаю, на сколько понятно то, что я написала, но в общем это все к тому, что у меня не работает этот запрос smile




Автор: 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
У меня все равно не получается.
Ну ладно, буду пытаться smile
Спасибо большое за внимание к вопросу

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)