Domino 9 und frühere Versionen > ND6: Entwicklung

GetDocumentByKey Methode liefert erst beim zweiten "QuerySave" das gewünschte Er

(1/4) > >>

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