Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Onkel Domino am 25.11.04 - 22:09:50

Titel: NotesDocumentCollection "kopieren"
Beitrag von: Onkel Domino am 25.11.04 - 22:09:50
Hallo,

ist es möglich ein NotesDocumentCollection zu kopieren?! Ich habe zwei Kollektionen col1 und col2, wenn ich col2 mit "SET" die col1 zuweise (Set col2 = col1), dann wird nur der Verweis umgesetzt. Heißt also, wenn ich Dokumente aus col2 lösche, dann sind die auch nicht mehr in col1 vorhanden.

Gibt es eine Möglichkeit das zu umgehen? Sozusagen einen Parameter für den Befehl "SET"?

Danke schonmal!
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Glombi am 25.11.04 - 22:13:02
Was meinst Du genau mit "löschen"?
Dokument löschen oder aus der Collection entfernen?

Vielleicht hilft ein Aufruf "Call by Value" in einer Sub:
Sub Wasweissich( Byval col1 as NotesDocumentColletion)

Andreas
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: -Michael- am 25.11.04 - 22:13:30
Hi,

kleine Nachfrage:
Wie löscht Du die Dokumente aus der Collection? Call doc.Remove(True) ?
Dann ist das Dokument natürlich nicht mehr verfügbar, ist ja komplett aus der DB dadurch gelöscht.


Michael
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Onkel Domino am 25.11.04 - 22:20:28
Sorry, hatte ich vergessen: mit löschen meine ich die Methode "Delete" aus der DocumentCollection. Also nur aus der Collection, nicht aus der DB löschen!

@Andreas:
Gute Idee mit der Sub! Kam mir auch schon in den Sinn, dachte nur vielleicht gibt es bereits Bordmittelchen, die die "Call by Reference"-Eigenschaften von "SET" umgehen.
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Glombi am 25.11.04 - 22:23:08
Das wäre mir neu...
aber vielleicht wissen die OO Superschlauen mehr  ;D

Andreas
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Onkel Domino am 25.11.04 - 22:27:56
Zur Not muss ich mal im Zentrum der Gruppenarbeitskompetenzen nachfragen  ;)
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Glombi am 25.11.04 - 22:30:30
Ein Competence Center in der Hinterhand zu haben, ist immer gut  ;D

Andreas
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Onkel Domino am 25.11.04 - 22:46:36
Hey Andreas,

ich muss nochmal in diesem Competence Center nerven:

---schnipp---
Function CopyCollection(Byval col As NotesDocumentCollection) As NotesDocumentCollection
   Set CopyCollection = col
End Function
---schnipp---

Wirft eine Fehlermeldung :-(

Illegal pass by value: COL or missing CALL keyword

Ist 'ByVal' denn überhaupt verträglich mit einer NDC? Sieht nicht so rosig aus...
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Glombi am 25.11.04 - 22:53:06
Du musst Variant verwenden:

  Function CopyCollection(Byval col As Variant) As NotesDocumentCollection

sonst meckert der Interpretor zurecht.

Andreas

Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Onkel Domino am 25.11.04 - 22:54:33
Hurra, er hat's geschluckt.

Vielen Dank!
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Glombi am 25.11.04 - 22:55:41
Es geht aber trotzdem nicht, habe es eben schnell mal getestet: Wenn Du ein Dokument aus der Collection entfernst, ist es auch aus der ursprünglichen draussen.
Irgendwie nicht so im Sinne des Erfinders des ByVal, oder?

Andreas
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Onkel Domino am 25.11.04 - 23:16:12
Kann mir auch nicht vorstellen, dass das so gewollt ist. Dann müssen eben viele, viele db.Search's laufen (hoffentlich liest es Bernhard nicht, (http://www.atnotes.de/index.php?topic=19604.msg121435#msg121435) ;) )

Danke vielmals für's Helfen und Testen!!!
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Glombi am 25.11.04 - 23:25:12
Ich weiß nicht, was Du eigentlich vorhast. Aber vielleicht kannst Du ja mit einer leeren Colllection anfagen und dann mit AddDocument die Dokumente hinzufügen.

Eine leere Collection gibt es ja nicht, d.h. du musst dir eine per pseudo Elemente aufbauen.

Andreas
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: koehlerbv am 25.11.04 - 23:38:49
Bernhard liest alles  ;D  Wenn er Zeit hat ... Das Forum ist einfach spannend, und ich lerne hier ja auch ständig dazu.

Ein Objekt kann man prinzipiell nicht ByVal übergeben - wie auch. Das Objekt ist ein Objekt ist ein Objekt ...

Ich glaube, das beste wäre, wenn Du mal folgendes aufmalst:
Was willst Du eigentlich erreichen ?
Warum arbeitest Du nicht mit dem FTI ?

Der Aufbau einer Kopie der NotesDocumentCollection wie von Andreas beschrieben geht (ausser bei Bummi-DBs) allemal schneller als vielfache NotesDatabase.Searchs. Ärgert auch den Server und die Bandbreite nicht so sehr  ;D

Vielleicht geht die Erreichung Deines Ziels ja aber auch ganz anders.

Gespannt,
Bernhard
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Onkel Domino am 25.11.04 - 23:43:28
Die Sache ist recht kompliziert. Ich habe mir einen Excel Export gebastelt und ich brauche die Eigenschaft "Count" der NDC um Überschriften über die exportierten Daten zu setzen. Immer wenn NDC.Count = 0 ist, wird drei Zeilen weitergesprungen und es gibt eine neue Überschrift. Danach geht die NDS nochmal nach anderen Kriterien durch eine Schleife. Nach diesen drei Zeilen brauche ich dann wieder die komplette NDC und nicht die reduzierte. Deshalb meine erste Frage, wie ich NDC's kopieren kann. Bisher läuft dann jedesmal wieder ein db.Search....

Aber egal.

Eine NDC mit AddDocument aufzubauen wäre ideal. Ich hatte mal am Anfang damit rumgespielt, es aber dann aus den von Dir genannten Gründen verworfen (keine leere Collection).

Wie mache ich das mit den "Pseudo Elementen" am geschicktesten? Hast Du vielleicht noch irgendow einen Code-Schnippsel für mich rumliegen?!
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: koehlerbv am 25.11.04 - 23:53:17
Wo "reduziert" sich denn überhaupt die NotesDocumentCollection ? Das ist mir irgendwie noch sehr unklar.

Leere Collection: Es führen viele "Wege nach Rom". Eine generell leere Ansicht, ein NotesDatabase.Search (!!!) mit einem (sicherheitshalber unsinnigen Key und) eine COD in ferner Zukunft (das geht wegen des COD dann wirklich sehr fix) und ...

Aber wie gesagt: Wie ändert sich während der Routine Deine NotesDocumentCollection ?

Bernhard
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Onkel Domino am 26.11.04 - 00:00:41
Hi Bernhard,

ist es Dir also nicht entgangen?!  8)

Ich werd' nochmal eine Skizze machen. Du hast mein Vorhaben aus dem letzten Thread ja schon etwas mitbekommen. Ich versuche es so einfach wie möglich zu halten:

- eine DB die u.a. Rechnungsdokumente enthält
- an den Rechnungen sind ggfs. Mitarbeiter beteiligt, die Provision bekommen
- es soll eine monatliche Provisionsübersicht erstellt werden (Excel)

Mein Vorgehen bis jetzt:
- habe alle Mitarbeiter in ein enges Array gequetscht (hoffentlich liest kein Betriebsrat mit)
- habe mir alle Rechnungen aus der Datenbank geholt
- nun nehme ich mir den ersten MA und schaue, ob er an der ersten Rechnung beteiligt ist
  - wenn nicht: Dok aus NDC löschen
  - wenn ja: Dok behalten
    - solange, bis ich durch alle Rechnungen durch bin
     - an dieser Stelle habe ich alle Dokumente des betreffenden MA's
     - Excel Datei die mittlerweile erstellt wurde bekommt in die Startzeile Namen des MA's
     - dann kommen die Spaltenüberschriften in Excel (Rg-Nr, Datum, etc) ... solange bis NDC.Count = 0
     - jetzt wird nach Rechnungsnummer sortiert und die Summe gebildet, danach ein paar Leerzeilen

  --> an dieser Stelle brauche ich wieder ALLE Rechnungen um sie nach dem nächsten MA im Array aussortieren zu können....und das ist leider bis jetzt noch db.Search


Warum ich keinen FT und eine nach MA kategorisierte View (wegen view.GetAllDocumentsByKEY()) verwende: der Abrechnungszeitraum muss variabel sein. Das krieg ich mit einer View nicht hin und FTSearch gibt mir nur die Möglichkeite Dok's NACH einem bestimmten Datum zu suchen; nicht aber eines bestimmten Zeitraums :-(

Ich habe überlegt, ansatt die Dokumente rauszuwerfen eine IF-Abfragen ob Array(x) = doc.Sachbearbeiter(0), aber dann sehe ich keine Möglichkeit die Spaltenüberschriften in Excel richtig zu setzen. Ich weiß ja nicht, ob das aktuelle Dokument das Letzte ist.

Ich hoffe, ich konnte mich einigermaßen verständlich ausdrücken.
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: koehlerbv am 26.11.04 - 00:06:39
He, das mit dem "nicht entgangen" sollte schon weiter oben klar geworden sein (23:38)  ;D

Gib' mir noch einen kleinen Moment ...

Bernhard
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Onkel Domino am 26.11.04 - 00:07:55
Ja danke, um 23:38 Uhr war ich am Tippen wie ein Großer....  ;D
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: koehlerbv am 26.11.04 - 00:17:56
Zunächst folgendes:
NotesDatabase.Search geht für einen solchen Zweck wie diesen natürlich. Das läuft dann ja dauernd  :)
FTSearch ermöglichst dieses aber genauso. Aber wie gesagt: Wozu (in diesem Falle).

A-Bär: Warum wirfst Du denn Dokumente aus der Collection ? Du kannst sie doch jedesmal erneut scannen und dann nur jeweils mit den zutreffenden weiterarbeiten ? Notfalls (um den Code nicht grundlegend ändern zu müssen) könntest Du Dir doch jeweils auch ein Array mit den UNIDs der Docs aus der Collection anlegen, in der der Mitarbeiter beteiligt ist. Dein NotesDocument.Collection.Count kriegst Du ja auch so (oder noch bequemer beim Scannen, indem Du jedesmal vorher eine boolesche Variable auf "True" (Default: False) setzt, wenn Du einen Treffer hast.

Dein Ansatz ist zu kompliziert (oder zu einfach - wie man es nimmt), scheint mir. Das geht alles viel einfacher.
Oder eleganter: Bau' Dir eine List und packe dort in einem ersten Scan alle Beteiligten 'rein. Elegant deshalb, da Du Dich um Doppler nicht kümmern musst. Im eigentlichen Excel-Export arbeitest Du dann Deine Collection an Hand der List ab.

Es führen immer viele Wege nach Rom.

Good luck,
Bernhard
Titel: Re: NotesDocumentCollection "kopieren"
Beitrag von: Onkel Domino am 26.11.04 - 00:57:01
Ja, Du hast recht: viele Wege führen nach Rom. Und eigentlich habe ich die Via Appia schon hinter mir (oder vor mir, wie man es nimmt  ;)). Ich wollte halt noch etwas an der Laufzeit schrauben...

Um den Code nicht wieder vollkommen überarbeiten zu müssen, werde ich es morgen mal mit einer leeren NDC probieren um dem db.Search aus dem Weg zu gehen.

Beim nächsten mal kann ich dank des Forum's auf jeden Fall auf viele gute Einfälle zurückgreifen...  :)