Autor Thema: PROMPT_OKCANCELCOMBO mit variablem Inhalt  (Gelesen 5001 mal)

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
PROMPT_OKCANCELCOMBO mit variablem Inhalt
« am: 07.08.12 - 18:00:21 »
Hallo,

in einer Ansicht werden Dokumente angezeigt.
Jedes Dokument hat unter anderem vier Felder namens "vHa", "nHa", "vVe", "nVe".
In jedem dieser Felder werden normalerweise vier Mitarbeiternamen gespeichert.
Es soll per Button in der Ansicht ermöglicht werden, einen Namen auszuwählen.

Solange in jedem Feld wirklich 4 Einträge stehen, funktioniert der u.g. Code einwandfrei.
Wenn aber weniger, dann geht es nicht mehr.

Was müsste in dem Code geändert werden?
Oder gibt's dafür auch ganz andere bessere Lösung?

Gruß
Leo

Code
Sub Click(Source As Button)
	
	Dim session As New NotesSession
	Dim ws As New NotesUIWorkspace
	Dim db As NotesDatabase
	Dim dc As NotesDocumentCollection
	Dim doc As NotesDocument
	
	Set db=session.CurrentDatabase
	Set dc=db.unprocessedDocuments
	Set doc=dc.GetFirstDOcument
	
	Do While Not doc Is Nothing
		
		Dim response As Variant
		Dim response1 As Variant
		
		Dim values(3) As Variant
		values(0) = "vHa"
		values(1) = "nHa"
		values(2) = "vVe"
		values(3) = "nVe"	
		
		Dim valuesA(4) As Variant
		valuesA(0) = doc.vHa(0)
		valuesA(1) = doc.vHa(1)
		valuesA(2) = doc.vHa(2)
		valuesA(3) = doc.vHa(3)
		
		Dim valuesB(4) As Variant
		valuesB(0) = doc.nHa(0)
		valuesB(1) = doc.nHa(1)
		valuesB(2) = doc.nHa(2)
		valuesB(3) = doc.nHa(3)		
		
		Dim valuesC(4) As Variant
		valuesC(0) = doc.vVe(0)
		valuesC(1) = doc.vVe(1)
		valuesC(2) = doc.vVe(2)
		valuesC(3) = doc.vVe(3)
		
		Dim valuesD(4) As Variant
		valuesD(0) = doc.nVe(0)
		valuesD(1) = doc.nVe(1)
		valuesD(2) = doc.nVe(2)
		valuesD(3) = doc.nVe(3)
		
		response = ws.Prompt (PROMPT_OKCANCELCOMBO, _
		"Servicezeit am " & doc.Datum(0) &  ": ", "Bitte Funktion auswählen", values(0), values)
		
		'Print response
		
		If Isempty (response) Then
			Messagebox "Abgebrochen", , "Nichts ausgewählt"
		Else
			If response = "vHa" Then
				response1 = ws.Prompt (PROMPT_OKCANCELCOMBO, _
				"Servicezeit am " & doc.Datum(0) &  " " & response & ": ", _
				"Bitte Mitarbeiter auswählen", valuesA(0), valuesA)
			Elseif response = "nHa" Then
				response1 = ws.Prompt (PROMPT_OKCANCELCOMBO, _
				"Servicezeit am " & doc.Datum(0) &  " " & response & ": ", _
				"Bitte Mitarbeiter auswählen", valuesB(0), valuesB)	
			Elseif response = "vVe" Then
				response1 = ws.Prompt (PROMPT_OKCANCELCOMBO, _
				"Servicezeit am " & doc.Datum(0) &  " " & response & ": ", _
				"Bitte Mitarbeiter auswählen", valuesC(0), valuesC)
			Elseif response = "nVe" Then
				response1 = ws.Prompt (PROMPT_OKCANCELCOMBO, _
				"Servicezeit am " & doc.Datum(0) &  " " & response & ": ", _
				"Bitte Mitarbeiter auswählen", valuesD(0), valuesD)	
			End If
			
			Print response1
			
			If Isempty (response1) Then
				Messagebox "MA-Wahl abgebrochen", , "Nichts ausgewählt"
			Else
				Msgbox Left(response1,12), ,"SZ-Dok öffnen für " & doc.Datum(0) & " " & _
				response
			End If
			
		End If
		
		Set doc=dc.GetNextDocument(doc)
	Loop
	
	Call ws.ViewRefresh
	
End Sub
nobody is perfect but i'm pretty close 

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: PROMPT_OKCANCELCOMBO mit variablem Inhalt
« Antwort #1 am: 07.08.12 - 18:16:16 »
Statt mit festenArrays musst Du mit dynamischen arbeiten. Stichwort: Redim Preserve.

Es geht natürlich auch einfacher: Statt Dim vValuesA (4) As Variant machst Du einfach nur ein Dim vValuesA As Variant und weisst dann das komplette Item zu:
vValuesA = doc.vHA
Und das war es dann auch schon.

Du solltest vielleicht im ersten Teil prüfen, ob die einzelnen Items überhaupt einen Inhalt haben und danach Dein erstes Prompt abhängig machen.

HTH,
Bernhard

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: PROMPT_OKCANCELCOMBO mit variablem Inhalt
« Antwort #2 am: 07.08.12 - 18:34:40 »
Du solltest auch versuchen, das Script allgemeingültiger zu schreiben, denn es hat viele Elemente unnötig mehrfach drin, die die Wartbarkeit erschweren und die Fehleranfälligkeit erhöhen.

Habe Dein Script mal auf die Schnelle "zusammengeschrumpft", ohne Prüfung auf Sinnhaftigkeit. Dieses Script macht exakt das gleiche, was Du geschrieben hast, ist aber um einiges kürzer.
Code
Sub Click(Source As Button)
	
	 Dim session As New NotesSession
	 Dim ws As New NotesUIWorkspace
	 Dim db As NotesDatabase
	 Dim dc As NotesDocumentCollection
	 Dim doc As NotesDocument
	
	 Set db=session.CurrentDatabase
	 Set dc=db.unprocessedDocuments
	 Set doc=dc.GetFirstDOcument
	
	 Dim response As Variant
	 Dim response1 As Variant
		
	 Dim values(3) As Variant
	 values(0) = "vHa"
	 values(1) = "nHa"
	 values(2) = "vVe"
	 values(3) = "nVe"	

	 Do While Not doc Is Nothing
		 response = ws.Prompt (PROMPT_OKCANCELCOMBO, _
		 "Servicezeit am " & doc.Datum(0) &  ": ", "Bitte Funktion auswählen", values(0), values)
		
		 'Print response
		
		 If Isempty (response) Then
			 Messagebox "Abgebrochen", , "Nichts ausgewählt"
		 Else
			 response1 = ws.Prompt (PROMPT_OKCANCELCOMBO, _
			 "Servicezeit am " & doc.Datum(0) &  " " & response & ": ", _
			 "Bitte Mitarbeiter auswählen", doc.GetItemValues (response) (0), doc.GetItemValues (response))
			
			 Print response1
			
			 If Isempty (response1) Then
				 Messagebox "MA-Wahl abgebrochen", , "Nichts ausgewählt"
			 Else
				 Msgbox Left(response1,12), ,"SZ-Dok öffnen für " & doc.Datum(0) & " " & _
				 response
			 End If
			
		 End If
		
		 Set doc=dc.GetNextDocument(doc)
	 Loop
	
	 Call ws.ViewRefresh
	
 End Sub

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: PROMPT_OKCANCELCOMBO mit variablem Inhalt
« Antwort #3 am: 07.08.12 - 22:35:47 »
...Redim Preserve.
Es geht natürlich auch einfacher: Statt Dim vValuesA (4) As Variant machst Du einfach nur ein Dim vValuesA As Variant und weisst dann das komplette Item zu:
vValuesA = doc.vHA
...


Hallo Bernhard,

vielen Dank für Deine super schnelle und ausführliche Unterstützung!
Es funktioniert jetzt!

Gruß
Leo

Code
Sub Click(Source As Button)
	
	Dim session As New NotesSession
	Dim ws As New NotesUIWorkspace
	Dim db As NotesDatabase
	Dim dc As NotesDocumentCollection
	Dim doc As NotesDocument
	Dim response, response1 As Variant
	Dim valuesA, valuesB, valuesC, valuesD As Variant
	Dim values(3) As Variant
	
	Set db=session.CurrentDatabase
	Set dc=db.unprocessedDocuments
	Set doc=dc.GetFirstDocument
	
	values(0) = "vHa"
	values(1) = "nHa"
	values(2) = "vVe"
	values(3) = "nVe"	
	
	Do While Not doc Is Nothing
		
		valuesA = doc.vHa
		valuesB = doc.nHa
		valuesC = doc.vVe
		valuesD = doc.nVe
				
		response = ws.Prompt (PROMPT_OKCANCELCOMBO, _
		"Servicezeit am " & doc.Datum(0) &  ": ", "Bitte Funktion auswählen", values(0), values)
		
		'Print response
		
		If Isempty (response) Then
			Messagebox "Abgebrochen", , "Nichts ausgewählt"
		Else
			If response = "vHa" Then
				response1 = ws.Prompt (PROMPT_OKCANCELCOMBO, _
				"Servicezeit am " & doc.Datum(0) &  " " & response & ": ", _
				"Bitte Mitarbeiter auswählen", valuesA(0), valuesA)
			Elseif response = "nHa" Then
				response1 = ws.Prompt (PROMPT_OKCANCELCOMBO, _
				"Servicezeit am " & doc.Datum(0) &  " " & response & ": ", _
				"Bitte Mitarbeiter auswählen", valuesB(0), valuesB)	
			Elseif response = "vVe" Then
				response1 = ws.Prompt (PROMPT_OKCANCELCOMBO, _
				"Servicezeit am " & doc.Datum(0) &  " " & response & ": ", _
				"Bitte Mitarbeiter auswählen", valuesC(0), valuesC)
			Elseif response = "nVe" Then
				response1 = ws.Prompt (PROMPT_OKCANCELCOMBO, _
				"Servicezeit am " & doc.Datum(0) &  " " & response & ": ", _
				"Bitte Mitarbeiter auswählen", valuesD(0), valuesD)	
			End If
			
			Print response1
			
			If Isempty (response1) Or response1 ="" Then
				Messagebox "MA-Wahl abgebrochen", , "Nichts ausgewählt"
			Else
				Msgbox Left(response1,12), ,"SZ-Dok öffnen für " & doc.Datum(0) & " " & _
				response
			End If
			
		End If
		
		Set doc=dc.GetNextDocument(doc)
	Loop
	
	Call ws.ViewRefresh
	
End Sub
nobody is perfect but i'm pretty close 

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: PROMPT_OKCANCELCOMBO mit variablem Inhalt
« Antwort #4 am: 07.08.12 - 22:42:00 »
Du solltest auch versuchen, das Script allgemeingültiger zu schreiben, denn es hat viele Elemente unnötig mehrfach drin, die die Wartbarkeit erschweren und die Fehleranfälligkeit erhöhen...

Hallo Peter,

vielen Dank für Deinen Vorschlag und die Hinweise.
Deine Variante sieht viel eleganter als meine.

Kannst Du bitte noch helfen, die "Mismatch" Fehlermeldung zu beheben?

Gruß
Leo

nobody is perfect but i'm pretty close 

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: PROMPT_OKCANCELCOMBO mit variablem Inhalt
« Antwort #5 am: 07.08.12 - 22:57:53 »
Hallo Peter,

ich hab's gefunden:

Ein s war zweimal zu viel.  ;)

Es funktioniert jetzt.
Nochmals Danke!

Gruß
Leo
nobody is perfect but i'm pretty close 

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: PROMPT_OKCANCELCOMBO mit variablem Inhalt
« Antwort #6 am: 08.08.12 - 08:48:53 »
Hallo,

(wie) könnte man den Script noch so User freundlicher verbessern, dass dass statt ZWEI User-Abfragen nur EINE notwendig wäre?

D.h. z.B.

Code
response = ws.Prompt (PROMPT_OKCANCELCOMBO, _
		"Servicezeit am " & doc.Datum(0) &  ": ", "Bitte Funktion auswählen", NEWvalues(0), NEWvalues)

wo

Code
NEWvalues(0) = "vHa" & " - " & doc.GetItemValue("vHa")(0)
NEWvalues(1) = "vHa" & " - " & doc.GetItemValue("vHa")(1)
NEWvalues(2) = "vHa" & " - " & doc.GetItemValue("vHa")(2)
NEWvalues(3) = "vHa" & " - " & doc.GetItemValue("vHa")(3)

NEWvalues(4) = "nHa" & " - " & doc.GetItemValue("nHa")(0)
NEWvalues(5) = "nHa" & " - " & doc.GetItemValue("nHa")(1)
NEWvalues(6) = "nHa" & " - " & doc.GetItemValue("nHa")(2)
etc...

Gruß
Leo
« Letzte Änderung: 08.08.12 - 08:56:14 von Bruce Willis »
nobody is perfect but i'm pretty close 

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: PROMPT_OKCANCELCOMBO mit variablem Inhalt
« Antwort #7 am: 08.08.12 - 19:08:41 »
Etwa so:
Code
	 Dim values(3) As Variant
	 values(0) = "vHa"
	 values(1) = "nHa"
	 values(2) = "vVe"
	 values(3) = "nVe"

	 Dim NEWvalues As Variant
	 Dim count As Integer
	 Redim NEWvalues (15)
	 Forall v in values
		 Forall vv in doc.GetItemValue (v)
			 NEWvalues (count) = v & " - " & vv
			 count = count + 1	 
		 End Forall
	 End Forall
	 If count > 0 Then
		 Redim Preserve NEWvalues (count - 1)
	 End If

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: PROMPT_OKCANCELCOMBO mit variablem Inhalt
« Antwort #8 am: 08.08.12 - 21:41:51 »
Etwa so...
Wow!

Peter, Du bist ein wahrer Zauberer !!

Vielen, vielen Dank !!!

 :knuddel:

Gruß
Leo
nobody is perfect but i'm pretty close 

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: PROMPT_OKCANCELCOMBO mit variablem Inhalt
« Antwort #9 am: 09.08.12 - 07:00:24 »
Freut mich, Deine Begeisterung zu lesen, aber wir wollen mal nicht übertreiben ...

Habe Dir in dem Script auch noch einiges an Optimierungspotential übrig gelassen. Probier z.B. mal aus, was passiert, wenn eines der Felder leer ist

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: PROMPT_OKCANCELCOMBO mit variablem Inhalt
« Antwort #10 am: 09.08.12 - 09:09:16 »
Habe Dir in dem Script auch noch einiges an Optimierungspotential übrig gelassen.
Ich finde ihn doch perfekt, ein Beispiel für Designer Hilfe! :)
Oder meinst Du, noch welche Überprüfungen einbauen?

Probier z.B. mal aus, was passiert, wenn eines der Felder leer ist
Funktioniert einwandfrei!
Sogar wenn drei Felder leer sind.
 :knuddel:

Code
Sub Click(Source As Button)
	
	'08.08.2012 Neu! Elegantere und sogar EINSTUFIGE Version !!!
	
	Dim session As New NotesSession
	Dim ws As New NotesUIWorkspace
	Dim db As NotesDatabase
	Dim dc As NotesDocumentCollection
	Dim doc As NotesDocument
	Dim response, response1 As Variant	'User zweimal fragen
	Dim myKey As String		'Schlüssel für die Suche nach szDok
	Dim view As NotesView
	Dim entry As NotesViewEntry
	Dim docEntry As NotesDocument
	
	Set db=session.CurrentDatabase
	Set dc=db.unprocessedDocuments
	Set doc=dc.GetFirstDocument
	
	Dim values(3) As Variant
	values(0) = "vHa"
	values(1) = "nHa"
	values(2) = "vVe"
	values(3) = "nVe"	
	
	'Variable Listen-Zuweisung
	Dim NEWvalues As Variant
	Dim count As Integer
	'Redim NEWvalues (15)	'es könnten nicht nur 4x4 sondern 4x5 Einträge geben, daher unten ersetzt
	Redim NEWvalues (19)
	Forall v In values
		Forall vv In doc.GetItemValue (v)
			NEWvalues (count) = v & "-" & vv
			count = count + 1	 
		End Forall
	End Forall
	If count > 0 Then
		Redim Preserve NEWvalues (count - 1)
	End If
	
	
	Do While Not doc Is Nothing
		response = ws.Prompt (PROMPT_OKCANCELCOMBO, _
		"Servicezeit am " & doc.Datum(0) &  ": ", "Bitte Funktion auswählen", NEWvalues(0), NEWvalues)
				
		If Isempty (response) Then
			Messagebox "Abgebrochen", , "Nichts ausgewählt"
			Exit Sub
		Else
			'Msgbox Left(Strleft(response1," - "),14), ,"SZ-Dok öffnen für " & doc.Datum(0) & _
			'" " & response
			myKey = doc.Datum(0) & "-" & Strleft(response," - ")	'neu
		End If
		
	'Das gesuchte szDok finden und öffnen
		Set view = db.GetView("szCalendarVollAlle")	'alle szDoks 
		Call view.Refresh
		Set entry = view.GetEntryByKey(MyKey, False)	'das gesuchte szDok finden
		
		If entry Is Nothing Then
			Msgbox "Leider nicht gefunden!",,myKey
			Exit Sub
		End If
		
		Set docEntry = entry.Document			'vom gefundenen Entry zum eigenen Dokument wechseln
		Call ws.EditDocument(True,docEntry)	'das gesuchte szDok ins Frontend überführen und öffnen
		
		Set doc=dc.GetNextDocument(doc)
	Loop
	
	Call ws.ViewRefresh
	Call view.Refresh
		
End Sub
nobody is perfect but i'm pretty close 

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: PROMPT_OKCANCELCOMBO mit variablem Inhalt
« Antwort #11 am: 09.08.12 - 15:46:57 »
1. Wenn z.B. vHa leer ist, bekommst Du in der Auswahlliste einen Eintrag "vHa -", deshalb sollte vv (also jeder einzelne Wert in den 4 Items) auf Inhalt überprüft werden.

2. Die Redim Preserve-Nummer am Ende war unsauber. Wenn alle Einträge gefüllt sind, braucht kein Redim Preserve ausgeführt zu werden (ok, die halbe Millisekunde, die Du sparst, macht den Kohl nicht fett), aber wenn kein Eintrag auswählbar ist, könnte man das Script auch gleich abbrechen.

Code
Forall v In values
	Forall vv In doc.GetItemValue (v)
		If vv <> "" Then
			NEWvalues (count) = v & "-" & vv
			count = count + 1
		End If
	End Forall
End Forall
If count <= Ubound (NEWvalues) Then
	If count = 0 Then
		Msgbox "nix zu tun", 16, "Fehler"
		Exit Sub
	Else
		Redim Preserve NEWvalues (count - 1)
	End If
End If

P.S.: Dass man mir Pingeligkeit nachsagt, ist nur ein dummes Gerücht  ;)

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: PROMPT_OKCANCELCOMBO mit variablem Inhalt
« Antwort #12 am: 10.08.12 - 18:10:56 »
Hi Peter,

1. Wenn z.B. vHa leer ist, bekommst Du in der Auswahlliste einen Eintrag "vHa -", deshalb sollte vv (also jeder einzelne Wert in den 4 Items) auf Inhalt überprüft werden.

Ah, Du meinst daaaaas... :)
Ich dachte, es sei nicht schlimm, da man diese halb-leeren Einträge als Separator zwischen den s.g. "Funktionen" betrachten könnte... ;)

2. Die Redim Preserve-Nummer am Ende war unsauber...
Oh, nochmals vielen Dank!

Und ein schönes Wochenende!

Gruß
Leo
« Letzte Änderung: 10.08.12 - 20:57:34 von Bruce Willis »
nobody is perfect but i'm pretty close 

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz