home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Troubleshooting Netware Systems
/
CSTRIAL0196.BIN
/
attach
/
pcmag
/
v14n05
/
ppv14n.exe
/
MAIN.BAS
< prev
next >
Wrap
BASIC Source File
|
1995-02-28
|
8KB
|
221 lines
Rem CSMC Employee Directory RTF File Generator
Rem Copyright (C) 1994-95 Ray Duncan
Rem Version 1.0 12/1/94 derived from OMIM.MDB and GENEMAP.MDB
Option Compare Database ' use database order for string comparisons
Option Explicit ' force declaration of all variables
Function Main ()
' This is the main routine of the conversion program; it can be invoked
' with a command button or by running a macro. It generates several
' different sorted indexes of employee names, then generates a main
' file containing the detailed information about each employee.
Call WriteIndexFile("CSMC Directory by Employee Name", "idx_name", "idxname.rtf", "EntireName", "LastName", 1.5)
Call WriteIndexFile("CSMC Directory by VAX Account", "idx_vax", "idxvax.rtf", "VaxMail1", "VaxMail1", 1.25)
Call WriteIndexFile("CSMC Directory by Extension", "idx_ext", "idxext.rtf", "Extension", "Extension", 1.5)
Call WriteIndexFile("CSMC Directory by Location", "idx_locn", "idxlocn.rtf", "Location", "Location", 1.5)
Call WriteIndexFile("CSMC Directory by Department", "idx_dept", "idxdept.rtf", "Dept", "Department", 3)
Call WriteBodyFile("csmcdir.rtf", "EntireName")
End Function
Function Mcase (Sarg As Variant) As Variant
' Converts the argument string to mixed case if and only
' if the string is in all caps. We use the "variant" form
' of the string functions so that the routine won't crash
' if it is passed a "null" string (as opposed to a
' zero-length string).
If StrComp(Sarg, UCase(Sarg), 0) <> 0 Then
Mcase = Sarg
Else
Mcase = UCase(Left(Sarg, 1)) & LCase(Mid(Sarg, 2))
End If
End Function
Sub WriteBlankLine (FileNum As Integer)
' Generates the RTF code for a blank line. For
' simplicity, this is just implemented as generation
' of an empty paragraph.
Print #FileNum, "\par"
End Sub
Sub WriteBodyFile (FileName As String, IndexField As String)
' This routine builds the main RTF file for the employee
' database. Each employee record in the database is converted
' to an individual topic in the output file. The context
' string and browse index for each topic is a function
' of the number of the corresponding record in the database.
' The employee last name is used for the keyword footnote.
' The full employee name, with the last name first, is used
' for the topic heading and for the title footnote (needed
' for the history window).
Dim Dbase As Database, Dset1 As Recordset
Dim TopicTitle As String, ContextString As String
Dim BrowseSequence As String, KeywordString As String
' open database and employee info table, set sort order
Set Dbase = DBEngine.Workspaces(0).Databases(0)
Set Dset1 = Dbase.OpenRecordset("CSMC Directory", DB_OPEN_TABLE)
Dset1.Index = IndexField
' open RTF output file, truncating any previous file
' by the same name to zero length
Open FileName For Output As #1 Len = 4096
' write RTF file identifier, font table, and color table
Call EmitRTFHeader(1)
' now walk through the sorted recordset and write the detail records
While Dset1.EOF <> True
' Build topic title, browse sequence number, context string, and
' keyword string. Note: browse sequence & context string are
' synthesized from a counter field.
TopicTitle = (Mcase(Dset1![LastName]) & ", " & Mcase(Dset1![FirstName]))
BrowseSequence = "dir:" & Left$("00000", 6 - Len(Str$(Dset1![ID]))) & LTrim$(Str$(Dset1![ID]))
ContextString = "dir_" & LTrim$(Str$(Dset1![ID]))
KeywordString = Mcase(Dset1![LastName])
' write index topic header
Call EmitRTFTopicDivider(1, TopicTitle, ContextString, KeywordString, TopicTitle, BrowseSequence)
' set tab stop at 1"
Call EmitRTFTabStopInches(1, 1)
' turn off line wrap
Print #1, "\keep "
Call WriteBlankLine(1)
Call WriteBodyItem(1, "Credential", Dset1![Credential])
Call WriteBodyItem(1, "Title #1", Dset1![Title1])
Call WriteBodyItem(1, "Title #2", Dset1![Title2])
Call WriteBlankLine(1)
Call WriteBodyItem(1, "Department", Dset1![Department])
Call WriteBodyItem(1, "Division", Dset1![Division])
Call WriteBodyItem(1, "Location", Dset1![Location])
Call WriteBodyItem(1, "Mail Stop", Dset1![MailStop])
Call WriteBlankLine(1)
Call WriteBodyItem(1, "Extension", Dset1![Extension])
Call WriteBodyItem(1, "Dept. Ext.", Dset1![DeptExt])
Call WriteBodyItem(1, "FAX", Dset1![FAX])
Call WriteBodyItem(1, "Pager", Dset1![Pager])
Call WriteBodyItem(1, "VAXMail #1", Dset1![VaxMail1])
Call WriteBodyItem(1, "VAXMail #2", Dset1![VaxMail2])
Call WriteBlankLine(1)
Call WriteBodyItem(1, "Other Info", Dset1![Other])
Call WriteBlankLine(1)
Dset1.MoveNext
Wend
' write the RTF file terminators
Call EmitRTFTrailer(1)
' close the output file & recordset
Close #1
Dset1.Close
End Sub
Sub WriteBodyItem (FileNum As Integer, ItemName As String,
ItemData As Variant)
' This handy little routine writes a field title, tabs to the
' first tab stop, displays a detail item in boldface, and forces
' the end of line.
Print #FileNum, ItemName & ":\tab " & "{\b " & ItemData & "}"
Print #FileNum, "\par"
End Sub
Sub WriteIndexFile (TopicTitle As String, ContextString As String,
FileName As String, IndexField As String,
InfoField As String, TabStop As Single)
' This routine writes a index to the employee file, consisting of
' a list of hyperlinks and sorted on the specified database field,
' to an RTF file as a single topic. The context string for the topic,
' the name of the output file, and the distance to the first tab stop
' are specified by the caller. The index sorted by employee name
' gets some special handling to include the employee's extension,
' since this is the index used most commonly.
Dim Dbase As Database, Dset1 As Recordset
Dim HotLinkString As String, TargetString As String
' open database and employee info table, set sort order
Set Dbase = DBEngine.Workspaces(0).Databases(0)
Set Dset1 = Dbase.OpenRecordset("CSMC Directory", DB_OPEN_TABLE)
Dset1.Index = IndexField
' open RTF output file for sorted index
Open FileName For Output As #1 Len = 4096
' write RTF file identifier, font table, and color table
Call EmitRTFHeader(1)
' write index topic heading, but omit keyword and browse sequence
' footnotes for index topics
Call EmitRTFTopicDivider(1, TopicTitle, ContextString, "", TopicTitle, "")
' set first tab stop as specified by caller
Call EmitRTFTabStopInches(1, TabStop)
' turn off line wrap for index entries
Print #1, "\keep \cf6"
' now walk through the sorted recordset and write the index topic
' as a list of hyperlinks to the employee detail topics
While Dset1.EOF <> True
TargetString = "dir_" & LTrim$(Str$(Dset1![ID]))
' skip records where the "InfoField" is empty or nonalphanumeric
If Dset1(InfoField) >= "0" Then
' adjust print format for the hotlink if we are sorting by name
If IndexField = "EntireName" Then
HotLinkString = Dset1![Extension] & "\tab " & Mcase(Dset1![LastName]) & ", " & Mcase(Dset1![FirstName])
Else
HotLinkString = Dset1(InfoField) & "\tab " & Mcase(Dset1![LastName]) & ", " & Mcase(Dset1![FirstName])
End If
' generate the hotlink and force end-of-line
Call EmitRTFHotLink(1, HotLinkString, TargetString)
Print #1, "\par"
End If
' go to the next employee record
Dset1.MoveNext
Wend
' write the RTF file terminators
Call EmitRTFTrailer(1)
' close the output file & recordset
Close #1
Dset1.Close
End Sub