Question

Bonjour, je ne suis pas un développeur et je ne suis donc pas au courant des meilleures pratiques. J'ai créé cela pour éviter la copie manuelle des données du journal. Cet agent concerne un seul flux que je vais copier et ajuster pour chaque flux supplémentaire. Pour le flux spécifié, il lit le journal pour la dernière fois traitée et le nombre de fichiers traités jusqu'à présent aujourd'hui et pour hier. Il compte également les fichiers dans le dossier d'entrée et lit le fuseau horaire du serveur. Chaque élément de données est séparé par une virgule pour csv et envoyé par courrier électronique, qui est ensuite hébergé sur un site Web. Merci pour toute critique constructive.

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
Était-ce utile?

La solution

Pour ne pas être développeur, vous pouvez écrire beaucoup de code:)

Si vous recherchez des leçons pour devenir un bon développeur, suivez les conseils de Mitch (d'après les commentaires) et divisez-les en sous-routines. Leçon 1: Il y a certainement du code répétitif ici, et c'est toujours une bonne idée de mettre du code répétitif dans une méthode (fonction ou sous-routine) afin qu'il n'existe qu'une seule fois. La section qui compte les fichiers traités et les fichiers précédents traités est similaire et pourrait probablement être insérée dans une routine telle que:

Function GetCountFilesProcessed() As Integer

    'code here

End Function

Cependant, vous pourrez peut-être même en éviter le problème si je comprends bien votre code. Au lieu de faire cette étrange boucle au milieu, il semble que vous essayez simplement d'obtenir une valeur à partir d'une colonne d'une vue. Dites que vous êtes interressé dans la valeur de la colonne 4. Vous pouvez simplement obtenir la valeur de la colonne souhaitée en y accédant par index. Par exemple, votre variable de fichier pourrait être définie directement sur la valeur de la colonne 4 par cette ligne

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

Quoi qu'il en soit, le résultat final est que si ce code fonctionne, vous êtes bien parti!

Autres conseils

Pour ce qui est du style, j’ai toujours trouvé plus facile de conserver le code des autres quand ils ont

.
  1. Déclaré Option 'Explicit' dans la section Déclarations
  2. Variables déclarées de plus en plus élevées à inférieures (par exemple, session avant db avant vue avant doc)
  3. Objets de notes préfixés avec leur type (docMail, dbMyDatabase, viewOutstandingInvoices)
  4. Placez toutes les déclarations en haut avant (aide à retrouver la déclaration lorsque vous tombez sur une variable)
  5. Comme d'autres l'ont mentionné, divisez-le en fonctions / sous-titres, le cas échéant.

Votre commentaire sur la copie de cet agent pour d'autres instances du même problème déclenche également un indicateur. Essayez de déterminer les points communs entre ces agents et envoyez ces fonctions dans une bibliothèque de scripts. Ce genre de chose fait gagner beaucoup de temps lors de la maintenance du code car vous n'avez pas besoin de réfléchir en quoi chaque agent est différent (par exemple, ma modification s'applique-t-elle à toutes les instances de cet agent ou à certaines d'entre elles?)

Vous voulez décomposer votre code beaucoup plus et ... une petite chose. Au lieu de

while not item is nothing

qui est une double négation et un coureur de cerveau populaire .. écrivez:

do until item is nothing
  ...
loop

Cela vous permet également de sortir de la boucle avec exit do

vous pouvez optimiser vos deux boucles ForAll. Voici à quoi ressemblerait le premier:

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

Voici à quoi ressemblerait le deuxième:

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

Juste une note concernant ce 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
    ....

Comme Ken le dit, vous pouvez obtenir columnValues ??en utilisant la méthode entry.ColumnValues ??(x), ce qui vous évite d'interagir avec les valeurs. Mais; vous auriez pu le faire

    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

Quelques points positifs déjà. Pour les ajouter si vous avez des variables qui partagent un objet commun, créez une classe. Ajoutez vos variables à cette classe.

Donc au lieu de dire:

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

Vous pouvez avoir:

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

et référence:

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

L'avantage de ceci est que vous pouvez ajouter des méthodes pour manipuler ces données et que vous savez que le code se rapporte à cet objet plutôt que de parcourir votre application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top