Autor Thema: Dem zu schreibendem doc.XXXXXX vorab eine Variable zuweisen  (Gelesen 1960 mal)

Offline snore

  • Aktives Mitglied
  • ***
  • Beiträge: 107
Hallo,

Wie kann ich denn für ein Item vorab über If ... Elseif eine Variable zuweisen ?

Also zuerst wird das Array aus der Maske gelesen ... je nach Nummernbereich das jeweilige Feld
...
If ResNummer >=0 And ResNummer <100 Then
WerteBisher = doc.GetItemValue("FeldA")
FeldZuweisungNeu = "doc.FeldA" ????
Elseif ResNummer >=100 And ResNummer <200 Then
WerteBisher = doc.GetItemValue("FeldB")
FeldZuweisungNeu = "doc.FeldB" ????
... u.s.w.

Dann wird das Array um den neuen Wert ergänzt...

If FullTrim (WerteBisher (0)) = ""  Then
WerteNeu = ArrayReplace(WerteBisher,"",ResNummerLang)
Else
WerteNeu = ArrayAppend(WerteBisher, ResNummerLang)   
End If   

-> Nun will ich aber vorab das Feld, wohin das Ergebnis soll variabel innerhalb der If-Abfrage mitgeben... und dann hier einsetzen...
doc.>>>"FeldZuweisungNeu"<<< = WerteNeu

Call doc.ComputeWithForm(True,False)
Call doc.Save (True, False)

Set doc = collection.GetNextDocument(doc)
Wend

Danke und Sorry




Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Dem zu schreibendem doc.XXXXXX vorab eine Variable zuweisen
« Antwort #1 am: 28.03.16 - 22:25:16 »
Du schreibst wirr. Das macht das Antworten sehr mühsam.

Ich vermute: Gemeint ist NotesDocument.ReplaceItemValue (itemname, itemvalue). Das ist variabel.

Was soll aber die Zusammenstellung If Then Elseif? Elseif ist doch anders gedacht und nicht als direkter Else-Ersatz ... Aber wie gesagt: Du schreibst wirr.

Bernhard

Offline snore

  • Aktives Mitglied
  • ***
  • Beiträge: 107
Re: Dem zu schreibendem doc.XXXXXX vorab eine Variable zuweisen
« Antwort #2 am: 31.03.16 - 07:26:06 »
Servus Bernhard,
vielen Dank für Deine Antwort - das war's !!

Damit aber mehr Licht ins Dunkle kommt, hier der gesamte Code.
Funktioniert super gut! ... ein Feedback zu Optimierungsmöglichkeiten
nehme ich aber gerne entgegen!

(Hinweis die Felder sind teilw. etwas anonymisiert...)

Step 1)
In der Maske SOLL_Rechte-Ressource (Berechtigung) habe ich eine eingebettete Ansicht der Stellen und Personen (Maske: SOLL_Rechte-Stelle) mit der zugewiesenen Kompetenz.
Damit das aufgrund der teilw. vielen Zeilen besser aussieht, gebe ich die eingebettete Ansicht auf Wunsch auch über eine Schaltfläche separat aus und "leg" mir die für den Agenten benötigten Werte in den Speicher:

'-> zeig mir alle Stellen/Personen ohne diese Berechtigung an....
..
@SetEnvironment("AktuelleSollNummer" ; @Text(SollNummer));
@SetEnvironment("AktuelleSollNummerText" ; @Text(SOLLRessource));
@Command( [OpenFrameset] ; "SETVIEWohne" );
@SetViewInfo([SetViewFilter];m1;"";1;1)

In der Ansicht selbst, gibts nun für die "Supervisor" eine Aktion zum Start des Agenten:

Step 2)

%REM
   Agent Massenzuweisung von Berechtigungen auf gewählte Dokumente der eingebetteten Ansicht
   Created 26.03.2016 by xxxx
   Description: Comments for Agent
%END REM
Option Public
Option Declare

Sub Initialize
   
   On Error GoTo errorhandler
   
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim ws As New NotesUIWorkspace
   Dim collection As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim uiview As NotesUIView
   Dim ResNummer As Variant
   Dim ResNummerLang As String
   Dim ResNummerBeschreibung As String
   Set db = session.CurrentDatabase
   Set uiview = ws.CurrentView
   
   ' holt sich die über den Button >>Auflistung der Stellen/Personen..>> der Maske SOLL_Rechte-Ressource
   ' in den Speicher bzw. der eingebetteten Ansicht übernommenen Werte zur weiteren Verarbeitung
   ResNummer = session.GetEnvironmentString( "AktuelleSollNummer" )
   ResNummerBeschreibung = session.GetEnvironmentString( "AktuelleSollNummerText" )
   
   ' aufgrund der beiden historisch gewachsenen Nummernbereiche, muss die Nummer entweder 4-stellig oder 6-stellig sein
   If ResNummer < 10000 Then
      ResNummerLang = Right$("0000" & CStr(ResNummer), 4)
   Else
      ResNummerLang = Right$("000000" & CStr(ResNummer), 6)
   End If


   If MessageBox ("Möchten Sie nun die Ressource -->" & Chr( 13 ) & ResNummerBeschreibung & Chr( 13 ) & _
   "(=technische Nummer " & ResNummerLang & ")" & Chr( 13 ) & "den markierten Dokumenten zuweisen ? " & _
   Chr( 13 ) & Chr( 13 ) & _
   "-> weitere Infos werden in die Notes-Statuszeile (ganz unten) geschrieben. " & Chr( 13 ) & _
   Chr( 13 ),4+32+0+0 , "Hinweis") = 7 Then
      GoTo p_ende
   End If

   If MessageBox ("Sind Sie sich auch wirklich sicher ?" & Chr( 13 ) & _
   "Haben Sie die richtigen Dokumente markiert (angehakt)?" & Chr( 13 ) & Chr( 13 ) & _
   "--> Wenn OK .. dann Ja .. sonst Nein" & Chr( 13 ) & _
   Chr( 13 ),4+32+0+0 , "Hinweis") = 7 Then
      GoTo p_ende
   End If

Print "Datenbank: Berechtigungskonzept -> Agent = Massenzuweisung"
   Print "START der Massenzuweisung von Berechtigungen über die in der Ansicht markierten Dokumente"
   Print "Über die Ressource ermittelte technische Nummer: " ResNummerLang

   Set collection = db.unprocesseddocuments   
   Set doc = collection.getfirstdocument
   
   If Not doc Is Nothing Then
      Print "-> Es wurden: " collection.Count " Dokumente über die Ansicht Markiert"
   Else
      MessageBox "Hinweis: Es wurden keine Einträge markiert" & Chr$ (10) &_
      "-> der Vorgang wird abgebrochen !"
      GoTo p_ende
   End If
   
   'Nun müssen je nach Nummernbereich (also Ressourcenbereich) die Werte ermittelt und zurückgeschrieben werden
   Dim WerteBisher As Variant
   Dim WerteNeu As Variant
   Dim Abschnitt As NotesItem
   Dim ZuweisungNeu As String
   
   While Not(doc Is Nothing)   
      ' In der 1.Zeile der eingebetteten Ansicht (=Überschrift) soll nichts verändert werden   
      If doc.Form(0)="SOLL_Rechte-Ressource" Then
         MessageBox "Hoppla: Sie haben (nur oder auch) die erste Zeile markiert" & Chr$ (10) &_
         "-> die Massenänderung wird abgebrochen !"
         GoTo p_ende
      Else
      End If
            
      ' In der Maske SOLL_Rechte-Stelle, gibt es verschiedene Felder (Abschnitte) mit den über die
      ' Maske SOLL_Rechte-Ressource und den definierten Nummernbereichen erstellten Berechtigungen
      ' pro Kompetenzbereich. Diese werde als Mehrfachwerte (Kontrollkästchen) bereitgestellt.   
      ' Ensprechend der technischen Nummer der Ressource wird das richtige Feld gezogen.      
      If ResNummer >=0 And ResNummer <100 Or ResNummer >=910000 And ResNummer <911000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxA")
         ZuweisungNeu = "SOLLRechteStellexxA"
      Elseif ResNummer >=300 And ResNummer <500 Or ResNummer >=913000 And ResNummer <914000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxB")
         ZuweisungNeu = "SOLLRechteStellexxB"
      ElseIf ResNummer >=2000 And ResNummer <2100 Or ResNummer >=920000 And ResNummer <921000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxC")
         ZuweisungNeu = "SOLLRechteStellexxC"
      ElseIf ResNummer >=2100 And ResNummer <2200 Or ResNummer >=921000 And ResNummer <922000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxD")
         ZuweisungNeu = "SOLLRechteStellexxD"   
      ElseIf ResNummer >=2200 And ResNummer <2600 Or ResNummer >=922000 And ResNummer <926000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxE")
         ZuweisungNeu = "SOLLRechteStellexxE"
      ElseIf ResNummer >=2600 And ResNummer <2650 Or ResNummer >=926000 And ResNummer <926500 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxF")
         ZuweisungNeu = "SOLLRechteStellexxF"
      ElseIf ResNummer >=2650 And ResNummer <3000 Or ResNummer >=926500 And ResNummer <930000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxG")
         ZuweisungNeu = "SOLLRechteStellexxG"
      ElseIf ResNummer >=200 And ResNummer <300 Or ResNummer >=912000 And ResNummer <913000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxH")
         ZuweisungNeu = "SOLLRechteStellexxH"
      ElseIf ResNummer >=500 And ResNummer <1000 Or ResNummer >=914000 And ResNummer <915000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxI")
         ZuweisungNeu = "SOLLRechteStellexxI"
      ElseIf ResNummer >=1000 And ResNummer <2000 Or ResNummer >=915000 And ResNummer <916000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxJ")
         ZuweisungNeu = "SOLLRechteStellexxJ"
      ElseIf ResNummer >=100 And ResNummer <200 Or ResNummer >=911000 And ResNummer <912000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxK")
         ZuweisungNeu = "SOLLRechteStellexxK"
      ElseIf ResNummer >=3000 And ResNummer <3300 Or ResNummer >=930000 And ResNummer <933000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxL")
      ZuweisungNeu = "SOLLRechteStellexxL"
      ElseIf ResNummer >=3300 And ResNummer <3500 Or ResNummer >=933000 And ResNummer <935000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxM")
         ZuweisungNeu = "SOLLRechteStellexxM"
      ElseIf ResNummer >=3500 And ResNummer <3800 Or ResNummer >=935000 And ResNummer <938000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxN")
         ZuweisungNeu = "SOLLRechteStellexxN"
      ElseIf ResNummer >=3800 And ResNummer <4000 Or ResNummer >=938000 And ResNummer <940000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxO")
         ZuweisungNeu = "SOLLRechteStellexxO"
      ElseIf ResNummer >=5000 And ResNummer <6000 Or ResNummer >=950000 And ResNummer <960000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxP")
         ZuweisungNeu = "SOLLRechteStellexxP"
      ElseIf ResNummer >=4000 And ResNummer <5000 Or ResNummer >=940000 And ResNummer <950000 Then
         WerteBisher = doc.GetItemValue("SOLLRechteStellexxQ")
         ZuweisungNeu = "SOLLRechteStellexxQ"
      Else
      End If
      
      ' Falls das Feld bisher leer war, dann Replace (wegen den Gänsefüsschen), sonst Append
      If FullTrim (WerteBisher (0)) = ""  Then
         WerteNeu = FullTrim (ArrayReplace(WerteBisher,"",ResNummerLang))
      Else
         WerteNeu = FullTrim (ArrayAppend(WerteBisher, ResNummerLang))   
      End If
      
      'Rückschreibung des neu berechneten Feldes mit allen Werten   
      Set Abschnitt = doc.ReplaceItemValue(ZuweisungNeu, WerteNeu)
      
      'Auflistung der geänderten Dokumente in der Statuszeile
      If doc.StelleoderPerson(0) ="1" Then
      Print "Zuweisung erfolgt auf Stelle  -> " doc.SOLLStelle(0)
      Else
      'Sehr umständlich in Script den normalen Namen der Person(=Notesname) auszugeben
      Dim NamePerson As NotesName
      Dim Ergebnis As String
         Set NamePerson = New NotesName(doc.GetItemValue("PersonPerson")(0))
         Ergebnis = NamePerson.Common
         Print "Zuweisung erfolgt auf Person -> " & Ergebnis
      End If
      'Das jeweilige Dokument aktualisieren, speichern und zum nächsten markierten Dokument wechseln
      Call doc.ComputeWithForm(True,False)
      Call doc.Save (True, False)
      Set doc = collection.GetNextDocument(doc)
   Wend

   Print "-> Massenzuweisung abgeschlossen: " collection.Count " Dokumente aktualisiert"
   MessageBox "-> Massenzuweisung abgeschlossen" & Chr$ (10) & Chr$ (10) &"Es wurden "& collection.Count & " Dokumente aktualisiert"
   
errorhandler:
   Print "Fehler beim Aktualisieren der Dokumente ->  " & Error$ & "(" & CStr(Err) & ")" & " in Zeile " & CStr(Erl)
p_ende:   

End Sub


Mein zweiter Agent zur "Massenlöschung" macht im Grund das gleiche ... nur mit der Abweichung:
....
      ' den genannten Wert aus dem Array löschen
      
      WerteNeu = FullTrim( ArrayReplace( WerteBisher , ResNummerLang , "" ) )
   
      'Rückschreibung des neu berechneten Feldes mit den übrigen Werten   
      Set Abschnitt = doc.ReplaceItemValue(ZuweisungNeu, WerteNeu)

...


...so genug "gedaddelt"
Ich geh' jetzt ins Holz zum Bäumefällen - soll heute über 20 Grad warm werden!
Gruß
snore



 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz