Autor Thema: Array beschneiden  (Gelesen 9110 mal)

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Array beschneiden
« 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
« Letzte Änderung: 07.04.08 - 11:34:15 von bikerboy »
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline dirk_2909

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.173
  • Geschlecht: Männlich
  • Expand your Notes Client with ECM functionality..
    • d.velop
Re: Array beschneiden
« Antwort #1 am: 07.04.08 - 11:40:04 »
hallo

evtl. hilft ein @Subset mit Evaluate.
Dirk

[IBM CLP R5]
[IBM CAD 6/6.5]
[IBM CAD 7]
[IBM CAD 8]


"Nein!! … Es genügt nicht Mails in einen anderen Ordner oder Datenbank zu verschieben, um sie zu archivieren!"

   
Disclaimer:
Ich Antworte nach besten Wissen und Gewissen. Sollte sich jemand durch meine Antwort persönlich angegriffen fühlen, ist dies nicht meine Absicht!
Ich bin auch nur ein Mensch, der Fehler machen kann. ....

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Array beschneiden
« Antwort #2 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

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Array beschneiden
« Antwort #3 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 ...
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Array beschneiden
« Antwort #4 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

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Array beschneiden
« Antwort #5 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
Grüßle Toni :)

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Array beschneiden
« Antwort #6 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
« Letzte Änderung: 07.04.08 - 12:39:59 von bikerboy »
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Array beschneiden
« Antwort #7 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.
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline bikerboy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.155
  • Geschlecht: Männlich
Re: Array beschneiden
« Antwort #8 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
Robert Kreutzer

Anwendungsentwicklung

"Jeder Idiot kann was kompliziertes bauen, es Bedarf eines Genie für etwas einfaches"

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Array beschneiden
« Antwort #9 am: 08.04.08 - 09:07:04 »
... danke ... ;D

Toni
Grüßle Toni :)

Offline Bille

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Weiblich
  • Ich kam, sah und ... staunte!
Re: Array beschneiden
« Antwort #10 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.





Experience is the name
everyone gives to his mistakes.
                                             (Oscar Wilde)

Offline TRO

  • Senior Mitglied
  • ****
  • Beiträge: 296
Re: Array beschneiden
« Antwort #11 am: 30.05.11 - 21:29:57 »
probier mal
vListe = doc.Liste
vValue= Evaluate({@Subset(Liste;-5)},doc)
doc.Liste = vValue


hth

Thomas

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Array beschneiden
« Antwort #12 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





Offline Bille

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Weiblich
  • Ich kam, sah und ... staunte!
Re: Array beschneiden
« Antwort #13 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.

Experience is the name
everyone gives to his mistakes.
                                             (Oscar Wilde)

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Array beschneiden
« Antwort #14 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 :)
Grüßle Toni :)

Offline Bille

  • Senior Mitglied
  • ****
  • Beiträge: 258
  • Geschlecht: Weiblich
  • Ich kam, sah und ... staunte!
Re: Array beschneiden
« Antwort #15 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
 :)
Experience is the name
everyone gives to his mistakes.
                                             (Oscar Wilde)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz