Domino 9 und frühere Versionen > ND7: Entwicklung

Wieder mal eine Datumfrage

(1/2) > >>

Sommersprosse:
Ein Frage....

Bei einem Archiv eines Kollegen fehlen Dokumente in der Inbox. Eigentlich kein Problem, da es bei IBM ein tolles Script gibt:
aber....


--- Code: ---Sub Initialize
Dim s As New notessession
Dim db As notesdatabase
Dim fDoc As NotesDocument ' Document in folder
Dim ad As notesview ' All Documents view
Dim aDoc As notesdocument ' document in All Docs view
Dim fUNID() As String ' array of UNID's of docs in folders
Dim i As Integer ' UNID array index
Dim deldate As notesitem
Dim Chair1 As notesitem
Dim startdate As String

Sub Initialize
Dim s As New notessession
Dim db As notesdatabase
Dim fDoc As NotesDocument ' Document in folder
Dim ad As notesview ' All Documents view
Dim aDoc As notesdocument ' document in All Docs view
Dim fUNID() As String ' array of UNID's of docs in folders
Dim i As Integer ' UNID array index
Dim deldate As notesitem
Dim Chair1 As notesitem
Dim startdate As Variant
Dim enddate As Variant


i =0
Set db = s.CurrentDatabase


Redim fUNID(0)

' Build UNID array by looping through folders, then their documents

startdate=(Inputbox("Startdatum eiingeben"))
enddate=(Inputbox("Endatum eingeben"))

Forall view In db.views
If view.IsFolder And Not view.Name=("($All)") Then
Set fDoc = view.GetFirstDocument
While Not fDoc Is Nothing
Redim Preserve fUNID(i)
fUNID(i) = fDoc.UniversalID
i=i+1
Set fDoc = view.GetNextDocument(fDoc)
Wend
End If
End Forall

' Loop through docs in the All Documents view and compare UNIDs to each doc in the array
Set ad = db.GetView("($All)")
Set aDoc = ad.GetFirstDocument


While Not aDoc Is Nothing
i = 0
Do While i <= Ubound(fUNID)
If fUNID(i) = aDoc.UniversalID Then
Exit Do
End If
i = i + 1
Loop
Set deldate = adoc.getfirstitem("delivereddate")
Set Chair1 = adoc.getfirstitem("CHAIR")
If i > Ubound(fUNID) And Not deldate Is Nothing And Chair1 Is Nothing Then
Call adoc.PutInFolder( "($Inbox)")
End If
Set aDoc = ad.GetNextDocument(adoc)
Wend

End Sub
--- Ende Code ---

..... die Datenbank ist zu groß und beinhaltet zuviele Dokumente und ich würde deswegen das Auswahldatum gerne eingrenzen.
Aus dem Grund würde ich gerne ein Start und ein Enddatum setzen.

Irgendwie fehlt mir aber noch die Idee, wie ich diese Werte jetzt in das Script mit verkaspern kann??
Ich hab mich durch einige Posts gelesen, wie auch die Hilfe, aber was jetzt da das richtige dafür ist, bin ich noch nicht ganz schlau draus geworden.
Notesdaterange mit start und enddate  ??? Oder doch anders ...

Bräuchte mal einen Tipp von euch

Danke im voraus...

Demian:
Moin,moin,

da keiner antwortet, trau ich mich einfach mal. So wie ich das sehe, müsste ja nur der While-Wend Teil der Forall Schleife entsprechend erweitert werden in der Art:

Forall view In db.views
   If view.IsFolder And Not view.Name=("($All)") Then
      Set fDoc = view.GetFirstDocument
         

      While Not fDoc Is Nothing
         if cdat(fdoc.PostedDate(0)) >= cdat(StartDate) then
            if cdat(fdoc.PostedDate(0)) <= cdat(EndDate) then
               Redim Preserve fUNID(i)
               fUNID(i) = fDoc.UniversalID
               i=i+1
            end if
         end if

         Set fDoc = view.GetNextDocument(fDoc)
      Wend
   End If
End Forall

Dann dürften eigentlich nur die Dokumente ins Array geschrieben werden, die zwischen Start- und EndDate liegen. Ob StartDate und EndDate gültige Datumswerte enthalten, sollte natürlich vorher mit IsDate und dergleichen geprüft werden.

Sommersprosse:
Hallo Demian,

ich hatte schon gedacht der Beitrag versinkt wie so manch anderer im Nirwana....

Ich hab mal Deine Zeilen mit aufgenommen, aber so effektiv ist das noch nicht.
Im ersten Step habe ich mal noch keine Überprüfung auf den richtigen Zeitwert, da ich zwei Inboxen habe, in denen ich das Datum so eingeben kann, wie es im postedDate steht.

Ohne Deine zwei Zeilen meckert er gleich mit Overflow Buffer usw.

Mit der Überprüfung auf das Start und Enddate braucht er halt ewig..... In der Datenbank sind 50000 Dokumente. Ich hab gestern nach zwei Stunden abgebrochen.
Es gibt doch bestimmt eine Möglichkeit wie ich von vorherein das Array festlegen kann  :-:

Ich werd' mich noch mal reingraben.... aber erst nach meinem Urlaub.

Danke trotzdem

Demian:
der Overflow wird daher rühren, weil i nur als integer deklariert ist. Müsste man dann auf long ändern. Würde aber bedeuten, das in irgendeinem der Ordner über 32.767 Dokumente sind.


--- Zitat ---Im ersten Step habe ich mal noch keine Überprüfung auf den richtigen Zeitwert, da ich zwei Inboxen habe, in denen ich das Datum so eingeben kann, wie es im postedDate steht.
--- Ende Zitat ---

mit Überprüfung meinte ich, die Überprüfung ob auch wirklich korrekte Datumswerte in die Input-Boxen eingegeben wurden. Wenn da jemand bei Startdate Fleisch und bei  Enddate Gulasch eingibt, würde das so nicht zu dem gewünschten Ergebnis führen.

Peter Klett:
Das Hauptproblem besteht wohl darin, dass Du, wenn Du Dokumente aus einem Ordner oder einer Ansicht holst, keine Einschränkung bzgl. des Erstelldatums machen kannst. Das geht z.B. bei db.Search, dann fehlt Dir aber der Bezug zur Ansicht / zum Ordner.

Da Du also alle Dokumente der Ansichten / Ordner anschauen musst, bringt Dich das in der Performance nicht wirklich weiter, wenn Du da eine Abfrage über das Erstelldatum nachträglich einbringst. Der Zeitgewinn ist da nicht so erheblich.

Dass der Beitrag versinkt, liegt m.E. eher daran, dass niemand eine vernünftige Lösung präsentieren kann. Ein view.Search oder folder.Search wäre hilfreich (also alle Dokumente einer Ansicht / eines Ordners, die einer Selektionsformel entsprechen), aber das gibt es (noch) nicht.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln