Autor Thema: Index einer View  (Gelesen 10342 mal)

7Stein

  • Gast
Index einer View
« 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

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Index einer View
« Antwort #1 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
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


7Stein

  • Gast
Re:Index einer View
« Antwort #2 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

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Index einer View
« Antwort #3 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?
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


7Stein

  • Gast
Re:Index einer View
« Antwort #4 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.

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Index einer View
« Antwort #5 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.
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


7Stein

  • Gast
Re:Index einer View
« Antwort #6 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.

7Stein

  • Gast
Re:Index einer View
« Antwort #7 am: 11.08.04 - 21:07:27 »
T'schuldige, der Kollege warst du selber ;D ;D

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Index einer View
« Antwort #8 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.
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


7Stein

  • Gast
Re:Index einer View
« Antwort #9 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?????????


Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Index einer View
« Antwort #10 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  ;)
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


7Stein

  • Gast
Re:Index einer View
« Antwort #11 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

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Index einer View
« Antwort #12 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
« Letzte Änderung: 12.08.04 - 15:57:25 von TMC »
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


7Stein

  • Gast
Re:Index einer View
« Antwort #13 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)

Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Index einer View
« Antwort #14 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 )
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


7Stein

  • Gast
Re:Index einer View
« Antwort #15 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??????????



7Stein

  • Gast
Re:Index einer View
« Antwort #16 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 ??? ??? ???

Offline Spalter

  • Aktives Mitglied
  • ***
  • Beiträge: 109
  • Mit der Lizenz zum Löschen!!!
Re:Index einer View
« Antwort #17 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

 ;)

7Stein

  • Gast
Re:Index einer View
« Antwort #18 am: 16.08.04 - 10:36:44 »
Ja danke, aber ich brauche auch noch HIlfe bei dem oben beschriebenen Problem


Offline TMC

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 3.660
  • Geschlecht: Männlich
  • meden agan
Re:Index einer View
« Antwort #19 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.
Matthias

A good programmer is someone who looks both ways before crossing a one-way street.


 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz