You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

658 lines
16 KiB

VERSION 5.00
Begin VB.Form formReport
Caption = "Time Report Form"
ClientHeight = 5295
ClientLeft = 930
ClientTop = 2175
ClientWidth = 10485
Height = 5700
Left = 870
LinkTopic = "Form1"
ScaleHeight = 5295
ScaleWidth = 10485
Top = 1830
Width = 10605
Begin VB.TextBox txtTo
Height = 288
Left = 1080
TabIndex = 25
Top = 120
Width = 5052
End
Begin VB.TextBox txtCell
Height = 288
Index = 8
Left = 8760
TabIndex = 24
Top = 2160
Width = 972
End
Begin VB.TextBox txtCell
Height = 288
Index = 7
Left = 7680
TabIndex = 23
Top = 2160
Width = 972
End
Begin VB.TextBox txtCell
Height = 288
Index = 6
Left = 6600
TabIndex = 22
Top = 2160
Width = 972
End
Begin VB.TextBox txtCell
Height = 288
Index = 5
Left = 5520
TabIndex = 21
Top = 2160
Width = 972
End
Begin VB.TextBox txtCell
Height = 288
Index = 4
Left = 4440
TabIndex = 20
Top = 2160
Width = 972
End
Begin VB.TextBox txtCell
Height = 288
Index = 3
Left = 3360
TabIndex = 19
Top = 2160
Width = 972
End
Begin VB.TextBox txtCell
Height = 288
Index = 2
Left = 2280
TabIndex = 18
Top = 2160
Width = 972
End
Begin VB.TextBox txtCell
Height = 288
Index = 1
Left = 1200
TabIndex = 17
Top = 2160
Width = 972
End
Begin VB.TextBox txtCell
Height = 288
Index = 0
Left = 120
TabIndex = 14
Top = 2160
Width = 972
End
Begin VB.CommandButton btnClear
Caption = "&Clear All"
Height = 372
Left = 8400
TabIndex = 5
Top = 120
Width = 852
End
Begin VB.CommandButton btnSend
Caption = "&Send"
Height = 372
Left = 7080
TabIndex = 4
Top = 120
Width = 972
End
Begin VB.TextBox txtPayPeriod
Height = 288
Left = 7080
TabIndex = 16
Top = 960
Width = 2172
End
Begin VB.TextBox txtName
Height = 288
Left = 1080
TabIndex = 1
Top = 960
Width = 4452
End
Begin VB.Line Line2
X1 = 0
X2 = 9720
Y1 = 1560
Y2 = 1560
End
Begin VB.Label Label13
Alignment = 2 'Center
Caption = "Total"
Height = 252
Left = 8880
TabIndex = 15
Top = 1800
Width = 732
End
Begin VB.Label Label12
Alignment = 2 'Center
Caption = "Sat"
Height = 252
Left = 7800
TabIndex = 13
Top = 1800
Width = 732
End
Begin VB.Label Label11
Alignment = 2 'Center
Caption = "Fri"
Height = 252
Left = 6720
TabIndex = 12
Top = 1800
Width = 732
End
Begin VB.Label Label10
Alignment = 2 'Center
Caption = "Thu"
Height = 252
Left = 5640
TabIndex = 11
Top = 1800
Width = 732
End
Begin VB.Label Label9
Alignment = 2 'Center
Caption = "Wed"
Height = 252
Left = 4560
TabIndex = 10
Top = 1800
Width = 732
End
Begin VB.Label Label8
Alignment = 2 'Center
Caption = "Tue"
Height = 252
Left = 3480
TabIndex = 9
Top = 1800
Width = 732
End
Begin VB.Label Label7
Alignment = 2 'Center
Caption = "Mon"
Height = 252
Left = 2400
TabIndex = 8
Top = 1800
Width = 732
End
Begin VB.Label Label6
Alignment = 2 'Center
Caption = "Sun"
Height = 252
Left = 1320
TabIndex = 7
Top = 1800
Width = 732
End
Begin VB.Label lblCategories
Alignment = 2 'Center
Caption = "Categories"
Height = 252
Left = 240
TabIndex = 6
Top = 1800
Width = 852
End
Begin VB.Label Label4
Caption = "Pay Period"
Height = 252
Left = 5880
TabIndex = 3
Top = 960
Width = 852
End
Begin VB.Label Label2
Caption = "Name:"
Height = 252
Left = 120
TabIndex = 2
Top = 960
Width = 492
End
Begin VB.Line Line1
X1 = 0
X2 = 9720
Y1 = 720
Y2 = 720
End
Begin VB.Label Label1
Caption = "To:"
Height = 252
Left = 240
TabIndex = 0
Top = 120
Width = 492
End
End
Attribute VB_Name = "formReport"
Attribute VB_Base = "0{D624D371-C698-11CF-A520-00A0D1003923}"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_TemplateDerived = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Attribute VB_Customizable = False
Const RowSize As Integer = 9
Dim objRequestMsg As Object 'the request message
Dim ReportCategories As Variant
Dim CatNum As Integer 'number of report categories in ReportCategories
Dim PayPeriod As Date
Dim ReportData() As WeekDataType
Public Sub Init()
'if there is a request message in the inbox, show the form
If FindRequestMsg Then
ShowReportForm
End If
End Sub
Function NumFromString(txtstr As String) As Double
If IsNumeric(txtstr) Then
NumFromString = Val(txtstr)
Else
NumFromString = 0
End If
End Function
Public Function ShowReportForm() As Boolean
'if can succesfully extract necessary prop from the
'request message show the form
On Error GoTo error_olemsg
If objRequestMsg Is Nothing Then
MsgBox "No active request message"
ShowReportForm = False
Exit Function
End If
If Not ExtractProps Then
ShowReportForm = False
Exit Function
End If
formReport.Show 1
ShowReportForm = True
Exit Function
error_olemsg:
MsgBox "Error " & Str(Err) & ": " & Error$(Err)
Resume Next
End Function
Private Function ExtractProps() As Boolean
'Reads number of report categories, report categiry names
' and pay period from the reques message
Dim objFields As Object
On Error GoTo error_olemsg
If objRequestMsg Is Nothing Then
MsgBox "no message"
ExtractProps = False
Exit Function
End If
'get msg's fields collection
Set objFields = objRequestMsg.Fields
If objFields Is Nothing Then
MsgBox "Error reading request message"
Exit Function
End If
'number of categories
CatNum = objFields.Item(NumCatPropName).Value
'report categories
ReportCategories = objFields.Item(CatPropName).Value
'pay period
PayPeriod = objFields.Item(PayPeriodPropName)
ExtractProps = True
Exit Function
error_olemsg:
MsgBox "Error " & Str(Err) & ": " & Error$(Err)
ExtractProps = False
Exit Function
End Function
Private Function FindRequestMsg() As Boolean
'finds request message in the inbox
'(request message has message class RequestMsgType)
'RequestMsgType is a const defined in tmcrdcmn.bas
'This functon doesn't deal very well with the situation when
'there are more than one request message in the inbox,
'It just gets the one returned by Inbox.Messges.GetFirst(RequestMsgType)
'This can be changed to showing the listbox with all the request messages
'and letting user choose the one he/she wants to user
On Error GoTo error_olemsg
Dim objInbox As Object
Dim objMessages As Object
Dim objMessage As Object
If objSession Is Nothing Then
MsgBox "Not logged on"
FindRequestMsg = False
Exit Function
End If
'get the inbox
Set objInbox = objSession.Inbox
If objInbox Is Nothing Then
MsgBox "Failed to open Inbox"
FindRequestMsg = False
Exit Function
End If
'get the inbox's message collection
Set objMessages = objInbox.Messages
If objMessages Is Nothing Then
MsgBox "Failed to open folder's Messages collection"
FindRequestMsg = False
Exit Function
End If
Set objMessage = objMessages.GetFirst(RequestMsgType)
If objMessage Is Nothing Then
MsgBox "no request msg found"
FindRequestMsg = False
Exit Function
End If
Set objRequestMsg = objMessage
FindRequestMsg = True
Exit Function
error_olemsg:
MsgBox "Error " & Str(Err) & ": " & Error$(Err)
Resume Next
End Function
Private Sub ShowGrid()
'displays the a appropriate number of edit boxes
'on the form
Const initX As Integer = 120
Const initY As Integer = 2160
Const deltaX As Integer = 1080
Const deltaY As Integer = 600
Dim row As Integer
Dim col As Integer
Dim ind As Integer
For row = 1 To CatNum - 1
For col = 1 To RowSize
ind = row * RowSize + col - 1
Load txtCell(ind)
txtCell(ind).Top = initY + row * deltaY
txtCell(ind).Left = initX + (col - 1) * deltaX
txtCell(ind).Visible = True
Next col
Next row
For row = 0 To CatNum - 1
txtCell(row * RowSize).Text = ReportCategories(row)
txtCell(row * RowSize).Enabled = False
txtCell((row + 1) * RowSize - 1).Enabled = False
Next row
End Sub
Function SumUpRow(RowNum As Integer) As Double
Dim ind As Integer
Dim total As Double
total = 0
For ind = 1 To RowSize - 2 Step 1
total = total + NumFromString(txtCell.Item((RowNum - 1) * RowSize + ind).Text)
Next ind
SumUpRow = total
End Function
Private Sub btnClear_Click()
Dim row As Integer
Dim col As Integer
Dim ind As Integer
For row = 0 To CatNum - 1 Step 1
For col = 2 To RowSize
ind = row * RowSize + col - 1
txtCell(ind).Text = ""
Next col
Next row
End Sub
Private Sub btnSend_Click()
'generates and sends a report message
On Error GoTo error_olemsg
Dim objReportMsg As Object
Dim obj As Object
Dim objR As Object
Dim prop As Object
Dim objFields As Object
Dim PropName As String
Dim row As Integer
Dim col As Integer
Dim ind As Integer
MousePointer = WaitCursor
ReDim ReportData(CatNum)
Dim dbgstr As String
dbgstr = ""
'get the data
For row = 0 To CatNum - 1 Step 1
For col = 2 To RowSize - 1 'don't need total
ind = row * RowSize + col - 1
ReportData(row).Day(col - 2) = NumFromString(txtCell(ind).Text)
dbgstr = dbgstr & ReportData(row).Day(col - 2) & " "
Next col
Debug.Print dbgstr
dbgstr = ""
Next row
If objSession Is Nothing Then
MsgBox "Not logged on"
Exit Sub
End If
'create a new message in the outbox
Set objReportMsg = objSession.Outbox.Messages.Add
If objReportMsg Is Nothing Then
MsgBox "Can't add a prop"
Exit Sub
End If
'set the message class
objReportMsg.Type = ReportMsgType
'address the message to the sender of the request message
Set objR = objReportMsg.Recipients.Add(EntryId:=objRequestMsg.Sender.ID, _
Name:=objRequestMsg.Sender.Name)
If objR Is Nothing Then
MsgBox "Can't set recipient"
Exit Sub
End If
'get msg field collection
Set objFields = objReportMsg.Fields
If objFields Is Nothing Then
MsgBox "Internal error. (can't access msg's field collecton)"
Exit Sub
End If
'report data is transmitted in named properties.
'name for the property containing data for the i-th category is "i"
'i = 1, 2, ..., NumberOfCategories
For row = 1 To CatNum Step 1
PropName = RepDataPropPrefix & Str(row)
'we can't write:
'Set obj = objFields.Add(Name:=PropName, _
Class:=vbDouble + vbArray, _
Value:=ReportData(row - 1.Day)
'because of the way VB passes array parameters
'so we first add a property and then set its value
Set obj = objFields.Add(Name:=PropName, _
Class:=vbDouble + vbArray)
If obj Is Nothing Then
MsgBox "Can't add a prop"
Exit Sub
End If
obj.Value = ReportData(row - 1).Day
Next row
Set obj = objFields.Add(Name:=CatPropName, _
Class:=vbString + vbArray)
If obj Is Nothing Then
MsgBox "Can't add a prop"
Exit Sub
End If
obj.Value = ReportCategories
Set obj = objFields.Add(Name:=NumCatPropName, _
Class:=vbInteger, _
Value:=CatNum)
If obj Is Nothing Then
MsgBox "Can't add a prop"
Exit Sub
End If
Set prop = objFields.Add(Name:=PayPeriodPropName, _
Class:=vbDate, _
Value:=PayPeriod)
If prop Is Nothing Then
MsgBox "Can't add a prop"
Exit Sub
End If
'$for testing only, later this field (txtName)
'will be read-only
'Set obj = objFields.Add(Name:=NamePropName, _
Class:=vbString, _
Value:=txtName.Text)
'If obj Is Nothing Then
' MsgBox "Can't add a prop"
' Exit Sub
'End If
objReportMsg.Send showDialog:=False
MousePointer = DefaultCursor
Unload Me
Exit Sub
error_olemsg:
MsgBox "Error " & Str(Err) & ": " & Error$(Err)
Resume Next
End Sub
Private Sub Categories_Click()
End Sub
Private Sub Form_Load()
txtTo.Text = objRequestMsg.Sender.Name
txtTo.Enabled = False
txtName.Text = objSession.CurrentUser.Name
txtName.Enabled = False
txtPayPeriod.Text = PayPeriod
txtPayPeriod.Enabled = False
ShowGrid
End Sub
Private Sub Form_Unload(Cancel As Integer)
CatNum = 0
Set objRequestMsg = Nothing
End Sub
Private Sub txtCell_LostFocus(Index As Integer)
'do some validation
Dim indTot As Integer
If (Index Mod RowSize = 0) Or ((Index + 1) Mod RowSize = 0) Then
Debug.Print "LostFocus from a disable control"
Exit Sub
End If
If txtCell.Item(Index).Text = "" Then
Exit Sub
End If
If IsNumeric(txtCell.Item(Index).Text) And _
Val(txtCell.Item(Index).Text) >= 0 And _
Val(txtCell.Item(Index).Text) <= 24 Then
indTot = (Index \ RowSize) * RowSize + RowSize - 1
txtCell.Item(indTot).Text = SumUpRow(Index \ RowSize + 1)
Else
MsgBox "Has to be number of hours." + Chr(13) + _
"(Can not be greater than 24)"
txtCell(Index).SetFocus
End If
End Sub