Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: bikerboy am 14.09.06 - 17:38:16

Titel: Agenten für Listen
Beitrag von: bikerboy am 14.09.06 - 17:38:16
Hallo,

nach langer Zeit bin ich wieder zurück und hoffe ihr könnt/wollt mir weiterhelfen.

Ich versuche gerade einen Agenten zu schreiben, der folgende Dinge machen soll.

-in einen Datensatz ein Feld auslesen.
   - in diesem Feld ist eine Liste die Informationen enthält, anhand der er neue Dokumente erstellen soll

( Ich bitte euch um Hilfe, da die Hilfe in Notes mich leider nicht weiterbringt, weil es keine Liste abarbeiten kann)

Ich hoffe ich habe mich klar artikuliert und ihr könnt mir weiterhelfen.

Ich bedanke mich schon mal im Vorraus.

Gruss Robert

Titel: Re: Agenten für Listen
Beitrag von: koehlerbv am 14.09.06 - 17:52:16
Ich für meinen Teil verstehe nicht, was Deine Frage ist. Und wieso sollte die DesignerHelp keine Informationen zu Listen enthalten?
Was meinst Du mit "Datensatz"?

Bernhard
Titel: Re: Agenten für Listen
Beitrag von: flaite am 14.09.06 - 17:56:54
Deine Begriffe wirken auf mich auch nicht so sauber. Das geht mir auch oft so, erschwert aber die Suche.
Listen sind in Notes eine Map-Datenstruktur. Du meinst Mehrfachwertefelder.
Am elegantesten zur Abarbeitung ist die Verbindung.
doc.getItemValue (feldName) und eine forall Schleife.
Fang einfach mal an und poste deinen Code.
Titel: Re: Agenten für Listen
Beitrag von: bikerboy am 14.09.06 - 17:59:16
@koehlerbv:

Also in einem Feld steht eine Liste. Jeder Eintrag dieser Liste soll durch den Agenten in einen eigenen Datensatz verwandelt werden. Also 1. Eintrag zu einem eigenenDatensatz
                                                          2. Eintrag zu einem eigenen Datensatz.


Ich weiss nicht ob die die Pumpe von Infoserv kennst, da heisst es Multifield. Diese Funktion brauche ich in einem Agenten.


Hoffe es ist nun klarer
Titel: Re: Agenten für Listen
Beitrag von: koehlerbv am 14.09.06 - 18:05:48
Also, Datensätze kennt Notes nicht. Du meinst sicherlich Dokumente.

Ein multivalue field (oder auch ein Array) kannst Du abarbeiten mit
- einer Forall-Schleife
- oder einer Schleife von Lbound bis Ubound des Arrays.

Bernhard
Titel: Re: Agenten für Listen
Beitrag von: bikerboy am 27.09.06 - 10:06:32
@koehlerbv

So habe nun ne Woche script aus nem Reader der Firma Herdt gebüffelt und kann nun die aufgabe lösen mit ner For-Schleife wie du schon gesagt hast.

Aber eine Frage habe ich noch.

Die Liste die ich bekomme ist ja ein langer String mit verschiedenen Seperatoren. Ist es sehr Laufzeit aufwendig wenn ich nun 5 Evaluates laufen lassen, damit ich ein @word laufen lassen kann, oder gibt es einen equivalenten Befehl in Script?

So werde es nun ausprobieren und hoffe , dass mein PC nicht gleich in die Knie geht
Titel: Re: Agenten für Listen
Beitrag von: Untitled am 27.09.06 - 11:10:18
Das Script-Equivalent gibt es: StrToken

Es gibt übrigens häufig eine sogenannte "Language cross-reference" in der Hilfe, irgendwo unter der Befehlsbeschreibung. Da werden dann die selben Befehle in den anderen Sprachen, falls vorhanden aufgelistet.

Grüsse
Moritz
Titel: Re: Agenten für Listen
Beitrag von: bikerboy am 27.09.06 - 13:04:08
@Untitled

Danke für den Tip haben sich gleich  mehere Anschlussfragen, damit geklärt.
Habt ihr am Ende Interesse an dem fertigen Code?

Man sollte so ne Art Fundgrube erstellen, wo jeder seinen fertigen Code präsentiert. So kann man sich immer schön umgucken was es gibt. Und braucht nicht ewig selber probieren.
Titel: Re: Agenten für Listen
Beitrag von: bikerboy am 27.09.06 - 14:49:04
So habe nun etwwas vollbracht,aber ich habe noch einen Fehler den ich aber nicht finde, deshalb bitte ich euch kurz um unterstützung

Code
Dim session As NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim docNew As NotesDocument	



Code
Sub Initialize
	
	
	Dim view As NotesView
	Dim collection As NotesDocumentCollection
	Dim varList As Variant
	Dim i As Integer
	
	Set session = New NotesSession
	Set db = session.CurrentDatabase
	Set view = db.GetView( "all")
	Set collection = db.UnprocessedDocuments
	
	For i = 1 To collection.Count
		Set doc = collection.GetNThDocument(i)
		varList = doc.list
		Call newDocument
		
	Next
	
End Sub


Code
Function newDocument
	
	Stop
	
	Dim varList As Variant
	Dim i As Integer
	
	Dim personName As String
	Dim payableDate As String
	Dim kindofCost As String
	Dim repeat As String
	Dim amount As String
	Dim once As String
	Dim lifetime As String
	Dim del1 As String
	Dim wert As Integer
	
	wert = Ubound(varList)
	del1 = "~"
	
	For i = 1 To wert
		Set docNew = db.CreateDocument
		docNew.personName = Strtoken("varList",del1,1)
		docNew.payableDate = Strtoken("varList",del1,2)
		docNew.kindofCost = Strtoken("varList",del1,3)
		docNew.repeat = Strtoken("varList",del1,4)
		docNew.amount = Strtoken("varList",del1,5)
		docNew.once = Strtoken("varList",del1,6)
		docNew.lifetime = Strtoken("varList",del1,7)
		
	Next
	
	
End Function


So ich hoffe ihr könnt mir sagen warum er mir nen type mismatch alls Fehler gibt
Titel: Re: Agenten für Listen
Beitrag von: bikerboy am 27.09.06 - 14:53:42
das stop müsst ihr kurz ignorieren , dass hatte ich nur gesetzt , damit der Debugger anhält
Titel: Re: Agenten für Listen
Beitrag von: m3 am 27.09.06 - 14:57:16
Möchtest Du die neu angelegten Dokumente nicht auch speichern?
Oder wolltest Du nur den Server beschäftigen? ;)
Titel: Re: Agenten für Listen
Beitrag von: DerAndre am 27.09.06 - 14:59:48
Und mit einem Errorhandle könnte man die Zeile finden, wo es knallt.
Titel: Re: Agenten für Listen
Beitrag von: Thomas Schulte am 27.09.06 - 15:04:03
gibt es doch:
Hier bei OpenNTF (http://www.openntf.org) in Form der Datenbanken und der CodeBin. Hier (http://www.notes.net) bei der Ibm in Form von Foren und der Sandbox. Bei ATnotes selber findest du auch massenweise Code Schnipsel.

Das Problem das sich da aber auftut ist in der Regel, das man die Teile dann anpassen muss und selber nicht wirklich Ahnung davon hat was das Ding jetzt eigentlich macht. In 7 von 10 Fällen funktionierts dann nicht so wie erwartet weil irgendein Randparameter nicht genannt wurde und du verbringst mehr Zeit mit der Fehlersuche als du dafür gebraucht hättest es selber zu lösen.
Titel: Re: Agenten für Listen
Beitrag von: Thomas Schulte am 27.09.06 - 15:20:07
Ad 1 der Debugger ist dein Freund. Und stellt dich genau an die Stelle wo es klemmt.
Ad 2 Error Handling ist in jeder Programmierung ein MUST HAVE keine Option.
Ad 3 Deine For Schleife ist mit V6 für den Müll, wenn du sicherstellen Kannst das die Anzahl deiner Elemente immer 7 ist.
Ad 4 Wenn du schon eine Funktion benutzt dann übergebt ihr auch den Wert für VarList.
Ad 5 Weil du keinen Wert zurückgibst kannst du genausogut auch eine Sub verwenden

Code
sub newDocument(varList as string)
	' String deswegen weil das eh text ist
	Stop
	
	Dim me_VarList As Variant
	Dim i As Integer
	
	Dim personName As String
	Dim payableDate As String
	Dim kindofCost As String
	Dim repeat As String
	Dim amount As String
	Dim once As String
	Dim lifetime As String
	Dim del1 As String
	Dim wert As Integer
	
	me_Varlist = Split(varlist,"~")
	
	Set docNew = db.CreateDocument
	docNew.personName = me_Varlist(0)
	docNew.payableDate = me_Varlist(1)
	docNew.kindofCost = me_Varlist(2)
	docNew.repeat = me_Varlist(3)
	docNew.amount = me_Varlist(4)
	docNew.once = me_Varlist(5)
	docNew.lifetime = me_Varlist(6)
	
	
End sub
Titel: Re: Agenten für Listen
Beitrag von: bikerboy am 27.09.06 - 16:05:13
Gut , habe mich noch ein bisschen, mit der Form auseinander gesetzt und erstmal festegestellt , dass ich depp nich gespeichert habe. -> wurde abgestellt

Der Debugger hat mir gesagt, dass varList leer ist, also habe ich es global deklariert.

Ach ja ich kann sicherstellen, dass immer 7 Elemente vorhanden sind.Selbst wenn ein Wert nicht gesetzt wir ist es immer noch durch die selbe Anzahl von Seperatoren getrennt, also wären die Felder bewusst leer an der Stelle

So da ich nun speichere und übergebe. Hatte ich am Ende wunderschöne leere Dokumente. Nur im ersten Feld steht "varlist" drin, alle anderen Felder sind leer. Seht ihr nen Fehler in bei  StrToken ?
Titel: Re: Agenten für Listen
Beitrag von: Thomas Schulte am 27.09.06 - 16:21:04
Warum willst du eigentlich partout mit dem Strtoken hantieren? Les doch erst einmal alle Antworten bevor du weiterfragst.

Aber gut
1. was hat varlist denn für einen Wert?
2. Ein Stringtoken geht ausschließlich mit einem String. Ich wette mit dir das der Debugger wenn du überhaupt einen Wert für varlist hast den mit varlist(0) anzeigt.
Titel: Re: Agenten für Listen
Beitrag von: bikerboy am 27.09.06 - 16:30:47
@Thomas Schulte

Also varList ist als Variant deklariert und enthält die "Liste" mit den verschiedenen Strings die ich zu einem Document auseindanderflicke. Also nochmal, damit ich nicht Missverstanden werde.

in varList steht ziemlich genau das drin :

"Robert Kreutzer~27.10.2006 11:00:40~Ausgangsrechnung~monatlich~60000~Nein~unbefristet~"
"Robert Kreutzer~27.11.2006 11:00:40~Ausgangsrechnung~monatlich~60000~Nein~unbefristet~"
"Robert Kreutzer~27.12.2006 11:00:40~Ausgangsrechnung~monatlich~60000~Nein~unbefristet~"

(alles fiktive Werte. nicht dass sich einer Hoffnung macht ;) )

