Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet 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.
-
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...
-
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
-
Hallo Roland,
danke für die Antwort. Erde ich gleich mal ausprobieren.
Gruß
Spalter
-
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
-
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
-
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.
-
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
-
Aber eben nicht über COM, was er anscheinend will ... ;)
-
Hallo m3,
vielen Dank für Deine Antwort. Ich setze das jetzt mal um.
Gruß
Spalter
-
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 :
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.
-
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
-
Ok, das hatte ich so nicht gelesen/verstanden. Danke für den Hinweis, Bernhard. :)
-
Hallo Bernhard,
ich hab's tatsächlich verwechselt.
Gruß
Spalter