Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: bikerboy am 07.04.08 - 11:31:54

Titel: Array beschneiden
Beitrag von: bikerboy am 07.04.08 - 11:31:54
Hi,

hi gibt es eine möglichkeit ein Array sich lediglich die ersten 25 Einträge eines Arrays geben zu lassen, ohne ein For-Schleife zu nutzen?

Habe sowas wie @Subset gesucht, aber leider kein Verweis auf Script bekommen.
Und ein Redim Preserve auf eine kleine Zahl ist ja auch nicht legitim
Titel: Re: Array beschneiden
Beitrag von: dirk_2909 am 07.04.08 - 11:40:04
hallo

evtl. hilft ein @Subset mit Evaluate.
Titel: Re: Array beschneiden
Beitrag von: koehlerbv am 07.04.08 - 11:40:25
Eine direkte LS-Funktion hierfür gibt es nicht - es hilft wirklich nur eine Schleife.
Alternativ kannst Du aber @Subset in Verbindung mit Evaluate auch in LS benutzen.

HTH,
Bernhard
Titel: Re: Array beschneiden
Beitrag von: m3 am 07.04.08 - 11:44:08
Alternativ kannst Du aber @Subset in Verbindung mit Evaluate auch in LS benutzen.
Aber ob da nicht die Schleife schneller wäre ...
Titel: Re: Array beschneiden
Beitrag von: koehlerbv am 07.04.08 - 11:49:22
Ich würde erwarten, dass Evaluate ("@Subset ..." bedeutend schneller ist als eine For-Schleife, da ja hierdurch direkt die API-Funktion aufgerufen wird, also Maschinensprache vs. Interpreter.

Bernhard
Titel: Re: Array beschneiden
Beitrag von: ata am 07.04.08 - 11:52:38
Hallo,

... in LS geht auch solch ein Konstrukt:

Dim vValue As Variant
Dim vArray( 0 to 3 ) As String
vArray( 0 ) = "1"
vArray( 1 ) = "2"
vArray( 2 ) = "3"
vArray( 3 ) = "4"
vValue = vArray
Redim Preserve vValue( 0 to 1 )
MsgBox Implode( vValue , Chr(10) )

Toni
Titel: Re: Array beschneiden
Beitrag von: bikerboy am 07.04.08 - 12:08:20
So habe nun folgende Lösung , vllt habt ihr lust sie noch zu verbessern, weil ich bestimmt Aspekte vergessen habe, aber das wichtigste es funktioniert

Code
Function appendLogEntry( varListHistory As Variant, strLogText As String,doc As NotesDocument)As Variant
	' varListHistory = Der Feldinhalt aus dem aktuellen Dokument
	' strLogText = der Text der angehangen werden soll
	' doc = das Dokument ( wird nur für das Evaluate benutzt )
	
	Dim strTemp As String
	
	strTemp = Implode(varListHistory,"~")
	strTemp = strLogText  + "~" + strTemp
	varListHistory = Split(strTemp,"~")
	
        Call doc.ReplaceItemValue("listHistory",varListHistory)

	If Ubound(varListHistory) > 24Then
		varListHistory = Evaluate({@Subset(listHistory;25)},doc)
	End If
	
	appendLogEntry = varListHistory 
	
End Function
Titel: Re: Array beschneiden
Beitrag von: m3 am 07.04.08 - 12:17:56
Ich würde erwarten, dass Evaluate ("@Subset ..." bedeutend schneller ist als eine For-Schleife, da ja hierdurch direkt die API-Funktion aufgerufen wird, also Maschinensprache vs. Interpreter.
Naja. Aber die Ergebnisse müssen hin- und her kopiert werden, etc.

Na ev. find ich heute ein bisschen Zeit, da mal was auszuprobieren.
Titel: Re: Array beschneiden
Beitrag von: bikerboy am 07.04.08 - 13:02:43
So finde die Lösung von ata schöner als meine, weil ich so die möglichkeit habe das ganze einfacher zu konfigurieren über ein Profildokument zum Beispiel und ich muss das Dokument nicht übergeben! ganz grosses Plus.

Besten Dank
Titel: Re: Array beschneiden
Beitrag von: ata am 08.04.08 - 09:07:04
... danke ... ;D

Toni
Titel: Re: Array beschneiden
Beitrag von: Bille am 30.05.11 - 21:05:11
Sorry, wenn ich diesen alten Fred nochmal bemühe, aber ich wollte ein ähnliches Problem lösen und bekomme leider einen Fehler.

Meine Aufgabe ist es, die letzten 5 Einträge eines Arrays in ein Feld zu schreiben.

Code
dim vValue as variant, x as integer, y as integer
vValue = doc.Liste
y = Ubound(vValue)
x = y - 4
Redim Preserve vValue( x to y )
doc.Liste = vValue

Beim Aufruf der Funktion kommt ein "Out of range". Lt. Debugger ist y = 10 und x = 6

Die andere Variante mit 
Code
vListe = doc.Liste
vValue= Evaluate({@Subset(vListe;-5)},doc)
doc.Liste = vValue

bringt nur einen leeren String und nicht den Feldinhalt, den ich eigentlich möchte (eben die letzten 5 Werte der Liste).

Kann mir jemand sagen, wo mein Fehler ist?

Bille

PS: Ich kann das Ganze erst wieder im Büro testen und dann abends antworten, ich bitte daher um Geduld, falls ich nicht gleich zurückschreiben kann.





Titel: Re: Array beschneiden
Beitrag von: TRO am 30.05.11 - 21:29:57
probier mal
vListe = doc.Liste
vValue= Evaluate({@Subset(Liste;-5)},doc)
doc.Liste = vValue


hth

Thomas
Titel: Re: Array beschneiden
Beitrag von: Peter Klett am 30.05.11 - 21:30:13
Dein Evaluate-Konstrukt ist falsch, weil Du mit der Formel versuchst, die Script-Variable zu manipulieren, obwohl Du nur auf die Felder des Dokuments zugreifen kannst.

doc.Liste = Evaluate({@Subset(Liste;-5)},doc)

sollte funktionieren.

Ob ein Redim Preserve vValue (6 to 10) funktionert, weiß ich nicht, auf solch eine Idee bin ich noch nie gekommen (obwohl es logisch klingt, glauben mag ich es nicht).

Da würde ich eine Schleife bauen

Dim vValue As Variant, i As Integer, x As Integer, y As Integer
x = Ubound (doc.Liste)
y = x - 4
If y > 0 Then
   Redim vValue (4)
   For i = 0 To 4
      vValue (i) = doc.Liste (y + i)
   Next i
   doc.Liste = vValue
End If




Titel: Re: Array beschneiden
Beitrag von: Bille am 31.05.11 - 06:55:45
Danke für die schnelle Rückmeldung.
Das mit dem Evaluate klingt einleuchtend, werde ich heute gleich probieren.

Titel: Re: Array beschneiden
Beitrag von: ata am 31.05.11 - 12:46:22
@Peter,

die Lösung mit dem Redim Preserve funktioniert nur, wenn du die Base hälst - also in dem genannten Beispiel von 0 neu dimensionierst:
Code
Sub Initialize()
On error GoTo ErrHandle
   Dim v() As String
   Dim i As Integer
   Redim v( 0 to 9 )
   For i = 0 to UBound( v )
      v(i) = Cstr( i + 1 )
'      Print i
   Next
   Redim Preserve v( 0 to 4 ) ' gibt in diesem Fall die Elemente 0 - 4 zurück
   ' Redim Preserve v( 1 to 4 ) ' gibt in diesem Fall einen Fehler zurück => Array bound out of index
   MsgBox Implode( v )
   Exit Sub
ErrHandle:
   MsgBox Error & " in Zeile " & Erl 
   Resume WayOut
WayOut:
End Sub

Toni :)
Titel: Re: Array beschneiden
Beitrag von: Bille am 31.05.11 - 19:50:46
Mit
Code
doc.Liste = Evaluate({@Subset(Liste;-5)},doc)

hat's wunderbar geklappt.

Danke an Euch alle
Bille
 :)