Domino 9 und frühere Versionen > ND8: Entwicklung

Entfernen Eintrag aus Feld mit Mehrfachwerten

(1/2) > >>

andrösen:
Guten Tag,
ich entwickle zur Zeit ein paar Grundfunktionen für eine dynamische Veranstaltungsdatenbank. Dynamisch in dem Sinne, dass der Anwender neue Veranstaltungen generieren kann und ich diese nicht hart vorprogrammiere.

Zum Aufbau:
Aufruf eines angelegten Veranstaltungsdoks mit eingebetteter Ansicht der zur Verfügung stehenden Kunden. Auswahl der Kunden innerhalb der Ansicht durch entsprechende Aktion. Die Kundendoks bekommen dann eine der Veranstaltung entsprechende Variable in das Feld "events" eingetragen. Es handelt sich um ein Textfeld mit Mehrfachwerten.
Die Werte werden per
item.AppendToTextList(NameVeranstaltung)
hinzugefügt. Dabei prüfe ich auch noch die maximale Teilnehmerzahl und einen eventuell bereits vorhandenen Wert im Kundendok.

--- Code: ---Sub Click(Source As Button)
'Deklaration
Dim session As New NotesSession
Dim workspace As New NotesUIWorkspace
Dim db As NotesDatabase
Dim uiview As NotesUIView
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim dc As NotesDocumentCollection
Dim collection As NotesDocumentCollection

Dim item As NotesItem
Dim NameVeranstaltung As String
Dim anzahl As String
Dim searchFormula As String
Dim TNMAX As String
Dim verfuegbar As Long
Dim anzahlausgewaehlt As Long
Dim dummyitem As String

'Set Variable
Set db = session.CurrentDatabase
Set uiview = workspace.CurrentView
Set collection = uiview.Documents

'VeranstaltungDoc deklarieren
Set uidoc = workspace.CurrentDocument
'Bezeichnung der Veranstaltung auslesen
NameVeranstaltung = uidoc.FieldGetText( "ThemaVeranstaltung" )  
'KundenDoks suchen
searchFormula = | events = "| + NameVeranstaltung +|"|
Set dc = db.Search( searchFormula, Nothing, 0 )
'KundenDoks innerhalb Collection zählen
anzahl = dc.Count

'TNMAX
TNMAX = uidoc.FieldGetText( "TeilnehmerMax" )
'Differenz Anzahl - TNMAX
verfuegbar = TNMAX - anzahl
'Anzahl ausgewählte Doks
anzahlausgewaehlt = collection.Count

If  anzahlausgewaehlt <= verfuegbar    Then
'Erstes Dokument
Set doc = collection.GetFirstDocument
'Schleife zum setzen des Event-KZ
While Not (doc Is Nothing)
Set item = doc.GetFirstItem( "events" )
If Not item.Contains( NameVeranstaltung ) Then
Call item.AppendToTextList( NameVeranstaltung )
Call doc.Save( False, True )
End If
'Nächstes Dokument
Set doc = collection.GetNextDocument(doc)
Wend

Else
Messagebox "Maximale Teilnehmerzahl bereits erreicht"
End If

End Sub

--- Ende Code ---


Jetzt die große Frage:
Wie bekomme ich gezielt einzelne Werte aus diesem Feld entfernt. Also Selektion eines oder mehrerer Kundendoks in der eingebetteten Ansicht und entfernen des jeweiligen Veranstaltungswertes.
Solange ich es nicht als Array oder Liste deklariere, ist es wohl trotz Mehrfachwerte auch nur ein einfaches Feld, oder? Welchen Umgang würdet Ihr mir mit diesem Feld innerhalb des Scripts empfehlen?

Folgendes funktioniert, allerdings nur mit konstanten Werten innerhalb einer Testmaske:

--- Code: --- Const Macro = |@ReplaceSubstring(subject; char_old; char_new)|
Wert = Evaluate(Macro, doc)
Call doc.ReplaceItemValue ("subject" , Wert)

--- Ende Code ---
Ich nehme an, dass die EvaluateFormel nicht mit dynamischen Werten per Script gefüttert werden kann?!

Erschießt mich nicht gleich. Das sind meine ersten Scriptschritte..

Gruß Sascha


Tode:

--- Code: ---varNewEvents = FullTrim( Replace( doc.GetItemValue( "events" ) , "DieVeranstaltungWillIchNichtMehr" , "" ) )
Call doc.ReplaceItemValue( "events" , varNewEvents )
--- Ende Code ---

Tipp: Wenn Du schon @ReplaceSubstring kennst, dann kuck mal in die Hilfe zu dem Befehl in die "Language cross-reference" ganz am Ende...
EDIT: Evaluate ist manchmal eine gute Idee, aber wenn es was entsprechendes in Script gibt, nimmt man (meist) direkt die Script- Funktion
und sowas geht natürlich auch:

--- Code: ---strBad = "DasWillIchNicht"
strGood = ""
varValue = Evaluate( {@ReplaceSubstring( Events ; "} & strBad & {"; "} & strGood {" )}, doc )

--- Ende Code ---

Peter Klett:
Ein Hinweis:

@ReplaceSubstring ersetzt Teilstrings, @Replace ersetzt ganze Werte

Hast Du diese Veranstaltungen

Konzert Band ABC
Konzert Band DEF
Konzert Band ABC Sonderveranstaltung

und ersetzt darin mit @ReplaceSubstring "Konzert Band ABC" durch "" bekommst Du

Konzert Band DEF
 Sonderveranstaltung

Nimm daher lieber @Replace ...

pram:
@Tode, möchte nur ergänzend hinweisen, dass man sich durch sowas schnell eine Sicherheitslücke baut:

--- Code: ---strBad = "DasWillIchNicht"
strGood = ""
varValue = Evaluate( {@ReplaceSubstring( Events ; "} & strBad & {"; "} & strGood {" )}, doc )

--- Ende Code ---

Deutlich besser ist

--- Code: ---doc.strBad = "DasWillIchNicht"
doc.strGood = ""
varValue = Evaluate( {@ReplaceSubstring( Events ; strBad ; strGood)}, doc )

--- Ende Code ---

Erklärung:
- spätestens wenn in strBad/strGood ein Anführungszeichen vorkommt, kracht es und durch geschickte Klammerung kann auch Code eingeschleust werden. (mit @SetDocField können z.B. fremde Dokumente geändert werden)
- die zweite Lösung compiliert die Formel gleich beim Abspeichern und ist ggf. noch einen Tick schneller.

ggf. muss man mit einem Temp-Doc oder Temp-Felder arbeiten.

Gruß
Roland

Peter Klett:
Die Sicherheitslücke ist aber nur dann eine, wenn der Code mit den höheren Rechten eines anderen Users ausgeführt wird (z.B. per Agent.RunOnServer).

Bei Ausführung des Codes durch einfaches Klicken auf einen Button mit den Rechten des angemeldeten Benutzers sehe ich die Lücke nicht. Wer in der Lage ist, solch eine "Lücke" auszunutzen, sollte es auch schaffen, ein Smarticon zu erstellen, oder einen persönlichen Agenten (evtl. in einer lokal erstellten Datenbank). Hat ein Benutzer Zugriffsrecht auf ein Dokument, hat er technisch alle Möglichkeiten. Dort muss die Sicherheit ansetzen: Keine Editorrechte für normale Benutzer, stattdessen eine saubere Autorensteuerung.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln