Autor Thema: Collection 2 mal durchlaufen !?  (Gelesen 9804 mal)

Offline Don Pasquale

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.390
  • Geschlecht: Männlich
  • Don Pasquale
    • Auf Verlorenem Posten
Collection 2 mal durchlaufen !?
« am: 07.10.02 - 12:34:30 »
Hallo Leute,

ich muss eine Collection (einer View) 2 mal durchlaufen,
weiss aber nicht, ob und wie ich den 2 Durchlauf neu initialisiere.
Ich überprüfe ob es ein Dokument derselben Identnummer bereits gibt  und welchen Bearbeiter es hat.
Hat das oder die anderen Dokumente mit derselben IDENTnummer noch keinen Bearbeiter, soll Ihnen im 2 Durchlauf der Bearbeiter zugewiesen werden.

Was mache ich beim Zweiten Durchlauf falsch ?

Manchmal wird er nämlich durchlaufen,
manchmal nicht. Dabei hätte in meinen Probedurchläufen  die Collection nicht   leer sein
dürfen ..


wundert sich
Don Pasquale


Code
      Dim ws As New NotesUIWorkspace   
     Dim uidoc As NotesUIDocument  
     Set uidoc = ws.CurrentDocument  
     Dim session As New NotesSession
     Dim db As NotesDatabase
     Dim view As NotesView
     Dim temp As Integer
     Dim dc As NotesDocumentCollection
     Set db = session.CurrentDatabase
     Set view = db.GetView( "(InternIdent)" )
     Dim item As NotesItem
     Dim nameList As Variant
     Dim frontenddoc As Notesdocument
     Dim key As String
     Set frontenddoc = uidoc.document
     
     Zielo$ = frontenddoc.e4fldWeiterverarbeitung(0)      
     Zielp$ = frontenddoc.Zielperson(0)
     key$ = frontenddoc.e4fldIdentnummer(0)
     Bearbeiter$ = frontenddoc.Bearbeiter(0)
     Set dc = view.GetAllDocumentsByKey(key$, True)
     
     Set doc = dc.getfirstdocument
     
     While Not (doc Is Nothing)
           
           Set item = doc.GetFirstItem("Identnummer")
           If frontenddoc.e4fldIdentnummer(0) = doc.e4fldIdentnummer(0) Then
                 If doc.e4fldInitiator(0) <> "" Then
                       If doc.e4fldInitiator(0) <> frontenddoc.Zielperson(0) Then
                             
                             ' Ein anderer Mitarbeiter bearbeitet bereits diese Identnummer                        
                             ' Dann kann dieses Dokument auch gleich dorthin
                             Zielp$ = doc.e4fldInitiator(0)                              
                             
                       End If
                 End If      
           End If
           Set doc = dc.GetNextDocument(doc)
     Wend      
     
     
     Set uidoc = ws.EditDocument( True )
     Call uidoc.FieldSetText("e4fldInitiator",Cstr(Zielp$))
     Call uidoc.FieldSetText("e4fldIndexiert", "True")
     Call uidoc.FieldSetText("e4fldNeuZugewiesen", "heute")
     Call uidoc.FieldSetText("e4fldLetzterBearbeiter",Cstr(Bearbeiter$))
     Call uidoc.FieldSetText("e4fldStatus",Cstr(Zielo$))
     Call uidoc.FieldSetText("e4fldOrdner","Register")
     temp = ws.folder("Register",True)
     
     Call uidoc.save
     Call uidoc.close
     
'      Und nun wird überprüft, ob es noch andere Doks mit dieser IDentnummer gibt,
'    die noch keinen Initiator haben      
     
     Set dc = view.GetAllDocumentsByKey(key$, True)
     Set doc = dc.getfirstdocument
     
     While Not (doc Is Nothing)
           
           Set item = doc.GetFirstItem("Identnummer")
           If frontenddoc.e4fldIdentnummer(0) = doc.e4fldIdentnummer(0) Then
                 If doc.e4fldInitiator(0) = "" Then
                       
                       Call doc.ReplaceItemValue( "e4fldInitiator", Cstr(Zielp$) )
                       Call doc.Save( True, False )
                       
                 End If      
           End If
           Set doc = dc.GetNextDocument(doc)
     Wend      
     End

Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re: Collection 2 mal durchlaufen !?
« Antwort #1 am: 07.10.02 - 12:54:41 »
hm...

wie wäre es zunächst, wenn Du eine Schleife in die Schleife setzt...und zwar an folgender Stelle:

While Not (doc Is Nothing)  
           
           Set item = doc.GetFirstItem("Identnummer")  
           If frontenddoc.e4fldIdentnummer(0) = doc.e4fldIdentnummer(0) Then
                 If doc.e4fldInitiator(0) <> "" Then
                       If doc.e4fldInitiator(0) <> frontenddoc.Zielperson(0) Then
                             
                             ' Ein anderer Mitarbeiter bearbeitet bereits diese Identnummer                        
                             ' Dann kann dieses Dokument auch gleich dorthin
                             Zielp$ = doc.e4fldInitiator(0)                              
                             
                       End If
Else...
Call doc.ReplaceItemValue( "e4fldInitiator", Cstr(Zielp$) )  
                       Call doc.Save( True, False )  

                 End If      
           End If
           Set doc = dc.GetNextDocument(doc)  
     Wend      


Denn Du hast ja die Abfrage in der ersten Schleife:
If doc.e4fldInitiator(0) <> "" Then
...
und mit Else
kannst Du automatisch auf
doc.e4fldInitiator(0) = "" abchecken und Maßnahmen treffen.

Ob das allerdings dann Dein Prob löst, weiß ich nicht, zumindest ist es sehr ineffizient zwei Schleifen mit gleichen Bedingungen separat laufen zu lassen. Denn einmal läufst Du alle Docs durch, dann nochmal.
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

Offline Don Pasquale

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.390
  • Geschlecht: Männlich
  • Don Pasquale
    • Auf Verlorenem Posten
Re: Collection 2 mal durchlaufen !?
« Antwort #2 am: 07.10.02 - 12:59:01 »
Zitat

Ob das allerdings dann Dein Prob löst, weiß ich nicht, zumindest ist es sehr ineffizient zwei Schleifen mit gleichen Bedingungen separat laufen zu lassen. Denn einmal läufst Du alle Docs durch, dann nochmal.


Hi Rob,
Erst wenn ich alle Docs abgearbeitet habe, kann ich sicher sein, dass nicht ein Dokument bereits einen Bearbeiter hat.

> Denn einmal läufst Du alle Docs durch, dann nochmal.
Wenn es denn 2 mal die Docs durchlaufen würd
e, aber das tut es eben nicht immer und ich habe keinen Schimmer wieso ?

Ratlos

Don Pasquale

« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »

Glombi

  • Gast
Re: Collection 2 mal durchlaufen !?
« Antwort #3 am: 07.10.02 - 13:06:17 »
Hast Du mal den Debugger laufen lassen, um zu sehen, an welcher Stelle abgebrochen wird?

Ausserdem ist es nicht notwendig, die dc nochmal zu setzen. Du kannst beim 2. Lauf wieder dc nehmen ohne es vorher zu setzen - ausser: Die Zugriffsformel bewirkt, dass das Frontend-Dokument (uidoc) nicht mehr angezeigt wird. Dann solltest Du vor dem Setzen der view ein view.Refresh aufrufen.

Gruß
Andreas
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »

Offline Don Pasquale

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.390
  • Geschlecht: Männlich
  • Don Pasquale
    • Auf Verlorenem Posten
Re: Collection 2 mal durchlaufen !?
« Antwort #4 am: 07.10.02 - 13:14:32 »
Mellon Glombi,

abgebrochen hat er nirgends, das Count der 2 ten
Collection war manchmal 0 bzw. es hat sich im Gegensatz zur ersten Collection nicht verändert, dabei hätte es Einen mehr sein müssen.

Danke Rob, Danke Glombi,

ich muss es nochmals ausgiebig testen,
aber das scheint es mir zu sein.


Danke

Don Pasquale




« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »

Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re: Collection 2 mal durchlaufen !?
« Antwort #5 am: 07.10.02 - 13:20:03 »
hm..ist schon irgendwie komisch.

Wenn Du im Debugger die Collcetion Dir anschaust, dann betrachte doch mal, was in der zweiten Schleife die Anzahl angeht. Sollte doch die gleiche sein, oder etwa nicht, weil Du in der ersten Schleife bzw. kurz danach im UIDOC Werte setzt? Ich denke, da ist der Ansatz bzw. "Fehler".

Mach doch mal bitte vor der zweiten Schleife übrigens einen view.refresh. dazu.
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Collection 2 mal durchlaufen !?
« Antwort #6 am: 07.10.02 - 13:33:20 »
Hallole,

ich habe mir deinen Code angeschaut, und dabei sind mehrere Sachen aufgefallen.

Zitat
Set item = doc.GetFirstItem("Identnummer")


Wozu initialisierst du das Item, du verwendest es nirgends mehr?

Zitat
Set dc = view.GetAllDocumentsByKey(key$, True)  


Eine 2. Initialisierung macht nur dann Sinn, wenn zuvor ein Refresh auf der View war, den du deshalb brauchst, weil sich mit dem neuen Index neue Dokumente erschließen könnten... wenn nicht brauchst du keine weitere Initialisierung, das kostet sonst unnötige Performance...

Dann habe ich gesehen, daß du mit While-Schlaufen arbeitest. Ich habe festgestellt, daß For-Next Schlaufen performanter sind. Die Initialisierung des doc geht dann innerhalb der Schlaufe zu Beginn mit GetNthDocument(index) von statten.

« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »
Grüßle Toni :)

Offline Don Pasquale

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.390
  • Geschlecht: Männlich
  • Don Pasquale
    • Auf Verlorenem Posten
Re: Collection 2 mal durchlaufen !?
« Antwort #7 am: 07.10.02 - 13:35:04 »
Hi Rob,

was Du nicht wissen kannst, weil Du nicht
weisst wie meine Sicht (InterIdent) aufgebaut ist,
das aktuelle Dokument wird erst mit :
Code

Call uidoc.FieldSetText("e4fldIndexiert", "True")

zu einem Teil der View (InternIdent),
das heisst, die 2 Colection muss einen größer sein, und genau das war sie eben nicht.

Das mein Code nicht gerade performant ist, bitte
ich geflissentlich zu übersehen, vielleicht finde
ich noch eine Windows*-Funktion in Lotus


Windows = altes indianisches Wort für "Der auf die Sanduhr starrt"


Gruß
Don Pasquale



« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »

Offline Don Pasquale

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.390
  • Geschlecht: Männlich
  • Don Pasquale
    • Auf Verlorenem Posten
Re: Collection 2 mal durchlaufen !?
« Antwort #8 am: 07.10.02 - 13:45:13 »
Salut Ata,

Zitat
Wozu initialisierst du das Item, du verwendest es nirgends mehr?


Fehler made by Dreck&Drop.
Wird rausgenommen.

Zitat

Eine 2. Initialisierung macht nur dann Sinn, wenn zuvor ein Refresh auf der View war, den du deshalb brauchst, weil sich mit dem neuen Index neue Dokumente erschließen könnten... wenn nicht brauchst du keine weitere Initialisierung, das kostet sonst unnötige Performance...


Das war ja das was ich gesucht habe :-)
Die Performance ist in der Tat eher schwach.


Zitat

Dann habe ich gesehen, daß du mit While-Schlaufen arbeitest. Ich habe festgestellt, daß For-Next Schlaufen performanter sind. Die Initialisierung des doc geht dann innerhalb der Schlaufe zu Beginn mit GetNthDocument(index) von statten.


Da bin ich jetzt etwas verunsichert, in einem anderen Thread wurde ich darauf hingewiesen While Schleifen zu nehmen statt for-next.

Würden sich die Herren Experten mal einigen  :D

Aber, Ich probiere es aus


badische Grüße

Don Pasquale

« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »

Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re: Collection 2 mal durchlaufen !?
« Antwort #9 am: 07.10.02 - 13:48:33 »
dann dürfte es am fehlenden refresh liegen.

Wegen der Perfomance würde ich mir keine Sorgen machen,

- da ich einerseits annehme, daß die Collections sehr klein ist und
- die Verwendung von getnthdocument in Collections die nicht über den View durchlaufen werden (!!!) sehr viel langsamer ist. Notes geht dann die Coll bei jedem Durchlauf von vorne wieder durch bis zum n-ten Doc. Ätzend! Wird über eine Viewcollection gearbeitet, weisen beide Methoden keine Unterschiede auf.
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

Offline Don Pasquale

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.390
  • Geschlecht: Männlich
  • Don Pasquale
    • Auf Verlorenem Posten
Re: Collection 2 mal durchlaufen !?
« Antwort #10 am: 07.10.02 - 13:58:50 »
Hi Ata, Glombi und Rob,

Vielen Dank für Eure Hilfe, so langsam bekomme
ich das Kind schon geschaukelt.

Zitat
dann dürfte es am fehlenden refresh liegen.


D´accord.

Zitat

Wegen der Perfomance würde ich mir keine Sorgen machen,
- da ich einerseits annehme, daß die Collections sehr klein ist


Es sei denn, ein Mitarbeiter kommt aus einem 4 wöchigen Urlaub, aber dann ist es auch okay,
so häufig kommt das ja nicht vor. :-)

Zitat

und
- die Verwendung von getnthdocument in Collections die nicht über den View durchlaufen werden (!!!) sehr viel langsamer ist. Notes geht dann die Coll bei jedem Durchlauf von vorne wieder durch bis zum n-ten Doc. Ätzend! Wird über eine Viewcollection gearbeitet, weisen beide Methoden keine Unterschiede auf.


Aha, langsam begeife ich´s. Den Passus werde ich mir bei Gelgenheit nochmal durchlesen


Ciao
Don Pasquale



Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re: Collection 2 mal durchlaufen !?
« Antwort #11 am: 07.10.02 - 14:02:44 »
schau dazu besser in das - wie ich finde obersuperduper wichtiges - Document in der Redbook Ecke auf LDD...namens "Performance Considerations".
Müßte ine White Paper sein oder sogar ein echtes Redbook.

Lohnt sich auf alle Fälle.
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Collection 2 mal durchlaufen !?
« Antwort #12 am: 07.10.02 - 14:08:28 »
@Rob

... und wie stets mit GetFirstDocument vor der Schleife und GetNextDocument(doc) am Ende der Schleife...?

ata
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »
Grüßle Toni :)

Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re: Collection 2 mal durchlaufen !?
« Antwort #13 am: 07.10.02 - 14:28:47 »
hm.."ja"....
das sage ich immer, wenn ich die Frage nicht verstehe ;D

Möchtest Du etwas wissen oder ist das als Frage zu verstehen hinsichtlich Performance Überlegungen oder ..

na ja, "ja" sage ich  ;D
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Collection 2 mal durchlaufen !?
« Antwort #14 am: 07.10.02 - 14:45:15 »
@Rob

hinsichtlich der Performance, ist das dann besser...

ata
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »
Grüßle Toni :)

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Collection 2 mal durchlaufen !?
« Antwort #15 am: 07.10.02 - 14:48:54 »
@Pasquale

könnte es an deinem key$ liegen, wenn er zum Beispiel leer war?

ata
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »
Grüßle Toni :)

Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re: Collection 2 mal durchlaufen !?
« Antwort #16 am: 07.10.02 - 15:03:55 »
genauer betrachtet hängt das ja von 2 Faktoren ab, wenn es um die Frage geht "nehm ich gextnext oder getnth".

1. While gegen For Loop
2. Arbeitsweise von getnth und getnext

While ist langsamer als For, da ja eben der Check bei jeder While Durchlaufchleife jedesmal gemacht wird, wohingegen bei For die Anzahl der Iterationsschritte bekannt ist bzw. lediglich die maximale Iterationsanzahl überprüft wird. An sich liegt der Unterschied wohl noch  tiefer betrachtet in der C Denkweise von Notes, was letzten Endes den Unterschied beider Methoden ausmacht, wie der RAM angesprochen wird. Das dürfte wohl ein gewiefter C Developer erklären können (oder ist Notes in C++ geschrieben?).

Gnth allerdings hebelt mE den Vorteil einer For SChleife komplett aus, da es dafür bekannt ist, jedes Doc intern  i++ Iterationsschritte und damit bei jedem Step zu durchlaufen, bis es das n-te Doc endlich refenziert. Im Gegensatz zum getnextdocument, das in der Coll sogleich zum nächsten Doc aus der Collection springt.

Wir hatte vor 2-3 Jahren mal intern Tests gemacht und es war wirklich so, daß eine NotesDocumentCollection mit einer For und GetNth Schleife super mega langsam war im Gegensatz zu einer While Getnext Schleife.

Doch natürlich gibt es Ausnahmen davon und manchmal kann man ja auch nicht anders, als ein getnth zu wählen. Zumal es ideal ist, wenn man weiß, wo man in einer Coll zu springen hat. Dann wäre getnext total deplaziert.
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

Glombi

  • Gast
Re: Collection 2 mal durchlaufen !?
« Antwort #17 am: 07.10.02 - 16:10:52 »
@Don Pasquale:
Also, wenn ich das richtig verstanden habe, baust Du die 2. Collection auf, um das Backend-Dokument von uidoc noch zu bekommen. Du könntest dieses aber einfach zur Collection hinzufügen:

...
call uidoc.Save(...)
set doc = uidoc.Document
call uidoc.Close
Call dc.AddDocument( doc )

...
hier dann weiter mit (ehemals 2. Collection)
set doc = dc.GetFirstDocument

Das ganze
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »

Glombi

  • Gast
Re: Collection 2 mal durchlaufen !?
« Antwort #18 am: 07.10.02 - 16:22:45 »
@All:
Wegen der Performance:
GetNthDocument sollte unbedingt vermieden werden, wenn man nicht explizit das n-te Dokument aus einer Colletion holen will.

Einige Tipps zum Thema Performance gibt's hier:
http://www.martinscott.com/Site/DesignLibrary.nsf/Papers/Performance

Gruß
Andreas
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »

Offline Don Pasquale

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.390
  • Geschlecht: Männlich
  • Don Pasquale
    • Auf Verlorenem Posten
Re: Collection 2 mal durchlaufen !?
« Antwort #19 am: 07.10.02 - 16:23:02 »
@Glombi

Danke für Deinen Hinweis, bin mir aber nicht sicher ob wir uns richtig verstanden haben.

Ich durchlaufe alle Dokumente einer Kategorie, weil  in einem Dokument bereits ein Bearbeiter stecken könnte.
Dann werden alle Dokumente nochmal durchlaufen
und der Wert Bearbeiter wird entweder mit dem
neuen Wert besetzt, oder dem Wert, den ich im 1. Durchlauf gefunden habe.

Der 2. Durchlauf benötigt das refresh, weil ich der View ja ein neues Dokument hinzugefügt habe.

Falls das nicht der Grund sein sollte, zumindest funktionert es jetzt mit dem Refresh in allen Fällen und nicht nur in jedem 5 Versuch.


Ciao

Don Pasquale
« Letzte Änderung: 01.01.70 - 01:00:00 von 1034200800 »

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz