Обеспечение того, чтобы отношения, хранящиеся в таблице связей / отношений MS Access, не перекрывались во времени - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть база данных MS Access 2016 с таблицами Person и Organization (PERS и ORG соответственно) и таблицей отношений (PERS-ORG_RLTNP), в которой хранятся данные об отношениях между людьми и организациями, например, об отношениях, которые показывают, когда конкретные людибыли членами организации. Таблицы PERS и ORG имеют первичные ключи автономного номера (Pers_ID и Org_ID), которые переносятся как внешние ключи в PERS-ORG_RLTNP. PERS-ORG_RLTNP также имеет поле типа отношения (Pers-Org_Rltnp_Typ), а также поля Effective_From_Date и Effective_To_Date, которые показывают, когда каждая связь действовала.

Я хочу, чтобы база данных разрешала множественные отношения одного типа между одним человеком и организацией, но я не хочу, чтобы эти отношения перекрывались. То есть я не хочу, чтобы база данных позволяла Effective_From_Date второго отношения (которое начинается позже) быть в течение периода времени между Effective_From_Date и Effective_To_Date первого отношения. Например, если Джо Смит является членом организации XYZ, начинающейся 1 января 1019 года и заканчивающейся 15 июня 2019 года, а затем снова становящейся участником, я не хочу, чтобы база данных позволяла вставлять запись для этого второго отношения, которое начинается(имеет Effective_From_Date) в течение периода времени с 1 января 1019 года по 15 июня 2019 года.

Если в MS Access есть способ использовать индексы и правила проверки, чтобы я мог применить это ограничение, как мне это сделать?

1 Ответ

1 голос
/ 11 ноября 2019

К сожалению, такие бизнес-правила не могут быть определены или управляться на уровне таблицы с помощью индексации, правил или отношений. Вы могли бы начать принимать процедуры магазина, но в конце дня? Скажите, может ли база данных сделать это? Что ж, в вашем пользовательском интерфейсе действительно не было бы возможности возвращать информацию пользователю.

В результате довольно просто внести это прямо в форму (ы) ввода данных. Таким образом, пользователь получает удобные подсказки и сообщения.

Чтобы предотвратить коллизии, логика здесь довольно проста:

Коллизия происходит, когда:

RequestStartDate <= EndDate и RequestEndDate> = StartDate

Таким образом, приведенный выше довольно простой запрос, но если произойдет какое-либо столкновение, приведенное выше вернет записи ... и вы просто не разрешите бронирование. Другими словами, так как мы НИКОГДА не разрешаем бронирование при столкновении, то вышеприведенное простое утверждение будет работать для нас.

dim strWhere                 as string 
dim dtRequeestStartDate      as date 
dim dtRequestEndDate         as date 

dtRequestStartDate = inputbox("Enter start Date") 
dtRequestEndDate = inputbox("Enter end date") 


strWhere="#" & format(dtRequestStartDate,"mm/­dd/yyyy") & "# <= EndDate" & _ 
 " and #" & format(dtRequestEndDate,"mm/dd­/yyyy") & "#  >= StartDate" 


if dcount("*","tableBooking",strW­here) > 0 then 
   msgbox "sorry, you cant book 
...bla bla bla.... 

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

Однако чтохорошо, что простые условия и логика, изложенные выше, возвращают ЛЮБЫЕ коллизии или любое перекрытие в этом диапазоне дат. Это включает один внутренний, или оба конца, начинающиеся снаружи, или один конец между промежутком начала / конца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...