Autor Thema: Positionenvergleich innerhalb eines Feldes  (Gelesen 2648 mal)

Offline Lotus_Notes_Newbie

  • Frischling
  • *
  • Beiträge: 10
  • Ich liebe dieses Forum!
Positionenvergleich innerhalb eines Feldes
« am: 24.03.04 - 11:43:35 »
Ich habe eine View "Versionen" die jede Menge Dokumente beinhaltet die alle über die Felder "VersionVon", "VersionBis" und "AlleKompatiblenVersionen"verfügen. z.B. steht im "VersionVon" Feld '1.2' drin im "VersionBis" Feld '2.5', die "AlleKompatiblenVersionen" Felder sind noch alle leer. Und um genau die geht es.

In dieses Feld sollen nämlich automatisch alle Versionen zwischen dem "VersionVon" Wert und dem "VersionBis" Wert hineingeschrieben werden. Da die Werte jedoch nicht durchgehend sind, also nicht 1.1, 1.2, 1.3 sondern durchaus auch mal eine Version 1.36b auftauchen kann sind alle möglichen Versionen im "AlleVersionen" Feld des Profildokumts "ProfileDoc" abgespeichert.

Deshalb soll der Agent nachdem er den ersten Wert des "VersionVon" Feldes eingelesen hat nach diesem Wert im "AlleVersionen" Feld des Profildokuments suchen und sich nach finden dessen die Position im Feld merken. Danach soll dann der Wert des "VersionBis" Feldes eingelesen werden und ebenfalls nach dessen Position im "Alle Versionen" Feld gesucht werden. Jetzt hat der Rechner ja die beiden Positionen und soll jetzt alle Werte zwischen diesen beiden Positionen auslesen und in das "AlleKompatiblenVersionen" Feld eintragen.

So stell ich mir zumindest in der Theorie vor das das funktionieren könnte. Deshalb die Frage an die Experten, ist es möglich, und wenn ja wie programmiere ich das, vor allem zu den Positionsbestimmungen innerhalb eines Feldes und dem Vergleich von diesen habe ich nämlich noch nichts gefunden.

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Positionenvergleich innerhalb eines Feldes
« Antwort #1 am: 24.03.04 - 13:14:54 »
geht ziemlich easy mit Lotusscript

mit

Dim vaFeldvalue As Variant
vaFeldValue = doc.getItemValue("Feldname")

bekommst du ein Array mit den Werten, die in dem Feld stehen

mit der ArraygetIndex-Funktion bekommst du die Position eines Werts innerhalb eines Arrays

vaPosition = Arraygetindex(vaFeld, "Wert1")

gibt dir die Position von "Wert1" zurück

Wenn in deinem Feld die Werte "Wert1", "Wert2", ..., "Wert9" stehen wäre es die 0 (Arrays fangen bei 0 an zu zählen)

du holst dir also die beiden Positionen und machst dann ne Schleife

For i = position1 to position2

Next


und liest in der Schleife die Werte des Felds aus

sWert = vaFeldValue(i)


Einigermaßen klar?
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline Lotus_Notes_Newbie

  • Frischling
  • *
  • Beiträge: 10
  • Ich liebe dieses Forum!
Re:Positionenvergleich innerhalb eines Feldes
« Antwort #2 am: 26.03.04 - 10:56:23 »
So hier ist mal mein bisheriger Quellcode. Er kompiliert zwar, läuft aber noch nicht richtig, sprich er tägt die Werte nicht in das "AlleKompatiblenVersionen" Feld ein. Könnt ihr mir vielleicht sagen wo in meinem Quellcode der Fehler steckt.



Sub Initialize
   
   Dim workspace As NotesUIWorkspace
   Dim session As NotesSession
   Dim db As NotesDatabase
   Dim uidoc As NotesUIDocument
   Dim doc_coll As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim document As NotesDocument
   Dim view As NotesView
   Dim item1 As NotesItem
   Dim item2 As NotesItem
   Dim Eintrag As NotesItem
   Dim MoeglicheVersionen As Variant
   Dim Position1 As String
   Dim Position2 As String
   Dim Ergebnis As String
   Dim KompatibleVersionen As Variant

   Set session = New NotesSession
   Set db = session.CurrentDatabase
   Set doc_coll = db.AllDocuments
   
   Set view = db.GetView("Versionen")
   Set document = view.GetFirstDocument
                  
   While Not (document Is Nothing)
      Set item1 = document.GetFirstItem("VersionVon")
      Set item2 = document.GetFirstItem("VersionBis")
   Wend
   
   Set doc = db.GetProfileDocument("ProfileDoc")
   Set MoeglicheVersionen = doc.getItemValue("AlleVersionen")
   
   Position1 = Arraygetindex(MoeglicheVersionen, item1)
   Position2 = Arraygetindex(MoeglicheVersionen, item2)
   
   For KompatibleVersionen = Position1 To Position2
      Ergebnis = MoeglicheVersionen(KompatibleVersionen)
      Set Eintrag = document.ReplaceItemValue("AlleKompatiblenVersionen","Ergebnis")
   Next
   
End Sub
« Letzte Änderung: 26.03.04 - 10:56:59 von Lotus_Notes_Newbie »

klaussal

  • Gast
Re:Positionenvergleich innerhalb eines Feldes
« Antwort #3 am: 26.03.04 - 11:11:38 »
.. so auf die schnelle:
Set Eintrag = document.ReplaceItemValue("AlleKompatiblenVersionen","Ergebnis")

Ergebnis nicht in "gänsebeinchen"...

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Positionenvergleich innerhalb eines Feldes
« Antwort #4 am: 26.03.04 - 12:39:49 »
Einmal diesen, und zum anderen: Wo wird denn die Änderung des Dokumentes gespeichert ?

Bernhard

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Positionenvergleich innerhalb eines Feldes
« Antwort #5 am: 26.03.04 - 12:45:08 »
das von klaussal trifft zu.

hier

While Not (document Is Nothing)
      Set item1 = document.GetFirstItem("VersionVon")
      Set item2 = document.GetFirstItem("VersionBis")
Wend

hast du eine kleine Endlosschleife eingebaut.

Mach mal das While Nott... und das Wend weg für den Anfang.

außerdem übergibst du hier

   Position1 = Arraygetindex(MoeglicheVersionen, item1)
   Position2 = Arraygetindex(MoeglicheVersionen, item2)

der Funktion Arraygetindex ein NotesItem(item1 und item2), obwohl du eigentlich den Wert, der in dem Item steckt meinst.

Müsste so aussehen:

   Position1 = Arraygetindex(MoeglicheVersionen, item1.values(0))
   Position2 = Arraygetindex(MoeglicheVersionen, item2.values(0))


Puh, da sind nochn paar mehr Fehler drin.

Am besten kommentierst du mal deinen Code. Schreib einfach mal auf, was du mit welchem Abschnitt bezwecken möchtest. Vielleicht fällt dir dabei selber was auf.


Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline Lotus_Notes_Newbie

  • Frischling
  • *
  • Beiträge: 10
  • Ich liebe dieses Forum!
Re:Positionenvergleich innerhalb eines Feldes
« Antwort #6 am: 26.03.04 - 13:15:06 »
Erstmal danke für eure ganzen Antworten.

Stimmt, so kann das mit der While-Schleife natürlich nicht funktionieren. Ich habe den Code jetzt nochmal überarbeitet, das Ergebnis steht nicht mehr in "", der Fehler bei Arraygetindex wurde behoben, die Änderungen der Dokumente werden jetzt gespeichert und die While-Schleife wurde ebenfalls korrigiert.

So sieht der Code momentan aus:

Sub Initialize
   
   Dim workspace As NotesUIWorkspace
   Dim session As NotesSession
   Dim db As NotesDatabase
   Dim uidoc As NotesUIDocument
   Dim doc_coll As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim document As NotesDocument
   Dim view As NotesView
   Dim item1 As NotesItem
   Dim item2 As NotesItem
   Dim Eintrag As NotesItem
   Dim MoeglicheVersionen As Variant
   Dim Position1 As String
   Dim Position2 As String
   Dim Ergebnis As String
   Dim KompatibleVersionen As Variant

   Set session = New NotesSession
   Set db = session.CurrentDatabase
   Set doc_coll = db.AllDocuments
   
   Set view = db.GetView("Versionen")
   Set document = view.GetFirstDocument
                 
   While Not (document Is Nothing)
      Set item1 = document.GetFirstItem("VersionVon")
      Set item2 = document.GetFirstItem("VersionBis")
   
   Set doc = db.GetProfileDocument("ProfileDoc")
   Set MoeglicheVersionen = doc.getItemValue("AlleVersionen")
   
   Position1 = Arraygetindex(MoeglicheVersionen, item1.values(0))
   Position2 = Arraygetindex(MoeglicheVersionen, item2.values(0))
   
   For KompatibleVersionen = Position1 To Position2
      Ergebnis = MoeglicheVersionen(KompatibleVersionen)
      Set Eintrag = document.ReplaceItemValue("AlleKompatiblenVersionen",Ergebnis)
      Call document.Save( True, True )
   Next

   Set document = view.GetNextDocument(document)

Wend
   
End Sub



Jetzt erhalte ich noch eine Fehlermeldung "Type mismatch"

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Positionenvergleich innerhalb eines Feldes
« Antwort #7 am: 26.03.04 - 13:23:35 »
Tipp: Debugger einschalten, schauen, in welcher Zeile, (evtl. nachdenken warum der Fehler kommt)
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline Lotus_Notes_Newbie

  • Frischling
  • *
  • Beiträge: 10
  • Ich liebe dieses Forum!
Re:Positionenvergleich innerhalb eines Feldes
« Antwort #8 am: 30.03.04 - 15:48:17 »
Position1 = Arraygetindex(MoeglicheVersionen, item1.values(0))
Position2 = Arraygetindex(MoeglicheVersionen, item2.values(0))

Genau an dieser Stelle bekomme ich immer die Fehlermeldung "Invalid use of null"...kann mir einer sagen woran das liegt und wie ich das beheben kann?
« Letzte Änderung: 30.03.04 - 15:48:35 von Lotus_Notes_Newbie »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Positionenvergleich innerhalb eines Feldes
« Antwort #9 am: 30.03.04 - 15:52:34 »
Vorher war doch noch die Rede von type mismatch ? Hat sich da mittlerweile der Quelltext geändert ?

Bernhard

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Positionenvergleich innerhalb eines Feldes
« Antwort #10 am: 30.03.04 - 17:05:22 »
Position1 = Arraygetindex(MoeglicheVersionen, item1.values(0))
Position2 = Arraygetindex(MoeglicheVersionen, item2.values(0))

Genau an dieser Stelle bekomme ich immer die Fehlermeldung "Invalid use of null"...kann mir einer sagen woran das liegt und wie ich das beheben kann?

wenn das gesuchte Element nicht im Array vorhanden ist , liefert die Funktion Null zurück

deswegen musst du das Ergbnis in einen Variant schreiben und diesen vor Verwendung auf Null prüfen

dim vaPosition as Variant
vaPosition = Arraygetindex(MoeglicheVersionen, item1.values(0))
if not Isnull(vaPosition) Then
   'Sachen mit der Position machen
End if
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Positionenvergleich innerhalb eines Feldes
« Antwort #11 am: 30.03.04 - 17:25:57 »
Jo, Thomas. Und ein String mag eine NULL-Zuweisung sowieso nicht.
Ansonsten lasst uns erstmal auf den aktuellen Code warten - zwischen type mismatch und dieser Sache muss ja was passiert sein.

Bernhard

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz