0

ビュー 1 とビュー 2 の 2 つのビューがあります。

view1 には 26 人の譜表 (AZ) のリストが含まれています。

view2 には、各スタッフが毎日作成したドキュメントのリストが含まれています (各スタッフは 1 日に 1 つのドキュメントしか作成できません)。これらの各ドキュメントには、ドキュメントを作成したスタッフの名前と、ドキュメントが作成された日付 (組み込みのメモの作成日ではありません) が含まれています。つまり、スタッフ A は 2012 年 1 月に 31 のドキュメント、2012 年 2 月には 29 のドキュメント、というように今日まで続きます (2012 年 8 月 16 日 - 2012 年 8 月には 16 のドキュメント)。

私の現在の状況では、一部のスタッフについて、ドキュメントが不足しています。たとえば、スタッフ A は 2010 年 4 月 27 日にドキュメントが欠落しており、スタッフ B は 2011 年 5 月 12 日と 2012 年 3 月 4 日にドキュメントが欠落しており、スタッフ C などです。不足しているドキュメントは、スタッフごとに異なります。ドキュメントがまったく欠落していないものもあれば、最大 10 個のドキュメントが欠落しているものもあります。

ドキュメントが欠落している日付を取得して、テキスト ファイルに保存したいと考えています。上記のスタッフ B は、上記の日付に 2 つのドキュメントが欠落しているとします。そのため、テキスト ファイルに「スタッフ B - 2011 年 5 月 12 日、2012 年 3 月 4 日」と表示します。しかし、そもそも存在しないものをどうやって取得するのでしょうか?

これまでのところ、2010 年 1 月 1 日から 2012 年 8 月 16 日までの期間の日付範囲をカウントすることしか考えていませんでした。その範囲内に何日あるかを数えてから、スタッフの合計ドキュメントを数えます。ドキュメントの合計がその範囲の日数と等しくない場合、一部のドキュメントが不足しています。しかし、不足しているドキュメントの日付はまだ必要です。

4

2 に答える 2

2

LotusScript の List データ型について知っていますか? 日付範囲をカバーするブール値の完全なリストを作成する必要があると思います。つまり、範囲内の各日のリスト エントリがあり、日付が listtag で、エントリ値がドキュメントが見つかったかどうかを示します。すべての日付が false になるように初期化されたリストから始めます。

Dim theDate As New NotesDateTime("1/1/2005")
dim endDate as New NotesDateTime("8/16/2012")
dim foundDates List as Boolean

While theDate.Timedifference(endDate) <= 0
  foundDates(theDate.dateOnly) = false
wend

各スタッフ メンバーのリストを再初期化できるように、関数内に上記のコードが必要になる場合があります。

ここで、スタッフの 1 人のメンバーのすべてのドキュメントを反復処理するコードが必要になります。ドキュメントから日付項目を読み取り、対応するリスト エントリを true に変更します。

dateObj = new NotesDateTime(doc.getItemValue("dateFieldName"))
foundDates(dateObj.dateOnly) = true

スタッフ メンバーのドキュメントをループすると、見つかったすべてのドキュメントの日付に対して true を含み、見つからなかったすべての日付に対して false を含む List が得られます。

forall を使用して、まだ false であるエントリをチェックするだけで、見つからなかった日付のリストを出力できるようになりました。

print #textfile, StaffName;
ForAll dateEntry in foundDates
   if dateEntry = false then
      print #textfile, listtag(dateEntry)
   end if
End ForAll
print #textfile,

各スタッフ メンバーのドキュメントを処理する前に、foundDate リストのすべてのエントリを false に再初期化して、上記のすべてをすべてのスタッフ メンバーのループに含めます。

于 2012-08-16T03:54:37.127 に答える
1

これを解決する最善の方法は、各スタッフ メンバーの日付範囲を調べて、欠落している日付を出力することだと思います。

あなたがlotusscriptを考えていると仮定すると、(テストされていない、ビューのインデックス作成と日付の保存方法が問題を引き起こす可能性があります)のようなものです。

Sub Initialize
    Dim session As New NotesSession
Dim db As NotesDatabase
Dim viewStaff As NotesView
Dim viewDocs As NotesView
Dim docStaff As NotesDocument
Dim docDoc As NotesDocument
Dim keys(1) As String
Dim startDate As New NotesDateTime("1/1/2005") 'Start date of Range
Dim endDate As New NotesDateTime("1/1/2010") 'End date of Range  
Dim tempDate As NotesDateTime

'Initialise Views
Set db = session.currentDatabase
Set viewStaff = db.GetView("StaffView")
Set viewDocs = db.GetView("DocsByStaff")

'Iterate over staff to process
Set docStaff = viewStaff.Getfirstdocument()
While Not docStaff Is Nothing
    'Search for daily docs for this staff member (this will need a view indexed on the staff member name, then the date)
    keys(0) = docStaff.Fullname(0) 'Or whatever this item is called

    Set tempDate = startDate
    While tempDate.Timedifference(endDate) <= 0 'Go over each date up to and including the end date
        keys(1) = tempdate.Dateonly
        Set docDoc = viewDocs.getDocumentByKey(keys) 'Search for date using current user and date
        If docDoc Is Nothing Then 'Haven't found it
            Print "Can't find document for " + keys(0) + " on " + keys(1) ' Could output to file or something here.
        End If
        tempDate.Adjustday(1) 'Roll forward another day
    Wend

    Set docStaff = viewStaff.getNextDocument(docStaff) 'Next staff member
Wend

End Sub

おそらく最も効率的な方法ではありませんが、たまに行うものでドキュメントがあまりない場合は、この方法で十分です。

于 2012-08-16T02:56:22.627 に答える