Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Axel am 07.07.03 - 15:40:11
-
Hi,
heute will ich auch mal ein Problem haben. Ein etwas kniffliges sogar.
Ich brauche eine Aktion, die Dokumente anlegt. Sollte ja nicht so schwer sein. ;D
Aber nu kommts. In der Aktion gehe ich auf eine DocumentCollection aus markierten Dokumenten. In diesen Dokumenten ist ein Feld mit einer DocID enthalten. Da liegt jetzt der Hase im Pfeffer. Es kann nämlich sein, dass in der Collection mehrere Dokumente mit der gleichen DocID vorhanden sind. Diese mehrfach vorhandenen Dokumente sollen, bevor ich die neuen Dokumente anlege aus der Collection gelöscht werden.
Wie kann ich sowas realisieren? Möglichst performant natürlich (was denn sonst) ?
Hat da jemand eine Idee?
Axel
-
Wenn Du das Dokument hast, dann hast Du ja auch die DocId, erstelle doch dann einfach eine neue, prüfe ob der Collection.Count grösser 1 ist und lösche das entsprechende. Die Frage ist, was passiert mit Deiner Collection im Anschluß? Da kann dann ja eines fehlen. Wichtig ist dann eigentlich nur, dass Du nicht mittels GetNthDocument durch die Collection läufst, sondern mittels GetFirst - GetNextDocument, dann sollte der Count der Collection eigentlich unwichtig sein.
Meff
-
geht es dir darum, die Collection z ubereinigen oder nur keine doppelten Dokumente anzulegen?
bei ersterem find ich die idee meines Vorredners ziemlich cool.
beim zweiten könntest du evtl. die Dokumente in der Collection in einen Ordner verschieben, der nach diesem DocID-Feld sortiert ist und dann halt den Ordner zum Navigieren zu benutzen und dabei immer die DocID des aktuelllen mit der des vorhergehenden Dokuments zu vergleichen
-
Ich würde es folgendermaßen machen:
collection erzeugen
collection document für doc durchgehen
existiert die DocID in der Zieldatenbank ? wenn nei , neues doc erzeugen, ( Prüfung über GetDocumnetByKey )
wenn ja, weiter zum nächsten doc in der collection
pseudocode:
GetCollection
For i% = 0 to collection count
if GetDocumentByKey(DocID) = false
create NewDoc
end if
next Doc ( Collection )
eknori
-
Hi,
erstmal vielen Dank für die Tipps. Ich bin mir aber nicht ganz sicher, ob es mich wirklich weiter bringt. Ich glaube ich muss das noch ein bisschen genauer erklären.
Die Dokumente sind Vorgangsdokumente und das Feld mit der DocID ist die Verknüpfung zu dem dazugehörigen Adressdokument (liegt in einer anderen DB).
Der User markiert nun ein oder mehrere Vorgangsdokumente, um weitere Vorgänge anzulegen. Dabei kann es aber vorkommen das in den markierten Dokumenten (sind in der Collection) mehrere Docs zur gleichen Adresse (also DocID) vorhanden sind. Diese doppelten muß ich herausfiltern.
Dann gehe ich die Collection durch und hole mir die DocID und lege die Vorgänge an.
Ich weiß, das hört sich etwas kompliziert an, aber die User wollen aus allen möglichen und unmöglichen Lagen (sprich Ansichten und Dokumenten) solche Vorgangsdokumente anlegen.
Ich bin an einer Lösung, bin aber noch nicht sicher ob's funktioniert. Wenn ja, informiere ich euch und stelle den Code rein.
Axel
-
Nur zum Verständnis:
Willst Du nicht, dass mehrere Anwender ein und denselben Vorgang bearbeiten? Oder dass der Anwender nicht das Anlegen zu einem Vorgang mehrmals machen kann?
Meff
-
Hi,
wie wär's mit der "Holzhammermethode".
Erstelle ein Array, dass die bereits bearbeiteten DocIDs speichert. Wenn Du dann über die Collection iterierst, prüfe zunächst, ob die DocID bereits bearbeitet wurde.
Also etwa so:
dim checkdoicids() as String
dim i as integer
dim lastdocid as string
dim ret as variant
... Collcection etc....
if dc.Count = 0 then exit sub
i = 0
set doc = dc.GetFirstDocument
do while not doc is nothing
lastdocid = doc.DocID(0)
if i > 0 then
'Prüfe ob DocID im Array ist. falls nicht: erstelle Dokument
ret = ArrayGetIndex(checkdoicids,doc.DocID(0))
if IsNull(ret) then
'erstelle neues Doc
end if
end if
checkdoicids(i) = lastdocid
i = i + 1
set doc = dc.GetNextDocument(doc)
if not doc is nothing then
redim preserve checkdoicids(i - 1) as string
checkdoicids(i-1) = lastdocid
end if
loop
Andreas
-
... warum immer so kompliziert ?
eine Collection zu durchlaufen dauert doch...
ich arbeite für solche Vorgänge mit Listen. Du erstellst einfach eine Liste, in der Du die DocID als Listeneintrag nimmst, mit IsElement fragst Du ab, ob die angegebene ID schon existiert - das geht schneller und ist auch nicht so kompliziert, da ich mit den ID's arbeite und nicht jedesmal ein Doc zuweisen muß - nebenbei kannst Du die Werte, welche Du zur weiteren Verarbeitung brauchst auch in die Liste legen - und mit ner "List as String", kann das ruhig auch eine große Liste werden !
-
Hi,
sodala, es ist vollbracht. Ich hab die Lösung. Hier ist ein Auszug aus dem Agenten:
idx = 0
Redim arrID(collection.Count)
Set doc = collection.GetFirstDocument
While Not (doc Is Nothing)
Set tmpdoc = collection.GetNextDocument(doc)
If idx = 0 Then
arrID(idx) = doc.xAdressID(0)
Else
strTemp = doc.xAdressID(0)
If Isnull(Arraygetindex(arrID, strTemp)) Then
arrID(idx) = doc.xAdressID(0)
Else
Call collection.DeleteDocument(doc)
End If 'If Arraygetindex(arrID, doc.xAdressID, 0) <> Null Then
End If 'If idx = 0 Then
idx = idx + 1
Set doc = tmpdoc
Wend 'While Not (doc Is Nothing)
'Ab hier wird die Collection durchlaufen um die entsprechenden
Infos auszulesen und die Dokumente anzulegen
Das kommt der Lösung von Glombi sehr nahe.
@DocTorte
Hast recht, das durchlaufen der Collection dauert. Aber ich braucht die bereinigte Collection um weitere Infos auszulesen, die ich für die weiteren Aktionen benötige.
@Meff
Es soll ein Vorgang nicht mehrfach angelegt werden.
Vielen Dank an alle die sich Gedanken gemacht haben.
Axel