Autor Thema: Fehlermeldung: Subscript out of range in loop-Schleife  (Gelesen 5046 mal)

Offline regedit

  • Aktives Mitglied
  • ***
  • Beiträge: 118
  • Geschlecht: Männlich
Habe folgendes Problem:
Habe das Text-Feld "Revisionen" mit Mehrfachwerte(mehrere Zeilen) im Hauptdokument. Nun muss ich aus einem Antwort-Dokument auf dieses Feld Revisionen zugreifen und Ergänzungen hinzufügen. Dies wollte ich im querysave des Antwortdoks machen. Da im Feld Revisionen unterschiedliche Anzahl von Werten sein können wollte ich dies mit einer loop-Schleife auslesen, erhalte allerdings am Ende des mehrmaligen Schleifendurchlaufs die Fehlermeldung Subscrip out of range.

Kann mir jemand weiterhelfen?

Gruß
Holger

hier der code:
Code
Sub Querysave(Source As Notesuidocument, Continue As Variant)
	Dim session As New NotesSession
	Dim db As notesdatabase
	Dim responsedoc As notesdocument
	Dim parentdoc As notesdocument
	Dim tmpRevisionen As Variant
	Dim user As String
	Dim tmp1 As String
	Dim tmp2 As String
	Dim i As Integer
	
	user = session.UserName

	Set db=session.currentdatabase
	Set responsedoc = source.document
	
	Call responsedoc.save(True,True)
	
	Set parentdoc=db.getdocumentbyUNID(responsedoc.UNID(0))
	
	tmpRevisionen=parentdoc.Revisionen
	
	
	tmp1 = Date$ + " " + Time$ + "   " + "Bearbeitungsdokument hinzugefügt von: " + Chr(10) + "                                         " + user + Chr(10)
	tmp2 =tmp1
	i = 0

	Do Until tmpRevisionen(i) = False
		tmp2 = tmp2 + tmpRevisionen(i) + Chr(10)
		i= i +1
	Loop
	
	parentdoc.Revisionen = tmp2
	
	Call parentdoc.save(True,True)
End Sub
!!HELP!! V1.6
Domino Server V6.5.6 FP1 (Windows 2003 Server)
Notes Client V6.5.5 (TS-Client / Win 2003 TS-Server)
Notes Client V6.5.5 (Win XP)

Driri

  • Gast
Re: Fehlermeldung: Subscript out of range in loop-Schleife
« Antwort #1 am: 22.04.09 - 16:27:27 »
Du willst doch einfach nur einen Wert hinzufügen, oder sehe ich das falsch ?

In dem Fall würde ich den Inhalt des Items "Revisionen" mit Join in einen String pumpen, den neuen Wert dazu verketten und dann den String mit Split wieder in einen Array umwandeln und in das Item zurückschreiben.

Darüber hinaus empfehle ich, für die Verkettung von Strings in Script nicht das "+", sondern das "&" zu verwenden.

Mal schnell runtergeschrieben könnte das dann so aussehen (ohne Gewähr):

Zitat
...
tmp2 = Join(parentdoc.Revisionen, "~~")
tmp2 = tmp2 & "~~" & tmp1

tmpRevisionen = Split(tmp2, "~~")

Call parentdoc.ReplaceItemValue("Revisionen", tmpRevisionen)
Call parentdoc.Save(True, True)
...



Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Fehlermeldung: Subscript out of range in loop-Schleife
« Antwort #2 am: 22.04.09 - 16:28:28 »
enthält das Item Revisionen denn boolesche Werte? Oder warum prüst du auf false? Und wenn ja, soll er dann abbrechen?

ich würde eine Forall-Scleife nehmen

forall x in revisionen
   tmp2 = tmp2 + x + Chr(10)
end forall

Die hört auf, wenn nix mehr da ist .....

Grüsse

Dau-in


edith: oder appendToTextlist verwenden

« Letzte Änderung: 22.04.09 - 16:30:05 von DAU-in »
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline Jan Grünklee

  • Frischling
  • *
  • Beiträge: 43
  • Geschlecht: Männlich
Re: Fehlermeldung: Subscript out of range in loop-Schleife
« Antwort #3 am: 22.04.09 - 16:34:07 »
Hallo Holger,

also bei dir wird in tmpRevisionen ein Variant mit mehreren Texteinträgen aus dem entsprechenden Feld gefüllt. Die einzelenen Einträge durchläufst Du. Allerdings wird keiner dieser Werte in deinem Variant je False werden, da es immer Text ist. Quasi würde deine Schleife eine Endlosschleife sein. Der Fehler tritt auf, weil Du irgendwann das Ende der Einträge in Deinem Variant erreicht hast, aber durch das weitere hochzählen auf einen Indexwert zugreifst, den es garnicht gibt.

Machs doch eher so:

Code
For i = 0 to Ubound ( tmpRevisionen )
      tmp2 = tmp2 + tmpRevisionen(i) + Chr(10)
Next

Greetz Jan
Notes ist das was Du draus machst!

Offline thomson666

  • Senior Mitglied
  • ****
  • Beiträge: 285
  • Geschlecht: Männlich
  • niemand hats leicht, aber leicht hats oan...
Re: Fehlermeldung: Subscript out of range in loop-Schleife
« Antwort #4 am: 22.04.09 - 17:28:19 »
zum anhängen 1nes Wertes an ein Array würde ich

Redim preserve tmpRevisionen(Ubound(tmpRevisionen)+1)
tmpRevisionen(Ubound(tmpRevisionen)) = neuerWert


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Fehlermeldung: Subscript out of range in loop-Schleife
« Antwort #5 am: 22.04.09 - 18:06:15 »
Wozu der ganze Aufwand?

parentDoc.Revisionen = Arrayappend (parentDoc.Revisionen, "Neuer Wert)

Den Aufwand sollte man lieber darin investieren zu überprüfen, dass das Item Revisionen nicht die 32k-Grenze durch ständiges "Nachschenken" überschreitet.

Bernhard

Offline regedit

  • Aktives Mitglied
  • ***
  • Beiträge: 118
  • Geschlecht: Männlich
Re: Fehlermeldung: Subscript out of range in loop-Schleife
« Antwort #6 am: 23.04.09 - 11:16:00 »
Vielen Dank für die vielen Lösungsmöglichkeiten  :)

Ich habe mich mit allen Möglichkeiten ein wenig beschäftigt, denn nur so kann ich auch was lernen.  ;)
Mit den "kurzen" Möglichkeiten ist nur ein anhängen möglich, ich muss allerdings meinen Text voranstellen.
Die 32k-Grenze sollte kein Problem sein, da es nur so 2-5 Einträge werden können.

Mein Script funktioniert jetzt auch!

Also nochmals vielen Dank für Eure Unterstützung

Gruß

Holger

hier mein Code:
Code
Sub Querysave(Source As Notesuidocument, Continue As Variant)
	Dim session As New NotesSession
	Dim db As notesdatabase
	Dim responsedoc As notesdocument
	Dim parentdoc As notesdocument
	Dim tmpRevisionen As Variant
	Dim user As String
	Dim tmp1 As String
	Dim tmp2 As String
	Dim i As Integer
	
	user = session.UserName
	
	Set db=session.currentdatabase
	Set responsedoc = source.document
	
	Call responsedoc.save(True,True)
	
	Set parentdoc=db.getdocumentbyUNID(responsedoc.UNID(0))
	
	tmp1 = Date$ & " " & Time$ & "   " & "Bearbeitungsdokument hinzugefügt von: " & Chr(10) & "                                         " & user & Chr(10)
	tmp2 =tmp1
	tmpRevisionen=parentdoc.Revisionen
	
	For i=0 To Ubound( tmpRevisionen)
		tmp2 = tmp2 & tmpRevisionen(i) & Chr(10)
	Next	
	
	parentdoc.Revisionen = tmp2
	
	Call parentdoc.save(True,True)
	
	
End Sub
!!HELP!! V1.6
Domino Server V6.5.6 FP1 (Windows 2003 Server)
Notes Client V6.5.5 (TS-Client / Win 2003 TS-Server)
Notes Client V6.5.5 (Win XP)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Fehlermeldung: Subscript out of range in loop-Schleife
« Antwort #7 am: 23.04.09 - 11:27:02 »
So, wie Du das Item "Revisionen" füllst, ist Deine For-Schleife aber völlig unnötig, da Du nur einen skalaren Wert erzeugst und kein Array, Ubound ist also immer 0. Sprich: Es funktionierst, Du weisst aber nicht, warum  ;)

Bernhard

Driri

  • Gast
Re: Fehlermeldung: Subscript out of range in loop-Schleife
« Antwort #8 am: 23.04.09 - 11:32:40 »
Wenn Du den Wert voranstellen willst, kannst Du das mit der von mir beschriebenen Methode machen. Du mußt dann halt nur bei der Verkettung der Strings die Reihenfolge der Strings tauschen.

Offline regedit

  • Aktives Mitglied
  • ***
  • Beiträge: 118
  • Geschlecht: Männlich
Re: Fehlermeldung: Subscript out of range in loop-Schleife
« Antwort #9 am: 23.04.09 - 12:23:36 »
So, Code nochmals angepasst.
Jetzt habe ich aber nochmal eine Frage.
Wie kann ich den User in der Form Abbreviated im String eintragen?
mit user = session.Username.Abbreviated klappt es jedenfalls nicht.

Gruß

Holger

Code
Sub Querysave(Source As Notesuidocument, Continue As Variant)
	Dim session As New NotesSession
	Dim db As notesdatabase
	Dim responsedoc As notesdocument
	Dim parentdoc As notesdocument
	Dim tmpRevisionen As Variant
	Dim user As String
	Dim tmp1 As String
	Dim tmp2 As String
	Dim i As Integer
	
	user = session.UserName
	
	Set db=session.currentdatabase
	Set responsedoc = source.document
	
	Call responsedoc.save(True,True)
	
	Set parentdoc=db.getdocumentbyUNID(responsedoc.UNID(0))
	
	tmp1 = Date$ & " " & Time$ & "   " & "Bearbeitungsdokument hinzugefügt von: " & Chr(10) & "                                         " & user & Chr(10)
	tmp2 =tmp1
	
	tmp2 = Join(parentdoc.Revisionen, "~~")
	tmp2 = tmp1 & "~~" & tmp2
	tmpRevisionen = Split(tmp2, "~~")
	Call parentdoc.ReplaceItemValue("Revisionen", tmpRevisionen)
	
	Call parentdoc.save(True,True)
	
	
End Sub
!!HELP!! V1.6
Domino Server V6.5.6 FP1 (Windows 2003 Server)
Notes Client V6.5.5 (TS-Client / Win 2003 TS-Server)
Notes Client V6.5.5 (Win XP)

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: Fehlermeldung: Subscript out of range in loop-Schleife
« Antwort #10 am: 23.04.09 - 12:27:20 »
Code
...
Dim session As New NotesSession
Dim nam As NotesName

Set nam = session.CreateName(session.UserName)

user = nam.Abbreviated
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 ascabg

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.697
  • Geschlecht: Männlich
Re: Fehlermeldung: Subscript out of range in loop-Schleife
« Antwort #11 am: 23.04.09 - 12:30:53 »
Zitat
mit user = session.Username.Abbreviated klappt es jedenfalls nicht.
.

Weil es Abbreviate ein Teil der Klasse NotesName ist und nicht von NotesSession.


Andreas

Offline regedit

  • Aktives Mitglied
  • ***
  • Beiträge: 118
  • Geschlecht: Männlich
Re: Fehlermeldung: Subscript out of range in loop-Schleife
« Antwort #12 am: 23.04.09 - 12:32:48 »
Das wars  :)

Vielen Dank nochmal für Eure Hilfe

Gruß

Holger
!!HELP!! V1.6
Domino Server V6.5.6 FP1 (Windows 2003 Server)
Notes Client V6.5.5 (TS-Client / Win 2003 TS-Server)
Notes Client V6.5.5 (Win XP)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz