Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Spalter am 20.05.11 - 09:14:23

Titel: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: Spalter am 20.05.11 - 09:14:23
Hallo zusammen,

habe folgendes Problem. Ich möchte alle Felder einer Form ermitteln und in ein Excel-Sheet schreiben. Funzt soweit auch ganz gut. Ich komme leider anders nicht an die Informationen heran.

Tasächlich wird aber nur ein Bruchteil der Felder, die ich in den Eigenschaften des getriggerten Dokuments sehen kann, ausgegeben.

Das Script sieht so aus:

Set db = Session.GETDATABASE("server", "xxx.NSF")
    searchFormula$ = " Feld = ""999"" & Form = ""TTT"" "
    Set dc = db.Search(searchFormula$, Nothing, 0)
   
    MsgBox dc.Count
   
   
   
    If dc.Count = 0 Then
    MsgBox ("Ihre Auswahl erfolgte ohne Treffer")
    End If

   
       Set form = db.GetForm("TTT")
   
    Set doc = dc.GetFirstDocument
   
   
    Felder = form.Fields
   
   
   
    For i = 1 To 350   
   
        Feldstr = Felder(i)
        On Error GoTo Errhandle
       
        Set notesitem = doc.GetFirstItem(Feldstr)
        Select Case notesitem.Type
       
       
        Case 1076: field = "Authors"
        Case 1024: field = "DateTime"
        Case 1074: field = "Names"
        Case 768: field = "Number"
        Case 1075: field = "Readers"
        Case 1: field = "Rich text"
        Case 1280: field = "Text"
        Case Else
            field = "Other " & form.GetFieldType(Feldstr)
        End Select
       
        Feldwert = doc.GetItemValue(Feldstr)
       
       
        Cells(i, 4) = Feldstr
        Cells(i, 5) = field
        Cells(i, 6) = notesitem.Type
        Cells(i, 8) = Feldwert

Bin ein wenig ratlos.
Titel: Re: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: marschul am 20.05.11 - 09:37:36
Naja, mit For i=0 To 350 legst Du Dich ja auf eine bestimmte Anzahl fest. Probier doch mal For i=0 To Ubound(Felder)
Interessant dürfte es auch sein, wenn Dein Doc weniger als 351 Felder hat, denn dann überschreitest Du mit Felder(i) die Zahl der Werte im Array = Fehler "Subscript out of range" oder so ähnlich...

EDIT: Und noch etwas: Du gehst ja durch die Liste der Felder der Maske. Das Dokument kann natürlich wesentlich mehr Items haben (z.B. durch Skripte hinzugefügt). Möchtest Du alle Felder des Doks haben, benötigst Du Doc.Items
Bernhard (koehlerbv) hat irgendwo in diesem Forum übrigens mal sehr schön den Unterschied zwischen fields & items beschrieben...
Titel: Re: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: pram am 20.05.11 - 09:42:24
Hallo Spalter,

Felder von Teilmasken und berechnete Felder etc werden so nicht berücksichtigt.

Du kannst/musst ein Doc öffnen und im UI-Doc dann alle Felder durchgehen

set doc = dc.getFirstDocument()
set uiDoc = workspace.editDocument(false, doc)
' Doc im UI öffnen, dabei werden alle TM etc eingebunden
items = uiDoc.document.items
forall item in items
   if item.saveToDisk then  ' keine Berechnet-Felder nehmen
      print "Feld im Dokument: ", item.name
   end if
end forall
call uiDoc.close() ' Das UI-Doc wieder schließen


Alternativ kann man sich das mit dem UI-Doc auch sparen und alle Item im Backend-Dokument durchgehen (da bekommt man aber mehr Felder als in der Maske tatsächlich vorhanden sind)


Gruß
Roland
Titel: Re: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: Spalter am 20.05.11 - 09:44:43
Hallo Roland,

danke für die Antwort. Erde ich gleich mal ausprobieren.

Gruß
Spalter
Titel: Re: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: pram am 20.05.11 - 09:58:45
ich hab noch einen Fehler gefunden:

anstatt
set doc = dc.getFirstDocument()
set uiDoc = workspace.editDocument(false, doc)

muss es

set doc = dc.getFirstDocument()
dim emptyDoc as new NotesDocument(db)
emptyDoc.Form = doc.Form
set uiDoc = workspace.editDocument(false, emptyDoc)

heißen
Titel: Re: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: Spalter am 20.05.11 - 10:06:40
Hallo Roland,

danke für den Hinweis. Workspace funzt nicht in com.

Also müßte ich zunächst von einer anderen Notes-DB zugreifen und dann in Excel wegschreiben. Direkt als Excel-Macro funzt das nicht. Werde ich später ausprobieren. Komme leider nicht direkt an die betreffende DB ran.

Gruß
Spalter
Titel: Re: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: m3 am 20.05.11 - 10:21:26
Wenn das ganze in einem COM Umfeld läuft, willst Du ev. über NotesDocument.Items (http://publib.boulder.ibm.com/infocenter/domhelp/v8r0/index.jsp?topic=/com.ibm.designer.domino.main.doc/H_ITEMS_PROPERTY.html) iterieren.

Dann brauchst Du kein Felder-Array, für das Du die Feldnamen schon vorher wissen musst.

Und wozu das Workspace, .... Zeugs? Den Code für das Erzeugen der Collection ist eh schon da.
Titel: Re: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: pram am 20.05.11 - 10:52:27
Und wozu das Workspace, .... Zeugs? Den Code für das Erzeugen der Collection ist eh schon da.

Alternativ kann man sich das mit dem UI-Doc auch sparen und alle Item im Backend-Dokument durchgehen (da bekommt man aber mehr Felder als in der Maske tatsächlich vorhanden sind)

Man bekommt halt mit obigen "Trick" die tatsächlichen Felder in der Maske. Ansonsten würde ich auch über doc.items iterieren.

Gruß
Roland
Titel: Re: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: m3 am 20.05.11 - 11:23:04
Aber eben nicht über COM, was er anscheinend will ... ;)
Titel: Re: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: Spalter am 20.05.11 - 11:32:14
Hallo m3,

vielen Dank für Deine Antwort. Ich setze das jetzt mal um.

Gruß
Spalter
Titel: Re: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: Driri am 20.05.11 - 12:41:51
Ich würde Dir den Weg über eine NoteCollection empfehlen. Du kannst die NoteCollection so bilden, daß nur Masken enthalten sind und greifst dann über die NoteID auf das Dokument zu (ein Designelement ist letztlich auch nur ein Dokument). Dort findest Du im Item $Fields alle Feldnamen.

gekürztes Beispiel :

Zitat
Dim ws As New NotesUIWorkspace   
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim doc As NotesDocument
   Dim ncol As NotesNoteCollection   
   Dim nid As String
   Dim fieldlist As Variant
   
   Set db = session.CurrentDatabase
   Set ncol = db.CreateNoteCollection(False)
   ncol.SelectForms = True
   Call ncol.BuildCollection
   
   nid = ncol.GetFirstNoteId
   
   While Not nid="" Or Isnull(nid)
      Set doc = db.GetDocumentByID(nid)
      If Not (doc Is Nothing) Then
         If Cstr(doc.GetItemValue("$TITLE")(0)) = "<Name der Maske>" Then
            fieldlist = doc.GetItemValue("$Fields")
            Exit Sub
         End If
      End If
      nid = ncol.GetNextNoteId(nid)
   Wend


Edit : Ich habe mal gerade nachgeschaut. Da sind dann auch Felder aus eingebundenen Teilmasken enthalten. Bei berechneten Teilmasken könnte das evtl. in die Hose gehen.
Titel: Re: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: koehlerbv am 20.05.11 - 12:45:05
Aber nur, wenn die Aufgabe darin besteht, für das Frontend definierte Felder zu ermitteln. Aus dem Ursprungspost geht aber hervor, dass der Fragesteller Field mit Item verwechselt und tatsächlich alle jeweils vorhandenen Itemwerte auslesen will.

Bernhard
Titel: Re: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: Driri am 20.05.11 - 12:47:02
Ok, das hatte ich so nicht gelesen/verstanden. Danke für den Hinweis, Bernhard.  :)
Titel: Re: Form.fileds zum auslesen der Felder einer Maske
Beitrag von: Spalter am 20.05.11 - 13:24:56
Hallo Bernhard,

ich hab's tatsächlich verwechselt.

Gruß
Spalter