有人可以提供有关我的 LotusScript 代理的反馈吗?
-
22-07-2019 - |
题
您好,我不是开发人员,因此不了解最佳实践。我创建它是为了绕过日志数据的手动数据复制。该代理适用于单个提要,我将复制该提要并针对每个其他提要进行调整。对于指定的提要,它会读取上次处理的日志以及今天和昨天迄今为止处理的文件数。它还对输入文件夹中的文件进行计数并读取服务器的时区。每个数据项均以 csv 逗号分隔并通过电子邮件发送,随后托管在网站上。感谢任何建设性的批评。
Sub Initialize
Dim customername As String
Dim servername As String
Dim feedname As String
Dim alertthresholdinhours As Integer
Dim inputfeedpath As String
' Set for each feed
customername = "gRrhio"
servername = "gRrhioEdge2"
feedname = "FF Thompson ADT"
alertthresholdinhours = 6
inputfeedpath = "\\mhinec\elycon\data\adt\*.*"
' Counts files in input folder
Dim pathName As String, fileName As String
Dim inputfeedcounter As Integer
inputfeedcounter = 0
pathName$ = inputfeedpath
fileName$ = Dir$(pathName$, 0)
Do While fileName$ <> ""
inputfeedcounter = inputfeedcounter + 1
fileName$ = Dir$()
Loop
Dim entry As NotesViewEntry
Dim vc As NotesViewEntryCollection
Dim filesprocessed As Integer
Dim session As New NotesSession
Dim db As NotesDatabase
Dim newDoc As NotesDocument
Dim rtitem As NotesRichTextItem
Set db = session.CurrentDatabase
Dim view As NotesView
Set view = db.GetView( "Sessions\by Feed" )
Set newDoc = New NotesDocument( db )
Set rtitem = New NotesRichTextItem( newDoc, "Body" )
Dim todaysdate As New NotesDateTime("Today")
Dim flag As Integer
Dim counter As Integer
Dim files As Integer
Dim errors As Integer
Dim lastdate As String
Dim lastdayran As String
Dim lasttime As String
Dim lasttimeran As String
Dim filesp As Integer
Dim lastdayfiles As Integer
Dim lastdaysfiles2 As Integer
Dim terrors As Integer
Dim lastdayerrors As Integer
lastdate = ""
lastdayran = ""
counter = 0
flag = 0
filesp = 0
lastdayfiles = 0
lastdaysfiles2 = 0
terrors = 0
lastdayerrors = 0
' Finds date for last time processed, counts files processed and errors
While flag = 0
Dim dateTime As New NotesDateTime(todaysdate.DateOnly)
Dim keyarray(1) As Variant
keyarray(0) = feedname
Set keyarray(1) = dateTime
Set vc = view.GetAllEntriesByKey(keyarray, False)
Set entry = vc.GetFirstEntry
If entry Is Nothing Then
Call todaysdate.AdjustDay(-1)
End If
While Not entry Is Nothing
files = 0
Forall colval In entry.ColumnValues
If counter = 9 Then
counter = 0
Elseif counter = 8 Then
counter = 9
Elseif counter = 7 Then
counter = 8
Elseif counter = 6 Then
errors = Cint(colval)
counter = 7
Elseif counter = 5 Then
counter = 6
Elseif counter = 4 Then
files = Cint(colval)
counter = 5
Elseif counter = 3 Then
counter = 4
Elseif counter = 2 Then
counter = 3
lasttime = colval
Elseif counter = 1 Then
counter = 2
lastdate = colval
Elseif counter = 0 Then
counter = 1
End If
End Forall
filesp = filesp + files
terrors = terrors + errors
Set entry=vc.GetNextEntry (entry)
flag = 1
Wend
Wend
lastdayfiles = filesp
lastdayerrors = terrors
lastdayran = lastdate
lasttimeran = lasttime
'Counts previous files processed
filesp = 0
terrors = 0
lastdate = ""
flag = 0
Call todaysdate.AdjustDay(-1)
While flag = 0
Dim dateTime2 As New NotesDateTime(todaysdate.DateOnly)
Dim keyarray2(1) As Variant
keyarray2(0) = feedname
Set keyarray2(1) = dateTime2
Set vc = view.GetAllEntriesByKey(keyarray2, False)
Set entry = vc.GetFirstEntry
If entry Is Nothing Then
Call todaysdate.AdjustDay(-1)
End If
While Not entry Is Nothing
files = 0
Forall colval In entry.ColumnValues
If counter = 9 Then
counter = 0
Elseif counter = 8 Then
counter = 9
Elseif counter = 7 Then
counter = 8
Elseif counter = 6 Then
counter = 7
Elseif counter = 5 Then
counter = 6
Elseif counter = 4 Then
files = Cint(colval)
counter = 5
Elseif counter = 3 Then
counter = 4
Elseif counter = 2 Then
counter = 3
Elseif counter = 1 Then
counter = 2
Elseif counter = 0 Then
counter = 1
End If
End Forall
filesp = filesp + files
Set entry=vc.GetNextEntry (entry)
flag = 1
Wend
Wend
lastdaysfiles2 = filesp
' Prints line of CSV into body of email
Call rtitem.AppendText ( customername )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( servername )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( datetime.timezone )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( lastdayran )
Call rtitem.AppendText ( " " )
Call rtitem.AppendText ( lasttimeran )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( lastdayfiles )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( lastdayerrors )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( lastdaysfiles2 )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( inputfeedcounter )
Call rtitem.AppendText ( ", " )
Call rtitem.AppendText ( alertthresholdinhours )
Call newDoc.Save( False, True )
newDoc.Subject = feedname
' Running from server line should be
'newDoc.SendTo = "Ecmon Feedcheck/Ecmonitor@ECMONITOR"
newDoc.SendTo = "AX1Forward Feedcheck/ACHQ@company.com"
newDoc.Send( False )
End Sub
解决方案
有关不成为开发人员,可以编写大量的代码:)
如果你正在寻找一些教训,开始成为一个优秀的开发人员,然后采取米奇的建议(从评论),打破了这个子程序。第1课:肯定有一些repetitve代码在这里,它总是把重复的代码放到一个方法(函数或子程序)一个好主意,所以它只存在一次。处理计数处理的文件和以前的文件的部分类似于并且很可能被放入像常规:
Function GetCountFilesProcessed() As Integer
'code here
End Function
但是,你甚至可以节省需要,如果我正确理解你的代码。而不是做那个奇怪的循环在中间,看来你正试图简单地得到从VIEWENTRY的列中的值。假设你在第4列的值interetsed。你可以简单地得到,在您要通过索引访问它的列中的值。例如,文件变量可以直接通过这条线设定为第4列的值
files = Cint(entry.ColumnValues(4)) 'check this, it might be 3 if the array is zero based.
不管怎样,底线是,如果此代码的工作,那么你已经开了个好头!
其他提示
在更多的风格方面,我总是发现维护其他人的代码更容易
- 宣布
Option 'Explicit'
在声明部分 - 声明的变量从大约较高到较低(例如,session 位于 db 之前,view 位于 doc 之前)
- 带前缀的注释对象及其类型(docMail、dbMyDatabase、viewOutstandingInvoices)
- 将所有声明放在前面(有助于在遇到变量时找到声明)
- 正如其他人提到的,在适用的情况下将其分解为函数/子函数。
您关于复制此代理以解决同一问题的其他实例的评论也提出了一个标志。尝试找出这些代理之间的共同点,并将这些功能推送到脚本库中。这类事情在维护代码时可以节省大量时间,因为您不需要考虑每个代理的不同之处(例如,我的更改是否适用于该代理的所有实例,还是仅适用于其中的某些实例?)
您想分解你的代码更和......一个小东西。代替
while not item is nothing
这是一个双否定和受欢迎的脑弯曲..写:
do until item is nothing
...
loop
这也可以让你打出来,退出循环做
的您可以优化您的两个循环的ForAll的。 这是第一个将如何看:
Forall colval In entry.ColumnValues
Select Case (counter)
Case 1: lastdate = colval
Case 2: lasttime = colval
Case 4: files = Cint(colval)
Case 6: errors = Cint(colval)
End Select
counter = (counter + 1) Mod 10
End Forall
这是如何第二将一个将如下所示:
Forall colval In entry.ColumnValues
if (counter = 4) Then files = Cint(colval)
counter = (counter + 1) Mod 10
End Forall
有关该位只是说明
While Not entry Is Nothing
files = 0
Forall colval In entry.ColumnValues
If counter = 9 Then
counter = 0
Elseif counter = 8 Then
counter = 9
....
肯说可以通过使用(x)的方法,以便通过这些值的作用中得到entry.ColumnValues是columnValues未需要。但;你可以这样做
While Not entry Is Nothing
files = 0
counter = 0
Forall colval In entry.ColumnValues
counter = counter + 1
Select case counter
case 6
errors = Cint(colval)
.....
end select
一些好点了。要添加到他们,如果你有一个共用一个对象,然后创建一个类变量。您的变量添加到类。
因此,而不是说:
Dim userFullName as String
Dim age as Integer
Dim addressLine1 as String
' ... etc.
可以具有:
Class UserDetails
Dim fullName as String
Dim age as Integer
Dim addressLine1 as String
' ... etc
End Class
和参考:
Dim u as new UserDetails
u.fullName = "full name"
u.age = 22
u.addressLine1 = "1 main street"
这样做的优点是可以添加的方法来操作的数据和你知道代码涉及该对象而不是通过应用程序打猎。