Steve,
Thank you for your response.
No; there is no Restore code anywhere. I have posted the code for both
forms below. They are part of a Timesheet database. The application uses
dummy, non-normalized tables for the entry form because they allow more
convenient data entry--the user cursors between date columns in a
spreadsheet-like form. When each user has entered the 2-week period, the
data is posted to normalized tables, and the dummy tables reset to the next
period.
The ResetLabels and UpdateTotals procedures are used to update totals rather
than using calculated controls because I found them to produce less delay and
screen flicker on each entry.
Perhaps you can find my errant way.
Thank you.
Sprinks
‘ Form 1 Code (Timesheet Entry form)
Private Sub Form_Open(Cancel As Integer)
On Error GoTo Err_Handler
Dim intI As Integer
Dim intDay As Integer
Dim dteStartDate As Date
Dim ctl As Control
‘ TSQueryAll used when management is reviewing all open timesheets
‘ Otherwise, the Timesheet opens to the CurrentUser()’s record
If Me.OpenArgs = "TSQueryAll" Then
dteStartDate = DMax("[PeriodBeginning]", "TSHistory")
With Me
.RecordSource = Me.OpenArgs
.AllowAdditions = True
.AllowDeletions = True
.AllowEdits = True
.Controls("cboStaffName").Visible = True
.Controls("cboStaffName").SetFocus
.Controls("txtStaffName").Visible = False
.Controls("cboPeriodStartDate").Visible = True
.Controls("txtPeriodStartDate").Visible = False
.Controls("cboPeriodStartDate").RowSource = dteStartDate - 14 &
";" & dteStartDate & ";" _
& dteStartDate + 14 & ";" & dteStartDate + 28
.Controls("cboPeriodStartDate").Requery
.Controls("cmdPost").Visible = False
.Visible = True
End With
Else
With Forms("Timesheet").Controls("TimeSheetDetail")
.SetFocus
If Not IsNull(.Form![cboProjectNumber]) Then
intDay = 0
' Determine first day of less than 8 hours
For intI = 3 To 7
If Forms("Timesheet").Controls("txtSumofDay" &
Trim(Str(intI))) < 8 Then
intDay = intI
Exit For
End If
Next intI
If intDay = 0 Then
' We found the first non-zero day, so skip this code
For intI = 10 To 14
If Forms("Timesheet").Controls("txtSumofDay" &
Trim(Str(intI))) < 8 Then
intDay = intI
Exit For
Else
intDay = 1
End If
Next intI
End If
.Form.Controls("txtHours" & Trim(Str(intDay))).SetFocus
Else
.Form![cboProjectNumber].SetFocus
End If
End With
End If
' Reset Labels & initialize totals
Call ResetLabels
Call UpdateTotals
Err_Exit:
Exit Sub
Err_Handler:
Select Case Err.Number
Case 2105, 2110 ' Can't set focus to txtHours1
Resume Next
Case 2455 ' No Timesheet record exists
MsgBox "A timesheet has not yet been initialized for you." &
vbCrLf & _
"Please see the Office Manager or system
administrator.", vbOKOnly, _
"Missing Timesheet Record"
DoCmd.Close
Case Else
MsgBox Err.Number & vbCrLf & Err.Description & vbCrLf & vbCrLf & _
"Please contact the system administrator with the above
information.", vbOKOnly, _
"Runtime Error"
End Select
Resume Err_Exit
End Sub
Private Sub Form_Activate()
On Error Resume Next
Me.Visible = False
DoCmd.Maximize
Me.Visible = True
End Sub
Private Sub Form_Current()
On Error GoTo Err_Handler
Call ResetLabels
Call UpdateTotals
Err_Exit:
Exit Sub
Err_Handler:
Select Case Err.Number
Case 2110 ' Can't set focus to txtHours
Me![cboProjectNumber].SetFocus
Resume Next
Case Else
MsgBox Err.Number & vbCrLf & Err.Description & vbCrLf & vbCrLf & _
"Please contact the system administrator with the above
information.", vbOKOnly, _
"Runtime Error"
End Select
Resume Err_Exit
End Sub
Private Sub ResetLabels()
On Error GoTo Err_Handler
Dim ctl As Control
For Each ctl In Me![TimeSheetDetail].Form.Controls
If Left(ctl.name, 7) = "lblDate" Then
ctl.Caption = Format([PeriodStartDate] + Mid(ctl.name, 8) - 1,
"mm/dd")
End If
Next ctl
Err_Exit:
Exit Sub
Err_Handler:
MsgBox "The following error has occurred. Please contact the system
administrator." & _
vbCrLf & vbCrLf & Err.Number & vbCrLf & Err.Description, vbOKOnly,
"Runtime Error"
Resume Err_Exit
End Sub
Private Sub UpdateTotals()
On Error GoTo Err_Handler
Dim intParam As Integer
Me.Refresh
For intParam = 1 To 14
' Update day subtotals
Me![TimeSheetDetail].Form!("SumofDetailHours" & intParam) = _
Nz(DSum("[DayHours" & intParam & "]", _
"TSDetailQry", "[TimesheetID] = " & Me![TimesheetID]))
Me![TimeSheetAdminDetail].Form!("SumofAdmin" & intParam) = _
Nz(DSum("[DayHours" & intParam & "]", _
"TSAdminDetailQry", "[TimesheetID] = " & Me![TimesheetID]))
' Update day totals
Me("txtSumofDay" & intParam) = _
Nz(Me![TimeSheetDetail].Form!("SumofDetailHours" &
intParam)) + _
Nz(Me![TimeSheetAdminDetail].Form!("SumofAdmin" & intParam))
Next intParam
' Update sum of row subtotals
Me![TimeSheetDetail].Form![txtSumofSumDetail] = _
Nz(DSum("[RT]", "TSDetailQry", "[TimesheetID] = " &
Me![TimesheetID]))
Me![TimeSheetAdminDetail].Form![txtSumofSumAdmin] = _
Nz(DSum("[RT]", "TSAdminDetailQry", "[TimesheetID] = " &
Me![TimesheetID]))
' Update grand total
Me![txtGrandTotal] = Nz(Me![TimeSheetDetail]![txtSumofSumDetail]) + _
Nz(Me![TimeSheetAdminDetail].Form![txtSumofSumAdmin])
Err_Exit:
Exit Sub
Err_Handler:
Select Case Err.Number
Case 3075
Resume Next
Case Else
MsgBox "The following error has occurred. Please contact the
system administrator." & _
vbCrLf & vbCrLf & Err.Number & vbCrLf & Err.Description,
vbOKOnly, "Runtime Error"
Resume Err_Exit
End Select
End Sub
Private Sub cmdOldTS_Click()
DoCmd.OpenForm "TimeRecordsByStaff", acNormal, , _
"StaffID = " & Me![txtStaffID], acFormReadOnly, acWindowNormal,
"Review"
End Sub
‘ Code for Form 2, opened by cmdOldTS_Click()
‘ Used by user to review his previous time records
‘ The same form is used by management, unfiltered by StaffID to review all
‘ historical records
Private Sub Form_Open(Cancel As Integer)
On Error GoTo Err_Handler
DoCmd.Maximize
Me.Visible = True
Err_Exit:
Exit Sub
Err_Handler:
MsgBox Err.Number & vbCrLf & Err.Description & vbCrLf & vbCrLf & _
"Please contact the system administrator with the above
information.", vbOKOnly, _
"Runtime Error"
GoTo Err_Exit
End Sub
Private Sub Form_Activate()
On Error Resume Next
Me![txtPeriodEnding].SetFocus
End Sub
Private Sub Form_Current()
On Error GoTo Err_Handler
Me![TRDates_Staff].Requery
Err_Exit:
Exit Sub
Err_Handler:
Select Case Err.Number
Case Else
MsgBox Err.Number & vbCrLf & Err.Description & vbCrLf & vbCrLf & _
"Please contact the system administrator with the above
information.", vbOKOnly, _
"Runtime Error"
End Select
GoTo Err_Exit
End Sub