home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1997 November / Pcwk1197.iso / LOTUS / Eng-ins / SMASTERS / APPROACH / SCHEDULE.MPR / SCRIPT / A007ApprGlobObj897.s (.txt) < prev    next >
Null Bytes Alternating  |  1997-01-09  |  81KB  |  893 lines

  1. '++LotusScript Development Environment:2:5:(Options):0:74
  2. Option Public
  3. Option Declare
  4.  
  5. '++LotusScript Development Environment:2:5:(Forward):0:1
  6. Declare Sub displayBlock(txt As String, start As Double, finish As Double, roomName As String)
  7. Declare Sub readBlock(dateReserved As String)
  8. Declare Sub clearDisplay
  9. Declare Sub displayRooms
  10. Declare Function modifySchedule(dateReserved As String, roomName As String, ReservedBy As String, start As Double, finish As Double, note As String, modType As Integer) As Integer
  11. Declare Sub modifyRoomsArray(modifyType As Integer)
  12. Declare Sub fillRoomsArray
  13. Declare Function modifyRooms
  14. Declare Sub deleteScheduledRemovedRooms
  15. Declare Sub string_sort(array() As String)
  16. Declare Function isScheduled (schedDate As String, roomName As String, schedTime As Double) As Integer
  17. Declare Sub displaySchedule(dateToDisplay As String)
  18. Declare Sub processDate
  19.  
  20. '++LotusScript Development Environment:2:5:(Declarations):0:10
  21. Dim rooms() As String
  22. Dim deletedRooms() As String
  23. Dim GlobDateDisplay As String
  24. Dim GlobStartTime As String
  25. Dim GlobEndTime As String
  26. Dim GlobRoom As String
  27. Dim GlobReservedBy As String
  28. Dim GlobNote As String
  29.  
  30.  
  31. %INCLUDE "LSCONST.lss"
  32.  
  33. '++LotusScript Development Environment:2:2:displayBlock:1:8
  34. Sub displayBlock(txt As String, start As Double, finish As Double, roomName As String)
  35. 'Displays the reservation owner in the correct time slot 
  36. 'on the current view body.
  37. 'Called from readBlock
  38.    '  txt                      reservation owner
  39.    '  start                  reservation start time
  40.    '  finish                reservation end time
  41.    '  roomName   reservation room name or number
  42. 'RUNTIME DEPENDENCIES
  43. 'Constants: Uses constants defined by LotusScript defined in
  44. 'LSCONST.LSS.
  45. 'Globals: Uses the global array Rooms() filled by the readBlock
  46. 'sub.
  47.     
  48. 'Declare variables
  49.     Dim tt As textbox    'New textbox to hold the reservation
  50.                                            'owner name on the view
  51.     Dim i As Integer     'Index of array with the room names
  52.     
  53. 'Index of the room that matches the roomName passed in.
  54. 'Used to determine the vertical placement of the reservation
  55. 'info on the view.
  56.     Dim matchedRoom As Integer   
  57.     
  58. 'Offset and multiplier for the vertical placement of the
  59. 'reservation info.
  60.     Dim verticalPlacement As Integer     
  61.     
  62. 'Search through the global array Rooms to find the room passed 
  63. 'in from the schedule database using the sub readBlock.
  64.       'Set matchedRoom to the index of the room passed in.
  65.     For i = 0 To Ubound(Rooms)
  66.         If Rooms(i) = roomName Then
  67.             matchedRoom = i
  68.             i = Ubound(Rooms)
  69.         End If   'If element matches the room passed in.
  70.     Next
  71.     
  72. 'Set position and display for the reservation info.
  73.     
  74. 'Header on the view takes up 1635 twips, each row in the table
  75. 'is 330 twips tall
  76.     verticalPlacement = 1635 + (330 * matchedRoom)
  77.     
  78. 'Create the textbox to hold the reservation info
  79.     Set tt = New textbox(currentview.body)
  80.     
  81. 'Fill the text of the textbox with the reservation owner name
  82. 'and spaces to center the text properly
  83.     tt.Text = " " + txt + " "
  84.     
  85. 'Set display properties for the textbox to match the form
  86.     tt.Font.Size = 8
  87.       ' Use LotusScript constants for border style
  88.     tt.Border.Style = $ltsBorderStyleNone
  89.     tt.Border.Left = True
  90.     tt.Border.Right = True
  91.     tt.Border.Top = False
  92.     tt.Border.Bottom = False
  93.       ' Use Approach constants for line width
  94.     tt.Border.Width = $apr1point
  95.       ' Use LotusScript constants for color    
  96.     Call tt.Border.Color.SetRGB(COLOR_ULTRAMARINE)
  97.     Call tt.Background.Color.SetRGB (COLOR_50_GRAY)
  98.     
  99. 'Set up the position of the textbox to correspond to the
  100. 'correct room and time.
  101.     tt.Height = 325
  102.     tt.Top = verticalPlacement   'Current offset from top of
  103.                                                               'form
  104.     
  105. 'Convert reservation time (passed in) to the horizontal
  106. 'location and length on the form.
  107.     tt.Left = (((start - 8) * 750) + 945)
  108.     tt.Width =  (750 * (finish - start))
  109.     
  110. 'Add a prefix to the name of the textbox so the clearDisplay
  111. 'function can delete the reservation info.
  112.     tt.Name = "tt" + Str$(tt.Top) + Str$(tt.Left)   
  113.     
  114. End Sub   'displayBlock
  115. '++LotusScript Development Environment:2:2:readBlock:1:8
  116. Sub readBlock(dateReserved As String)
  117. '  Retrieves the reservation information from the database for the date passed in
  118. '  Called from click events for the following:
  119. '    btnToday, txtSeeToday                                on Start view
  120. '    fbxDateDisplay, btnRefresh, btnNext, btnPrev        on Schedule Display view
  121. '    btnOK, fbxDate                                        on Enter Date view
  122. '    btnDone                                                on Reservation view
  123.    ' dateReserved      Date formatted as a string   
  124.     
  125.    ' Declare objects for connecting to the reservation database
  126.     Dim C As New Connection
  127.     Dim Q As New Query
  128.     Dim RS As New ResultSet
  129.     
  130.     Dim s As Double       ' Start time of existing reservation
  131.     Dim f As Double       ' End time of existing reservation
  132.     Dim row As String     ' Room reserved
  133.     Dim n As String       ' Reservation owner
  134.     Dim tname As String   ' A shorter reservation table name reference
  135.     
  136.    ' Collect the name of the main table associated with the 
  137.    ' document, which is the first table, numbered starting at zero.
  138.     tname = CurrentDocument.Tables(0).TableName
  139.     
  140.    ' Place the names of the current rooms on the view.
  141.     Call displayRooms()
  142.     
  143.    ' Build the connection to retrieve the reservation information for 
  144.    ' the passed-in date. This is a standard data-access sequence, 
  145.    ' modify SQL SELECT statement as needed. 
  146.    ' Note that the database is dBASE IV in this case.
  147.     If C.ConnectTo("dBASE IV") Then
  148.         Set Q.Connection = C
  149.         
  150.       ' Tablename for the query needs to have full path.
  151.         Q.Tablename =  CurrentDocument.Tables(0).Path & tname & ".dbf"
  152.         
  153.       ' The query is set to retrieve all database fields for records        
  154.       ' whose Date Reserved field match the date passed-in.
  155.       ' Note that the syntax for the SQL SELECT statement requires          
  156.       ' extra quotes to define the string concatination.
  157.         Q.SQL = "SELECT * FROM """+Q.Tablename+""""_
  158.         + tname+" WHERE (("_
  159.         + tname+".""Date Reserved"" = '"+dateReserved+"'))"      
  160.         
  161.       ' Assign this query to the result set
  162.         Set RS.Query = Q
  163.         
  164.       ' Use the result set to fill in the reservation information on
  165.       ' the display.
  166.       ' If the result set was created successfully, then.
  167.         If (RS.Execute) Then   
  168.          ' Confirm that there are reservations for this date.
  169.             If (RS.numrows) Then        
  170.                 RS.firstrow     ' Go to the first record in the result set
  171.                 
  172.             ' Loop through all of the records in the result set and               
  173.             ' display the reservation information on the view.
  174.                 Do
  175.                     s = RS.getvalue("Start Time")
  176.                     f = RS.getvalue("End Time")
  177.                     row = RS.getvalue("Room Name/Number")
  178.                     n = RS.getvalue("Reserved By")
  179.                     
  180.                ' Build a text box on the view with the reservation 
  181.                ' info from this pass through the loop.
  182.                     Call displayBlock(n, s, f, row)
  183.                     
  184.                 Loop   While RS.nextrow            
  185.             End If      ' Numrows not zero
  186.         End If      ' Result set successful   
  187.     End If      ' Connection successful
  188.     
  189.    ' Close the connection to allow other connections to this database
  190.     C.Disconnect
  191.     
  192. End Sub        ' readBlock
  193. '++LotusScript Development Environment:2:2:clearDisplay:1:8
  194. Sub clearDisplay
  195. '  Clears the reservations from the Schedule Display view
  196. '  Only clears the text boxes that were tagged with "tt" by displayBlock
  197. '  Called by the click events for the following objects:
  198. '    btnToday, txtSeeToday                                on Start view
  199. '    fbxDateDisplay, btnRefresh, btnNext, btnPrev        on Schedule Display view
  200. '    btnOK, fbxDate                                        on Enter Date view
  201. '    btnDone                                                on Reservation view
  202.     
  203.     Dim f As form            '  Holds the name of the view to clear
  204.     Dim cl As collection    '  Holds the list of tagged objects
  205.     
  206.     Set f = currentdocument.Schedule~ Display
  207.     Set cl = f.objectlist
  208.     
  209.     '  Loop through all items in the collection, and delete if the object is tagged
  210.     Forall i In cl
  211.         If Left$(i.name, 2) = "tt" Then        ' tt is the tag prefix
  212.             Delete i
  213.         End If        ' Check for tag
  214.     End Forall        ' End of objectlist
  215.     
  216. End Sub        ' clearDisplay
  217. '++LotusScript Development Environment:2:2:displayRooms:1:8
  218. Sub displayRooms
  219. '  Displays the room names as stored in the global variable rooms()
  220. '  The room names are displayed in new text boxes on the Schedule Display view
  221. '  Called from readBlock
  222.     
  223.     Dim roomText As textbox        ' New textbox
  224.     
  225.     Dim i As Integer                    ' Index for rooms() array
  226.     
  227.     ' Fill rooms() with the most recent information from the rooms database
  228.     ' by calling the sub fillRoomsArray
  229.     Call fillRoomsArray()
  230.     
  231.     ' Loop through rooms(), creating a new text box for each room in the array.
  232.     ' Each text box is positioned on the view in order
  233.     For i = 0 To Ubound(rooms)        ' from 0 to upperbound of rooms()
  234.         
  235.         ' Create the text box
  236.         Set roomText = New textbox(currentdocument.Schedule~ Display.body)
  237.         
  238.         ' Name the text box with a prefix so it can be easily cleared from the view
  239.         ' using clearDisplay.
  240.         roomText.name = "tt"+Str$(i)
  241.         
  242.         ' Fill the text box with the room name
  243.         roomText.text = rooms(i)                
  244.         
  245.         ' Position the text box on the view        
  246.         roomText.Top = 1650 + (330 * i)        ' 1650 is the offset from top of the view
  247.                                                 ' 330 is the vertical size of each text box
  248.         roomText.width = 750
  249.         roomText.height = 300
  250.         roomText.left = 160
  251.         
  252.         ' Set the display properties of the text box to match the view
  253.         roomText.font.size = 8
  254.         roomText.border.style = $ltsBorderStyleNone    
  255.         roomText.border.color.setrgb(COLOR_TRANSPARENT)
  256.         roomText.background.color.setrgb(COLOR_IVORY)
  257.     Next    ' Loop through rooms()    
  258. End Sub        'displayRooms
  259. '++LotusScript Development Environment:2:1:modifySchedule:1:8
  260. Function modifySchedule(dateReserved As String, roomName As String, ReservedBy As String, start As Double, finish As Double, note As String, modType As Integer) As Integer
  261.     
  262. '  Compares reservation information with the schedule database; if no overlapping
  263. '  reservation exists, modifies the schedule database.
  264. '  Called from btnDone on Reservation view.
  265.     ' dateReserved    Date of the reservation
  266.     ' roomName        Room to be reserved
  267.     ' ReservedBy        Name of reservation owner
  268.     ' start                Reservation begin time
  269.     ' finish                Reservation end time
  270.     ' note                Comments about the reservation
  271.     ' modType        Reserve or Remove
  272.     
  273.     'Check for apostrophe in room name
  274.     Dim PositionOfApstr As Integer
  275.     Dim ModRoomNm As String
  276.     ModRoomNm = roomName
  277.     PositionOfApstr = Instr(1, ModRoomNm, "'")
  278.     Do While PositionOfApstr > 0
  279.         ModRoomNm = Left$( ModRoomNm , PositionOfApstr - 1) & "''" & Right$(ModRoomNm, Len(ModRoomNm) - PositionOfApstr)
  280.         PositionOfApstr = Instr(PositionOfApstr+2, ModRoomNm, "'")        
  281.     Loop
  282.     ' Declare objects for the connection to the schedule database
  283.     Dim C As New Connection
  284.     Dim Q As New Query
  285.     Dim RS As New ResultSet
  286.     
  287.     Dim tname As String            ' Stores a shorter table name reference
  288.     
  289.     ' Store the reservation table name. The schedule table is the first table
  290.     ' for the document. The index numbering starts at zero.
  291.     tname = CurrentDocument.Tables(0).TableName
  292.     
  293.     ' Initialize the function's return value to false
  294.     modifySchedule = False
  295.     
  296.     ' Create a connection to the schedule database
  297.     If C.ConnectTo("dBASE IV") Then
  298.         Set Q.Connection = C
  299.         
  300.         ' Tablename for the query needs to have full path. 
  301.         Q.TableName = CurrentDocument.Tables(0).Path & tname & ".dbf"
  302.         
  303.         ' Select the records from the schedule database that match the passed-in 
  304.         ' reservation information. Different information is appropriate whether the
  305.         ' user is removing a reservation or creating a reservation
  306.         If modType > 0 Then            ' Reserving
  307.             ' Retrieve all the reservations for the date specified
  308.             Q.SQL = "SELECT * FROM """+Q.Tablename+""" "+ tname + " WHERE (("+ tname + ".""Date Reserved"" = '"+dateReserved+"') AND ("+ tname + ".""Room Name/Number"" = '"+ModRoomNm+"'))"        
  309.         Elseif modType < 0 Then    ' Removing
  310.             ' Retrieve the specific reservation to be removed
  311.             Q.SQL = "SELECT * FROM """+Q.Tablename+""" "+ tname + " WHERE (("+ tname + ".""Date Reserved"" = '"+dateReserved+"') AND ("+ tname + ".""Room Name/Number"" = '"+ModRoomNm+"') AND ("+ tname + ".""Start Time"" = '"+Trim$(Str$(start))+"') AND ("+ tname + ".""End Time"" = '"+Trim$(Str$(finish))+"'))"
  312.         End If        ' select for modification type
  313.         
  314.         ' Assign the query to the declared result set
  315.         Set RS.Query = Q
  316.         
  317.         ' Create the result set and perform the modification
  318.         If (RS.Execute)Then            ' if the result set was successful
  319.             
  320.             If (RS.NumRows) Then    ' if there are records in the result set,
  321.                 RS.FirstRow            ' go to the first record
  322.             End If    ' result set has records
  323.             
  324.             ' Set the return value for the function. If there is a schedule conflict, this flag is set to False
  325.             modifySchedule = True
  326.             
  327.             ' Modify the schedule for the appropriate modification type
  328.             If modType < 0 Then            ' Remove reservations
  329.                 If RS.NumRows Then        ' If there are more than 0 records in the result set
  330.                                             ' the reservation passed-in,
  331.                     RS.DeleteRow            ' then delete the reservation record
  332.                     
  333.                 Else        ' If there are no reservations to remove, don't modify the schedule
  334.                     modifySchedule = False
  335.                     
  336.                 End If        ' If the result set is empty
  337.             Else                            ' Create new reservations
  338.                 If (RS.NumRows) Then    ' If there are more than 0 records in the result set
  339.                     
  340.                     ' Check to see that the new reservation does not overlap an existing
  341.                     ' reservation.
  342.                     Do                ' For each record in the result set and if there hasn't 
  343.                                     ' already been an overlap identified
  344.                     
  345.                     ' If the new reservation:
  346.                     '    1. Starts before and ends after an existing reservation
  347.                     '    2. Finishes between the start and end of an existing reservation
  348.                     '    3. Starts between the start and end of an existing reservation
  349.                     ' then it conflicts with an existing reservation and the schedule is not
  350.                     ' modified.
  351.                     If start <= RS.GetValue("Start Time") And finish >  RS.getvalue("Start Time") Then
  352.                         modifySchedule = False                    
  353.                     Elseif finish <= RS.GetValue("End Time") And finish >  RS.getvalue("Start Time") Then
  354.                         modifySchedule = False
  355.                     Elseif start < RS.GetValue("End Time") And start >=  RS.getvalue("Start Time") Then
  356.                         modifySchedule = False
  357.                     End If        ' If there is a conflict, then do not modify the schedule
  358.                     
  359.                 Loop    While (RS.NextRow And modifySchedule = True)        ' For each record in the result set
  360.             End If        ' If there are more than zero records in the result set
  361.             
  362.             ' If the new reservation did not conflict with an existing reservation, then add 
  363.             ' a record to the result set with the new reservation information
  364.             If modifySchedule = True Then        ' If there is a new reservation, then
  365.                 RS.AddRow                            ' Add a row to the result set
  366.                 ' Enter the reservation information to each of the fields in the reservation record:
  367.                 RS.SetValue "Start Time", start
  368.                 RS.SetValue "End Time", finish
  369.                 RS.SetValue "Reserved By", ReservedBy
  370.                 RS.SetValue "Date Reserved", dateReserved
  371.                 RS.SetValue "Room Name/Number", roomName
  372.                 RS.SetValue "Note", note
  373.                 ' Commit the new record to the table
  374.                 RS.UpdateRow
  375.             End If        ' If a new reservation did not conflict with an existing one, update the result set
  376.         End If        ' If modification type was add or remove
  377.     End If        ' Result set is successful
  378.     
  379. End If        ' Connection is successful
  380. ' Close the connection so it is available for other subs or functions
  381. C.Disconnect
  382.  
  383. End Function        ' modifySchedule
  384. '++LotusScript Development Environment:2:2:modifyRoomsArray:1:8
  385. Sub modifyRoomsArray(modifyType As Integer)
  386. '  Adds or removes rooms( from) the rooms() array according to changes
  387. '  made in the Room Setup view. This routine contains the limit on the
  388. '  number of rooms that the system allows (MaxRooms).
  389. '  Called by click evens on the btnAdd and btnRemove on the Room Setup view
  390.     ' modifyType        1 = Add a room; 0 = Remove
  391.     
  392.     ' Declare display objects to use as shorthand for objects on the view
  393.     Dim fbx As fieldbox        ' Room name field box; the user can type into this box
  394.     Dim lbx As listbox            ' List of confirmed rooms; Cannot type into it, but can select from
  395.     Dim btn As button            ' Button that completes the current tast
  396.                                 ' It starts out as "Done"
  397.     
  398.     Dim i As Integer                        ' Index for the rooms() array during an add
  399.     Dim j As Integer                        ' Index for the rooms() array during a remove
  400.     Dim ret As Integer                    ' Return from user prompt for confirming room deletion
  401.     Dim roomExists As Integer            ' Flag indicating whether a room with the name of a
  402.                                             ' new room already exists in the room() arry
  403.     Dim newRoomName As String        ' Stores the name of a room being added
  404.     Dim numRooms As Integer            ' Stores the actual number of rooms in the system, from
  405.                                             ' rooms() array
  406.     Dim badname As Integer            ' Flag indicating that the name submitted is blank
  407.     Dim deleteRoomName As String    ' Stores the name of a room selected for deletion
  408.     Dim MaxRooms As Integer            ' Stores the ceiling for the number of rooms allowed
  409.     Dim CheckValue As Integer            ' Store return values for error checking
  410.     
  411.     ' Define the total number of rooms allowed in the reservation system
  412.     maxrooms = 20
  413.     
  414.     ' If the modification to occur is an Add, check to make sure there can be another
  415.     ' entry in the rooms() array.
  416.     
  417.     ' If there are already the maximum number of rooms and this is an Add, then
  418.     If ((Ubound(rooms) + 1) = MaxRooms) And (modifyType > 0)Then
  419.         ' Indicate to the user that no more rooms can be added.
  420.         Messagebox "Cannot add anymore rooms.  Maximum number of rooms is"+Str$(MaxRooms)+"."
  421.         
  422.     Else        ' If there can be more rooms, or the modification is a Remove, then
  423.         ' Create a shorter reference name for the display objects this section uses
  424.         Set fbx = currentview.body.fbxRoomName        ' The box the user enters a new room name in
  425.         Set lbx = currentview.body.lbxRooms            ' The list of rooms displayed in the view
  426.         Set btn = currentview.body.btnDone                ' The button that the user clicks to perform the
  427.                                                             ' indicated operation
  428.         
  429.         ' If the modification is to Add a room to the list, then
  430.         If modifyType > 0 Then
  431.             roomExists = False            ' Initialize this flag to False. 
  432.             newRoomName = fbx.text    ' Record the new room name from the UI
  433.             If fbx.text = "" Then            ' If the new room name is blank, then
  434.                 badname = True            ' Set this flag to True: this name is not acceptible
  435.             End If        ' New room name is blank
  436.             
  437.             ' Loop through the rooms() array to see if the new room name already exists
  438.             For i = 0 To Ubound(rooms)        ' From 0 to the upper bound of the rooms() array
  439.                                                 ' (remember array starts at 0)
  440.                 
  441.                 ' Compare the current name from rooms() to the new room name.
  442.                 ' Make the comparison case-insensitive by comparing the names
  443.                 ' in upper case.
  444.                 If Ucase$(rooms(i)) = Ucase$(newRoomName) Then        ' If the names match, then
  445.                     roomExists = True        ' Set this flag to True: the new room name is in the list already
  446.                     
  447.                     ' Because there is a conflict, we don't need to stay in the loop anymore;
  448.                     ' Set the index to a value beyond the limit on the loop.
  449.                     i = Ubound(rooms) + 1
  450.                 End If    ' If the new room name matches the current rooms() array value
  451.             Next        ' Increment through the rooms() array
  452.             
  453.             ' Add the new room to the rooms() array.
  454.             ' A True value in BadName or RoomExists would cancel the modification
  455.             If (roomExists = False And badname = False) Then    ' If both flags are false, then
  456.                 
  457.                 ' Check to see if the rooms() array needs more space to store the new room
  458.                 ' If there are no rooms already in the rooms() array, then add the room name
  459.                 ' to the first entry in the array (array increments from zero)
  460.                 If Ubound(rooms) = 0  And rooms(0) = "" Then
  461.                     rooms(0) = newRoomName        ' Set the array element to the new room name
  462.                     
  463.                 ' If there are rooms already or the first room in the array is not blank,
  464.                 ' then add more space to the rooms array and add the new name to the
  465.                 ' last entry
  466.                 Else        ' The upper bound is not zero or the first element in rooms() is not blank
  467.                     Redim Preserve rooms(Ubound(rooms) + 1)    ' Create space for one more
  468.                                                                         ' element in the array
  469.                     rooms(Ubound(rooms)) = newRoomName        ' Set the last element to the new
  470.                                                                         ' room name
  471.                 End If        ' adding the new room name to the array
  472.                 
  473.                 ' Update the view with the new information
  474.                 CheckValue = lbx.setlist(rooms)        ' Fill the room list box with the new values from rooms()
  475.                 fbx.text = ""                ' Remove the new room name from the text box
  476.                 btn.enabled = True        ' Enable the Done button
  477.                 
  478.             ' If the RoomExists flag was set, indicate to the user that the name already exists.
  479.             Elseif roomExists = True Then        ' If flag was set to True above, then
  480.                 Messagebox "A room named """ + Ucase$(newRoomName) + """ already exists"
  481.             End If        ' If the room name already exists
  482.             
  483.         Else        ' If the modification type is not Add, then
  484.             
  485.             ' Allow the user to confirm the room deletion
  486.             ' The message box has these arguments:
  487.             '    "Are you ..."        The message
  488.             '    MB_YESNO        The box has buttons for Yes and No
  489.             '    "Delete Room"    The title of the box
  490.             ' The message box returns IDYES or IDNO (LotusScript constants)
  491.             ret = Messagebox( "Are you sure you want to delete this room?  Deleting this room will also delete any scheduled conferences for this room.", MB_YESNO, "Delete Room")
  492.             
  493.             ' If the return from the message box is Yes, delete the room selected in the Room Name list box
  494.             If ret = IDYES Then    ' If response is Yes--the room is being deleted--then
  495.                 deleteRoomName = lbx.text        ' Store the name selected in the list box
  496.                 
  497.                 'Make space in the list of deleted rooms and add the new room name to the list
  498.                 Redim Preserve deletedRooms(Ubound(deletedRooms) + 1)
  499.                 deletedRooms(Ubound(deletedRooms)) = deleteRoomName
  500.                 
  501.                 ' Look through rooms() for the room to be deleted. If found, fill its space with
  502.                 ' the name of the next room on the list. Repeat until there are no gaps in the
  503.                 ' array.
  504.                 For i = 0 To Ubound(rooms)        ' Zero to the upper bound of rooms()
  505.                     ' If  the deleted room is in rooms(), then
  506.                     If Ucase$(rooms(i)) = Ucase$(deleteRoomName) Then
  507.                         numRooms = numRooms - 1    ' Reduce the size of rooms() by one
  508.                         ' Starting with the element in rooms that is deleted, move the next
  509.                         ' room name into the current room's place in the array.
  510.                         For j = i To (Ubound(rooms) - 1)
  511.                             rooms(j) = rooms(j + 1)
  512.                         Next    ' To the upper bound of rooms()
  513.                         i = Ubound(rooms) + 1    ' Increment i to the next room in rooms()
  514.                     End If        ' If the deleted name is matches the room in rooms(i)
  515.                 Next        ' Loop through each room in rooms()
  516.                 
  517.                 ' If there are still rooms listed in rooms, then reduce the space the array
  518.                 ' fills, now that a room has been deleted.
  519.                 If Ubound(rooms) Then
  520.                     Redim Preserve rooms(Ubound(rooms) - 1)                
  521.                 Else        ' If there are no rooms listed in rooms(), then
  522.                     rooms(0) = ""        ' Set the first element to blank
  523.                     ' Disable the Remove button on the form, as there are no rooms to remove
  524.                     currentview.body.btnRemove.enabled = False
  525.                 End If        ' There are rooms remaining in rooms()
  526.             End If        ' If the deletion is confirmed
  527.         End If        ' If the modification type is Add or Remove
  528.         
  529.         Call string_sort(rooms)                ' Sort rooms() in alpha order        
  530.         CheckValue = lbx.setlist(rooms)        ' Update the UI with the new list of rooms
  531.         btn.enabled = True                    ' Enable the Done button
  532.     End If            ' There can be more rooms or the mod type is remove
  533.     
  534. End Sub        ' modifyRoomsArray
  535. '++LotusScript Development Environment:2:2:fillRoomsArray:1:8
  536. Sub fillRoomsArray
  537. '  Fills public array rooms() with the contents of the rooms database
  538. '  Called from displayRooms and the Switchto event on the Room Setup view
  539.     
  540.      ' Declare objects for connecting to the rooms database
  541.     Dim C As New Connection        ' Defines which database to connect to
  542.     Dim Q As New Query                ' Defines which records are used from the database
  543.     Dim RS As New ResultSet        ' Holds the records selected by the query
  544.     
  545.     Dim numRooms As Integer        ' Count of the number of records in the rooms database
  546.     Dim i As Integer                    ' Index for looping through the rooms array
  547.     Dim tname As String                ' Stores a shorter table reference
  548.     
  549.     ' Store the name of the table with room information. It is not the main table
  550.     ' for the application, so it will be the second table in the document, where the
  551.     ' count starts at zero.
  552.     tname = currentdocument.tables(1).tablename
  553.     
  554.     ' Make the connection to the rooms database, reserve space for the expected
  555.     ' number of rooms, and copy each room name into the rooms array.
  556.     
  557.     i = 0        ' Initialize the index to zero because the database records are numbered from 0
  558.     If C.ConnectTo("dBASE IV") Then    ' If the connection is successful, then
  559.         Set Q.Connection = C                ' Use this connection with this query
  560.         
  561.         ' Use the rooms database as the table to query
  562.         Q.Tablename = currentdocument.tables(1).path & tname & ".dbf"
  563.         
  564.         ' Because this query has no SQL property set, the query returns all records
  565.         ' in the specific table.
  566.         Set RS.Query = Q            ' Assign the query to the result set
  567.         If (RS.Execute) Then        ' If the result set is created successfully, then
  568.             numRooms = RS.numrows()        ' Store the number of records in the database
  569.             If numrooms Then                ' If there are more than 0 records, then
  570.                 
  571.                 ' Reserve space for rooms(); remember the array starts at 0
  572.                 Redim rooms(numRooms - 1)
  573.                 
  574.                 RS.firstrow        ' Go to the first record in the result set (the entire database)
  575.                 Do                    ' Loop through the records in the result set
  576.                 
  577.                 ' Copy the room name from the record into the rooms array
  578.                 rooms(i) = RS.getvalue("room")        
  579.                 i = i + 1            ' Increment the array
  580.             Loop    While RS.nextrow        ' Loop through the records in the result set
  581.         Else    ' If there are no rooms in the database
  582.             Redim rooms(numRooms)    ' Redimension the array to zero
  583.         End If        ' If there are records in the rooms database
  584.     End If        ' If the result set is created successfully
  585. End If            ' If the connection to the rooms database succeeds
  586.  
  587. ' Close the connection to the database
  588. c.disconnect
  589.  
  590. 'Put the rooms in alphabetical order in rooms() by calling the sub string_sort
  591. ' with rooms as its input
  592. Call string_sort (rooms)
  593. End Sub        'displaySchedule
  594. '++LotusScript Development Environment:2:1:modifyRooms:1:8
  595. Function modifyRooms
  596. ' Commits room changes made in the UI to the rooms database.
  597. ' Does this by deleting the contents of the rooms database and
  598. ' refilling it using the rooms() array.
  599. ' Called from the click event for the btnDone on the Room Setup view
  600. ' Returns True if the database is updated with the new room list. Returns
  601. ' False if no update occurs.
  602.     
  603.     ' Declare objects for connecting to the rooms database
  604.     Dim C As New Connection        ' Defines which database to connect to
  605.     Dim Q As New Query                ' Defines which records are used from the database
  606.     Dim RS As New ResultSet        ' Holds the records selected by the query
  607.     
  608.     Dim i As Integer                    ' Index for cycling through the rooms() array
  609.     Dim tname As String    ' A shorter the reservation table name reference
  610.     
  611.     ' Collect the name of the table with room information, which is not the main table
  612.     ' associated with the document. It will be the second table, numbered from zero.
  613.     tname = CurrentDocument.Tables(1).TableName    
  614.     
  615.     ' Initialize the function return value
  616.     modifyRooms = False
  617.     
  618.     ' Create the connection to the Rooms database, delete all of the records, and
  619.     ' refill the database from the rooms() array.
  620.     If C.ConnectTo("dBASE IV") Then        ' If the connection succeeds, then
  621.         Set Q.Connection = C                    ' Use this connection in the query
  622.         ' Use the rooms database as the table for the query
  623.         Q.TableName = CurrentDocument.Tables(0).Path & tname & ".dbf"
  624.         ' Because no SQL property is set for the query, the query will return all
  625.         ' records from the database.
  626.         
  627.         ' Define the result set to use the query defined above.
  628.         Set RS.Query = Q
  629.         
  630.         ' Create the result set, delete each record in the set, and refill the result set from rooms()
  631.         If (RS.Execute)Then                ' If the result set successfully created, then
  632.             If (RS.NumRows) Then        ' If there are more than 0 records in the result set
  633.                 RS.FirstRow                ' Go to the first record in the result set
  634.                 Do                            ' Loop through all of the records in the result set
  635.                 RS.DeleteRow            ' Delete the current row
  636.             Loop    While (RS.NumRows)    ' While there are still records in the result set
  637.         End If            ' If the result set has more than 0 records
  638.         
  639.         ' Set the function return value to True (the rooms list is modified)
  640.         modifyRooms = True
  641.         
  642.         ' Refill the result set with the current list of rooms from rooms()
  643.         For i = 0 To Ubound(rooms)            ' Loop from 0 to the upper bound of the rooms() array
  644.             RS.AddRow                        ' Add a record to the result set (all the rows were deleted above)
  645.             RS.SetValue "room", rooms(i)    ' Fill the rooms field in the record with the current 
  646.             RS.UpdateRow                        ' Commit the new record to the table
  647.         Next        ' Increment to the next value in rooms()
  648.     End If            ' If the result set is created successfully
  649. End If            ' If the connection is successfully
  650.  
  651. ' Close the connection to the database
  652. C.Disconnect
  653.  
  654. End Function        'modifyRooms
  655. '++LotusScript Development Environment:2:2:deleteScheduledRemovedRooms:1:8
  656. Sub deleteScheduledRemovedRooms
  657. ' Removes deleted rooms from rooms.dbf
  658. ' Called from Done button on Room Setup view
  659.     
  660.     ' Declare objects for connecting to the rooms database
  661.     Dim C As New Connection        ' Defines which database to connect to
  662.     Dim Q As New Query                ' Defines which records are used from the database
  663.     Dim RS As New ResultSet        ' Holds the records selected by the query
  664.     Dim tname As String                ' Stores the name of the rooms table
  665.     
  666.     Dim i As Integer                    ' Index for loop through records in the database
  667.     
  668.     ' Store the table name to make a shorter reference
  669.     ' The schedule information is the main table for the application.
  670.     ' The main table is the first table in the document --> tables(0)
  671.     tname = currentdocument.tables(0).tablename
  672.     
  673.     ' Make a connection to the rooms database, search for rooms that match
  674.     ' the rooms deleted using the UI <modifyRoomsArray>, and then delete
  675.     ' the record in the database for that room.
  676.     
  677.     If C.ConnectTo("dBASE IV") Then        ' If the connection works, then
  678.         
  679.         ' Define the query object with a connection, a table, and search criteria
  680.         Set Q.Connection = C                    ' Use this connection in the query
  681.         Q.Tablename = currentdocument.tables(0).path & tname & ".dbf" 
  682.                                                 ' Use this table in the query
  683.         
  684.         ' Search the database for each room that has been marked for deletion
  685.         For i = 1 To Ubound(deletedRooms)
  686.             
  687.             ' Use this seach criteria in the query
  688.             ' This query will:
  689.             '    Select *                  Bring back all fields in each record...
  690.             '    From "..."                ...from the specified table...
  691.             '    Where                    ...that meet this criteria:
  692.             '    Room...=                The Room Name/Number field value equals
  693.             '    deletedRooms(i)        The value from the deleted rooms list.
  694.             Q.SQL = "SELECT * FROM """+Q.Tablename+""""+ tname + " WHERE ("+ tname + ".""Room Name/Number"" = '"+deletedRooms(i)+"')"
  695.             
  696.             ' Define the result set to use this query
  697.             Set RS.Query = Q
  698.             
  699.             ' Create the result set and if there are any records in the result set
  700.             ' (records that match the deletedRoom() value), delete the records
  701.             If (RS.Execute)Then            ' If the result set is created successfully
  702.                 If (RS.numrows) Then    ' If there are records in the result set
  703.                     RS.firstrow            ' Go to the first record in the result set
  704.                     Do                        ' Cycle through all of the records
  705.                     RS.deleteRow        ' Delete the records
  706.                 Loop    While (RS.numrows)
  707.             End If        ' If there are records to delete
  708.         End If        ' If the result set was successful
  709.     Next        ' For each room marked for deletion
  710.     
  711.     ' Close the connection to the database
  712.     C.Disconnect
  713.     
  714. End If        ' If the database connection was successful
  715. End Sub        ' deleteScheduledRemovedRooms
  716. '++LotusScript Development Environment:2:2:string_sort:1:8
  717. Sub string_sort(array() As String)
  718. '  Generic sort routine that orders the elements of the passed-in array.
  719. '  Called from modifyRoomsArray and fillRoomsArray to sort the contents
  720. '  of rooms()
  721.     ' array()    A reference to the array to be sorted
  722.     
  723.     ' Declare indexes and temporary storage for the sort
  724.     Dim temp As String    ' Stores an array element that is being repositioned in the array
  725.     Dim i As Integer        ' Index for the array. The sort steps through the array once using i
  726.     Dim j As Integer        ' Index for the array. The sort steps through parts of the array once for
  727.                             ' each value of i using j
  728.     
  729.     ' Sort through the array, comparing the i-th element to every subsequent
  730.     ' element. If the original element is not the earliest (smallest) in the sequence,
  731.     ' the sort replaces the original element with the one being compared. 
  732.     ' The new element is then compared with the rest of the array.
  733.     
  734.     ' Loop through the array, from lower bound to upper bound
  735.     For i = Lbound(array) To Ubound(array)
  736.         temp = array(i)            ' Store the original array element being compared
  737.         
  738.         ' Loop through the part of the array not yet inspected
  739.         For j = i + 1 To Ubound(array)
  740.             ' Does the original or the new element come first in the sequence?
  741.             If array(j) < array(i) Then        ' If the new element comes first, then
  742.                 array(i) = array(j)            ' Replace the original element with the new element
  743.                 array(j) = temp            ' Place the original in the position left by the new element
  744.                 temp = array(i)            ' Store the new element for the next iteration
  745.             End If        ' If the new element is first in the sequence. If not, there is no change
  746.                         ' and the sort continues to the next element in the array.
  747.         Next        ' Go to the next element and compare to the original
  748.     Next        ' All comparisons and replacements have been made for the original element of the
  749.                 ' array. Now move to the next element.
  750. End Sub        ' string_sort
  751.  
  752. '++LotusScript Development Environment:2:1:isScheduled:1:8
  753. Function isScheduled (schedDate As String, roomName As String, schedTime As Double) As Integer
  754. ' Checks to see if there is overlap between a reservation being made using the UI
  755. ' and a reservation that already exists in the schedule database.
  756. ' Called from the click event for RctBackground on the Schedule Display view.
  757. ' Returns True if there is a conflict between the passed in room and time and a value
  758. ' in the Schedule database. Returns False is there is no conflict.
  759.     ' schedDate        ' date of new reservation
  760.     ' roomName        ' room of new reservation
  761.     ' schedTime        ' time of new reservation
  762.     Dim PositionOfApstr As Integer
  763.     Dim ModRoomNm As String
  764.     ModRoomNm = roomName
  765.     PositionOfApstr = Instr(1, ModRoomNm, "'")
  766.     Do While PositionOfApstr > 0
  767.         ModRoomNm = Left$( ModRoomNm , PositionOfApstr - 1) & "''" & Right$(ModRoomNm, Len(ModRoomNm) - PositionOfApstr)
  768.         PositionOfApstr = Instr(PositionOfApstr+2, ModRoomNm, "'")        
  769.     Loop
  770.     
  771.     ' Declare objects for connecting to the rooms database
  772.     Dim C As New Connection        ' Defines which database to connect to
  773.     Dim Q As New Query                ' Defines which records are used from the database
  774.     Dim RS As New ResultSet        ' Holds the records selected by the query
  775.     
  776.     Dim tname As String                ' Stores a shorter table reference
  777.     
  778.     ' Initialize the function return value to indicate no conflict
  779.     isScheduled = False                
  780.     
  781.     ' Store the table name so it is easier to refer to. The schedule information is the main table
  782.     ' for the document. The tables are numbered from zero.
  783.     tname = currentdocument.tables(0).tablename
  784.     
  785.     ' Create the connection to the Schedule database, select the records from the
  786.     ' same day, room, time as the new reservation, and check for overlap between the existing
  787.     ' reservations and the new one.
  788.     If C.ConnectTo("dBASE IV") Then        ' If the connection succeeds, then
  789.         ' Define a query with a database connection, a table name, and search
  790.         ' criteria.
  791.         Set Q.Connection = C                    ' Use this connection in the query
  792.         ' The query will use the schedule database
  793.         Q.Tablename = currentdocument.tables(0).path + tname
  794.         ' Use this seach criteria in the query
  795.         ' This query will:
  796.         '    Select *                  Bring back all fields in each record...
  797.         '    From "..."                ...from the specified table...
  798.         '    Where                    that meet these criteria:
  799.         '    "Date Reserved" = schedDate        The date in the record is the same as the new reservation
  800.         '    AND                                     and meet the next criteria
  801.         '    "Room Name..." = roomName        The room in the record is the same as the new reservation 
  802.         '    AND                                     and meet the next criteria
  803.         '    "Start Time" <= ...(schedTime)        The start time in the record is the same or earlier than the new reservation  
  804.         '    AND                                     and meet the next criteria
  805.         '    "End Time" > (schedTime)            The end time in the record is later than the start time of the new reservation
  806.         Q.SQL = "SELECT * FROM """+Q.Tablename+""" "+ tname + " WHERE (("+ tname + ".""Date Reserved"" = '"+schedDate+"') AND ("+ tname + ".""Room Name/Number"" = '"+ModRoomNm+"') AND ("+ tname + ".""Start Time"" <= "+Trim$(Str$(schedTime))+")  AND ("+ tname + ".""End Time"" > "+Trim$(Str$(schedTime))+"))"
  807.         
  808.         ' The result set will use the query defined above.
  809.         Set RS.Query = Q
  810.         
  811.         ' Create the result set. If records exist that met the search criteria, store
  812.         ' the record information in the global variables for reservation information.
  813.         ' The results will be displayed in the view by the click event for RctBackground.
  814.         If (RS.Execute)Then                ' If the result set creation succeeds, then
  815.             If (RS.numrows) Then        ' If there is more than 0 records in the result set, then
  816.                 ' Set the function return value to True: there is a conflicting reservation
  817.                 isScheduled = True        
  818.                 
  819.                 ' Copy the reservation information from the result set into global variables
  820.                 ' using the field names from the database
  821.                 GlobDateDisplay = RS.getvalue("Date Reserved")
  822.                 GlobStartTime = RS.getvalue("Start Time")
  823.                 GlobEndTime = RS.getvalue("End Time")
  824.                 GlobRoom = RS.getvalue("Room Name/Number")
  825.                 GlobReservedBy = RS.getvalue("Reserved By")
  826.                 GlobNote = RS.getvalue("Note")
  827.             End If        ' If there are more than 0 records in the result set
  828.         End If            ' If the result set creation was successful
  829.         
  830.         ' Close the connection to the database
  831.         C.Disconnect
  832.     End If        ' If the connection to the database succeeded
  833.     
  834. End Function        'isScheduled
  835.  
  836. '++LotusScript Development Environment:2:2:displaySchedule:1:8
  837. Sub displaySchedule(dateToDisplay As String)
  838. '  Displays the Schedule Display view with schedule information for the date
  839. '  passed-in
  840. '  Called from btnToday and txtSeeToday (on the Start view)
  841. '  Called from btnOK and fbxDate (on the Enter Date view)
  842.     ' dateToDisplay    Schedule date to display info for
  843.     
  844.     ' Change to the Schedule Display view
  845.     Set currentwindow.activeview = currentdocument.Schedule~ Display
  846.     
  847.     ' Display the passed-in date in the field box fbxDateDisplay
  848.     currentview.body.fbxDateDisplay.text = dateToDisplay
  849.     
  850.     ' Clear schedule information from previous days from the view
  851.     Call clearDisplay()        ' global sub
  852.     
  853.     ' Fill the schedule information for the date passed-in.
  854.     Call readBlock(dateToDisplay)        ' global function
  855.     
  856. End Sub        'displaySchedule
  857. '++LotusScript Development Environment:2:2:processDate:1:8
  858. Sub processDate
  859. ' Reads entered date on the Enter Date view, checks if it is
  860. ' a valid date, then displays the schedule for the date on the
  861. ' Schedule Display view
  862.     
  863.     ' If there is a value entered in the date field box, then
  864.     If currentview.body.fbxDate.text <> ""    Then
  865.         
  866.         ' If there is a valid date entered in the field box, then
  867.         If Isdate(currentview.body.fbxDate.text) Then
  868.             
  869.             ' Store the entered date
  870.             GlobDateDisplay = currentview.body.fbxDate.text    
  871.             
  872.             ' Switch to the Schedule Display view and display the
  873.             ' schedule for the new date.
  874.             Call displaySchedule(GlobDateDisplay)
  875.             
  876.         Else        ' If the entered value is not a date, then
  877.             ' Prompt the user to enter a new date.
  878.             Messagebox "Date entered is not valid.", MB_OK + MB_ICONEXCLAMATION, "Invalid date"
  879.             
  880.             ' Clear the invalid date from the field box.
  881.             currentview.body.fbxDate.text = ""            
  882.             
  883.         End If        ' If the entered value is a date
  884.         
  885.     Else        ' If no value was entered, then
  886.         ' Close the Enter Date view and return to the view displayed before
  887.         currentwindow.close        
  888.         'Doevents returns control back to operating system so that pending 
  889.         'actions can be performed
  890.         Doevents
  891.     End If        ' If any value was entered in the date field box
  892.     
  893. End Sub    'processDate