С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
MS Access
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
АлексН
0 / 0 / 0
Регистрация: 30.12.2011
Сообщений: 52
1

Значение в поле в зависимости от значения в другом поле

03.02.2012, 12:29. Просмотров 3382. Ответов 12
Метки нет (Все метки)

Здравствуйте. Задача опять образовалась. В запросе из нескольких таблиц имеем поле «Выслуга» в формате 00-00-00 (лет-месяцев-дней). Нужно создать другое поле «Надбавка за выслугу», в котором в зависимости от значения поля «Выслуга» выводилось бы значение размера надбавки.
Поля «Выслуга» и «Klass» уже есть в запросе. Подскажите, пожалуйста, как сделать образуемые от них поля «Надбавка за выслугу» и «Надбавка за класс»? Можно ли их сделать в этом же запросе или же в форме, которая будет строиться на основании этого запроса?
Уже не раз убеждался, что в руках настоящих профи Acces творит чудеса, очень надеюсь на очередное. Спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2012, 12:29
Ответы с готовыми решениями:

Задать значение в поле в зависимости от значения в другом
Есть таблица Tab1 на ее базе построен запрос Query1, в обеих есть поля ...

Источник строк поля со списком в зависимости от значения в другом поле
Здравствуйте! Подскажите, почему не работает запрос в форме в поле "2 уровень"...

Вывод в поле запроса последней цифры из значения в другом поле
Здравствуйте все!!! Подскажите какую функцию или сочетание функций можно...

Запрет на изменение данных в поле в зависимости от наличия или отсутствия данных в другом поле
Форумчане,доброго времени суток! Помогите решить проблему: В форме...

Ограничение доступа к полю формы в зависимости от того есть ли значение в другом поле этой же формы
Форумчане, доброго времени суток! В форме есть два поля : "Поле1"-...

12
АлексН
0 / 0 / 0
Регистрация: 30.12.2011
Сообщений: 52
03.02.2012, 14:28  [ТС] 2
Опять проблема сжать базу... Воспользуемся имеющимся из прошлого образцом.
0
minob
3532 / 1106 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
04.02.2012, 12:56 3
Во вложении решение вашей задачи. Если не понравятся имена новых таблиц "tblLong_bonus", "tblProfi" или их полей, то измените их.

Внесите изменение в предыдущей задаче при определении пересекающихся интервалов. Замените фрагмент кода
Visual Basic
1
2
3
4
5
6
7
8
9
    Else
      id = DLookup("Id_Ots", "ТаблицаОтсутствующие", "Id_fam=" & Me!Id_fam & _
                   " And Ots_Okon Is Not Null " & _
                   " And Ots_Nach<=" & Format(Me!Ots_Okon, "\#mm\/dd\/yyyy\#") & _
                   " And Ots_Okon>=" & Format(Me!Ots_Nach, "\#mm\/dd\/yyyy\#"))
      If Not IsNull(id) And id <> Me!Id_Ots Then
        MsgBox "Человек не может в одно и то же время быть в разных местах", vbOKOnly, Me.Caption
        Me!Ots_Okon.SetFocus: Cancel = True
      End If
на
Visual Basic
1
2
3
4
5
6
    ElseIf Not IsNull(DLookup("Id_Ots", "ТаблицаОтсутствующие", "Id_fam=" & Me!Id_fam & _
                            " And Ots_Okon Is Not Null And Id_Ots<>" & Me!Id_Ots & _
                            " And Ots_Nach<=" & Format(Me!Ots_Okon, "\#mm\/dd\/yyyy\#") & _
                            " And Ots_Okon>=" & Format(Me!Ots_Nach, "\#mm\/dd\/yyyy\#"))) Then
      MsgBox "Человек не может в одно и то же время быть в разных местах", vbOKOnly, Me.Caption
      Me!Ots_Okon.SetFocus: Cancel = True
P.S.
в руках настоящих профи Acces творит чудеса, очень надеюсь на очередное
Не лестью единой живет "профи"
0
АлексН
0 / 0 / 0
Регистрация: 30.12.2011
Сообщений: 52
04.02.2012, 16:13  [ТС] 4
Цитата Сообщение от minob Посмотреть сообщение
P.S. Не лестью единой живет "профи"
Да я уже понял, что давно должен "накрыть поляну"...

Visual Basic
1
2
3
4
5
6
7
8
9
    ElseIf Not IsNull(DLookup("Id_Ots", "ТаблицаОтсутствующие", "Id_fam=" & Me!Id_fam & _
                            " And Ots_Okon Is Not Null And Id_Ots<>" & Me!Id_Ots & _
                            " And Ots_Nach<=" & Format(Me!Ots_Okon, "\#mm\/dd\/yyyy\#") & _
                            " And Ots_Okon>=" & Format(Me!Ots_Nach, "\#mm\/dd\/yyyy\#"))) Then
      MsgBox "Человек не может в одно и то же время быть в разных местах", vbOKOnly, Me.Caption
      Me!Ots_Okon.SetFocus: Cancel = True
    End If
   End If
End Sub
В конце правильно вышло? End If дважды?
0
minob
3532 / 1106 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
04.02.2012, 17:34 5
Цитата Сообщение от АлексН Посмотреть сообщение
В конце правильно вышло? End If дважды?
Да, правильно!
И еще, теперь можно удалить в той же процедуре строку
Visual Basic
1
Dim id
0
АлексН
0 / 0 / 0
Регистрация: 30.12.2011
Сообщений: 52
04.02.2012, 17:45  [ТС] 6
Похоже еще раз придется вернуться к связям в таблицах. Что-то я в них запутался как в рыба в сетях...
И что есть Ху... то есть Q? Вы запрос так "скрыли" что мне трудно по аналогии сделать еще несколько полей.
Еще возникает вопрос такой: Вы разбиваете информацию на составные части, для каждой - своя таблица. Ну вот к примеру. В базе данных, которая перешла по наследству, было два основных массива: Данные личного состава и Данные по штатным должностям (что-то типа штатного расписания). Вот все что касается личных данных сваливали в таблицу ДанныеЛС (в примере под нее подходит TblLS) - (Ф,И,О, дата, место рождения, воинское звание, образование, уровень подготовки (квалификация), семейное положение, место жительства, награды, и еще очень много разных данных.
Вторая таблица со всеми данными по должности: должность (наименование), код должности (цифровое обозначение), штатная категория, тарифный разряд, ВУС, форма допуска к гостайне, подразделение, принадлежность (специальность) и т.д.
Вот классная квалификация у меня в таблице ДанныеЛС. По Вашему примеру, как я понимаю, нужно создать отдельную таблицу, а в старую внести только Id_klass .
Вот по аналогии нужно сделать поле Надбавка за допуск. В ТаблицеШтатноДолжн (в примере она схожа на TblDolg) есть поле ForDopusk. Нужно сделать еще таблицу -назовем ее пусть ТаблицаГостайна и связать ее по Id_Dop со старой таблицей в которой создать поле Id_Dop.
Насколько же частей нужно разбить таблицы? И как потом увидеть штатное расписание целиком? Запросом соединить все поля? По нему создать форму. Получим необновляемый запрос и необновляемую форму. Чтобы внести изменения (добавить или изменить данные о должности) нужно лазить по многим таблицам? Ну со штатом проще, хоть и время перемен, но все же не каждый день меняется. А вот с данными на людей? Получил человек звание или класс повыше, женился и т.п. опять ходить по всем таблицам? Понимаю, что для Вас эти «мысли» наивны. Но это как бы доводы простого рядового пользователя. Конечно есть там всякие запросы на обновление и т.п. Все это как бы и называют оптимизацией базы данных. Наверное. Но простым пользователям что-то тяжко. Да, понимаю… нужно чаще делать то, что завещал великий дедушка Ленин. Наверное.
Вот у Вас есть чему поучиться. Но вот хочется еще и разобраться, а не просто положить в рот конфетку…
Опять о сладком… Видно действительно пора накрывать поляну…  Без 100 гр не разобраться похоже…
Спокойной ночи.
0
АлексН
0 / 0 / 0
Регистрация: 30.12.2011
Сообщений: 52
04.02.2012, 18:05  [ТС] 7
Цитата Сообщение от minob Посмотреть сообщение
И еще, теперь можно удалить в той же процедуре строку
Visual Basic
1
Dim id
Да, убрал, нашел в самом начале. Спасибо.
Про отсутствующих у себя еще не сделал - мысли на ближайшее будущее. Есть еще пару идей, думаю как лучше реализовать. Пока подсчитываем выслугу. Сделали 2/3. Еще вот новое начисление дендовольствия военным. Надо помочь девчатам с подсчетом надбавок. Вот не сидится на пенсии дома, скука...
0
minob
3532 / 1106 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
05.02.2012, 07:49 8
Цитата Сообщение от АлексН Посмотреть сообщение
Похоже еще раз придется вернуться к связям в таблицах. Что-то я в них запутался как в рыба в сетях...
И что есть Ху... то есть Q? Вы запрос так "скрыли" что мне трудно по аналогии сделать еще несколько полей.
Раскладываю по полочкам. Запрос "ЗапросВыплаты"
T-SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT tblLS.Fam & " " & tblLS.Im & " " & tblLS.Ot AS FIO, 
       Q.vco, 
       (SELECT TOP 1 bonus FROM tblLong_bonus WHERE long_service<=Val(Q.vco) ORDER BY long_service DESC) AS bonus, 
       tblProfi.class,
       tblProfi.premium
FROM ([SELECT Id_fio, Fstag_txt(Sum(FStagMy(PsNach,PsOkon,1,True))) AS vco 
       FROM tblPeriod 
       GROUP BY Id_fio]. AS Q 
INNER JOIN tblLS ON Q.Id_fio=tblLS.Id_fio) 
INNER JOIN tblProfi ON tblProfi.Id_class=tblLS.Id_class
ORDER BY 1
Цитата Сообщение от АлексН Посмотреть сообщение
Еще возникает вопрос такой: Вы разбиваете информацию на составные части, для каждой - своя таблица. Ну вот к примеру. В базе данных, которая перешла по наследству, было два основных массива: Данные личного состава и Данные по штатным должностям (что-то типа штатного расписания). Вот все что касается личных данных сваливали в таблицу ДанныеЛС (в примере под нее подходит TblLS) - (Ф,И,О, дата, место рождения, воинское звание, образование, уровень подготовки (квалификация), семейное положение, место жительства, награды, и еще очень много разных данных.
Вот именно, что "сваливали".
Дальше касаюсь только, как мне кажется, недоделок и несуразиц, возможно и спорных:
- воинское звание. Наверное - это текущее звание. Следовательно, не отслеживается история, отдельная таблица, присвоений/разжалований, содержащая очередные звания, номера и даты приказа о присвоении/разжаловании, ... Кроме того, разумеется, должен присутствовать справочник званий.
- ФИО, образование, уровень подготовки (квалификация), семейное положение. Аналогично предыдущему, отсутствует история изменений + справочники для образования, квалификации, семейного положения.
- награды. Все награды в одно поле - оригинально. Должен быть справочник наград, связанный многие ко многим с таблицей ЛС посредством таблицы наград.
....
Цитата Сообщение от АлексН Посмотреть сообщение
Вторая таблица со всеми данными по должности: должность (наименование), код должности (цифровое обозначение), штатная категория, тарифный разряд, ВУС, форма допуска к гостайне, подразделение, принадлежность (специальность) и т.д.
Также нужно привести к нормальному виду.
Цитата Сообщение от АлексН Посмотреть сообщение
Вот классная квалификация у меня в таблице ДанныеЛС. По Вашему примеру, как я понимаю, нужно создать отдельную таблицу, а в старую внести только Id_klass .
Вот по аналогии нужно сделать поле Надбавка за допуск. В ТаблицеШтатноДолжн (в примере она схожа на TblDolg) есть поле ForDopusk. Нужно сделать еще таблицу -назовем ее пусть ТаблицаГостайна и связать ее по Id_Dop со старой таблицей в которой создать поле Id_Dop.
Да.
Цитата Сообщение от АлексН Посмотреть сообщение
На сколько же частей нужно разбить таблицы?
На столько, сколько нужно для нормализации структуры вашей БД. Это нужно было сделать еще на стадии проектирования. Но раз вы ввязались в это дело, то прийдется вам делать. Настоятельно рекомендую почитать, имеющиеся во множестве в интернете, статьи, книги о нормализации структуры данных БД.
Цитата Сообщение от АлексН Посмотреть сообщение
И как потом увидеть штатное расписание целиком? Запросом соединить все поля? По нему создать форму. Получим необновляемый запрос и необновляемую форму.
Обратите внимание, например, на форму "ФормаОтсутствующие" в выложенном мной в предыдущем топике файле Отсутствующие_2.zip. Посмотрите источник записей этой формы. Там вы не увидите запроса, связывающего поля основной таблицы и справочников.
Цитата Сообщение от АлексН Посмотреть сообщение
Чтобы внести изменения (добавить или изменить данные о должности) нужно лазить по многим таблицам?
Аппелирую к той же форме "ФормаОтсутствующие". При добавлении записи в таблицу, достаточно двух щелчков мышью для ввода фамилии и двух щелчков для ввода причины, естественно если они есть в справочниках, в ином случае, прийдется дополнить справочники. Но ведь дополнения справочников - это редкие разовые операции. Вы же предлагаете оставить все как есть. Т.е. если, например, СЕРГЕЕВ съездил 10 раз в командировку, то в основную таблицу нужно будет 10 раз ввести фамилию (СЕРГЕЕВ) и 10 раз причину отсутствия (командировка). При этом возрастает вероятность появления различных ошибок ввода, вследствии которых, если поинтересуетесь количеством командировок Сергеева, рискуете получить число, отличное от 10.
Цитата Сообщение от АлексН Посмотреть сообщение
Но это как бы доводы простого рядового пользователя.
Это не доводы простого рядового пользователя, а ваша, как программиста, лень ищет псевдопричины, чтобы не выполнять необходимую работу, а свалить ее на пользователя. Вы прибросьте, как пользователь, что проще - два щелчка мышью для ввода информации из справочника или ввод ее с клавиатуры, с вероятностью допустить ошибку.
Цитата Сообщение от АлексН Посмотреть сообщение
Конечно есть там всякие запросы на обновление и т.п. Все это как бы и называют оптимизацией базы данных.
К оптимизации базы первое предложение никакого отношения не имеет
Цитата Сообщение от АлексН Посмотреть сообщение
Но простым пользователям что-то тяжко.
Не путайте себя и пользователей. Ваша задача, несмотря на мнимые или реальные трудности, облегчить им жизнь.
0
АлексН
0 / 0 / 0
Регистрация: 30.12.2011
Сообщений: 52
05.02.2012, 17:42  [ТС] 9
Проблемы не приходят в одиночку. Весь день был "убит" на ремонт дивана. Попытка приобрести новый успехом не увенчалась.
Теперь по существу. Вы как всегда правы. Я когда еще писал ответ, мысленно согласен был с Вами на все 100, процентов. Но... есть одно (или даже не одно) очень непростое НО... Кардинальные изменения повлекут потерю важной информации. Конечно, в базе данных, с которой мне пришлось столкнуться, давно нужно было сделать революцию. Просто начинали ее методом проб и ошибок давным-давно еще в 97-м Accessе. Просматриваются определенные следы Борея и еще некоторых учебных образцов. Но к ней все привыкли. Хотя многое надо менять. И многое уже поменяли. Но... В чем опасность всех революций? "... разрушим до основания, а затем..." - так ведь у классиков. Сначала разрушим. Рушить то мы умеем! А затем??? - "...мы наш, мы новый... построим... может быть... потом...как-нибудь...если получится...наверное...
НО… а еще не хватает знаний. Опыта. И времени. Хотя его, правда, с выходом на пенсию стало побольше. Вот видеоуроки закончились на самом интересном... До конца не дали досмотреть.
На скорую руку прикинул Ваш вариант. С надбавкой за выслугу вроде получится должно. А вот деление таблиц пока не получается. Завтра на работе попробую погрызть гранит… науки Access. А Вам спасибо за терпение и учение! У нас уже далеко за полночь. Доброй ночи. Утро вечера…(будем надеяться)
P.S. "А диванчик-то еще послужит..." - сказала жена.
И все же рано или поздно придется покупать новый...
0
minob
3532 / 1106 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
06.02.2012, 12:02 10
Цитата Сообщение от АлексН Посмотреть сообщение
Но... есть одно (или даже не одно) очень непростое НО... Кардинальные изменения повлекут потерю важной информации. Конечно, в базе данных, с которой мне пришлось столкнуться, давно нужно было сделать революцию.
...
Но... В чем опасность всех революций? "... разрушим до основания, а затем..." - так ведь у классиков. Сначала разрушим. Рушить то мы умеем! А затем??? - "...мы наш, мы новый... построим... может быть... потом...как-нибудь...если получится...наверное...
У классиков, например Л. Троцкого, встречались еще и упоминания о ползучей революции.
Возьмите какой-то один параметр, например звание, и попробуйте поработать с ним.
Коли чо, то подмогну советами.
0
АлексН
0 / 0 / 0
Регистрация: 30.12.2011
Сообщений: 52
06.02.2012, 16:51  [ТС] 11
Цитата Сообщение от minob Посмотреть сообщение
У классиков, например Л. Троцкого, встречались еще и упоминания о ползучей революции.
Здравствуйте. Ну что ж послужили в авиации, теперь пора и на землю опуститься...
К сожалению, планы на сегодня порушены внеочередными ЦУ. Вот уж где точно революция - в финансовой и кадровой работе. Но это уже другая история.
Радует, что у Вас хватает терпения и не бросаете с моими проблемами. Вопросы есть, конечно, но наверное уже на завтра.
0
АлексН
0 / 0 / 0
Регистрация: 30.12.2011
Сообщений: 52
10.02.2012, 08:27  [ТС] 12
В продолжении темы. Вот пытаюсь понять как работает подстановка из поля со списком:
SELECT DISTINCTROW ТаблицаДанныеЛС.Fam, ТаблицаДанныеЛС.Im, ТаблицаДанныеЛС.Ot FROM ТаблицаДанныеЛС ORDER BY ТаблицаДанныеЛС.Fam;
http://www.fayloobmennik.net/1357954
1234
Можно образец в "остатках тяжелого прошлого" (так Вы кажется это называете) посмотреть. Может это работать из двух таблиц? Ну вот то что Вы делали запросом по классности? Например в форме есть поля Class (заполнено) и premium (не заполнено) и сответствующие в таблице (но уже оба заполнены данными). И чтобы по полю со списком Class вставало значение premium из таблицы. Просто много аналогий: тарифный разряд - оклад по должности, звание - оклад по званию и т.п.
0
minob
3532 / 1106 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
10.02.2012, 13:22 13
Если правильно понял, что вы спрашивали, то см. во вложении различные варианты в формах frmLS_1, frmLS_2, frmLS_3.
0
10.02.2012, 13:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2012, 13:22

При выборе значения из списка, в этой же таблице в другом поле установить значение по запросу
Здравствуйте! У меня есть таблица в которой есть поле с выпадающем списком,...

Как обеспечить зависимость значений для ввода в поле базы данных от значения в другом поле базы данных?
Есть 2 таблицы справочников (все факторы и все возможные значения -...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru