Frage

Hallo, ich bin kein Entwickler und kenne daher die Best Practices nicht.Ich habe dies erstellt, um das manuelle Kopieren von Protokolldaten zu umgehen.Dieser Agent ist für einen einzelnen Feed, den ich für jeden weiteren Feed kopiere und anpasse.Für den angegebenen Feed wird das Protokoll der letzten Verarbeitung sowie die Anzahl der bisher verarbeiteten Dateien heute und gestern gelesen.Außerdem zählt es Dateien im Eingabeordner und liest die Zeitzone des Servers.Jedes Datenelement wird im CSV-Format durch ein Komma getrennt und per E-Mail verschickt, das später auf einer Website gehostet wird.Vielen Dank für jede konstruktive Kritik.

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
War es hilfreich?

Lösung

Für keinen Entwickler sein, Sie eine Menge Code schreiben:)

Wenn Sie für einige Stunden suchen ein guter Entwickler beginnen immer, dann nehmen Sie Mitch Rat (aus den Kommentaren) und brechen diese in Subroutinen auf. Lektion 1: Es gibt definitiv einige repetitve Code hier, und es ist immer eine gute Idee, sich wiederholende Code in eine Methode (Funktion oder Unterprogramm) zu setzen, so dass es existiert nur ein einziges Mal. Der Abschnitt, die Dateien verarbeitet und frühere Dateien zählt verarbeitet sieht ähnlich und wahrscheinlich in eine Routine wie genommen werden kann:

Function GetCountFilesProcessed() As Integer

    'code here

End Function

Allerdings könnten Sie sogar in der Lage sein, die Notwendigkeit zu retten, wenn ich Ihren Code richtig bin zu verstehen. Statt in der Mitte, dass die seltsame Schleife zu tun, es scheint Du einfach versuchen, einen Wert aus einer Spalte eines Viewentry zu bekommen. Sagen Sie bitte in der Spalte 4 der Wert interetsed werden. Sie können einfach auf den Wert für die Spalte, die Sie durch einen Index zugreifen wollen bekommen. Zum Beispiel könnten Sie Ihre Dateien mit variabler Spalte 4 der direkt auf dem Wert eingestellt werden, indem diese Zeile

files = Cint(entry.ColumnValues(4))  'check this, it might be 3 if the array is zero based.

Wie auch immer, unter dem Strich ist, wenn dieser Code funktioniert dann sind Sie auf einen guten Start!

Andere Tipps

Auf mehr der Stil-Seite der Dinge habe ich fand es immer leichter Code anderer Leute zu halten, wenn sie haben

  1. erklärt Option 'Explicit' in den Deklarationsbereich
  2. deklarierten Variablen von etwa höher zu senken (zB Sitzung vor db vor Ansicht vor doc)
  3. Präfix Notizen Objekte mit ihrem Typ (DOCMAIL, dbMyDatabase, viewOutstandingInvoices)
  4. Legen Sie alle der Erklärungen an der Spitze vor (hilft der Suche nach der Erklärung, wenn Sie über eine Variable kommen)
  5. Wie andere erwähnt haben, es lösen sich in Funktionen / U-Boote, soweit anwendbar.

Ihr Kommentar über das Kopieren dieses Mittel für andere Instanzen des gleichen Problem stellt sich auch eine Flagge. Versuchen Sie herauszufinden, was zwischen diesen Mitteln und schieben diese Funktionen in eine Script-Bibliothek gemeinsam ist. Dergleichen spart eine Menge Zeit, wenn Sie den Code beibehalten wird, wie Sie nicht denken müssen, auf welche Weise jeder Agent ist anders (z. B. hat meine Änderung auf alle Instanzen dieses Mittels, oder nur einige von ihnen gelten?)

Sie möchten Ihr Code viel mehr und ... eine kleine Sache zersetzen. Statt

while not item is nothing

, die eine doppelte Verneinung ist und ein beliebtes Gehirn Bender .. schreiben:

do until item is nothing
  ...
loop

Auf diese Weise können Sie auch aus der Schleife mit Ausgang brechen tun

Sie können Ihre beiden ForAll Schleifen optimieren. Dies ist, wie die erste aussehen würde:

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

Dies ist, wie die zweite würde man aussehen würde:

Forall colval In entry.ColumnValues
    if (counter = 4) Then files = Cint(colval)
    counter = (counter + 1) Mod 10
End Forall

Nur eine Anmerkung zu diesem Teil

    While Not entry Is Nothing
        files = 0            
        Forall colval In entry.ColumnValues
            If counter = 9 Then
                counter = 0
            Elseif counter = 8 Then
                counter = 9
    ....

Wie Ken sagt, können Sie „columnValues“ mithilfe der Methode „entry.ColumnValues(x)“ abrufen, so dass ein Durchsuchen der Werte nicht erforderlich ist.Aber;Du hättest das tun können

    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

Einige gute Punkte bereits. Um sie hinzufügen, wenn Sie Variablen, die ein gemeinsames Ziel teilen, um eine Klasse zu erstellen. Fügen Sie Ihre Variablen zu dieser Klasse.

Anstatt also sagen wir:

Dim userFullName as String
Dim age as Integer
Dim addressLine1 as String
' ... etc.

können Sie haben:

Class UserDetails 
  Dim fullName as String
  Dim age as Integer
  Dim addressLine1 as String
  ' ... etc
End Class

und Referenz:

Dim u as new UserDetails
u.fullName = "full name"
u.age = 22
u.addressLine1 = "1 main street"

Der Vorteil hierbei ist, dass Sie Methoden hinzufügen können, dass die Daten zu manipulieren, und Sie wissen, dass der Code auf das Objekt bezieht sich eher dann durch die Anwendung der Jagd.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top