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
Foi útil?

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

  1. Option 'Explicit' declarado na declaração seção
  2. variáveis ??declaradas a partir de, aproximadamente, superior ao inferior (por exemplo, antes da sessão de db antes vista antes doc)
  3. prefixado notas objetos com seu tipo (docMail, dbMyDatabase, viewOutstandingInvoices)
  4. Coloque todas as declarações no topo antes (ajuda a encontrar a declaração quando você se deparar com uma variável)
  5. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top