Alguém pode oferecer feedback sobre o meu agente LotusScript?
-
22-07-2019 - |
Pergunta
Oi lá eu não sou um desenvolvedor e por isso tenho conhecimento de melhores práticas. Eu criei este para desvio manual de dados cópia de dados de log. Este agente é para uma única alimentação que eu vou copiar e ajustar para cada um adicional. No caso da alimentação especificado ele lê o log pela última vez processado e número de arquivos processados ??até agora hoje e ontem. Conta também arquivos na pasta de entrada e lê fuso horário do servidor. Cada item de dados é separado por uma vírgula para csv e enviado, que mais tarde está hospedado em um site. Obrigado por qualquer crítica construtiva.
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
Solução
Por não ser um desenvolvedor, você pode escrever um monte de código:)
Se você está procurando algumas lições para começar a se tornar um bom programador, em seguida, tomar o conselho de Mitch (a partir dos comentários) e acabar com isso em sub-rotinas. Lição 1: Há definitivamente algum código repetitve aqui, e é sempre uma boa idéia para colocar o código repetitivo em um método (função ou sub-rotina) para que ele só existe uma vez. A seção que os arquivos contagens processados ??e arquivos anteriores processados ??aparência semelhante e provavelmente poderia ser colocado em uma rotina como:
Function GetCountFilesProcessed() As Integer
'code here
End Function
No entanto, você pode até ser capaz de salvar a necessidade de que se eu estou entendendo o seu código corretamente. Em vez de fazer esse ciclo estranha no meio, parece que você está a tentar simplesmente obter um valor de uma coluna de uma viewentry. Digamos que você está interetsed no valor da coluna 4 do. Você pode simplesmente obter o valor para a coluna que desejar acessando-o pelo índice. Por exemplo, a variável de arquivos pode ser definida diretamente para o valor da coluna 4 do por esta linha
files = Cint(entry.ColumnValues(4)) 'check this, it might be 3 if the array is zero based.
De qualquer forma, a linha inferior é se esse código funciona, então você está fora de um bom começo!
Outras dicas
Em mais de lado o estilo de coisas, eu sempre achei mais fácil de manter o código de outras pessoas quando eles têm
-
Option 'Explicit'
declarado na declaração seção - variáveis ??declaradas a partir de, aproximadamente, superior ao inferior (por exemplo, antes da sessão de db antes vista antes doc)
- prefixado notas objetos com seu tipo (docMail, dbMyDatabase, viewOutstandingInvoices)
- Coloque todas as declarações no topo antes (ajuda a encontrar a declaração quando você se deparar com uma variável)
- Como já foi mencionado, dividi-lo em funções / subs quando aplicável.
O seu comentário sobre como copiar este agente para outras instâncias do mesmo problema também levanta uma bandeira. Tente descobrir o que é comum entre esses agentes e empurre essas funções em uma biblioteca de script. Esse tipo de coisa poupa muito tempo em manter o código que você não precisa pensar sobre de que maneira cada agente é diferente (não Ex. A minha mudança aplicam-se a todas as instâncias deste agente, ou apenas alguns deles?)
Você quer decompor o seu código muito mais e ... uma coisa pequena. Em vez de
while not item is nothing
que é uma negação de casal e um bender cérebro populares .. escreve:
do until item is nothing
...
loop
Isso também permite que você quebre fora do circuito com saída fazê
Você pode otimizar tanto de seus loops FORALL. Isto é como o primeiro seria:
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
Isto é como o segundo seria um seria parecido com:
Forall colval In entry.ColumnValues
if (counter = 4) Then files = Cint(colval)
counter = (counter + 1) Mod 10
End Forall
Apenas uma nota sobre este bit
While Not entry Is Nothing
files = 0
Forall colval In entry.ColumnValues
If counter = 9 Then
counter = 0
Elseif counter = 8 Then
counter = 9
....
Como ken diz que você pode obter columnValues ??usando o método entry.ColumnValues ??(x), de modo interating através dos valores é necessária-un. Mas; você poderia ter feito isso
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
Alguns bons pontos já. Para adicionar a eles, se você tem variáveis ??que compartilham um objeto comum, em seguida, criar uma classe. Adicionar suas variáveis ??a essa classe.
Então, ao invés de dizer:
Dim userFullName as String
Dim age as Integer
Dim addressLine1 as String
' ... etc.
Você pode ter:
Class UserDetails
Dim fullName as String
Dim age as Integer
Dim addressLine1 as String
' ... etc
End Class
e referência:
Dim u as new UserDetails
u.fullName = "full name"
u.age = 22
u.addressLine1 = "1 main street"
A vantagem disso é que você pode adicionar métodos para manipular esses dados e você sabe o código se refere a esse objeto em vez de caça através de sua aplicação.