Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: 7Stein am 10.08.04 - 17:28:53

Titel: Index einer View
Beitrag von: 7Stein am 10.08.04 - 17:28:53
Hallo zusammen,
ich bin noch relativ neu in der Programmierung mit Notes.
Ich habe bisher in delphi auf einer oracle Datenbank programmiert.
Gibt es in Notes die Möglichkeit, den Datensatzzeiger einer View auszulesen?
Hintergrund:
Ich habe ein Formular mit einer Subform, in der Positionen eines Lieferscheines angezeigt werden.
Wenn ich einen Doppelklick auf den Datensatz mache, geht ein neues Formular zum Ändern der Daten auf.
Wenn ich den Datensatz aber nur markiere und über die Action D"Datensatz Ändern" gehe, geht zuerst ein Dialog auf, über den ich den Datensatz auswählen muss.
Code

Sub Click(Source As Button)
Dim detail as NotesDocument
Dim view as NotesView
Dim view2 as NotesView
Dim sPos as String

Set view = db.GetView("(Lieferposition)")
Set view2 = db.GetView("(BestellPositionenByKey)")

sPOs = Inputbox("Welche Position bearbeiten?","Position bearbeiten", "1")
If sPos <> "" Then
  Call View2.Refresh()
  Set detail = view2.GetdocumentByKey(thisdoc.UniversalID+"-  "+sPOs)

  If detail Is Nothing Then
    Messagebox("Position nicht vorhanden")
    Exit sub
  End if

  OK = ws.Dialogbox("LieferPosEdit", True, True, False, False,   
   False,False,  "Bestellposition bearbeiten", detail)

  If OK then
    Call detail.Save(True, True)
    Call view.Refresh()
    Call uiDoc.Refresh()
   End if
End if
End sub


Vielleicht kann mir einer helfen.
Wenn ich auf das Ereignis Queryopendocument zugreifen will, welches bei einem Doppelklick ausgelöst wird, funktioniert das nicht.

Gruß 7Stein
Titel: Re:Index einer View
Beitrag von: TMC am 10.08.04 - 18:27:46
Wenn ich das richtig verstehe hast Du eine eingebettete View in einer Maske ?
Was genau willst Du nun machen?

Eine saubere Möglichkeit, um per Buttonklick auf das in der embedded View markierten Dokument Zugriff zu erhalten (z.B. die UNID) ist mir nicht bekannt in R5.

Es gibt aber Workarounds:
http://www.atnotes.de/index.php?board=7;action=display;threadid=6473
Titel: Re:Index einer View
Beitrag von: 7Stein am 10.08.04 - 21:47:10
Ja genau das ist mein Problem.
Aber warum geht das dann mit einem Doppelklick auf den Datensatz?
Kann ich nicht die Funktiion Queryopendocument aufrufen?
Das verstehe ich noch nicht so richtig.

Gruß 7Stein
Titel: Re:Index einer View
Beitrag von: TMC am 10.08.04 - 22:07:57
Da Du wohl von der relationalen DB - Seite kommst, kann vielleicht der Link für Dich interessant sein: http://www.nsftools.com/misc/WhatIsNotes.htm
Da wird ein wenig auch die Logik und der Aufbau von Notes erklärt.

Was da aber nicht erklärt wird, ist die Problematik mit embedded Views.
Gerade in R5 sind diese nicht sehr toll (programmatisch) zu bedienen. Ich vermeide die eigentlich auch immer soweit möglich.

Wäre es eine normale View, kommst Du einfach an das gerade ausgewählte Dokument (z.B. via DocumentContext Property der NotesSession-Klasse, also z.B. "Set doc = session.DocumentContext"). Oder alternativ über die UnprocessedDocuments Property der NotesDatabase - Klasse.

Was willst Du denn in dem Queryopendocument-Event machen?
Titel: Re:Index einer View
Beitrag von: 7Stein am 11.08.04 - 18:38:45
Im Queryopendocument kann ich direkt auf den mit Doppelklick angewählten Datensatz zugreifen, und das würde ich gerne auch über die Click Routine hinbekommen.
Code
Sub Queryopendocument(Source As Notesuiview, Contnue As Variant)
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Dim view As NotesView

Set uidoc = ws.CurrentDocument
Set collection As Source.Documents
Set doc = collection.GetFirstDocument()
Set view = Source.View

If uidoc.EditMode Then
  Ok = ws.DialogBox("LieferPosEdit", True, True, False, False, False, False, "Artikelposition bearbeiten", doc)
  If OK then
  Call doc.Save(True, True)
  Call view.Refresh()
End if
End if 
Continue = false
End Sub

Diese Funktion würde ich halt gerne für die embedded view aus der Hauptmaske aufrufen.
Aber das funktioniert irgendwie nicht.
Titel: Re:Index einer View
Beitrag von: TMC am 11.08.04 - 19:03:00
Ah, ok.

Problem ist eben, dass der Button (die Click-Routine) in der Maske das aktuell ausgewählte Dokument der embedded View nicht kennt. Wie oben schon geschrieben ist das ein Problem von embedded Views in R5.
Wäre der Button in einer normalen View, dann würde es wunderbar gehen.

Eine View dient übrigens lediglich dazu, Dokumente (also eine Art "Datensätze") anzuzeigen. Auf View-Events reagieren auch nur auf UI - Dinge (z.B. User öffnet Dokument, etc.) - anderweitig kannst Du den Code nicht ausführen.
Natürlich kannst Du Code auch zentral ablegen (z.B. in ScriptLibraries) und dann in den Events via Call Routine() den Code aufrufen.

Hilft aber alles nichts, weil es sich hier ja um eine eingebette View handelt - und Du eben keinen programmatischen Zugriff auf das gerade gewählte Dok hast.
Titel: Re:Index einer View
Beitrag von: 7Stein am 11.08.04 - 21:05:40
Dann kann ich also nur hingehen und in einer Inputbox den Datensatz abfragen, der geändert werden soll und dann auf das Element zugreifen????????
Aber das ist doch bei nur einem Datensatz in der embedded view eigentlich völliger Blödsinn oder????????
Was dein Kollege oben beschrieben hat habe ich nicht so ganz verstanden und den link kann ich im Büro nicht ausführen wegen irgendwelcher Zertifikate.
Titel: Re:Index einer View
Beitrag von: 7Stein am 11.08.04 - 21:07:27
T'schuldige, der Kollege warst du selber ;D ;D
Titel: Re:Index einer View
Beitrag von: TMC am 11.08.04 - 21:23:15
Dann kann ich also nur hingehen und in einer Inputbox den Datensatz abfragen, der geändert werden soll und dann auf das Element zugreifen????????
Aber das ist doch bei nur einem Datensatz in der embedded view eigentlich völliger Blödsinn oder????????

Du kannst ja vorher abfragen, wieviel Doks sich in der View befinden.

Wenn > 1, dann lässt Du die View zur Auswahl in einer Auswahlbox anzeigen, wenn = 1, dann nimmst Du das Doc, wenn < 1, dann Abbruch.
Titel: Re:Index einer View
Beitrag von: 7Stein am 11.08.04 - 22:28:31
Ja und wie frage ich das ab???????????????
Ich denke ich habe von der Maske aus keinen ZUgriff auf die embedded view.
Dann kann ich doch auch die Dokumente ( sind ja keine Datensätze oder?) nicht zählen oder?????????

Titel: Re:Index einer View
Beitrag von: TMC am 11.08.04 - 22:42:19
Ich empfehle Dir dringend, ein Buch zu lesen.

Die Bible ist gut:
http://www.atnotes.de/index.php?board=26;action=display;threadid=16569

Eigentlich blöd: Du steigst frisch in die Notes-Programmierung ein, und musst Dich gleich mal mit embedded View rumschlagen (ist nicht gerade ein Motivator).

Die View existiert in der Datenbank. Du kannst via Backend-Methoden von überall auf die View-Inhalte zugreifen. Was aktuell im Frontend selektiert ist, kennen natürlich die Backend-Methoden nicht (woher auch). Und diese View ist eben auch u.a. in einer Maske embedded. Von der Maske aus gibt es in R5 keine Möglichkeit abzufragen, was via Frontend markiert ist.
Aber im Backend hast Du immer vollen Zugriff.

Leider gibt es die EntryCount property der NotesView - Klasse erst seit R6. Die gibt Dir als Integer die Anzahl der Dokumente der View wider.

In R5 kannst Du aber z.B. die Dokumente der View in eine DocCollection geben. Dann lässt Du Dir einen collection.count zurückgeben.
Wenn Du ein Codebeispiel brauchst, dann sag Bescheid  ;)
Titel: Re:Index einer View
Beitrag von: 7Stein am 12.08.04 - 15:29:43
Ja bitte, das wäre echt nett, wenn du mir das mit einem Beispiel erklären könntest.

Naja, die Motivation wird schon noch kommen, wenn sich der Durchblick einstellt oder?????

Gruß 7Stein
Titel: Re:Index einer View
Beitrag von: TMC am 12.08.04 - 15:56:18
Die Motivation kommt dann von ganz alleine.  ;)

Hier ein Beispiel-Code. Den kopierst Du in einen Button Deiner Maske:
Zitat
Sub Click(Source As Button)
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim view As NotesView
   Dim vec As NotesViewEntryCollection
   Dim intCount As Integer
   Dim doc As NotesDocument
   Set db = session.currentdatabase
   Set view = db.GetView( "DEIN VIEWNAME" ) 'Hier Deine View eintragen
   Set vec = view.AllEntries
   
   intCount = vec.count 'Jetzt haben wir die Anzahl Doks der View in der Variable intCount
   
   Msgbox "Die View '" & view.name & "' enthält " & intCount & " Dokumente."
   
   
   Select Case intCount
   Case 1:
      '---> Die View hat nur einen Eintrag.
      Set doc = view.GetFirstDocument  
      '-- so und nun mach was mit dem Dokument :-)
     
   Case 0:
      '---> Die View ist leer.
      Msgbox "Die View ist leer ! Wir brechen ab."
      Exit Sub
   Case Else:
      '---> Die View hat mehr als 1 Eintrag !
      'Du rufst also Deine Auswahlbox auf zur Auswahl eines Dokumentes
   End Select
   
End Sub
Titel: Re:Index einer View
Beitrag von: 7Stein am 13.08.04 - 10:57:50
So, das funktioniert soweit ja schonaml, das alle Dokumente in der View gezählt werden.
Aber die Dokumente, die da gezählt werden, gehören ja nicht alle zu einem Datensatz der Maske.

In der Maske wird eine Bestellung angezeigt und in der embedded view alle Positionen zu der Bestellung. Die Positionen zu der Bestellung werden aber erst später, also nach der Abfrage, welches Dokument bearbeitet werden soll, zusammengebastelt.
So verstehe ich das zumindestens.
Ich habe also ca 18000 Dokumente gezählt, und angezeigt werden nur 6. Wie kriege ich von den sechsen heraus, ob da vielleicht nur eins vorhanden ist??????????

Code
sPos = Inputbox( "Welche Position bearbeiten?", "Position bearbeiten", "1" )   
   If spos <> "" Then
      Call view2.Refresh()
      Set detail = view2.GetDocumentByKey( thisDoc.UniversalID + "-" + sPos )
      
      If detail Is Nothing Then
         Messagebox( "Position nicht vorhanden." )
         Exit Sub
      End If   
      
      OK = ws.Dialogbox( "LieferPosEdit", True, True, False, False, False, False, "Bestellposition bearbeiten", detail )
und so wie unten beschrieben werden die Lieferpositionn ermittelt.
ParentUNID + "-" + @Text(Pos)
Titel: Re:Index einer View
Beitrag von: TMC am 13.08.04 - 13:39:44
Schau Dir in der Designerhilfe die GetAllDocumentsByKey - Methode der NotesView-Klasse an.
Damit kannst Du alle Doks in eine NotesDocumentCollection setzen, die Deinen Kriterien entsprechen.
NotesDocumentCollection.Count gibt Dir dann die Anzahl wieder.

In Deinem Beispielcode machst Du schon sowas ähnliches:

Code
Set detail = view2.GetDocumentByKey( thisDoc.UniversalID + "-" + sPos )
Titel: Re:Index einer View
Beitrag von: 7Stein am 13.08.04 - 14:07:53
Aber die Variable sPOs habe ich ja erst nach der Abfrage "Welches Dokument ich ändern will".
Dann frage ich das doch immer noch ab auch wenn nur ein Dokument in der embedded view vorhanden ist.
Und das möchte ich ja gerne ausschalten, weil es nervig ist, bei nur einer Bestellposition noch gefragt zu werden, welche Position der Bestellung ich denn nun bearbeiten will.
das ist ja fast wie Windowsprogrammierung, wenn man dreimal gefragt wird ob man ein Dokument nun wirklich löschen will oder vielleicht lieber doch nicht. ;)

Wenn ich die Dokumente doch zählen kann, auch wenn sie embedded sind, wieso kann ich dann nicht feststellen welches angewählt ist, also welches einen Rahmen( wird doch bei der Selektion angezeigt) hat oder so??????????


Titel: Re:Index einer View
Beitrag von: 7Stein am 16.08.04 - 08:31:27
Also ich habe hier im Forum gelesen, dass man dem angeklilckten Datensatz einer embedded view einen Rahmen geben kann.
Aber wie das funktioniert stand da leider nicht zu lesen.
Kann mir jemand erklären wie das funktioniert bitte.
Denn in meinem Buch "Anwendungsentwicklung unter Lotus Notes/Domino5
von Matthias Knäpper finde ich dazu keine Erklärung.

Danke nochmal für die Hilfe ??? ??? ???
Titel: Re:Index einer View
Beitrag von: Spalter am 16.08.04 - 10:31:43
Hallo 7Stein,

wenn Du ein gutes Buch suchst, ist Raimunds Buch immer die erste Wahl

Mann , Raimund
Domino Designer R5

Gruß
Spalter

 ;)
Titel: Re:Index einer View
Beitrag von: 7Stein am 16.08.04 - 10:36:44
Ja danke, aber ich brauche auch noch HIlfe bei dem oben beschriebenen Problem

Titel: Re:Index einer View
Beitrag von: TMC am 16.08.04 - 12:03:21
Aber die Variable sPOs habe ich ja erst nach der Abfrage "Welches Dokument ich ändern will". Dann frage ich das doch immer noch ab auch wenn nur ein Dokument in der embedded view vorhanden ist.

Diese Variable vielleicht. Aber nach irgendeinem Kriterium werden ausgewählte Dokumente in Deiner embedded View angezeigt. Und eben nach diesem Kriterium kannst Du Dir z.B. via GetAllDocumentsByKey die Dokumente geben lassen.

Wenn ich die Dokumente doch zählen kann, auch wenn sie embedded sind, wieso kann ich dann nicht feststellen welches angewählt ist, also welches einen Rahmen( wird doch bei der Selektion angezeigt) hat oder so??????????

Das eine ist Backend (collection.count, etc.), das andere Frontend/UI (ausgewähltes Dok in der embedded View). Aber das Thema "auf ausgewähltes Dok in der embedded View programmatisch zugreifen" ist eben in R5 nicht wirklich unterstützt. Habe ich denke ich aber oben schon erklärt.

Oben hatte ich bereits einen Link gepostet, wo auch eine Beispiel-DB ist. Aber das ist ein unsauberer / unschöner und wackeliger Weg, den ich vermeiden würde.
Titel: Re:Index einer View
Beitrag von: 7Stein am 16.08.04 - 13:09:15
Naja, dann muss ich eben auch bei einem Dokument nachfragen welches denn nun bearbeitet werden soll
Ist das Kriterium nach dem die Dokumente angezeigt werden so etwas wie ein Filter????????
Mit der Formel: ParentUNID + "-" + @Text(Pos)
werden doch die Positionen ermittelt, die nur für diesen Lieferschein gelten oder nicht?
Ich glaube so ganz geschnallt habe ich das noch nicht.
Wenn das nicht das Kriterium ist, welches könnte es denn dann sein?
Langsam krieg ich hier echt die Krise!!!!!!!!!!!!!!

Titel: Re:Index einer View
Beitrag von: TMC am 17.08.04 - 20:53:38
Ist das Kriterium nach dem die Dokumente angezeigt werden so etwas wie ein Filter????????

Wenn Du die embedded View meinst: Ja.

Sollte eigentlich in der Designerhilfe dokumentiert sein, schau da mal rein.
Titel: Re:Index einer View
Beitrag von: TMC am 18.08.04 - 23:51:45
Hier noch ein Querverweis zu einem Cross-Posting von Dir:
http://spotlight.de/zforen/lts/m/lts-1092812535-10228.html
Titel: Re:Index einer View
Beitrag von: 7Stein am 19.08.04 - 07:38:25
naja, ich dachte halt, das in einem anderen Forum jemand eine Idee hat.

T'schuldigung!!!!!

Dann werde ich die Diskussion heir mal als erledigt markieren, obwohl das Problem ja nicht gelöst ist.

Danke trotzdem für die Tipps.

7Stein
Titel: Re:Index einer View
Beitrag von: TMC am 19.08.04 - 19:41:49
Es ist lediglich mehr als fair, jeweils einen Link zum anderen Forum zu posten.....

Zitat
obwohl das Problem ja nicht gelöst ist.

Was ist denn hier noch nicht gelöst? Deine letzte Frage wurde beantwortet - und dann kam von Dir nichts mehr.
Titel: Re:Index einer View
Beitrag von: 7Stein am 20.08.04 - 07:39:19
Naja, das das eben nicht geht und mich sowas ärgert, denn ich habe mal gelernt, geht nicht gibt's nicht.

Diese Variable vielleicht. Aber nach irgendeinem Kriterium werden ausgewählte Dokumente in Deiner embedded View angezeigt. Und eben nach diesem Kriterium kannst Du Dir z.B. via GetAllDocumentsByKey die Dokumente geben lassen.

Ich kann dafür kein Kriterium finden, nachdem die Auswahl getroffen wird, welches Dokument in der embedded view angezeigt wird.
Ich eiss nur - oder habe mittlerweile festgestellt - , dass die Dokumente sortiert werden nach der Formel:

ParentUNID + "-" + @Text(Pos)

Aber die werden ja schon vorher angezeigt, bevor ich sPOs habe.
Das ist mir noch nicht so ganz klar.
Titel: Re:Index einer View
Beitrag von: TMC am 20.08.04 - 17:55:20
7Stein,

Das ist alles etwas durcheinander was Du postest - ohne klare Aufteilung / Zuteilung zu Designelementen, dadurch ist es nicht einfach, auf die schnelle zu helfen. ParentUNID ist schätzungsweise ein Feld im Dokument.
Soll kein Vorwurf sein, als Neueinsteiger in die Thematik kannst Du das auch nicht wissen. Wobei die Designerhilfe schon sehr weiterhilft.
Aus "Parent" schließe ich, dass die Dokumente Haupt- und Antwortdoks sind. Dies und vieles weitere ist aber nicht bekannt.

Vorschlag:
Mache eine Kopie der Datenbank ohne Dokumente, wirf alle Designelemente etc. raus, die wir hier nicht brauchen, und erstelle ein paar Testdokumente.
Dann zippe die DB und hänge sie hier rein.

Dann kann ich mir das ansehen.
Titel: Re:Index einer View
Beitrag von: Axel am 20.08.04 - 20:11:57
Hi,

ata hat auf seiner Webseite (http://www.anton-tauscher.de/startdyn.htm)ein schönes und aufschlussreiches Beispiel für dynamische Ansichten. Lad' dir das Teil mal runter und schau dir's an. Vielleicht wird dann einiges klarer.

DynView.zip (http://www.anton-tauscher.de/Download/DynView.zip)

Axel
Titel: Re:Index einer View
Beitrag von: TMC am 20.08.04 - 20:27:56
Danke Axel, aber darauf habe ich oben auch schon indirekt verwiesen (siehe Link im Link oben).

Ich hoffe, 7Stein hat das alles in Ruhe gelesen und sich auch Literatur bestellt, und sieht sich auch die Designer-Hilfe an.
Titel: Re:Index einer View
Beitrag von: 7Stein am 20.08.04 - 21:52:57
Habe ich allees gemacht.
AM Montag werde ich die Datenbank mal zippen und versenden.

Ich find es echt klasse, das ich euch soviel Mühe mit mir gebt.

Gruß 7STein
Titel: Re:Index einer View
Beitrag von: 7Stein am 24.08.04 - 10:48:19
Ich kann da kene Dokumente rausnehmen, aber wenn ads geht schicke ich dir meine spiele db. Aber da wäre es schon gut - glaube ich - wenn ich die heir nicht öffentlich ins Forum setze, sondern wenn ich die an deine private eMail Adresse schicken könnte.
Titel: Re:Index einer View
Beitrag von: TMC am 24.08.04 - 19:31:27
Kein Problem, eMail-Adresse steht in meinem Profil.
Titel: Re:Index einer View
Beitrag von: TMC am 25.08.04 - 20:52:18
OK, die DB ist mittlerweile angekommen (auch wenn sie 'etwas' größer war)  :)

Mittlerweile blicke ich auch was Du meinst dank der DB.

Um das ganze nochmal einzugrenzen:
Wenn in der embedded View nur 1 Dok ist, willst Du beim Klick auf den Button "Liefermenge Ändern" auch gleich das Dokument anzeigen lassen !?

Hier eine mögliche Umsetzung, kannste 1:1 in den Buhtong kopieren:
Code
Sub Click(Source As Button)
   Dim docDetail As NotesDocument      
   Dim viewForRefresh As NotesView
   Dim view2 As NotesView      
   Dim strPos As String   
   Dim coll As NotesDocumentCollection
   Dim vOK As Variant
   
   Set viewForRefresh = db.GetView( "(LieferPositionen)" )
   Set view2 = db.GetView( "(BestellPositionenByKey)")
   Call view2.Refresh()
   Set coll = view2.GetAllDocumentsByKey(thisDoc.UniversalID)
   
   Select Case coll.Count
   Case 0:
      Msgbox "Keine Position vorhanden.", 48, db.title   
   Case 1:   
      Set docDetail = coll.GetFirstDocument
   Case Else:
      strPos = Inputbox$( "Welche Position bearbeiten?", "Position bearbeiten", "1" )
      If strPos = "" Then Exit Sub
      Set docDetail = view2.GetDocumentByKey( thisDoc.UniversalID + "-" + strPos )
      If docDetail Is Nothing Then
         Messagebox( "Position nicht vorhanden." )
         Exit Sub
      End If
   End Select
   
   vOK = ws.Dialogbox( "LieferPosEdit", True, True, False, False, False, False, "Bestellposition bearbeiten", docDetail )
   
   If vOK = True Then
      Call docDetail.Save( True, True )
      Call viewForRefresh.Refresh()
      Call uiDoc.Refresh()
   End If
   
End Sub

Was mir hier noch nicht gefällt, dass zweimal ein GetDocByKey läuft, da Du die Docs eh schon in der Collection hättest. Soll aber auch nur ein Beispiel sein.

Matthias
Titel: Re:Index einer View
Beitrag von: 7Stein am 26.08.04 - 08:25:49
DANKE!!!!!!!

Das klappt ja jetzt endlich!!!!!

Ich hoffe ich war nicht zu nervig mit meiner Fragerei und meiner Meinung, dass das doch funktionieren muss.

Kann ich meinem Kollegen nach dem Urlaub doch sagen, dass das funktioniert.
 ;D freu!!!!