Autor Thema: Performance bei: "Existiert diese ID bereits?"  (Gelesen 2138 mal)

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Performance bei: "Existiert diese ID bereits?"
« am: 16.02.05 - 14:13:57 »
** Thema ist Erledigt **
*************************************

Hi,

in einer DB habe ich etwa 5000 Dokumente, werden täglich mehr.

Wenn ein neues Dokument erstellt wird, soll im Querysave geprüft werden, ob der Wert im Feld "ID" nicht schon mal vorkommt.
Gibt es schon ein Dokument mit dieser "ID", so soll das Speichern abgebrochen werden (Continue = False) mit einer Fehlermeldung.

Bisher hab ich das so umgesetzt:
Code
Sub Querysave(Source As Notesuidocument, Continue As Variant)
	
	On Error Goto ErrorHandler
	
	Dim session As New NotesSession	
	Dim db As NotesDatabase
	Dim docThis As NotesDocument
	Dim viewLookupID As NotesView
	Dim docLookup As NotesDocument
	Dim strCurrentID As String	
	Set docThis = Source.Document
	Set db = session.CurrentDatabase
	strCurrentID = docThis.ID(0)
	
	Set viewLookupID = db.GetView("LookupID")
	Set docLookup = viewLookupID.GetFirstDocument
	While Not (docLookup Is Nothing)
		If docLookup.ID(0) = strCurrentID And Not (docLookup.UniversalID = docThis.UniversalID) Then
			Msgbox "Möp"
			Continue = False
			Exit Sub
		End If
		Set docLookup = viewLookupID.GetNextDocument(docLookup)
	Wend

Der Teil
Code
And Not (docLookup.UniversalID = docThis.UniversalID)
ist drin, weil ja sonst eine Fehlermeldung kommt, wenn ein User ein bestehendes Dokument speichert (weil es das Dok ja schon in der View gibt). Eine Prüfung auf IsNewDoc kann ich hier aber nicht einbauen, weil sich die "ID" auch öfter ändern kann/wird.

Problem:
Das Konstrukt ist sehr langsam! Ist ja auch klar, hier wird beim Speichern Dokument für Dokument durchgesehen.

Hat wer von Euch einen Vorschlag, um das ganze zu beschleunigen? Ich brauche allerdings auch eine Prüfung à la "If (docLookup.UniversalID = docThis.UniversalID)".

Habe da schon an NotesView.GetAllDocumentsByKey gedacht. Wäre sicherlich schneller. Aber die o.g. Prüfung bringe ich dann nicht hin, oder?

Ich glaube ich hab gerade ein Brett vor'm Kopf und es müsste doch einfacher gehen.

Matthias

P.S. die Umstände bei diesem Konstrukt sind mir klar (mehrere Repliken etc.), aber die DB läuft 100% nur auf 1 Server, lokal werden keine Dokumente erstellt.
« Letzte Änderung: 16.02.05 - 14:21:43 von TMC »
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Performance bei: "Existiert diese ID bereits?"
« Antwort #1 am: 16.02.05 - 14:16:45 »
Du brauchst eine Lookup-View mit den IDs. Dort holst Dir dann mit GetAllDocumentsByKey Deine Collection. Du brauchst dann nur noch diese prüfen, ob dort ein Dokument drin steckt mit einer anderen UNID als der des aktuellen Dokuments.

HTH,
Bernhard

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re: Performance bei: "Existiert diese ID bereits?"
« Antwort #2 am: 16.02.05 - 14:20:19 »
Du brauchst dann nur noch diese prüfen, ob dort ein Dokument drin steckt mit einer anderen UNID als der des aktuellen Dokuments.

Hmm, ja klar, danke Bernhard, that's it.   :D

Matthias
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz