|
|
|
| У меня в форме есть поле "должность" и вычисляемое поле "% к окладу"( если работа связана с вредными условиями). Вопрос: "Как правильно сделать проверку по полю "Должность", "= if ([Должность] = "Химлаборант"; 5 ; Null)". Вот так? Что не правильно в формуле?" | |
|
| |
|
|
|
|
| У меня почему-то все равно не присваивается полю "% от оклада" значение "5", если в поле "должность" значение "химлаборант". Почему? | |
|
| |
|
|
|
|
| у Вас по разному написано
"химлаборант" и "Химлаборант"
либо пишите правильно, либо используйте StrCompare() | |
|
| |
|
|
|
| Скорее всего у Вас [Должность] # "Химлаборант"
Cоветую сразу изменить Химлаборант на код должности "Химлаборант". Надеюсь у Вас есть отдельная таблица должностей в которой как минимум есть поля [ИД должности] и [название должности] | |
|
| |
|
|
|
| 1. Надбавка за вредность должна быть характеристикой единицы штатного расписания, а никак не вычисляемым полем.
2. Должен быть справочник должностей, что бы небыло этого: [Должность] = "Химлаборант" | |
|
| |
|
|
|
|
Надбавка за вредность должна быть характеристикой единицы штатного расписания, а никак не вычисляемым полем
|
Она и есть характеристика должности штатного расписания в форме "карта сотрудника", прсто этого поля "% надбавка" нет в таблицы. Я не хотел забивать для каждого сотрудника его %, а чтобы это поле автоматически в форме расчитывалось в зависимости от должности.
Должен быть справочник должностей, что бы небыло этого: [Должность] = "Химлаборант"
|
А вот справочника такого нет (может и зря), но уже позно. Если добавлять то придется много переделывать.
У меня ещё вопрос: "Что не верно в этой формуле?"
=IIf(Формы![tblSotrudnik]![Стаж]>20;20;IIf(Формы![tblSotrudnik]![Стаж]>15 And Формы![tblSotrudnik]![Стаж]<20;15;IIf(Формы![tblSotrudnik]![Стаж]>10 And Формы![tblSotrudnik]![Стаж]<15;10;IIf(Формы![tblSotrudnik]![Стаж]>5 And Формы![tblSotrudnik]![Стаж]<10;5;0))))
Так как в расчитываемом поле выдает "#Имя?" | |
|
| |
|
|
|
| в синтаксисе еще не разобрался а вот логическая ошибка присутствует .......
если стаж равен 5 или 10 или 15 или 20 годам то сотруднику процент надбавки будет -0
(в некоторых местах знак > надо заменить на >= ) | |
|
| |
|
|
|
|
Я не хотел забивать для каждого сотрудника его %
|
Не ленись. Что будете делать, если завтра придет приказ об увеличении надбавки с 5 до 6 %? Переделывать формы? И так каждый раз? Ню-ню.
А вот справочника такого нет (может и зря), но уже позно.
|
Никогда не поздно исправить ошибки, просто иногда проще сделать заново.
"Что не верно в этой формуле?"
|
Я бы описал функцию и считал бы ей. И работало бы быстрее. | |
|
| |
|
|
|
|
Не ленись. Что будете делать, если завтра придет приказ об увеличении надбавки с 5 до 6 %? Переделывать формы? И так каждый раз? Ню-ню.
|
Никогда не поздно исправить ошибки, просто иногда проще сделать заново.
|
Эта база использоваться где-либо не будет, так что пусть будет так я думаю.
Я бы описал функцию и считал бы ей. И работало бы быстрее.
|
Не мог бы ты рассказать как бы ты это сделал? Для меня сделать это моим путем проше, так как в Access недавно(азы есть, а глубохик познаний нет) и мне пока ещё трудно. | |
|
| |
|
|
|
| Как-то так:
Private Function funCounterInterval(ByVal DatStart As Date) As Long
Do While Date > DateAdd("yyyy", 1, DatStart)
funCounterInterval = funCounterInterval + 1
DatStart = DateAdd("yyyy", 1, DatStart)
Loop
End Function
Public Function funNemo(ByVal DatStart As Date)
Select Case funCounterInterval(DatStart)
Case Is < 5: funNemo = 0
Case 5 To 9: funNemo = 5
Case 10 To 14: funNemo = 10
Case 15 To 20: funNemo = 15
Case Is > 20: funNemo = 20
End Select
End Function
|
В итоговом поле, данные: =funNemo([ПолеДатыПриемаНаРаботу]) | |
|
| |
|
|
|
| 2Lukas
Мои действия:
-В меню "Обработке события-Приложения" поля "%за выслугу лет" я добавляю код приведенны выше.
-и в Своиствах этогоже поля "%за выслугу лет" в строке дата добавляю
=funNemo( Forms![tblSotrudnik]![Дата приема на работу] )
И у меня все равно в поле "%за выслугу лет" вместо ожидаемых чисел фигурирует надпись "#Имя?". Что не так опять? | |
|
| |
|
|
|
| Модуль создай.......
(это там где таблицы запросы формы отчеты макросы - найди Модули и нажми кнопку Создать)
в большом белом поле под строкой Option Compare Database
вставь код который Lukas прислал
закрой редактор VBA
а в поле "%за выслугу лет" в свойствах на вкладке Данные в строке данные вставь вызов функции (это - =(и все что там далее написано)) | |
|
| |
|
27 Кб. |
|
| Блин все равно в поле "% за стаж" пишет только "#Имя?" почему не пойму? Вот посмотрите БД. | |
|
| |
|
|
|
| Оказывается код работает при условие если запушено не толька форма "Табельсотрудника" в котором расчитывается значение, но и форма "карта сотрудника" из которой проверяется значение поля "Дата приема на работу". Почему так? | |
|
| |
|
|
|
|
=funNemo(Формы!tblSotrudnik![Дата приема на работу])
|
Вот это строка подразумевает, что форма, со странным префиксом "tbl", с названием "tblSotrudnik" должна быть загружена и в ней текущая запись должна соответствовать рассчитываемому в форме "tblTabelSotr" сотруднику.
У вас в форме "tblTabelSotr" есть комбобокс с данными "Сотрудник". По значению этого поля можно получить (функцией DlookUp, например) дату его приема на работу, и передавать эту дату в функцию.
Либо включить дату приема на работу в источник строк комбобокса "Сотрудник", и используя свойство Column и преобразование к типу Date передавать эту дату в функцию. | |
|
| |
|
|
|
|
У вас в форме "tblTabelSotr" есть комбобокс с данными "Сотрудник". По значению этого поля можно получить (функцией DlookUp, например) дату его приема на работу, и передавать эту дату в функцию.
Либо включить дату приема на работу в источник строк комбобокса "Сотрудник", и используя свойство Column и преобразование к типу Date передавать эту дату в функцию.
|
Покажи на примере пожалуйста, я так на словах не могу (. | |
|
| |
|
|
|
|
Вот это строка подразумевает, что форма, со странным префиксом "tbl", с названием "tblSotrudnik" должна быть загружена и в ней текущая запись должна соответствовать рассчитываемому в форме "tblTabelSotr" сотруднику.
|
Код работает вместе с формой "tblSotrudniki" и выдает всегда одно и тоде значение на разных сотрудников. А если в форме "tblSotrudniki" перейти на другово сотрудника, то значения меняются в нашей форме в соответствии со значениями поля "дата приема на работу". Как это можно исправить? | |
|
| |
|
|
|
|
Вот это строка подразумевает, что форма, со странным префиксом "tbl", с названием "tblSotrudnik" должна быть загружена и в ней текущая запись должна соответствовать рассчитываемому в форме "tblTabelSotr" сотруднику.
|
Код работает вместе с формой "tblSotrudniki" и выдает всегда одно и тоде значение на разных сотрудников. А если в форме "tblSotrudniki" перейти на другово сотрудника, то значения меняются в нашей форме в соответствии со значениями поля "дата приема на работу". Как это можно исправить? | |
|
| |
|
|
|
| Форма tblTabelSotr вычисляет и будет вычислять только тогда, когда будет открыта форма tblSotrudnik, в остальных случаях будет ошибка или что угодно. При этом вычислять будет на кого угодно и что угодно. Вы зе %за стаж так пишете =funNemo(Forms!tblSotrudnik![Дата приема на работу]), а форма "Сотрудник" не открыта. Сделали бы в подчиненной форме. Или проще - запрос с вычисляемым полем. | |
|
| |
|
43 Кб. |
|
| Черт его знает на счет функции. Как и из чего она считает не разбирался. Оставил как есть. Но имея формулы можно бы в запросе вычислить. Оформление тагсе, но примерно в моем исполнении было бы примерно так.
Хотя я бы все делал иначе с самого начала. Могу выслать на майл вырезку из своего давнего учета сотрудников. Работающее. Там как пример масса всяких вычислений и прочего. Сюда не лезет, в раре 150 кБт. Еггог выскакивает. | |
|
| |
|
|
|
| вот уж действительно век живи век учись (я про DlookUp).........
вот код......замени в код модуле на то что написано ниже
Private Function funCounterInterval(ByVal DatStart As Date) As Long
Do While Date > DateAdd("yyyy", 1, DatStart)
funCounterInterval = funCounterInterval + 1
DatStart = DateAdd("yyyy", 1, DatStart)
Loop
End Function
Public Function funNemo(ByVal Sotrudnik As Integer)
Dim DatStart As Date
If Sotrudnik <> 0 Then
DatStart = DLookup("[Дата приема на работу]", "tblSotrudnik", "Код=" & Sotrudnik)
Select Case funCounterInterval(DatStart)
Case Is < 5: funNemo = 0
Case 5 To 9: funNemo = 5
Case 10 To 14: funNemo = 10
Case 15 To 20: funNemo = 15
Case Is > 20: funNemo = 20
End Select
End If
End Function
и вызов функции на следующее
=funNemo([Сотрудник])
должно помочь.............
(если будут благодарности то это в адрес Lukas - его идея) | |
|
| |
|
|
|
|
| Все вроде правильно сделал, но все равно без формы "Sotrudnik" не работает. А когда она запушена, то выдает ошибку "Invalid use of Null" | |
|
| |
|
|
|
| там нет ссылки на форму Sotrudnik......
Sotrudnik - это переменная (я обозначил ее как integer, Lukas меня поправил что нужно Long) | |
|
| |
|
|
|
| Если конечно вы формы не переименовали | |
|
| |
|
|
|
| Я переделал все. Сделал подчиненную форму использовал первый вариант кода без (DlookUp), вроде все работает. Спасибо большое всем, что помогли разобраться. | |
|
| |