Domino 9 und frühere Versionen > ND8: Entwicklung

PROMPT_OKCANCELCOMBO mit variablem Inhalt

(1/3) > >>

Bruce Willis:
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

--- Ende Code ---

koehlerbv:
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

Peter Klett:
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
--- Ende Code ---

Bruce Willis:

--- Zitat von: koehlerbv am 07.08.12 - 18:16:16 ---...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
...


--- Ende Zitat ---

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
--- Ende Code ---

Bruce Willis:

--- Zitat von: Peter Klett 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...

--- Ende Zitat ---

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

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln