Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: betty am 31.05.04 - 10:40:16

Titel: Dynamisches zwei-dimensionales array erstellen
Beitrag von: betty am 31.05.04 - 10:40:16
Hat schon mal jemand ein dynamisches zwei-dimensionales array gebaut?  ???

Ich bin gerade dabei eine FTSearch über mehrere Datenbanken zu entwickeln. Ich möchte die Ergenisse in der jeweiligen DocumentCollection (für jede DB eine Collection) in einem dynamischen, zwei-dimensionalen array --> "searchresult()" sammeln und dieses dann der Methode "WriteResult( st_searchresult )" übergeben. Index1 beinhaltet die Datenbank, Index2 beinhaltet bestimmte Inhalte aus den Treffer-Dokumenten.

Problem: Bei mehrdimensionalen arrays funktioniert die Funktion Redim Preserve nur, wenn die letzte Dimension verändert wird. Wie schaffe ich es dann, nachdem die erste Collection durchlaufen ist und der Index2 immer um eins erhöht wurde, die Datenbank zu wechseln, d.h. den Index1 um eins zu erhöhen und bei Index2 wieder von vorne anzufangen?

Simples Beispiel, welches mein Problem auch darstellt:

Dim arrayLänderundStädte()

Collection1 mit Städten aus BW:
arrayLänderundStädte(Baden-Würrtemberg, Mannheim)
arrayLänderundStädte(Baden-Würrtemberg, Heidelberg)
...

Collection2 mit Städten aus Rheinland-Pfalz:
arrayLänderundStädte(Rheinland-Pfalz, Ludwigshafen)
arrayLänderundStädte(Rheinland-Pfalz, Speyer)
...

Wie kann ich beide Collections in ein Array packen??? Hoffentlich kann mir jemand helfen. Es muss ein dynamisches array sein, weil zu Beginn der Suche weder klar ist, wie viele DBs durchsucht werden sollen (das kann der User bestimmen), noch die Anzahl der Treffer bekannt ist.

Gruß
Bettina
Titel: Re:Dynamisches zwei-dimensionales array erstellen
Beitrag von: Glombi am 31.05.04 - 11:17:43
Es gibt doch nur endlich viele Bundesländer, warum also muss der erste Index variabel sein?

Dynamische Arrays sind extrem unperformant. Alternativ kannst Du auch ein temporäres Dokument erstellen und dann dort Items (Felder) setzen:
Pro Index1 ein Feld mit Mehrfachwerten, welche dann Index2 repräsentieren.
Mit der Methode NotesItem.AppendToTextList füllst Du dann die Items.

Andreas
Titel: Re:Dynamisches zwei-dimensionales array erstellen
Beitrag von: animate am 31.05.04 - 11:25:14
diese Methode 'writeResult' - gibt es die schon oder willst du die auch erst noch erstellen?
Es geht mir darum, ob du gezwungen bist, ein 2D-Array zu benutzen, weil es die Methode erwartet.
Titel: Re:Dynamisches zwei-dimensionales array erstellen
Beitrag von: betty am 31.05.04 - 13:39:02
Das mit den Bundesländern war nur ein Beispiel. Die Bundesländer ensprechen den verschiedenen Datenbanken, die durchsucht werden und die Städte den gefundenen Dokumenten.

Die Methode WriteResult() ist noch in Bearbeitung. Sie sieht vor, das Ergebnis in einem RichtTextItem auszugeben. Ich dachte, ein 2-D-Array sei sehr geschickt, dann kann ich alles auf einmal übergeben. Ist also allgemein von dieser Art von Lösung abzuraten?

Ich bin ein absoluter Neuling in Sachen Notes. Welche Lösung wäre denn performant? Vielleicht einfach nach jeder Collection gleich die Methode WriteResult() aufrufen? Dann kann ich aber nicht alles in ein und daselbe RichtTextItem schreiben...

Bettina.
Titel: Re:Dynamisches zwei-dimensionales array erstellen
Beitrag von: koehlerbv am 31.05.04 - 13:50:15
Übergib' WriteResult doch neben Deinem Suchergebnis auch das Ziel-RichTextItem gleich mit. Damit wird das Ganze dann gleich noch universeller.

HTH,
Bernhard
Titel: Re:Dynamisches zwei-dimensionales array erstellen
Beitrag von: animate am 31.05.04 - 13:58:53
erst mal ein Alternativvorschlag, der mir gerade eingefallen ist.

du machst deine Suche über n Datenbanken vermutlich in einer Schleife?!?

in jedem Durchlauf bekommst du ein DocumentCollection Objekt

das packst du in ein Array (1D)

dieses Array übergibst du einer Funktion, die dein RTFeld befüllt in dem sie über alle Dokumente in den Collections läuft und die benötigten Informationen ausliest und ins Feld schreibt.

ein Dokument in der DocumentCollection enthält den Inhalt, den du brauchst und die Information, aus welcher Datenbank es stammt.

keine Ahnung, ob das performant ist, oder nicht und es gibt bestimmt Raum für Verbesserungen. Ist halt eine Idee.
Titel: Re:Dynamisches zwei-dimensionales array erstellen
Beitrag von: animate am 31.05.04 - 14:06:13
ja, oder das Feld als Parameter an die Funktion übergeben, dann gehts ganz ohne Array
Titel: Re:Dynamisches zwei-dimensionales array erstellen
Beitrag von: betty am 01.06.04 - 09:41:35
Vielen Dank für die Hinweise!

Richtig, ich mache meine Suche über n DBs in einer Schleife.
Die Idee, die Collections-Objekte in ein 1-D-Array zu schreiben, dann der Methode WriteResult zu übergeben und erst dann die einzelnen Dokumente auszugeben hört sich gut an.

Wie funktioniert das mit dem "Feld als Parameter übergeben"? Da muss ich doch vorher schon den Befehl "itm_output = doc_current.CreateRichTextItem( {dsp_SearchResult} )" durchführen, oder?!
Zur Zeit meckert Notes mit folgender Fehlermeldung, wenn ich mehr als eine DB durchsuche: "Variant does not contain an object". Ich dachte ich prüfe einfach, ob ein RTItem dsp_SearchResult bereits ein Item hat, wenn ja, wird gleich zu der Stelle gesprungen, wo ich mit AppendText anfange. Ich dachte, er fügt das dann einfach dem vorhergehenden Item hinzu.

Bettina

Titel: Re:Dynamisches zwei-dimensionales array erstellen
Beitrag von: betty am 01.06.04 - 10:51:15
Hallo Thomas,

wie kann ich denn einem Array eine NotesDocumentCollection übergeben?? Das passt doch eigentlich vom Datantyp nicht.

Hab immer noch keine passende Lösung gefunden.  ???

Bettina.
Titel: Re:Dynamisches zwei-dimensionales array erstellen
Beitrag von: animate am 01.06.04 - 13:38:49
am besten deklarierst du dein Array als Variant, dann gibts keine Probleme, wenn du ihn als Parameter übergibst
der Rest ist nix ungewöhnliches.

Dim vaCollections as Variant

For i = 0 To 10
   Set dcFoundDocuments = db.ftSearch()
   Redim Preserve vaCollections(i)
   Set vaCollections(i) = dcFoundDocuments
Next

so in der Art müsste das klappen