Autor Thema: Entfernen Eintrag aus Feld mit Mehrfachwerten  (Gelesen 2716 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.883
  • 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