Domino 9 und frühere Versionen > ND8: Entwicklung
Identische Arrayeinträge aus einem Array herausfiltern
Christian Weiß:
Hallo,
ich greife mit Hilfe eines Agenten auf Dokumente zu und schreibe dann pro Dokument von verschiedenen Multi-Value Feldern die Werte mit Lotusscript in verschiedene Arrays.
Die in den Arrays stehenden Werte sehen dann z. B. so aus:
Person A~Prüfer~123
Person A~Prüfer~456
Person B~Freigeber~222
Person B~Freigeber~333
Person C~Letzter Freigeber~888
Jetzt ist es ja so, dass es für Person A zwei Einträge als Prüfer gibt. Ich möchte jetzt ganz gerne das der Eintrag Person A~Prüfer~456 in ein anderes Array geschrieben wird.
Ähnliches gilt auch für den Eintrag Person B~Freigeber~333. Es müssten also nur die ersten beiden Teile der Zeichenkette des Arrayeintrages überprüft werden.
Der letzte Teil der Zeichenkette wird jedoch auch benötigt. Dies ist die Unid-ID von Dokumenten.Diese Dokumente sollen dann gelöscht werden, wenn bestimmte Voraussetzungen erfüllt sind. Ich hoffe ihr versteht was ich gerne möchte und könnt mir Empfehlungen geben wie ich dies am besten und nicht zu Performanzlastig umsetzen könnte?
Tode:
Und wo ist Deine konkrete Frage?
Ich würde -entweder schon beim erstellen der Arrays oder beim späteren durchlaufen- eine Liste erstellen (sehr performant, unheimlich leicht zu programmieren):
Zum Beispiel so:
--- Code: ---Dim listKeys List as String
Dim listKeysDel List as String
Forall strVal in DeinArray
strKey = strleftback( strVal , "~" )
if iselement( listKeys( strKey ) ) then
'- Key schon vorhanden... am besten in ner Liste merken
listKeysDel( strVal ) = strrightback( strVal , "~" ) '- auf diese Weise hast Du schon die UNID direkt als Wert
else
listKeys( strKey ) = strVal
end if
End Forall
Forall strUnid in listKeysDel
'- mache was Du mit den Doks machen musst...
End Forall
--- Ende Code ---
HTH
Christian Weiß:
Hallo Torsten,
vielen Dank für Deine Antwort. Ich hatte auch schon die Idee mit Listen zu arbeiten, muss aber gestehen das ich damit noch nicht so viel gemacht habe.
Ich habe leider noch ein kleines Problem:
Mein Array hat leider nicht mehr 3 Einträge sondern 4.
Person A~Prüfer~True~123
Person A~Prüfer~False~456
...
Ich würde es jetzt gerne erreichen, dass der Eintrag 'Person A~Prüfer~False~456' herausgefiltert wird, also die UNID direkt als Wert in einer Liste steht.
Peter Klett:
Dann würde ich mir die einzelnen Einträge auseinanderdröseln, etwa so (ohne Anspruch auf korrekte Syntax und ohne Errorhandling)
Dim tmpwerte As Variant
Dim personen List As String
Forall a in array
tmpwerte = Split (a, "~")
REM
Dann ist beim ersten Eintrag
tmpwerte (0) = "Person A"
tmpwerte (1) = "Prüfer"
tmpwerte (2) = "True"
tmpwerte (3) = "123"
END REM
personen (tmpwerte (0) & "~" & tmpwerte (1)) = tmpwerte (3)
End Forall
Bei einem Inhalt in array von
Person A~Prüfer~True~123
Person A~Prüfer~False~456
Person B~Freigeber~True~222
Person B~Freigeber~False~333
Person C~Letzter Freigeber~True~888
sieht die Liste personen nach Duchlauf des obigen Scriptes so aus:
personen ("Person A~Prüfer") = "456"
personen ("Person B~Freigeber") = "333"
personen ("Person C~Letzer Freigeber") = "888"
Wenn Du es etwas anders haben willst (da ich zugeben muss, dass ich nicht wirklich verstanden habe, wie Du genau was herausfiltern willst), kannst Du Dir die Schlüssel und die Werte entsprechend anders zusammenbauen. Entscheidend ist, dass Du in der Liste die einzelnen Elemente mit ihrem Schlüssel ansprichst, im Gegensatz zum Array, wo Du die Nummer des Elements benötigst. Sobald ein Schlüssel erneut auftritt, wird das Element überschrieben. Deshalb gewinnt so die letzte UNID des Schlüssels (z.B. Scchlüssel = "Person A~Prüfer", UNID erst "123", dann überschrieben durch "456").
Tode:
In meinem Code würde die neue Anforderung durch Änderung von zwei Zeilen implementiert:
aus
strKey = strleftback( strVal , "~" )
wird
strKey = strtoken( strVal , "~" ,1 ) & "~" & strtoken( strVal , "~" ,2 )
und aus
listKeysDel( strVal ) = strrightback( strVal , "~" )
wird
listKeysDel( strVal ) = strtoken( strVal , "~" ,3 )
aber genau aus diesem Grund liefere ich hier im Forum eher ungern fertigen Code.
Weil der Fragensteller dann nämlich aufhört, selbst nachzudenken....
Und auf diese Lösung hätte man ja durchaus mit ein wenig nachdenken selbst kommen können...
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln