Autor Thema: GetDocumentByKey Methode liefert erst beim zweiten "QuerySave" das gewünschte Er  (Gelesen 3820 mal)

Offline Ranki

  • Junior Mitglied
  • **
  • Beiträge: 63
  • Geschlecht: Männlich
    • Ranki.de
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

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

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
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.
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline Ranki

  • Junior Mitglied
  • **
  • Beiträge: 63
  • Geschlecht: Männlich
    • Ranki.de
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

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Die Spalte, in der Du suchen willst, ist auch sicher die erste sortierte Spalte in der View?

HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline Ranki

  • Junior Mitglied
  • **
  • Beiträge: 63
  • Geschlecht: Männlich
    • Ranki.de
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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Ich habe mir jetzt einige Mühe gegeben, aber Dein Code ist dermassen schwer zu lesen - ich gebe es auf.

Dieser Fehler tritt auch nur auf, wenn der Ansichtsname (also die Variable "doc_value_gruppe")

Wie bitte? "doc_value_gruppe" ist doch kein Ansichtsname, sondern eine Laufvariable Deiner Forall-Schleife! Und so geht es weiter beim Versuch, Deinen Code nachzuvollziehen.

Bernhard

Offline gab

  • Frischling
  • *
  • Beiträge: 45
Wenn ich es richtig entziffere, wird dem Argument str_doc_value_gruppe für die GetdocumentByKey Methode kein Wert mitgegeben.

Sollte es vielleicht sowas werden?

Code
Forall X  In doc_value_gruppen
			Set view_doc_ausbilder = lookup_view.GetDocumentByKey(X ,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
				Msgbox "no document with name " + X + " located"
			End If
		End Forall

Offline Ranki

  • Junior Mitglied
  • **
  • Beiträge: 63
  • Geschlecht: Männlich
    • Ranki.de
Hallo zusammen,

sorry, wenn das so vermeintlich schlecht zu lesender Code ist ... ich versuche es etwas besser zu machen, aber wie im Post vorher schon angedeutet, bin ich da bisher unbedarft und für Tipps offen, wenn jmd. so ein Manual bzw. eine Vorlage hat.

Naja, hier mein Versuch:

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
  '
  ' Declare variables 
  Dim session As New NotesSession
  Dim db As NotesDatabase
  Dim view_Gruppenverantwortliche As NotesView
  Dim doc_currentDocument As NotesDocument
  Dim doc_Gruppenverantwortlicher As NotesDocument
  Dim str_docfld_ausbilder As String
  Dim str_viewdocfld_ausbilder As String
  Dim str_gruppe As String
  Dim docitem_gruppen As Variant
  ' Define variables
  Set db = session.CurrentDatabase
  Set view_Gruppenverantwortliche = db.GetView("_Profile_Ausbildung_byGroups")
  Set doc_currentDocument = source.Document
  ' Get documentvalues
  str_docfld_ausbilder = Source.FieldGetText("ausbilder")
  docitem_gruppen = doc_currentDocument.GetItemValue("gruppen")
  ' Action
  If docitem_gruppen(0) <> "" Then ' no group is assigned in the document therefore we do not need to check anything
      ' every group will be checked, if there is any document already existing in the view "view_Gruppenverantwortliche"
      Forall arrayvalue_gruppe In docitem_gruppen
          ' to ensure, that we use the GetDocumentByKey Function with a string
          str_gruppe = Cstr(arrayvalue_gruppe)
          ' Get document with name of the group currently handled
          Set doc_Gruppenverantwortlicher = view_Gruppenverantwortliche.GetDocumentByKey(str_gruppe,True)
          If Not doc_Gruppenverantwortlicher Is Nothing Then 
              ' Get name of Ausbilder from found document				
              str_viewdocfld_ausbilder = doc_Gruppenverantwortlicher.ausbilder(0)
              ' If a Ausbilder is found and this name is not the same as the current profile name then cancel save and provide error message
              If (str_viewdocfld_ausbilder <> "") And (str_viewdocfld_ausbilder <> str_docfld_ausbilder) Then
                  continue = False
                  Messagebox "Leider kann eine Gruppe nicht zwei Ausbildern gleichzeitig zugeordnet sein ... wurde nicht gespeichert."
              End If ' End > If (str_viewdocfld_ausbilder <> "") And (str_viewdocfld_ausbilder <> str_docfld_value_ausbilder)
          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_gruppe + " located"
          End If ' End > If Not doc_Gruppenverantwortlicher Is Nothing
      End Forall ' End > Forall arrayvalue_gruppe In docitem_value_gruppen
  End If ' End > If docitem_value_gruppen(0) <> ""
End Sub

@gab: Ich fülle die Variable an dieser Stelle, um sicher zu gehen, dass es ein String ist; hatte ich vorher auch nicht drin, aber ich bin halt schon einige Posts durch gegangen ...
Code
' to ensure, that we use the GetDocumentByKey Function with a string
str_gruppe = Cstr(arrayvalue_gruppe)

@Bernhard: Ja, auch hier sorry für die Verwirrung! Das ist natürlich ein Feldinhalt; also ein Wert, der in dem Feld "Gruppen" im Dokument ausgewählt sein kann.

Ich habe nun noch einen Screenshot von der View "_Profile_Ausbildung_byGroups.gif" und einen Screenshot vom Dokument "Profil_Ausbilder.gif" angehangen; vielleicht trägt das noch etwas mehr zum Verständnis bei.

Danke Euch für Eure Mühen!!!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Sascha, der Code wir dimmer leserlicher  :D

Aber: Wir können den mangels der eigentlichen DB und Datenbasis nicht nachvollziehen. Um nun nicht jede einzelne Zeile analysieren zu müssen, was denn unter welchen Umständen passieren könnte: Was sagt der Debugger zu den entscheidenden Variablen / Objekten an *welcher* Stelle, an der Du meinst, es klappt nicht?
Du hast offensichtlich ein logisches Problem, aber um da mitzuhelfen bei der Auflösung, brauchen wir mehr bzw. genauere Informationen.

Bernhard

Offline Ranki

  • Junior Mitglied
  • **
  • Beiträge: 63
  • Geschlecht: Männlich
    • Ranki.de
Ok, Ironie ist angekommen .... :-(

Der Debugger befüllt im ersten Step die Variable einfach nicht; es kommt nicht zum Fehler außer meinem Beschriebenen ... im zweiten Speichern befüllt er die Variable dann.

Ich habe das mal in ein Video komplett mit Debugger gepackt (mein letzter Versuch) :-)

Ich kann auch die Datenbank bereitstellen ... aber wenn Ihr schon nicht durch meinen Code blickt .... dann sehe ich schwarz ;-)

Schönen Gruß
Sascha

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Auch wenn in der Designer-Hilfe für den Parameter von GetDocumentByKey
Zitat
String (variable-length only), integer, long, single or double value, or array of string
steht, probiers mal mit einem Array anstelle des Strings str_gruppe und ohne "Exact Match".

HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline Ranki

  • Junior Mitglied
  • **
  • Beiträge: 63
  • Geschlecht: Männlich
    • Ranki.de
Hallo,

leider kein Erfolg; "Exact Match" habe ich raus genommen und dann mal einmal das array value "arrayvalue_gruppe" und einmal das array an sich "docitem_gruppen" übergeben. Leider ohne Erfolg.

Schönen Gruß
Sascha

Offline Ranki

  • Junior Mitglied
  • **
  • Beiträge: 63
  • Geschlecht: Männlich
    • Ranki.de
Hallo zusammen,

ich habe die Datenbank nun mal angehangen. Es geht sich im Speziellen um den Menüpunkt Profile > Profile Ausbildung. Dort soll es nicht möglich sein, eine Gruppe zweimal zuzuordnen.

Schönen Gruß
Sascha
« Letzte Änderung: 28.04.08 - 19:00:33 von Ranki »

Offline gab

  • Frischling
  • *
  • Beiträge: 45
Da gibt es zwei Fehler:

1.) Du vergleichst mit :FieldGetText einen 'abbreviate' Name aus dem Frontend mit einem
canonical Name in der Ansicht, d.h. du solltest den Ausbilder übers 'Backend' holen:
Code
str_docfld_ausbilder = Source.Document.GetFirstItem("Ausbilder").Values(0)

2.) Unabhängig von deinem Fehler musst du noch ausschliessen, dass das Dokument "sich selber" findet, so dass der Code
so aussieht:

Code
	If (str_viewdocfld_ausbilder <> "") And (str_viewdocfld_ausbilder <> str_docfld_ausbilder) Then
					If doc_currentDocument.UniversalID <> doc_Gruppenverantwortlicher.UniversalID Then
						continue = False
						Messagebox "Leider kann eine Gruppe nicht zwei Ausbildern gleichzeitig zugeordnet sein ... das Dokument wurde nicht gespeichert."
					End If
				End If ' End > If (str_viewdocfld_ausbilder <> "") And (str_viewdocfld_ausbilder <> str_docfld_value_ausbilder)

HTH

Gabor

EDIT: wg. den Coding Richtlinienen für LScript muss ich mal suchen...


« Letzte Änderung: 28.04.08 - 20:32:51 von gab »

Offline Ranki

  • Junior Mitglied
  • **
  • Beiträge: 63
  • Geschlecht: Männlich
    • Ranki.de
Hi Gabor,

danke für die Info; das Erste habe ich umgesetzt; leider ohne weiteren Erfolg. Das zweite habe ich, denke ich schon durch die Bedingung "str_viewdocfld_ausbilder <> str_docfld_ausbilder" umgesetzt. Wenn der Ausbilder des in der Ansicht gefundenen Dokumentes der gleiche ist, wie im aktuellen Dokument ...

Ich werde es nun so machen, dass ich Gruppennamen mit einem Unterstrich ausschließe, weil es anscheinend nur daran scheitert ...

Gerne bleibe ich für weitere Lösungsvorschläge offen.

Danke für Eure Hilfe
Sascha

Offline gab

  • Frischling
  • *
  • Beiträge: 45
Ich habe es eben nochmal mit meiner Modifikation getestet (Notes 6.5.6 Int.) .
Diese funktioniert auch bei Gruppen mit "_" im Namen und es wird beim Speichern
verhindert, dass ein Ausbilder zwei Gruppen gleichzeitig belegt.

Kann auch sein, dass ich deine Anforderung falsch verstanden habe.
Ich geb's auf :)    (die DB habe ich dir vorhin gemailt)

--
Gabor

Offline Ranki

  • Junior Mitglied
  • **
  • Beiträge: 63
  • Geschlecht: Männlich
    • Ranki.de
Hi Gabor,

hm, danke Dir; habe die DB getestet, aber bei mir funktioniert es nicht (Lotus Notes 6.5.4); mag es wirklich an den 2 kleinen Nummern liegen??? ;-(

Naja, danke Dir auf jeden Fall!!

Schönen Gruß
Sascha

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz