Domino 9 und frühere Versionen > ND8: Entwicklung

Optimierung einer Suchfunktion

<< < (3/3)

Mitch:

--- Zitat von: Valron am 21.08.14 - 14:53:04 ---Aufgrund folgender Aussage von dir...

--- Zitat ---Die Nummern sind immer 5-stellig mit führenden Nullen und werden aus diesem Grund als Text im Dokument gespeichert.
--- Ende Zitat ---
... gehe ich davon aus, dass deine NotesDocumentCollection immer leer bleibt. ;)
Du musst in diesem Fall dein Array als String deklarieren und dementsprechend mit den Strings füllen.

--- Ende Zitat ---

Ohja, sehr wichtig!  :)

Valron:
Hallo Dirk,

da ich gerade nichts zu tun habe,... hier die fertige Funktion.  ;D
Getestet und Einsatzbereit. :)
~Kann 1:1 so übernommen werden ;)

- Suche über GetAllDocumentsByKey
- Prüfung ob Nummern bereits doppelt vergeben sind
- Prüfung ob es sich beim gefundenen Dokument um das aktuelle Dokument handelt, welches gespeichert werden soll.


--- Code: ---Function NummerSuchen(jahr As String, nummer As String, refdoc As NotesDocument) As Boolean

Dim s As New NotesSession
Dim db As NotesDatabase
Dim v As NotesView
Dim doc As NotesDocument
Dim ndc As NotesDocumentCollection
Dim asKeys(0 To 1) as String

Set db = s.CurrentDatabase
Set v = db.GetView("(LUNummern)") '// Eine View, dessen 1. Spalte Ablagenummer_1 und 2. Spalte Ablagenummer_2 ist (Beide sortiert)

asKeys(0) = jahr
asKeys(1) = nummer
Set ndc = v.GetAllDocumentsByKey(asKeys, True)

If ndc.Count <> 1 Then
'// Es wurden keine, oder mehrere Dokumente gefunden
If ndc.Count > 1 Then
'// Achtung! Nummer ist bereits doppelt vergeben!
MsgBox "Die Nummer ist bereits doppelt vergeben. Bitte informieren Sie einen Administrator",16,"Hinweis"
NummerSuchen = True
End If
Else
'// Es wurde genau 1 Dokument gefunden
Set doc = ndc.GetFirstDocument()
If refdoc Is Nothing Then '// If Not ... ist ebenfalls unperformanter, als If ... (Macht auch nur paar ms aus)
MsgBox "Die Nummer wurde schon vergeben.",16,"Hinweis"
NummerSuchen = True
Else
'// Prüfung, ob es sich beim gefundenen Dokument um sich selber handelt
If StrCompare(doc.Universalid, refdoc.Universalid, 5) <> 0 Then '// StrCompare ist meines Wissens nach performanter, als Strings direkt miteinander zu vergleich
MsgBox "Die Nummer wurde schon vergeben.",16,"Hinweis"
NummerSuchen = True
End If
End If
End If

End Function
--- Ende Code ---

Gruß,
Rich

Keydins:
Danke für die weiteren Tips und die fertige Funktion  :knuddel:

Das mit dem Cint() bei den Keys ist schon korrekt, ich hatte sie beim ersten Versuch als String definiert und mich gewundert, warum ich keine Treffer hatte. Ein genauer Blick auf die Ansicht ergabe dann, dass die Spalten in der LU-Ansicht per @TextToNumer(Feld) in Zahlen gewandelt werden.

Die Anpassung im Script erschien mir daher sinnvoller, als ggf. eine neue Baustelle durch Anpassung der Ansicht zu eröffnen. Ich soll die Anwendug nicht 'komplett überarbeiten', auch wenn ich das gerne würde.


Eine weitere Frage hätte ich allerdings noch:

Gibt es eine Möglichkeit eine DocumentCollection zu sortieren?

Bin in der Anwendung gerade über eine 2. Funktion gestolpert, die für die Vergabe der Nummern für neue Dokumente zuständig ist.

Für das aktuelle Jahr holt sie sich aus der LU-Ansicht das letzte Dokument und rechnet +1 auf die laufende Nummer, füllt mit führenden Nullen auf und trägt die Nummer in das neue Dokument ein.

Lege ich jedoch ein Dokument für das Vorjahr (oder älter) an, geht die Funktion wieder die Dokumente in der Ansicht durch, um das letzte Dokument des ausgewählten Jahres zu finden und dann wieder auf die Nummer +1 zu addieren. Dauert natürlich auch wieder ewig....

Auf Grund eurer Tips dachte ich mir, dass ich hier ggf. auch mit einer DocumentCollection arbeiten kann, aus der ich mir dann das letzte Dokument rauspicke.


--- Code: ---If Cint(jahr_uidoc) < jahr) Then
'Gibt es schon ein Dokument für das Jahr ?
Set dc = v.GetAllDocumentsByKey(Cint(jahr_uidoc),True)

If dc.Count = 0 Then
Call Source.FieldSetText("Ablagenummer_2","00001")
Else
Set doc = dc.GetLastDocument

nummer = Cint(doc.Ablagenummer_2 (0))
nummer = nummer + 1
Call Source.FieldSetText("Ablagenummer_2",_
Right("00000" + Cstr(nummer),5))
Exit Function
End If
End If
--- Ende Code ---

Bei einigen Jahrgängen funktioniert das wie gewünscht, das letzte Dokument der Collection ist das mit der höchsten Nummer, bei anderen Jahren ist das letzte Dokument der Collection zwar in der Nähe der höchsten Nummer, aber es gibt jeweils noch 2-3 Dokumente, die eine höhere Nummer haben.

Mitch:
Jain. :) Die NotesDocumentCollection ist unsortiert. Aber du solltest mit einer NotesViewEntryCollection arbeiten können, die ist wie die Ansicht sortiert.

Gruß,

Mitch

Gesendet von meinem Nexus 7 mit Tapatalk

Keydins:
Und nochmal herzlichen Dank an Mitch.

Die Anwendung schnurrt jetzt auch bei der Anlage von neuen Dokumenten - egal für welches Jahr - wie ein Kätzchen  ;D


--- Code: ---jahr_uidoc = Source.FieldGetText("Ablagenummer_1")

Set vc = v.GetAllEntriesByKey(Cint(jahr_uidoc),True)

If vc.Count = 0 Then
Call Source.FieldSetText("Ablagenummer_2","00001")
Else
Set entry = vc.GetLastEntry
Set doc = entry.Document
nummer = Cint(doc.Ablagenummer_2 (0))
nummer = nummer + 1
Call Source.FieldSetText("Ablagenummer_2",_
Right("00000" + Cstr(nummer),5))
End If
--- Ende Code ---

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln