誰でも私のLotusScriptエージェントに関するフィードバックを提供できますか?

StackOverflow https://stackoverflow.com/questions/647198

質問

こんにちは。私は開発者ではないので、ベストプラクティスを知りません。これは、ログデータの手動データコピーをバイパスするために作成しました。このエージェントは単一のフィード用で、追加のフィードごとにコピーして調整します。指定されたフィードについて、今日および昨日のこれまでに処理された最後の時間と処理されたファイルの数のログを読み取ります。また、入力フォルダー内のファイルをカウントし、サーバーのタイムゾーンを読み取ります。各データ項目はcsvのカンマで区切られてメールで送信され、後でWebサイトでホストされます。建設的な批判をありがとう。

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
役に立ちましたか?

解決

開発者ではないため、多くのコードを書くことができます:)

優れた開発者になるためのレッスンを探している場合は、(コメントから)Mitchのアドバイスを参考にして、これをサブルーチンに分割してください。レッスン1:ここには間違いなく繰り返しコードがいくつかあります。繰り返しコードをメソッド(関数またはサブルーチン)に入れて、それが一度しか存在しないようにすることは常に良い考えです。処理されたファイルと以前に処理されたファイルをカウントするセクションは似ており、おそらく次のようなルーチンに入れることができます。

Function GetCountFilesProcessed() As Integer

    'code here

End Function

ただし、コードを正しく理解していれば、その必要性を節約できるかもしれません。途中で奇妙なループを行う代わりに、単にビューエントリの列から値を取得しようとしているように見えます。列4の値に興味があるとします。インデックスでアクセスすることで、目的の列の値を取得できます。たとえば、files変数は、この行で列4の値に直接設定できます

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

とにかく、一番下の行は、このコードが機能する場合、あなたは良いスタートを切っています!

他のヒント

スタイルの面では、他の人のコードを維持する方が簡単であることが常にわかっています

  1. 宣言セクションで Option 'Explicit' を宣言
  2. 変数をおおよそ上位から下位に宣言しました(たとえば、dbの前のセッションはdocの前に表示されます)
  3. 接頭辞付きノートオブジェクトとそのタイプ(docMail、dbMyDatabase、viewOutstandingInvoices)
  4. すべての宣言を先頭に配置します(変数に遭遇したときに宣言を見つけるのに役立ちます)
  5. 他の人が述べたように、必要に応じて関数/サブに分割します。

同じ問題の他のインスタンスのためにこのエージェントをコピーすることに関するコメントも、フラグを立てます。これらのエージェントに共通することを解決し、それらの機能をスクリプトライブラリにプッシュしてみてください。各エージェントがどのように異なるかを考える必要がないので、この種のことはコードを維持する際に多くの時間を節約します(例えば、私のエージェントのすべてのインスタンス、またはそれらのいくつかに私の変更が適用されますか?)

コードをさらに分解したいのですが... 1つの小さなことです。の代わりに

while not item is nothing

これは二重否定であり、人気のある脳のベンダーです。書く:

do until item is nothing
  ...
loop

これにより、exit doでループから抜けることもできます

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

これは、2番目のものがどのように見えるかです:

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
    ....

kenが言っているように、entry.ColumnValues(x)メソッドを使用して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"

この利点は、そのデータを操作するメソッドを追加でき、アプリケーションを探し回るのではなく、コードがそのオブジェクトに関連していることを知っていることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top