Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как правильно задать проверку?(Access'03)
 
 автор: Dimka   (14.05.2009 в 11:27)   личное сообщение
 
 

У меня в форме есть поле "должность" и вычисляемое поле "% к окладу"( если работа связана с вредными условиями). Вопрос: "Как правильно сделать проверку по полю "Должность", "= if ([Должность] = "Химлаборант"; 5 ; Null)". Вот так? Что не правильно в формуле?"

  Ответить  
 
 автор: Гамлет   (14.05.2009 в 11:36)   личное сообщение
 
 

iif

  Ответить  
 
 автор: Dimka   (14.05.2009 в 11:43)   личное сообщение
 
 

У меня почему-то все равно не присваивается полю "% от оклада" значение "5", если в поле "должность" значение "химлаборант". Почему?

  Ответить  
 
 автор: Dimka   (14.05.2009 в 11:47)   личное сообщение
 
 

Все получилось.

  Ответить  
 
 автор: Дрюня   (14.05.2009 в 11:47)   личное сообщение
 
 

у Вас по разному написано
"химлаборант" и "Химлаборант"
либо пишите правильно, либо используйте StrCompare()

  Ответить  
 
 автор: Гамлет   (14.05.2009 в 11:50)   личное сообщение
 
 

Скорее всего у Вас [Должность] # "Химлаборант"
Cоветую сразу изменить Химлаборант на код должности "Химлаборант". Надеюсь у Вас есть отдельная таблица должностей в которой как минимум есть поля [ИД должности] и [название должности]

  Ответить  
 
 автор: Lukas   (14.05.2009 в 11:53)   личное сообщение
 
 

1. Надбавка за вредность должна быть характеристикой единицы штатного расписания, а никак не вычисляемым полем.
2. Должен быть справочник должностей, что бы небыло этого: [Должность] = "Химлаборант"

  Ответить  
 
 автор: Dimka   (14.05.2009 в 12:21)   личное сообщение
 
 


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


Она и есть характеристика должности штатного расписания в форме "карта сотрудника", прсто этого поля "% надбавка" нет в таблицы. Я не хотел забивать для каждого сотрудника его %, а чтобы это поле автоматически в форме расчитывалось в зависимости от должности.


Должен быть справочник должностей, что бы небыло этого: [Должность] = "Химлаборант"


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


У меня ещё вопрос: "Что не верно в этой формуле?"
=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))))
Так как в расчитываемом поле выдает "#Имя?"

  Ответить  
 
 автор: snipe   (14.05.2009 в 12:37)   личное сообщение
 
 

в синтаксисе еще не разобрался а вот логическая ошибка присутствует .......
если стаж равен 5 или 10 или 15 или 20 годам то сотруднику процент надбавки будет -0
(в некоторых местах знак > надо заменить на >= )

  Ответить  
 
 автор: Lukas   (14.05.2009 в 12:40)   личное сообщение
 
 


Я не хотел забивать для каждого сотрудника его %


Не ленись. Что будете делать, если завтра придет приказ об увеличении надбавки с 5 до 6 %? Переделывать формы? И так каждый раз? Ню-ню.


А вот справочника такого нет (может и зря), но уже позно.


Никогда не поздно исправить ошибки, просто иногда проще сделать заново.


"Что не верно в этой формуле?"


Я бы описал функцию и считал бы ей. И работало бы быстрее.

  Ответить  
 
 автор: Dimka   (14.05.2009 в 12:46)   личное сообщение
 
 


Не ленись. Что будете делать, если завтра придет приказ об увеличении надбавки с 5 до 6 %? Переделывать формы? И так каждый раз? Ню-ню.



Никогда не поздно исправить ошибки, просто иногда проще сделать заново.


Эта база использоваться где-либо не будет, так что пусть будет так я думаю.


Я бы описал функцию и считал бы ей. И работало бы быстрее.


Не мог бы ты рассказать как бы ты это сделал? Для меня сделать это моим путем проше, так как в Access недавно(азы есть, а глубохик познаний нет) и мне пока ещё трудно.

  Ответить  
 
 автор: Lukas   (14.05.2009 в 13:21)   личное сообщение
 
 

Как-то так:

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([ПолеДатыПриемаНаРаботу])

  Ответить  
 
 автор: Dimka   (14.05.2009 в 13:30)   личное сообщение
 
 

2Lukas
Мои действия:
-В меню "Обработке события-Приложения" поля "%за выслугу лет" я добавляю код приведенны выше.
-и в Своиствах этогоже поля "%за выслугу лет" в строке дата добавляю
=funNemo( Forms![tblSotrudnik]![Дата приема на работу] )

И у меня все равно в поле "%за выслугу лет" вместо ожидаемых чисел фигурирует надпись "#Имя?". Что не так опять?

  Ответить  
 
 автор: snipe   (14.05.2009 в 13:56)   личное сообщение
 
 

Модуль создай.......
(это там где таблицы запросы формы отчеты макросы - найди Модули и нажми кнопку Создать)
в большом белом поле под строкой Option Compare Database
вставь код который Lukas прислал
закрой редактор VBA

а в поле "%за выслугу лет" в свойствах на вкладке Данные в строке данные вставь вызов функции (это - =(и все что там далее написано))

  Ответить  
 
 автор: Dimka   (14.05.2009 в 14:06)   личное сообщение
27 Кб.
 
 

Блин все равно в поле "% за стаж" пишет только "#Имя?" почему не пойму? Вот посмотрите БД.

  Ответить  
 
 автор: Dimka   (14.05.2009 в 15:06)   личное сообщение
 
 

Оказывается код работает при условие если запушено не толька форма "Табельсотрудника" в котором расчитывается значение, но и форма "карта сотрудника" из которой проверяется значение поля "Дата приема на работу". Почему так?

  Ответить  
 
 автор: Lukas   (14.05.2009 в 15:16)   личное сообщение
 
 


=funNemo(Формы!tblSotrudnik![Дата приема на работу])

Вот это строка подразумевает, что форма, со странным префиксом "tbl", с названием "tblSotrudnik" должна быть загружена и в ней текущая запись должна соответствовать рассчитываемому в форме "tblTabelSotr" сотруднику.

У вас в форме "tblTabelSotr" есть комбобокс с данными "Сотрудник". По значению этого поля можно получить (функцией DlookUp, например) дату его приема на работу, и передавать эту дату в функцию.
Либо включить дату приема на работу в источник строк комбобокса "Сотрудник", и используя свойство Column и преобразование к типу Date передавать эту дату в функцию.

  Ответить  
 
 автор: Dimka   (14.05.2009 в 15:41)   личное сообщение
 
 


У вас в форме "tblTabelSotr" есть комбобокс с данными "Сотрудник". По значению этого поля можно получить (функцией DlookUp, например) дату его приема на работу, и передавать эту дату в функцию.
Либо включить дату приема на работу в источник строк комбобокса "Сотрудник", и используя свойство Column и преобразование к типу Date передавать эту дату в функцию.



Покажи на примере пожалуйста, я так на словах не могу (.

  Ответить  
 
 автор: Dimka   (14.05.2009 в 16:17)   личное сообщение
 
 


Вот это строка подразумевает, что форма, со странным префиксом "tbl", с названием "tblSotrudnik" должна быть загружена и в ней текущая запись должна соответствовать рассчитываемому в форме "tblTabelSotr" сотруднику.


Код работает вместе с формой "tblSotrudniki" и выдает всегда одно и тоде значение на разных сотрудников. А если в форме "tblSotrudniki" перейти на другово сотрудника, то значения меняются в нашей форме в соответствии со значениями поля "дата приема на работу". Как это можно исправить?

  Ответить  
 
 автор: Dimka   (14.05.2009 в 16:18)   личное сообщение
 
 


Вот это строка подразумевает, что форма, со странным префиксом "tbl", с названием "tblSotrudnik" должна быть загружена и в ней текущая запись должна соответствовать рассчитываемому в форме "tblTabelSotr" сотруднику.


Код работает вместе с формой "tblSotrudniki" и выдает всегда одно и тоде значение на разных сотрудников. А если в форме "tblSotrudniki" перейти на другово сотрудника, то значения меняются в нашей форме в соответствии со значениями поля "дата приема на работу". Как это можно исправить?

  Ответить  
 
 автор: Goblin   (14.05.2009 в 22:14)   личное сообщение
 
 

Форма tblTabelSotr вычисляет и будет вычислять только тогда, когда будет открыта форма tblSotrudnik, в остальных случаях будет ошибка или что угодно. При этом вычислять будет на кого угодно и что угодно. Вы зе %за стаж так пишете =funNemo(Forms!tblSotrudnik![Дата приема на работу]), а форма "Сотрудник" не открыта. Сделали бы в подчиненной форме. Или проще - запрос с вычисляемым полем.

  Ответить  
 
 автор: Goblin   (14.05.2009 в 23:07)   личное сообщение
43 Кб.
 
 

Черт его знает на счет функции. Как и из чего она считает не разбирался. Оставил как есть. Но имея формулы можно бы в запросе вычислить. Оформление тагсе, но примерно в моем исполнении было бы примерно так.
Хотя я бы все делал иначе с самого начала. Могу выслать на майл вырезку из своего давнего учета сотрудников. Работающее. Там как пример масса всяких вычислений и прочего. Сюда не лезет, в раре 150 кБт. Еггог выскакивает.

  Ответить  
 
 автор: snipe   (15.05.2009 в 03:51)   личное сообщение
 
 

вот уж действительно век живи век учись (я про 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 - его идея)

  Ответить  
 
 автор: Lukas   (15.05.2009 в 10:06)   личное сообщение
 
 


...Sotrudnik As Long...

  Ответить  
 
 автор: Dimka   (15.05.2009 в 12:11)   личное сообщение
 
 

Все вроде правильно сделал, но все равно без формы "Sotrudnik" не работает. А когда она запушена, то выдает ошибку "Invalid use of Null"

  Ответить  
 
 автор: snipe   (15.05.2009 в 12:15)   личное сообщение
 
 

там нет ссылки на форму Sotrudnik......
Sotrudnik - это переменная (я обозначил ее как integer, Lukas меня поправил что нужно Long)

  Ответить  
 
 автор: snipe   (15.05.2009 в 12:16)   личное сообщение
 
 

Если конечно вы формы не переименовали

  Ответить  
 
 автор: Dimka   (15.05.2009 в 12:49)   личное сообщение
 
 

Я переделал все. Сделал подчиненную форму использовал первый вариант кода без (DlookUp), вроде все работает. Спасибо большое всем, что помогли разобраться.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList