2016-03-04 4 views
0

У меня возникли проблемы с получением некоторой сложной логики IF для работы внутри запроса MS Access, и я чувствую себя жареным на этом этапе, поэтому я надеюсь, что свежая пара глаз поможет мне решить мою проблему.Сложная логика доступа Access

Следующий скриншот Надеюсь, это поможет сделать мою логику более ясной.

enter image description here

Мой конечный результат с формулой, чтобы определить, является ли заемщик (Borr) является устарелым с представленными документами. В этом случае я забочусь только о (P) FS и/или IE документов.

Условия для устаревания немного сложны, и я объясню их ниже. TRUE соответствует устаревшему состоянию и FALSE соответствует требованиям.

  1. Если NR флажок для (P)FS и IE Тогда FALSE
  2. Если NR флажок не установлен для (P)FS И IE и (P) FS date is blank AND IE` дата является пустым Тогда ИСТИНА

Это достаточно легко, но теперь для сложной части CYYY = текущий год, PYYY = предыдущий год, PY2Y = 2 года назад

  1. Если (P)FS или IE требуется, и если текущая дата находится в пределах от 1/1/CYYY и 4/30/CYYYY и дата в (P)FS или IE находится в пределах от 10/1/PY2Y и 4/30/PYYY Тогда ЛОЖЬ остального ИСТИНЫ
  2. Если (P)FS или IE не требуется, и если текущая дата находится в диапазоне от 5/1/CYYY и 9/30/CYYYY и дата в (P)FS или IE составляет менее 1 года. Затем FALSE Else ИСТИНА
  3. Последняя вещь, чтобы иметь в виду, что до тех пор, как существует уточненный (P)FS или IE документа, результат должен быть FALSE. Они оба не требуются. Это либо или.

Этот скриншот должен помочь уточнить дату формулы:

enter image description here

Это последняя формула доступа я вошел, но по-прежнему не работает. Я также думаю, что я знаю, почему, но я тоже обжаренный с этим, чтобы попытаться продолжить решать на данный момент:

B1-FS-IE: IIf([annual_review].[prop_cd]<>"0056" And [nr_fs_b1]=True And 
[nr_ie_b1]=True,False,IIf(([nr_fs_b1]=False And IsNull([fs_b1])) And ([nr_ie_b1]=False 
And IsNull([ie_b1])),True,IIf(Month([fs_b1])>9 Or Month([fs_b1])<5 
And (Month(Date())<5 And Date()-[fs_b1]>576) Or (Month([fs_b1])>4 
And Month([fs_b1])<10 And Date()-[fs_b1]>=365) Or Month([ie_b1])>9 
Or Month([ie_b1])<5 And (Month(Date())<5 And Date()-[ie_b1]>576) 
Or (Month([ie_b1])>4 And Month([ie_b1])<10 And Date()-[ie_b1]>=365),True,False))) 

Наконец, я поместил Excel тега, потому что если кто-то может решить эту проблему в Excel, я могу перевести на Access.

+2

Формула, подобная этой, является не только кошмаром, но и для поддержания. Я бы поставил логику в общедоступную функцию VBA и передал соответствующие поля в качестве параметров. Там вы можете написать читаемый код. – Andre

+0

@Andre - Блестящий! Я даже об этом не думал. Это упростило бы сборку, чтение, поддержку! Спасибо за изменение в перспективе, в которой я нуждался! –

ответ

0

Вам также нужен правильный метод расчета лет - как эта функция:

Public Function Years(_ 
    ByVal datDate1 As Date, _ 
    ByVal datDate2 As Date, _ 
    Optional ByVal booLinear As Boolean) _ 
    As Integer 

' Returns the difference in full years between datDate1 and datDate2. 
' 
' Calculates correctly for: 
' negative differences 
' leap years 
' dates of 29. February 
' date/time values with embedded time values 
' negative date/time values (prior to 1899-12-29) 
' 
' Optionally returns negative counts rounded down to provide a 
' linear sequence of year counts. 
' For a given datDate1, if datDate2 is decreased step wise one year from 
' returning a positive count to returning a negative count, one or two 
' occurrences of count zero will be returned. 
' If booLinear is False, the sequence will be: 
' 3, 2, 1, 0, 0, -1, -2 
' If booLinear is True, the sequence will be: 
' 3, 2, 1, 0, -1, -2, -3 
' 
' If booLinear is False, reversing datDate1 and datDate2 will return 
' results of same absolute Value, only the sign will change. 
' This behaviour mimics that of Fix(). 
' If booLinear is True, reversing datDate1 and datDate2 will return 
' results where the negative count is offset by -1. 
' This behaviour mimics that of Int(). 

' DateAdd() is used for check for month end of February as it correctly 
' returns Feb. 28. when adding a count of years to dates of Feb. 29. 
' when the resulting year is a common year. 
' 
' 2000-11-03. Cactus Data ApS, CPH. 
' 2000-12-16. Leap year correction modified to be symmetrical. 
'    Calculation of intDaysDiff simplified. 
'    Renamed from YearsDiff() to Years(). 
' 2000-12-18. Introduced cbytMonthDaysMax. 
' 2007-06-22. Version 2. Complete rewrite. 
'    Check for month end of February performed with DateAdd() 
'    after idea of Markus G. Fischer. 

    Dim intDiff As Integer 
    Dim intSign As Integer 
    Dim intYears As Integer 

    ' Find difference in calendar years. 
    intYears = DateDiff("yyyy", datDate1, datDate2) 
    ' For positive resp. negative intervals, check if the second date 
    ' falls before, on, or after the crossing date for a full 12 months period 
    ' while at the same time correcting for February 29. of leap years. 
    If DateDiff("d", datDate1, datDate2) > 0 Then 
    intSign = Sgn(DateDiff("d", DateAdd("yyyy", intYears, datDate1), datDate2)) 
    intDiff = Abs(intSign < 0) 
    Else 
    intSign = Sgn(DateDiff("d", DateAdd("yyyy", -intYears, datDate2), datDate1)) 
    If intSign <> 0 Then 
     ' Offset negative count of years to continuous sequence if requested. 
     intDiff = Abs(booLinear) 
    End If 
    intDiff = intDiff - Abs(intSign < 0) 
    End If 

    ' Return count of years as count of full 12 months periods. 
    Years = intYears - intDiff 

End Function 
0

Для первой части, чтобы получить ли заемщик из даты PFS, IE флажков, даты,

Вы можете использовать следующее уравнение на источник управления контроля заемщика, чтобы указать, Истина или Ложь

IIF (checkPFS.value = True и CheckIE.value = True, False, IIF (checkPFS.value = True и CheckIE.value = True и PFSDate = '' и IEDate = '', True, False))

Смежные вопросы