Das Notes Forum

Domino 9 und frühere Versionen => ND6: Administration & Userprobleme => Thema gestartet von: LukasSChl am 20.04.10 - 15:36:16

Titel: Schleife mit variabler Zelle
Beitrag von: LukasSChl am 20.04.10 - 15:36:16
Hi Leute,

bin erneut auf ein Problem gestoßen.

Das Ergebnis sollte so aussehen:
Code
While oDoc.Pause_1  != ""  'ungleich geht <> oder?
     If oDoc.Pause_X = "" Then
          oDoc.Pause_X = Pause_Std & ":" & pause
     End If
X = X +1
Wend

X steht hier für ne Variable Zahl.
Habe die Felder von Pause_1 bis Pause_9

Wie kann ich den Feldnamen so variabel setzten, das sich mit jedem Durchlauf der Schleife das Feld ändert ? ??? :-: ???
Für jeden Fall das einzeln zu stricken ist auch possible, aber ich habe sowieso schon voll den langen Code und wollte ma schaun ob das nicht auch kürzer geht.

mfg Lukas
Titel: Re: Schleife mit variabler Zelle
Beitrag von: koehlerbv am 20.04.10 - 15:40:44
Du möchtest Dir NotesDocument.DocItemValue anschauen.

Bernhard
Titel: Re: Schleife mit variabler Zelle
Beitrag von: LukasSChl am 20.04.10 - 16:02:52
thx für die schnelle Antwort Bernhard

leider find ich nichts (hilfe & inet) zu .DocItemValue, nur .GetItemValue, aber das hilft irgendwie überhaupt nicht weiter.

Es gibt was zu Doc.items aber hilft mir auch nicht weiter.

mfg Lukas
Titel: Re: Schleife mit variabler Zelle
Beitrag von: koehlerbv am 20.04.10 - 16:05:32
Sorry, habe mich auf die Schnelle verschrieben - ich meine natürlich NotesDocument.GetItemValue. Und genau das hilft Dir weiter! Der Itemname lässt sich im von Dir benannten Fall perfekt in einer Schleife bilden.

Denken musst Du jetzt aber selber  ;)

Bernhard
Titel: Re: Schleife mit variabler Zelle
Beitrag von: Peter Klett am 20.04.10 - 16:13:53
Zum schreiben in das Feld nimmst Du NotesDocument.ReplaceItemValue (...
Titel: Re: Schleife mit variabler Zelle
Beitrag von: koehlerbv am 20.04.10 - 16:22:56
Danke für die Ergänzung, Peter.

Tak og hilsener til Norge,
Bernhard
Titel: Re: Schleife mit variabler Zelle
Beitrag von: LukasSChl am 20.04.10 - 16:30:11
ok dann wirds aber ne stück für stück operation

die Syntax ist ja: valueArray = notesDocument.GetItemValue( itemName$ )
die Beispiele sind in der Hilfe für mich zumindest immer wenig hilfreich^^

daraus folgere ich das hier:
Code

While oDoc.Pause_1  <> "" 
      If "oDoc.Pause_" & X = "" Then
          
            test = doc.GetItemValue( "Pause_1" )
            
            Forall Pause In test                '-> Pause kommt ja in jedem Namen vor
                  total = total + m      ' ka wozu diese Zeile gut sein soll
                 oDoc.ReplaceItemValue(test, neuer_Wert) = Pause_Std & ":" & pause
            End Forall

      End If
Wend


EDIT: hab die letzten 2 Post noch gelesen und das angepasst.

is da zumindest etwas schonma richtig?^^

mfg Lukas
Titel: Re: Schleife mit variabler Zelle
Beitrag von: koehlerbv am 20.04.10 - 16:35:40
Nein, das ist völlig falsch - Deinen Itemnamen musst Du Dir schon korrekt zusammenbauen ("Pause_" & Cstr (x))

Und die Hilfe ist gut - da musst Du an *Dir* noch arbeiten und nicht die Hilfe verfluchen.

Bernhard
Titel: Re: Schleife mit variabler Zelle
Beitrag von: LukasSChl am 20.04.10 - 16:38:17
thx Bernhard

hab die Hilfe ja nicht verflucht, finde einfach die Beispiele teilweise schlecht für jmd der da kaum Ahnung von hat.

Gut dann guck ich morgen früh ma ob ichs hinbekomme.

Frohes Schaffen
Titel: Re: Schleife mit variabler Zelle
Beitrag von: LukasSChl am 21.04.10 - 09:08:55
moin moin

habs etwas weiterbekommen, aber noch nicht soweit, dass es läuft.

Code
	If oDoc.Pause_1 = "" Then 'hier kommt schon ein "type missmatch" Fehler, warum?
		oDoc.Pause_1 =  Pause_Std & ":" & pause
		oDoc.Pause_1_Anzeige = "Stunde(n)"
	Else
		While oDoc.Pause_1  >< ""  
			If "oDoc.Pause_" & X = "" Then
				Array = doc.GetItemValue("Pause_" & X)
				Forall P In Array
					counter = counter + m ' ka wozu diese Zeile gut sein soll
					Set item = oDoc.ReplaceItemValue( "Array", (Pause_Std & ":" & pause))
				End Forall
			End If
			X= X + 1
		Wend
	End If

jedoch versteh ich nicht, warum die Prüfung ob das Feld leer ist schon fehlschlägt.
Außerdem ist mir die Bedeutung der Zeile:
"counter = counter + m" nicht klar (aus dem Beispiel in der Hilfe übernommen)

Wie sieht der Code denn sonst aus, aufm richtigen Weg??

mfg Lukas
Titel: Re: Schleife mit variabler Zelle
Beitrag von: Thomas Schulte am 21.04.10 - 09:24:02
jedoch versteh ich nicht, warum die Prüfung ob das Feld leer ist schon fehlschlägt.
Außerdem ist mir die Bedeutung der Zeile:
"counter = counter + m" nicht klar (aus dem Beispiel in der Hilfe übernommen)

Wie sieht der Code denn sonst aus, aufm richtigen Weg??
Deine Prüfung schlägt deswegen fehl,weil du in der verkürzten Notation schreibst. Und da hat Bernhard dir schon gesagt ,das du dann IMMER mit einem ARRAY rechnen musst.
oDoc.pause_1 = "" geht gar nicht. Wenn schon, dann oDoc.pause_1(0). Noch sinnvoller wäre es aber wenn du mit dem NotesItem Object arbeiten würdest.
Davon abgesehen ist die ganze Konstruktion falsch. Du mixt verkürzte und lange Notation mit einer While Schleife bei der du wieder die verkürzte Notation verwendest.

Les dir doch bitte bevor du jetzt weiterbastelst erst einmal alles was in der Hilfe zu NotesItem steht durch.
Titel: Re: Schleife mit variabler Zelle
Beitrag von: Peter Klett am 21.04.10 - 09:25:07
If oDoc.Pause_1 = "" Then ist nicht ganz korrekt, richtig ist:

If oDoc.Pause_1 (0) = "" Then

Felder in Notes sind grundsätzlich Arrays, selbst wenn es keine Mehrfachwerte sind

While oDoc.Pause_1  >< ""  

ungleich ist <>, aus dieser Schleife kommst Du niemals wieder raus, weil oDoc.Pause_1 (besser gesagt oDoc.Pause_1 (0), per obiger Bedingung schon ungleich leer ist.

Was soll das Script eigentlich genau machen?

Das mit dem Zuweisen von Werten in Felder klären wir dann danach, das geht so nicht, wie Du es geschrieben hast.
Titel: Re: Schleife mit variabler Zelle
Beitrag von: LukasSChl am 21.04.10 - 10:04:58
Danke für die Hilfe

@Thomas Schulte
gemacht, leider bleibt davon kaum was hängen, da ich die ScriptSpache nie gelernt habe, bin einfach eingestiegen und hab mir was die Script-Sprache angeht, alles entweder abgeguckt oder selbst "erbastelt".

@Peter Klett
Es soll gucken ob das erste Feld leer ist,
wenn ja -> reinschreiben
wenn nein -> gucken ob nächstes Feld leer ist, solange bis alle Felder abgearbeitet wurden.

Hab jetzt noch etwas dran geschraubt:
Code
For X = 1 To 6
     If oDoc.GetItemValue("Pause_" & X)(0) = "" Then			
          Array = oDoc.GetItemValue("Pause_" & X)
          Forall P In Array
               counter = counter + m ' ka wozu diese Zeile gut sein soll
               Set item = oDoc.ReplaceItemValue( "Array", (Pause_Std & ":" & pause))
          End Forall
     End If
Next

Die Prüfungen laufen alle ohne Probleme.
Was jetzt noch fehlt ist, dass hier:
"Set item = oDoc.ReplaceItemValue( "Array", (Pause_Std & ":" & pause))"
in das jeweilige Feld reingeschrieben wird.

So wie es jetzt ist, wird in Array aber nur der Wert den jeweiligen Feldes gespeichert, anstatt der Verweis auf das Feld selber.

Also im Endeffekt muss ja nurnoch an folgenden Zeile was verändert werden:
"Array = oDoc.GetItemValue("Pause_" & X)"
und
"Set item = oDoc.ReplaceItemValue( "Array", (Pause_Std & ":" & pause))"

Die einfachste Lösung:
"Array = oDoc.GetItemName("Pause_" & X)"
geht leider nicht xD

Edit:

Folgendes klappt auch leider nicht, obwohl man so ja laut Hilfe den Namen des Items herrausbekommt.
Code
For X = 1 To 6
     If oDoc.GetItemValue("Pause_" & X)(0) = "" Then
			
          Set item = doc.GetFirstItem( "Pause_" & X ) ' "Variant does not contain an Object"
          itemName = item.Name

          Forall P In Array
               counter = counter + m ' ka wozu diese Zeile gut sein soll
               Set item = oDoc.ReplaceItemValue( "itemName", (Pause_Std & ":" & pause))
          End Forall
     End If
Next

mfg Lukas
Titel: Re: Schleife mit variabler Zelle
Beitrag von: Peter Klett am 21.04.10 - 10:28:53
das sieht jetzt schon viel besser aus.

Das Schreiben in das Feld ist einfacher, als Du gedacht hast. So sollte es das tun, was Du willst:

For X = 1 To 6
     If oDoc.GetItemValue("Pause_" & X)(0) = "" Then         
          Call oDoc.ReplaceItemValue("Pause_" & X, (Pause_Std & ":" & pause))
     End If
Next
Titel: Re: Schleife mit variabler Zelle
Beitrag von: Peter Klett am 21.04.10 - 10:31:59
Nachtrag: den Counter habe ich weggelassen, wenn Du den für irgendetwas benötigst, muss der natürlich noch da mit rein.
Titel: Re: Schleife mit variabler Zelle
Beitrag von: LukasSChl am 21.04.10 - 10:40:15
vielen Dank

Code
For X = 1 To 6
     If oDoc.GetItemValue("Pause_" & X)(0) = "" Then			
          Call oDoc.ReplaceItemValue("Pause_" & X, (Pause_Std & ":" & pause))
          Exit Sub
     End If
Next

Nachdem das Feld mit einem Wert gefüllt worden ist, wird die Schleife verlassen.

Nachtrag: den Counter habe ich weggelassen, wenn Du den für irgendetwas benötigst, muss der natürlich noch da mit rein.

Der war im Beispiel der Hilfe mit aufgelistet und da hab ichs nur übernommen^^

mfg Lukas
Titel: Re: Schleife mit variabler Zelle
Beitrag von: Peter Klett am 21.04.10 - 10:44:59
Mit Exit Sub verlässt Du die Routine, falls Du nur die For-Schleife verlassen willst, nimm Exit For
Titel: Re: Schleife mit variabler Zelle
Beitrag von: LukasSChl am 21.04.10 - 10:48:36
ähh meinte ich^^ aus gewohnheit schreib ich immer exit sub, ka warum (VB-vorbelastet).

mfg Lukas
Titel: Re: Schleife mit variabler Zelle
Beitrag von: ascabg am 21.04.10 - 11:17:19
Hallo,

War in VB aber nicht anders.

Raus aus der For-Schleife = Exit For
Raus aus der Routine = Exit Sub bzw. Exit Funktion

 ;)

Andreas
Titel: Re: Schleife mit variabler Zelle
Beitrag von: DerAndre am 21.04.10 - 11:21:16
Ääääh in Antwort 12 schreibst Du, das alle Felder abgearbeitet werden sollen.

Jetzt machst Du ein ExitFor?

Kann es sein, das Du nur das erste Freie Feld suchst?
Und ob man ein ExitFor macht ist Geschmackssache, ich persönlich finde es unschön.
Titel: Re: Schleife mit variabler Zelle
Beitrag von: LukasSChl am 21.04.10 - 11:45:41
War in VB aber nicht anders.

I know, schreib trozdem immer erstma Exit Sub, ka woher ich das hab xD

Ääääh in Antwort 12 schreibst Du, das alle Felder abgearbeitet werden sollen.

Jetzt machst Du ein ExitFor?

Kann es sein, das Du nur das erste Freie Feld suchst?
Und ob man ein ExitFor macht ist Geschmackssache, ich persönlich finde es unschön.

JoJo suche nur das Erste Leere, in das ich dann hineinschreibe.
Ohne Exit For würde ich ja alle weiteren Felder auch mit dem Wert füllen, was ja nicht sein soll.

mfg Lukas
Titel: Re: Schleife mit variabler Zelle
Beitrag von: koehlerbv am 21.04.10 - 15:42:24
Bevor das chronisch wird, gewöhne Dir gleich Typmischungen à la NotesDocument.GetItemValue ("Pause_" & X) ab!
- "Pause_" ist eine Stringkonstante
- X ist eine Integer-Variable

Wir haben das hier im Forum schon einige Male thematisiert und auch mit eindringlichen Beispielen belegt: Das kann gut gehen, kann aber auch zu völlig falschen Resultaten führen, die mit einer Concatenation nichts mehr zu tun haben.

Daher: Bleib sauber, Junge, und mach nicht so ein Schmuddelzeug.

Bernhard
Titel: Re: Schleife mit variabler Zelle
Beitrag von: LukasSChl am 21.04.10 - 15:46:59
Bleib sauber, Junge, und mach nicht so ein Schmuddelzeug.
Bernhard

xDD ne ich werd versuchen mich dran zu halten, ich machs nur wenn ich keinen anderen Weg finde^^

mfg Lukas
Titel: Re: Schleife mit variabler Zelle
Beitrag von: koehlerbv am 21.04.10 - 16:05:30
... ich werd versuchen mich dran zu halten, ich machs nur wenn ich keinen anderen Weg finde^^

Völlig falsche Herangehensweise, Lukas! Typkonvertierungen sind immer möglich. Wenn Du nicht weisst, wie es geht, schau in die DesignerHelp. Dort ist das beschrieben. Die entsprechenden Functions fangen alle mit "C" wie "Convert" an.

Bernhard
Titel: Re: Schleife mit variabler Zelle
Beitrag von: Peter Klett am 22.04.10 - 06:50:55
Das ist logisch völlig korrekt, dass Du Text mit Zahlen mischst, also dass sich Feldnamen aus einem Text plus Zählvariable errechnen. Ich finde es auch gut, dass Du Dir darüber Gedanken machst, den Code möglichst kompakt zu schreiben, mach weiter so.

Was Bernhard meinte ist, dass Du technisch sauber bleiben sollst, also nicht

oDoc.GetItemValue("Pause_" & X)(0)

sondern

oDoc.GetItemValue("Pause_" & Cstr(X))(0)