Autor Thema: Entfernen Eintrag aus Feld mit Mehrfachwerten  (Gelesen 2759 mal)

andrösen

  • Gast
Entfernen Eintrag aus Feld mit Mehrfachwerten
« am: 03.05.13 - 12:55:26 »
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


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)
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


« Letzte Änderung: 03.05.13 - 16:30:04 von andrösen »

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.896
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Entfernen Eintrag aus Feld mit Mehrfachwerten
« Antwort #1 am: 03.05.13 - 13:02:09 »
Code
varNewEvents = FullTrim( Replace( doc.GetItemValue( "events" ) , "DieVeranstaltungWillIchNichtMehr" , "" ) )
Call doc.ReplaceItemValue( "events" , varNewEvents )

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 )
« Letzte Änderung: 03.05.13 - 13:05:08 von Tode »
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Entfernen Eintrag aus Feld mit Mehrfachwerten
« Antwort #2 am: 03.05.13 - 13:23:03 »
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 ...

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Entfernen Eintrag aus Feld mit Mehrfachwerten
« Antwort #3 am: 03.05.13 - 16:01:02 »
@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 )

Deutlich besser ist
Code
doc.strBad = "DasWillIchNicht"
doc.strGood = ""
varValue = Evaluate( {@ReplaceSubstring( Events ; strBad ; strGood)}, doc )

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
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Entfernen Eintrag aus Feld mit Mehrfachwerten
« Antwort #4 am: 03.05.13 - 16:24:59 »
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.


andrösen

  • Gast
Re: Entfernen Eintrag aus Feld mit Mehrfachwerten
« Antwort #5 am: 03.05.13 - 16:29:21 »
Vielen Dank für die schnelle Hilfe!

Ich habs erstmal mit dem Fulltrim umgesetzt. Den Replace-Tipp werd ich die Tage nochmal testen.
Anbei die umgesetzte Lösung.

Gruß Sascha

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 MyWert As Variant
Set db = session.CurrentDatabase
Set uiview = workspace.CurrentView
Set collection = uiview.Documents
Dim charNew As String
Dim charOld As String
Dim varNewEvents As Variant
'VeranstaltungDoc deklarieren & Veranstaltung auslesen
Set uidoc = workspace.CurrentDocument
NameVeranstaltung = uidoc.FieldGetText( "ThemaVeranstaltung"' z.B. "XMAS"
'Erstes Dokument
Set doc = collection.GetFirstDocument
'Schleife zum setzen des Event-KZ
While Not (doc Is Nothing)
Set item = doc.GetFirstItem( "events" )
If item.Contains( NameVeranstaltung ) Then
varNewEvents = Fulltrim( Replace( doc.GetItemValue( "events" ) , NameVeranstaltung , "" ) )
'Print varNewEvents
Call doc.ReplaceItemValue ( "events" , varNewEvents )
Call doc.Save( False, True )
End If
'Nächstes Dokument
Set doc = collection.GetNextDocument(doc)
Wend
workspace.ViewRefresh
End Sub

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz