Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: werner16 am 15.09.11 - 08:43:49

Titel: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: werner16 am 15.09.11 - 08:43:49
Hallo,

ich möchte mittels eines Agenten aus allen Dokumenten in einer DB ein Feld auslesen.

Jetzt habe ich ein Script da mir soweit auch alle Dokumente durchläuft, aber wie bzw. mit
welchem Befehl kann ich jetzt aus dem aktuellen Dokument ein Feld auslesen?

Der Befehl "mailfeld = uidoc.FieldGetText("email1")" funktioniert jedenfalls nicht!


Hier das Script:

Option Public
Use "MyScripts"
Sub Initialize
   
   Err=0
   On Error Resume Next
   MessageBox "START",1, ""
   Dim session As New NotesSession 
   Dim db As NotesDatabase 
   Dim collection As NotesDocumentCollection 
   Dim doc As NotesDocument 
   Set db = session.CurrentDatabase 
   Set collection = db.AllDocuments 

   For i = 1 To collection.Count
      Set doc = collection.GetNthDocument( i ) 
   
      mailfeld = uidoc.FieldGetText("email1")
      
      MessageBox "Die eMail Adresse Nr. " & i & " lautet " & mailfeld & " und ist vorhanden",1, " E-Mail"
   Next

   MessageBox "ENDE!",1, ""
   Exit Sub
   
End Sub


Gruß und Dank im voraus,
Werner
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: Christian Kröll am 15.09.11 - 08:53:09
Guten Morgen Werner,

erst set doc und dann aber uidoc?

Grüße Christian
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: DAU-in am 15.09.11 - 08:55:48
doc.feldname(0)

doc.getItemvalue("Feldname")(0)
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: Christian Kröll am 15.09.11 - 08:57:53
genau das war gemeint...
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: werner16 am 15.09.11 - 09:12:29
Hi,

ok stehe jetzt auf'm Schlauch, sorry.
Bin am herumtesten, aber es will noch nicht so!  ???

Gruß,
Werner



Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: Schnubbel am 15.09.11 - 09:19:05
So würde ich es machen:

Option Public
Use "MyScripts"
Sub Initialize
  
   Err=0
   On Error Resume Next
   MessageBox "START",1, ""
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim collection As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim mailfeld as Variant
   Set db = session.CurrentDatabase
   Set collection = db.AllDocuments

   For i = 1 To collection.Count
      Set doc = collection.GetNthDocument( i )
  
      mailfeld = doc.GetItemValue("email1")

            
      MessageBox "Die eMail Adresse Nr. " & i & " lautet " & mailfeld(0) & " und ist vorhanden",1, " E-Mail"
   Next

   MessageBox "ENDE!",1, ""
   Exit Sub
  
End Sub
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: werner16 am 15.09.11 - 09:29:28
Hallo Schnubbel,

Dein Script funktioniert, muss es mir nach mal in Ruhe ansehen um es zu verstehen,
habe jetzt leider einen Termin, aber melde mich hier nochmal.

Danke erst mal an alle.  :)

Gruß,
Werner
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: ata am 15.09.11 - 09:31:18
... uidoc greift auf ein im Frontend geöffnetes Dokument zu - du liest aber per Backend - das kann also nicht gehen...

Toni
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: Tode am 15.09.11 - 09:32:07
WICHTIGER TIPP: IMMER Option Declare hinzufügen... (kann man auch einstellen, dass das automatisch hinzugefügt wird).

1. wird man gezwungen, alle Variablen, die man verwendet zu deklarieren
2. Hättest Du sofort gemerkt, dass uidoc <> doc (weil uidoc eben NICHT deklariert wurde...
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: DAU-in am 15.09.11 - 09:50:41
Was machst du, wenn die Mailadresse nict auf (0), sondern auf (1) steht?

Und zu deiner Iteration:

http://www-10.lotus.com/ldd/bpmpblog.nsf/dx/finding-docs1

das ist häufig besser aus Performancegründen

Set collection = db.AllDocuments
set doc = collection.getfirstdocument

For i = 1 To collection.Count
'tu was
set doc = collection.getnextDocment(doc)

Next


edith:
Eknori sagt:

bei View und ViewEntryCollection kannst du das nehmen, nur bei Collection nicht
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: marschul am 15.09.11 - 09:56:10
Noch'n Tipp:

...
For i = 1 To collection.Count
 Set doc = collection.GetNthDocument( i ) 
...
 MessageBox "Die eMail Adresse Nr. " & i & " lautet " & mailfeld & " und ist vorhanden",1, " E-Mail"
Next
...

Dann hoffe mal, dass da nicht tausende Mails enthalten sind, sonst bekommst Du Probleme mit Deinem Klick-Finger  ;)

Und (zwischenzeitlich gibt's den Hinweis bereits):
.getnthdocument geht anfangs schnell, wird aber immer langsamer, da Notes bei jedem Schleifendurchlauf die Collection bis zum Wert durchzählt, deshalb besser z.B.

Code
set doc = collection.getfirstdocument
do until doc is nothing
...Dein Code...
set doc = collection.getnextdocument (doc)
loop
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: werner16 am 15.09.11 - 10:24:36
Hallo,

so jetzt, viele Infos, gehen wir das mal durch:

1)
mailfeld = doc.GetItemValue("email1")
MessageBox "Die eMail Adresse Nr. " & i & " lautet " & mailfeld(0) & " und ist vorhanden",1, " E-Mail"

Wenn ich mit  "mailfeld = doc.GetItemValue("email1")" die Variable deklariere wie so muss ich dann
in der Weiterverarbeitung mit "mailfeld(0)" und nicht "mailfeld" arbeiten?


2)
>>... uidoc greift auf ein im Frontend geöffnetes Dokument zu - du liest aber per Backend - das kann also nicht gehen...

OK, habe ich kapiert!


3)
>> WICHTIGER TIPP: IMMER Option Declare hinzufügen...

stimmt!  ;)


4)
>> Was machst du, wenn die Mailadresse nicht auf (0), sondern auf (1) steht?

Siehe Punkt ein wo ist der Unterschied bei (0) und (1)?  ???


5)
>> Dann hoffe mal, dass da nicht tausende Mails enthalten sind, sonst bekommst Du Probleme mit Deinem Klick-Finger

In der Testdatenbank sind jetzt erst mal nur 9 Dokumente, bzw. zum Testen kann ich ja auch den
Schleifenzähler auf z.B. 9 reduzieren.
In der Endversion fliegt der MessageBox raus, war jetzt nur um zu sehen ob es fuktioniert.


Gruß,
Werner


Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: Schnubbel am 15.09.11 - 10:36:05
1)
Das GetItemValue liefert nunmal immer ein Array zurück. (Steht so auch in der Hilfe) Und du willst ja das erste Element haben aus dem Array , also mailfeld(0). Zu dem was DAU-in gesagt (was man macht wenn es in (1) liegt) hat, kann ich dir leider nichts sagen, bin aber auch gespannt auf eine/dessen Antwort. (wann das denn überhaupt passieren kann)

Thorsten








Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: ascabg am 15.09.11 - 10:37:12
Hallo,

Wenn Du mit doc.GetItemValue(...) Werte aus dem betreffenden Feld ausliest, wird Dir als Ergebnis immer ein Array zurueckgeliefert.
Daher sollte Deine Variable, in die Du den Wert einlesen moechteste immer als Variant deklariert werden.


Andreas
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: ascabg am 15.09.11 - 10:39:20
@Schnubbel (Thorsten)
Zitat
Zu dem was DAU-in gesagt (was man macht wenn es in (1) liegt) hat, kann ich dir leider nichts sagen, bin aber auch gespannt auf eine/dessen Antwort. (wann das denn überhaupt passieren kann)
Pruefunden einbauen.  ;)


Andreas
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: Schnubbel am 15.09.11 - 10:47:54
Selbstverständlich sind Prüfungen sinnvoll, das beantwortet aber nicht die Frage, warum denn der Wert in (1) aufeinmal liegen soll. Wann passiert das? Mir ist das (noch) nicht untergekommen.
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: koehlerbv am 15.09.11 - 10:52:39
Warum sollte das denn nicht passieren können? Du scheinst nur an den ganz simplen Fall zu denken, dass es ein im Frontend existierendes Feld gibt, dass keine Mehrfachwerte erlaubt. Aber soooo simpel ist die Welt des Programmierers ja nun bei weitem nicht!  ;D

Bernhard
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: Schnubbel am 15.09.11 - 11:09:45
Hallo Bernhard,

ich empfinde eine gewisse Überheblichkeit in deinen Worten. Aber da kann ich mich ja auch täuschen.

Also wenn ich so ein Script wie Werner erstelle, dann weiß ich doch, dass in dem Feld "email1" nur eine E-Mail-Adresse stehen kann. Dafür habe ich doch beim Erstellen des Wertes bereits gesorgt, dass kein Nutzer dort 2 Email-Adressen oder sonstigen Müll hinterlegen kann.

Ich verstand den Einwand von DAU-in so, dass durch irgendeinen Zufall / oder ähnliches Ereignis der Wert in (1) liegt und darauf zielte mein Nachfragen ab. Natürlich können, dann auch Werte in (1) (2) etc. liegen, aber dann ist das von mir als - simpler - Programmierer gewollt.

Thorsten



Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: ascabg am 15.09.11 - 11:12:36
Und was ist, wenn Du das Script in einer datenbank erstellen sollst, die eben NICHT von Dir erstellt wurde.
Woher willst Du in einem solchen Fall wissen, das die Programmierer eben genauso denken wie Du.


Andreas
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: klaussal am 15.09.11 - 11:13:49
Zitat
Aber da kann ich mich ja auch täuschen.

Du täuschst Dich.

In der Programmierung sollte man nie "nie" sagen. Irgendwann tritt's doch ein. Und darauf zielte Bernhard ab.
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: DAU-in am 15.09.11 - 11:26:32
ich würde mindestens bei


mailfeld =  Fulltrim(doc.GetItemValue("email1"))
   
      machen (so heißt das doch? sieh nochmals in der Hilfe nach!)

und bei der weiteren Verarbeitung im Kopf haben, dass es Mehrfachwerte sein können, und dazwischen auch Leerwerte.

und außderdem: hasItem wird häufig unterschätzt
und frag die collection ab ob sie da ist
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: marschul am 15.09.11 - 13:24:47
und frag die collection ab ob sie da ist

Die ist nach einem Set collection =
immer da, hat nur mglw. die Eigenschaft .count = 0
Mit der Variante
Code
set doc = collection.getfirstdocument
do until doc is nothing
...
wird keine weitere Abfrage benötigt, denn wenn die Coll leer ist, ist doc nach dem set auch nothing und das Programm geht gar nicht erst in die Schleife.
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: DAU-in am 15.09.11 - 15:17:44

Die ist nach einem Set collection =
immer da, hat nur mglw. die Eigenschaft .count = 0
Mit der Variante
Code
set doc = collection.getfirstdocument
do until doc is nothing
...

ich hab schon Pferde kotzen sehen ....

ich hab schon so oft ein 'Objektvariable not set' bekommen an Stellen, an denen ich mir beim Programmieren gaaaanz sicher war, da kann nix knallen
Titel: Re: Mit Agent Felder aus Dokumenten auslesen
Beitrag von: ata am 15.09.11 - 15:27:45
... dem kann ich mich nur anschließen - erstmal sauber validieren - das erspart viel Ärger... ;)