und das jetzt soll jede Zeile ein Document ergeben

Titel: Re: Agenten für Listen
Beitrag von: flaite am 27.09.06 - 16:51:58
varlist scheint vom Typ variable-length-Array zu sein und nicht vom Lotus-Script Datentyp List.
In LotusScript gibts wirklich nicht soooo viele Datentypen. Deshalb kann man ruhig so vorsichtig mit unserem natursprachlichen Deutsch umgehen, dass man Irreführungen vermeidet. Unter List verstehe ich in LotusScript einen Datentyp der eine bestimmte Containerstruktur abbildet (eigentlich ein tree btw. dh. lotus nennt einen tree eine list. auch nicht besser). Aber egal.

An die einzelnen Elemente des Arrays kommst du am schnellsten über eine forall - Schleife ran.

Code
forall x in dasWasDuListNennst 
  print x 
' x über split weiterverarbeiten (s.u.) 

End ForAll

Die einzelnen Elemente des Array zerschnippelst du am besten über die split-Funktion von LotusScript:
hier aus der Hilfe von Notes:
Code
Sub Initialize
   Dim ret As Variant
   dim teststr as string
   Dim delim As String
   teststr = "This is the Connection"
   delim = " "
   ret = split(teststr, delim)
   For x = 0 to 3
      Print ret(x)
   Next
End Sub 
Als delim nimmst du natürlich ~
Titel: Re: Agenten für Listen
Beitrag von: bikerboy am 27.09.06 - 17:38:45
So an alle Kritiker, ich habe es. Noch keine Fehlerabfangung aber ich das kommt nun nachdem es funzt. hier der code


Code
Function newDocument
	
	Dim i As Integer
	
	Dim personName As String
	Dim payableDate As String
	Dim kindofCost As String
	Dim repeat As String
	Dim amount As String
	Dim once As String
	Dim lifetime As String
	
	Dim del1 As String
	Dim wert As Integer
	Dim value As String
	
	
	wert = Ubound(varList)
	del1 = "~"
	
	For i = 0 To wert
		Set docNew = db.CreateDocument
		value = varList(i)
		
		docNew.personName = Strtoken(value, del1, 1)
		docNew.payableDate = Strtoken(value, del1, 2)
		docNew.kindofCost = Strtoken(value, del1, 3)
		docNew.repeat = Strtoken(value, del1, 4)
		docNew.amount = Strtoken(value, del1, 5)
		docNew.once = Strtoken(value, del1, 6)
		docNew.lifetime = Strtoken(value, del1, 7)
		docNew.Form = "Agent"
		
		Call docNew.Save(True,False)
		
	Next
	
	
End Function
Titel: Re: Agenten für Listen
Beitrag von: ata am 27.09.06 - 20:58:12
... noch ein kleiner Tip zur Performance:
Code
Set doc = collection.GetNThDocument(i)
... ist nicht gut für die Performance, wenn du viele Dokumente zum abarbeiten hast. Er wird um so langsamer, je mehr Dokumente du in der Collection hast...
Code
Set doc = collection.GetFirstDocument
While Not doc Is Nothing
   ' # deine Anweisungen
   Set doc = collection.GetNextDocument( doc )
Wend
... ist in diesem Fall die bessere Variante - bevor du dir diesen Weg standardisierst... ;-)

Toni
Titel: Re: Agenten für Listen
Beitrag von: DerAndre am 28.09.06 - 07:23:07
Einen Errorhandle würde ich als Allererstes einbauen.
Warum? Was ist besser:

Object Variable not set

oder

In Zeile xy Fehlercode nnnn - Objectvariable not set ?

Man erspart sich mit dem Errorhandle jede Menge sucherei.
Titel: Re: Agenten für Listen
Beitrag von: bikerboy am 28.09.06 - 08:49:30
@ ata

danke für den tip, werde ihn beherzigen