Проверьте значения формы Microsoft Access перед сохранением - PullRequest
1 голос
/ 20 сентября 2010

У меня есть форма доступа - давайте назовем ее «Добавить труд» (Access 2007), которая сохраняет данные в таблицу.

В таблице есть два столбца, в частности, с именами «Дата начала» и «Дата окончания» (в этой таблице хранятся задачи)

Существует также другая таблица с именем FiscalYears, которая включает даты начала и окончания для финансового периода.Годы, которые структурированы следующим образом:

FyID FYear StartDate EndDate

Пример данных:

FYId FYear StartDate EndDate
-----------------------------
 1   2010   10/1/2009 9/30/2010
 2   2011   10/1/2010 9/30/2011

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

Если пользователь выбирает дату начала труда = 30.06.2009 и дату окончания 02.10.2010, он охватывает два финансовых года

Так что в моей таблице труда я долженвведите две вещи

LaborID StartDate EndDate
-----------------------------
1        6/30/2009  9/30/2010
2        10/1/2010  10/2/2010

В основном мне нужно сделать проверку перед сохранением записи и добавить две записи, если они охватывают финансовые годы, сейчас я просто слепо делаю Сохранить запись в форме (встроенной), но я думаю, мне нужно добавить немного VBA.Я почти никогда не использовал Access, так что это может быть просто (надеюсь).Я думаю, что вместо события, которое просто вызывает Save Record, мне нужно добавить пользовательский VBA.

Ответы [ 2 ]

3 голосов
/ 20 сентября 2010

Скажем, у вас есть несвязанная форма для добавления дат, вы можете сказать:

Dim rsFY As DAO.Recordset
Dim rsAL As DAO.Recordset
Dim db As Database
Dim sSQL As String

Set db = CurrentDb

''Select all years from the fiscal years table    
sSQL = "SELECT FYear, StartDate, EndDate " _
  & "FROM FiscalYears WHERE StartDate>=#" & Format(Me.StartDate, "yyyy/mm/dd") _
  & "# Or EndDate <=#" & Format(Me.Enddate, "yyyy/mm/dd") _
  & "# ORDER BY FYear"

Set rsFY = db.OpenRecordset(sSQL)
Set rsAL = db.OpenRecordset("AddLabor") ''table

''Populate recordset
rsFY.MoveLast
rsFY.MoveFirst

Do While Not rsFY.EOF

    ''Add records for each year selected
    rsAL.AddNew
    If rsFY.AbsolutePosition = 0 Then
        rsAL!StartDate = Format(Me.StartDate, "yyyy/mm/dd")
    Else
        rsAL!StartDate = rsFY!StartDate
    End If

    If rsFY.AbsolutePosition + 1 = rsFY.RecordCount Then
        rsAL!Enddate = Format(Me.Enddate, "yyyy/mm/dd")
    Else
        rsAL!Enddate = rsFY!Enddate
    End If

    rsAL.Update

    rsFY.MoveNext
Loop

Если код выполнялся в главной форме с подчиненной формой, показывающей таблицу Addlabor, вы можете обновить подчиненную форму, чтобы отобразить новые записи, например:

 Me.Addlabor_subform.Requery
1 голос
/ 20 сентября 2010

Зачем вам таблица FiscalYears? Если финансовые годы вашей организации всегда начинаются 1 октября и заканчиваются 30 сентября, вы можете использовать функцию для определения финансового года для данной даты.

Public Function Fy(ByVal pDate As Date) As Integer
    Dim intYear As Integer
    Dim intReturn As Integer
    intYear = Year(pDate)
    If pDate > DateSerial(intYear, 9, 30) Then
        intReturn = intYear + 1
    Else
        intReturn = intYear
    End If
    Fy = intReturn
End Function

И простые функции для возврата дат начала и окончания для данного года.

Public Function FyStart(ByVal pYear As Integer) As Date
    FyStart = DateSerial(pYear - 1, 10, 1)
End Function

Public Function FyEnd(ByVal pYear As Integer) As Date
    FyEnd = DateSerial(pYear, 9, 30)
End Function

Затем вы можете определить, сколько финансовых лет включено в данный диапазон дат:

Fy(EndDate) - Fy(StartDate)

Но я могу быть совершенно не в курсе, потому что вы сказали, что «Дата начала = 30.06.2009 и дата окончания 10/2/2010» охватывает два года. Однако это выражение возвращает 2 (3 года):

Fy(#10/2/2010#) - Fy(#6/30/2009#)
...