расчет значений контрола в отчете (ленточной форме)

Igor Mitichev
Дата: 29.11.2009 13:02:03
Собственно, тема вытекает отсюда. Имеем таблицу:

┌───┬────────┬───────────────┐
│ID │ ФИО │ДатаПоступления│
├───┼────────┼───────────────┤
│1 │Иванов │ 12.03.1995 │
│2 │Петров │ 4.08.2008 │
│3 │Сидоров │ 29.12.2008 │
└───┴────────┴───────────────┘

Задача рассчитать стаж сотрудника на текущую дату. При чем не в абстрактных циферках, а сколько лет, месяцев и дней. Кое-какой скриптик на VBA я для этой цели придумал. Теперь сам вопрос.

Как сделать так (на какое событие повесить, или еще как вывернуться), чтобы данные были актуальны для каждого сотрудника в отчете (ленточной форме). Пока у меня получается, что во всех контролах указывается оно и то же значение (значение текущей записи в ленточной форме или значение первой записи в отчете). Такую распечатку в отдел кадров не отдашь...
отакота
Дата: 29.11.2009 13:45:32
Igor Mitichev
Как сделать так (на какое событие повесить, или еще как вывернуться), чтобы данные были актуальны для каждого сотрудника в отчете (ленточной форме). Пока у меня получается, что во всех контролах указывается оно и то же значение (значение текущей записи в ленточной форме или значение первой записи в отчете). Такую распечатку в отдел кадров не отдашь...


Можно тот код, что вы придумали оформить в виде отдельной процедуры (MyDateDiff), в которую параметром передать исходную дату для расчета, а возвращать эта функция должна будет вычисленную там строку стажа (т.е. искомое значение, в том виде как вы его хотите видеть в форме). Тогда можно в поле результата в свойстве "данные" написать вызов этой функции передав ей поле даты в качестве параметра: =MyDateDiff([полеДаты])
Igor Mitichev
Дата: 29.11.2009 14:11:04
отакота,

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

Как объявить в access глобальную переменную (описать глобальную функцию), чтобы к ней можно было обращаться (ее можно было вызвать) из любой формы/запроса/отчета базы данных.

Вот можем же мы написать запрос, использующий например системную функцию Date():

SELECT table1.ДатаПоступления,  Date()-table1.ДатаПоступления As [Стаж Работы]
FROM table1;

А как объявить пользовательскую функцию, чтобы к ней тоже можно было так обращаться?
отакота
Дата: 29.11.2009 14:38:03
Public Function MyFunction(...) As ...
это надо сделать в любом ОБЩЕМ модуле проекта (НЕ в модуле класса)
Igor Mitichev
Дата: 29.11.2009 14:59:15
отакота,

То есть мне надо сделать так, как на картинке, и потом прописывать уже код в этом вновь созданном модуле? Я правильно понял?
отакота
Дата: 29.11.2009 15:22:02
Да, но необязательно создавать новый модуль. Public-функцию можно написать в любом уже существующем модуле, главное - чтобы он не был модулем класса, т.е. чтобы это был обычный модуль (или общий) - такой, как выделен на вашей картинке. А создать его можно либо через в меню, либо по кнопке "Создать" в окне базы данных на вкладке "Модули". Да вы просто попробуйте, если вы опишете вашу функцию там где надо - вы тут же сможете вызвать ее в запросе - вот так и проверите.
Igor Mitichev
Дата: 29.11.2009 17:35:13
отакота
Да, но необязательно создавать новый модуль. Public-функцию можно написать в любом уже существующем модуле

Собственно, я вот из-за этого картинку и привел. На сколько я понимаю, в данном конкретном проекте пока общих модулей нет, и его надо создать вручную.

Я еще по интернету полазил, везде пишут что-то типа "можно написать в любом уже существующем модуле". А где их, уже существующие модули искать-то? Браузер VBA вроде ничего такого не показывает...
отакота
Дата: 29.11.2009 18:05:24
Igor Mitichev
отакота
Да, но необязательно создавать новый модуль. Public-функцию можно написать в любом уже существующем модуле

Собственно, я вот из-за этого картинку и привел. На сколько я понимаю, в данном конкретном проекте пока общих модулей нет, и его надо создать вручную.

Я еще по интернету полазил, везде пишут что-то типа "можно написать в любом уже существующем модуле". А где их, уже существующие модули искать-то? Браузер VBA вроде ничего такого не показывает...
Ну если еще нет, то конечно надо создать, о чем речь.

А существующие модули видны в оболочке VBA, в окне ProjectExplorer'а (том, что на вашей картинке) и в окне базы данных (то что открывается при окрытии файла mdb) на вкладке Модули
Igor Mitichev
Дата: 29.11.2009 22:48:16
отакота
Да вы просто попробуйте, если вы опишете вашу функцию там где надо - вы тут же сможете вызвать ее в запросе - вот так и проверите.


Да, спасибо. Так гораздо интереснее получается.