Domino 9 und frühere Versionen > ND6: Entwicklung
GetDocumentByKey Methode liefert erst beim zweiten "QuerySave" das gewünschte Er
Ranki:
Hallo zusammen,
ich weiß leider nicht mehr weiter. Habe einige Sachen hier zu der Methode durchprobiert, aber leider brachte weder ein "view.refresh", ein "True" um den richtigen Treffer zu erzwingen, noch definitiv einen String als GetDocumentByKey Variable zu verwenden oder Shift + F9 ...
Der Hintergrund:
Ich habe ein Dokument pro Ausbilder in einer Urlaubsdatenbank. In diesem Dokument werden dem Ausbilder bestimmte Gruppen zugeordnet (Feld mit Checkboxen). Ich möchte mit dem QuerySave nun prüfen, ob eine der ausgewählten Gruppen schon eine Zuordnung hat. Dazu gibt es die Ansicht "_Profile_Ausbildung_byGroups", die 3 Spalten enthält:
Berufsgruppe (Standard, Sortiert, aufsteigend)
AusbilderIn (Standard, nicht sortiert)
Profil erstellt (Standard, nicht sortiert)
Querysave:
--- Code: ---Sub Querysave(Source As Notesuidocument, Continue As Variant)
' Checks the view "_Profile_Ausbildung_byGroups", if for one of the selected groups there
' is already a trainer assigned
Dim session As New NotesSession
Dim db As NotesDatabase
Dim lookup_view As NotesView
Dim view_doc_ausbilder As NotesDocument
Dim doc_value_ausbilder As String
Dim view_value_ausbilder As String
Dim str_doc_value_gruppe As String
Set db = session.CurrentDatabase
Set lookup_view = db.GetView("_Profile_Ausbildung_byGroups")
Set doc = source.Document
doc_value_ausbilder = Source.FieldGetText("ausbilder")
doc_value_gruppen = doc.GetItemValue("gruppen")
If doc_value_gruppen(0) <> "" Then ' no group is assigned in the document therefore we do not need to check anything
Forall doc_value_gruppe In doc_value_gruppen
' to ensure, that we use the GetDocumentByKey Function with a string
str_doc_value_gruppe = Cstr(doc_value_gruppe)
' Get view with name of the group currently handled
Set view_doc_ausbilder = lookup_view.GetDocumentByKey(str_doc_value_gruppe,True)
If Not view_doc_ausbilder Is Nothing Then
view_value_ausbilder = view_doc_ausbilder.ausbilder(0)
If (view_value_ausbilder <> "") And (view_value_ausbilder <> doc_value_ausbilder) Then
continue = False
Messagebox "Leider kann eine Gruppe ... das Dokument wurde nicht gespeichert."
End If
Else
' view couldn't be located; means either the view does not exist or the viewdocument cannot be found
' (happend during development, if only one group is assigned and the document is saved the first time)
Msgbox "view_doc_ausbilder couldn't be located"
End If
End Forall
End If
End Sub
--- Ende Code ---
Das Fehlerbild:
Wenn ich das Dokument abspeichere ohne eine einzige Gruppe ausgewählt zu haben dann läuft alles super durch und er checkt auch, dass keine Gruppe ausgewählt ist. Sobald ich nun eine einzige Gruppe auswähle und speichere wird die Variable 'view_doc_ausbilder' nicht gefüllt und meine jetzt eingebaute Fehlermeldung erscheint. Sobald ich unmittelbar danach nochmal abspeicher, wird die Variable ordnungsgemäß gefunden.
Ich wäre Euch für jeden heißen Tipp dankbar, da ich echt nicht mehr weiß, woran das noch liegen kann.
Danke und schönen Gruß
Sascha
m3:
1) Eine Variable, die ein Objekt vom Type NotesDocument beinhalten soll "view_..." zu nennen trägt nicht zur Lesbarkeit des Codes bei. Zumindest bei mir nicht.
2) Wenn "view_doc_ausbilder" "Nothing" beinhaltet, dann konnte er nicht den View nicht finden, sondern im View keine Dokumente. Ein kleiner, aber feiner Unterschied, den man aber in der Designer-Hilfe nachlesen kann.
Wenn er die View nicht finden konnte, wäre "lookup_view" gleich Nothing.
3) Du willst "Option Declare" verwenden!!!
Dann wäre Dir nämlich aufgefallen, dass Du zu beginn "doc_value_gruppen" deklarierst, dann aber bei GetDocumentsByKey die undefinierte Variable "doc_value_gruppe" (ohne "n" am Schluss) verwendest.
Ranki:
Hallo,
danke Dir erstmal für die Antwort. Zu den Punkten:
1) Da stimme ich Dir zu; mein Variablennaming ist ziemlich unstrukturiert; ich stolper manchmal selber darüber. Aktuell ist das nur eine logische Benamung. Ich kann aber verstehen, wenn das Probleme bereitet. Bin gerne für Vorschläge zu haben; ich habe mal gelesen, dass jeder eine andere Ansicht dazu hat (was ein einheitliches Naming angeht), aber konkret etwas gesehen habe ich noch nicht.
2. Ok, ja; das habe ich geändert. Du hast vollkommen recht. War ein Denkfehler; wahrscheinlich weil zu spät. Im Grunde war ich mir darüber aber im Klaren.
3. Option declare ist nun drin und wird Pflichtprogramm :-)
Allerdings lag es nicht daran; doc_value_gruppe wird in der Forall Schleife gefüllt. Ich nehme also aus der Gesamtheit der Gruppeneinträge doc_value_gruppen jeweils eine doc_value_gruppe heraus ...
4. Wenn ein genereller Fehler vorliegen würde, dann dürfte es ja garnicht funktionieren; meiner Ansicht nach. Aber sobald ich ein zweites Mal speicher funktioniert es einwandfrei ... das ist ja die Krux. Ich dachte zuerst es wäre ein Refresh Problem, aber die View wird ja zu dem Zeitpunkt garnicht geändert .... und einen Refresh hatte ich ja auch schon drin ...
Hier noch der declarte Code:
--- Code: ---Sub Querysave(Source As Notesuidocument, Continue As Variant)
' Checks the view "_Profile_Ausbildung_byGroups", if for one of the selected groups there
' is already a trainer assigned
Dim session As New NotesSession
Dim db As NotesDatabase
Dim lookup_view As NotesView
Dim doc As NotesDocument
Dim view_doc_ausbilder As NotesDocument
Dim doc_value_ausbilder As String
Dim view_value_ausbilder As String
Dim str_doc_value_gruppe As String
Dim doc_value_gruppen As Variant
Set db = session.CurrentDatabase
Set lookup_view = db.GetView("_Profile_Ausbildung_byGroups")
Set doc = source.Document
doc_value_ausbilder = Source.FieldGetText("ausbilder")
doc_value_gruppen = doc.GetItemValue("gruppen")
If doc_value_gruppen(0) <> "" Then ' no group is assigned in the document therefore we do not need to check anything
Forall doc_value_gruppe In doc_value_gruppen
' to ensure, that we use the GetDocumentByKey Function with a string str_doc_value_gruppe = Cstr(doc_value_gruppe)
' Get document with name of the group currently handled
Set view_doc_ausbilder = lookup_view.GetDocumentByKey(str_doc_value_gruppe,True)
If Not view_doc_ausbilder Is Nothing Then
view_value_ausbilder = view_doc_ausbilder.ausbilder(0)
If (view_value_ausbilder <> "") And (view_value_ausbilder <> doc_value_ausbilder) Then
continue = False
Messagebox "Leider kann eine Gruppe nicht zwei Ausbildern gleichzeitig zugeordnet sein ... das Dokument wurde nicht gespeichert."
End If
Else
' document couldn't be located; means either the document does not exist or the document cannot be found
' (happend during development, if only one group is assigned and the document is saved the first time)
Msgbox "no document with name " + str_doc_value_gruppe + " located"
End If
End Forall
End If
End Sub
--- Ende Code ---
m3:
Die Spalte, in der Du suchen willst, ist auch sicher die erste sortierte Spalte in der View?
Ranki:
Jepp! Dreimal geprüft; vor allem nachdem ich die anderen Forenbeiträge durchgegangen bin .... und ich denke, sonst würde es ja nicht beim zweiten Speichern klappen.
Gerade ist mir noch etwas aufgefallen:
Dieser Fehler tritt auch nur auf, wenn der Ansichtsname (also die Variable "doc_value_gruppe") beim ersten Speichern mit einem Unterstrich gefüllt ist. Egal, ob es der erste Wert in "doc_value_gruppen" ist oder an einer anderen Stelle.
Beispiel:
Im Dokument sind bei der Selektion die Gruppen CTA_2204 und IFK2006 ausgewählt. Beim ersten Querysave wird nur die CTA_2004 angemeckert. Nachdem nochmal gespeichert wurde (also zweiter Querysave) gehen beide durch.
Danke auf jeden Fall für die Mühen!
Schönen Gruß
Sascha
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln