Autor Thema: bestimmte Felder auslesen und in neuer DB speichern  (Gelesen 3395 mal)

Offline Ralph

  • Frischling
  • *
  • Beiträge: 18
  • ohne Forum wäre ich ein nichts
Hallo Leute, bin blutiger Anfänger und hab ein großes Problem.
Ich will aus der names.nsf einige Felder wie Name, Telefon usw. auslesen und in einer anderen db speichern. Die names.nsf soll über einen Agenten regelmäßig ausgelesen werden und die Felder in der neuen db überschreiben. So das in der neuen immer aktuelle Daten sind.
danke für eure Hilfe.
Ralph

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re:bestimmte Felder auslesen und in neuer DB speichern
« Antwort #1 am: 14.10.02 - 17:11:53 »
Hallo Ralph,

das ist mit ein/zwei Sätzen nicht getan. Wenn es mir gelingt, dann stelle ich dir bis morgen einen Ansatz zusammen...

ata
Grüßle Toni :)

Offline Ralph

  • Frischling
  • *
  • Beiträge: 18
  • ohne Forum wäre ich ein nichts
Re:bestimmte Felder auslesen und in neuer DB speichern
« Antwort #2 am: 14.10.02 - 19:55:06 »
Hallo Ata,
ist spitze das du  versuchst zu helfen.
Blauäugig wie ich bin dachte ich wenn ich Spalten mit @Column in einer anderen db auslesen kann dann wird es auch mit allen Feldern eines Doc's gehen. Nachdem ich viele Handbücher gelesen habe wurde ich eines besseren belehrt.

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re:bestimmte Felder auslesen und in neuer DB speichern
« Antwort #3 am: 15.10.02 - 10:13:12 »
Hallole,

wie versprochen ein Ansatz, es gibt wie immer natürlich verschiedene Wege ans Ziel.
Ich gehe davon aus, daß du mit Version 5 arbeitest.

Grundsätzliches:

Mit @DBColumn kannst du Spalten auslesen, mit @DBLookup kannst du die Felder eines Dokumentes lesen.
Dazu benötigst du einen eindeutigen Key, der das gewünschte Dokument identifiziert, und eine Ansicht in der zu lesenden DB, die in der ersten Spalte nach diesem Key sortiert ist.

Der Key ist also wichtig, wenn du Dokumente finden willst. In der Names.nsf gibt es die Ansicht "Contacts"/"Kontakte".
In ihrem Alias heißt die Ansicht "People". Diese Ansicht ist in der ersten Spalte sortiert. In der Spaltenformnel siehst du, wie der Key (1. Spalte) gebildet wird.


KeyName := @Name([CN]; @UserName);
server := "";
OffPhoneNo := @DbLookup( "" : "NoCache" ; server : "names.nsf" ; "People" ; KeyName ; "OfficePhoneNumber" );

Diese Formel liest dir dein Bürotelefonnummer aus deinem lokalen Adressbuch...
Entspprechend kannst du so auch Werte aus fernen Datenbanken lesen => Server eingeben...

Das Ding hat einen Haken: Du kannst doppelte Namenseinträge haben => Notes nimmt den ersten...
Wenn du keine doppelten Einträge hast, könntest du mit einem flauen Gefühl im Magen damit glücklich werden...

Der eindeuige Weg führt über LotusScript. Hier gibt es den Weg über die UniversalID eines Dokumentes Zugriff zu erhalten.
Du mußt also bei der Anlage deiner Dokumente darauf achten, die UNID des Originaldokumentes deines Adressbuches mitzunehmen.
In der Regel legt man dazu ein Feld namens "ParDocID" und speichert den Wert dort.
Zur Überprüfung, ob das Adressdokument bereits vorhanden ist, benötigst du noch eine Ansicht aller Personnendokumente, in der ersten Spalte sortiert nach ParDocID.

' # #### Übernahme von Adressen #####
' # Denkbar in einer Ansichts-Aktion oder einem Button...
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim dbThis As NotesDatabase
Dim dbNAB As NotesDatabase
Dim vwParDocID As NotesView
Dim dc As NotesDocumentCollection
Dim docNew As NotesDocument
Dim i As Integer

Set dbThis = session.CurrentDatabase
Set vwParDocID = dbThis.getView("PersonByParDocId")
Call vwParDocID.Refresh
Set dbNAB = session.GetDatabase("","names.nsf")
Set dc = ws.PickListCollection(1,True,"","names.nsf","People","Auswahl der Dokumente","Wählen Sie die gewünschten Dokumente")
If dc.Count > 0 Then
   Set docNAB = dc.GetFirstDocument
   For i = 1 To dc.Count
      ' # Überprüfen. ob es dieses Dokument bereits gibt
      Set docNew = vwParDocID.GetDocumentByKey(docNAB.UniversalID)
      If docNew Is Nothing Then
         ' # Die Adresse ist noch nicht vorhanden
         Set docNew = dbThis.CreateDocument
         With docNew
            .Form = "Person"
            .ParDocID = docNAB.UniversalID
   .LastName = docNAB.LastName
   .FirstName = docNAB.FirstName
   .OfficePhoneNumber = docNAB.OfficePhoneNumber
   ' # ... die gewünschten Felder eben...
   Call .Save(True, True)
         End With      
      Else
         ' # Die Adresse gibt es bereits - überspringen
      End If         
      Set docNAB = dc.GetNextDocument(docNAB)
   Next      
Else
   ' # Es wurden keine Dokumente gewählt      
End If
' # #### ENDE: Übernahme von Adressen #####


' # #### Synchronisation der Dokumente #######
Dim session As New NotesSession
Dim dbThis As NotesDatabase
Dim dbNAB As NotesDatabase
Dim dc As NotesDocumentCollection
Dim docNAB As NotesDocument
Dim doc As NotesDocument
Dim sUNID As String
Dim dt As New NotesDateTime("01/01/1990")
Dim sSearch As String
Dim i as Integer

Set dbThis = session.CurrentDatabase
Set dbNAB = session.GetDatabase("","names.nsf") ' # lokales Adressbuch
' # Ich gehe davon aus, daß deine Personendokumente mit einer Maske namens "person" erstellt wurden
' # ... In der Maske gibt es ein Feld "ParDocID" mit der UNID des Original-Adress-Dokumentes
' # ... Die Feldnamen aus dem Original-Adressdokument wurden 1:1 in der DB übernommen

sSearch = |SELECT Form="Person"| ' # Suchformel bilden
Set dc = dbThis.Search(sSearch,dt,0) ' # alle Personendokumente in eine Collection holen...
If dc.Count > 0 Then
   ' # Personendokumente gefunden
   Set doc = dc.GetFirstDocument
   For i = 1 to dc.Count
      sUNID = doc.ParDocID(0) ' # die UNID des Adressdokumentes lesen
      Set docNAB = dbNAB.GetDocumentByUNID(sUNID)
      If Not docNAB Is Nothing Then
         doc.OfficePhoneNumber = docNAB.OfficePhoneNumber  ' # Synchronisation der Büro-Telefonnummer
        ' # ...
      End If
      Set doc = dc.GetNextDocument(doc)
   Next
Else
   ' # Keine Personen-Dokumente gefunden
End If
Grüßle Toni :)

Offline Ralph

  • Frischling
  • *
  • Beiträge: 18
  • ohne Forum wäre ich ein nichts
Re:bestimmte Felder auslesen und in neuer DB speichern
« Antwort #4 am: 16.10.02 - 16:08:56 »
Danke Ata,
habe ich versucht aber hat nicht geklappt. Es kommt immer zu einer Fehlermeldung : Objekt Variable not set !

Ich hab jetzt den ganzen Tag alles mögliche probiert und bin zu keinen Ergebnis gekommen.
Als erstes hab ich eine neue db angelegt: eine Maske mit den Feldnamen der names.nsf und das Feld ParDocID, dann eine Sicht mit einer Aktion, darauf dein Skript "Übernahme der Adressen" und auf eine andere Aktion das Skript "Syncronisation".
Probleme hab ich mit der unId der orginal ID, das einzige was mir eingefallen ist war in der Sicht der names.nsf eine Spalte an erste stelle zu setzen und im Formelfenster " @text(DocumentUniqueID) anzugeben, er zeigt mir auch die ID an aber ich denke das ist nicht der richtige Weg.

Das klingt sicher alles sehr DAU mäßig, ich wurde meinen Weiterbildungsträger voll ist kalte Wasser geworfen. Aber man hört ja nie auf zu lernen.

gruß Ralph ???

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re:bestimmte Felder auslesen und in neuer DB speichern
« Antwort #5 am: 16.10.02 - 17:32:26 »
Hallo Ralph,

nur die Ruhe - durch Fehler lernt man am meisten, auch wenn das zunächst erst mal frustet.

Stelle erst mal fest, wo die Fehlermeldung erzeugt wird. Dazu aktivierst du den Debugger, lässt den Code laufen und schaust dann wo er aussteigt.
Die Fehlermeldung bedeutet, daß er ein Notesobjekt nicht initialisieren konnte - also ein Dokument, eine Ansicht, eine Datenbank, eine Collection oder etwas derartiges...

Gib mir Bescheid, wenn du das Objekt des Fehlers gefunden hast.

Du kannst mir die DB aber auch zumailen - am Besten gezippt - siehe Profil

ata
Grüßle Toni :)

Offline Ralph

  • Frischling
  • *
  • Beiträge: 18
  • ohne Forum wäre ich ein nichts
Re:bestimmte Felder auslesen und in neuer DB speichern
« Antwort #6 am: 18.10.02 - 13:10:07 »
Hi Ata,
Danke für deine Tip's von gestern, jetzt klappt alles
Die Übernahme der Daten hab ich mit doc.Search und SELECT
hinbekommen. ;D

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz