Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Greenthumb am 02.12.03 - 11:38:03
-
Hallo,
Ich möchte in einer Maske Daten aus mehreren Masken zu einem Kunden zeigen.
Erst werden die Daten aus vorhandenen Dokument gelesen (unprocessedDocuments) und in die Zielmaske geschrieben.
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim ws As New NotesUIWorkspace
Dim collection As NotesDocumentCollection
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
Dim coldoc As NotesDocument
Set coldoc = collection.GetFirstDocument
' Daten lesen aus der Sales-Maske...
coldocid = coldoc.UniversalID
firma = coldoc.GetItemValue("firma")(0)
salesnum = coldoc.GetItemValue("salesnum")(0)
status = coldoc.GetItemValue("status")(0)
...
'Daten in Zielmaske schreiben....
Dim doc As NotesDocument
Set doc= db.CreateDocument
doc.Form = "SchnellInfo-sdoc"
doc.salesdocid= coldocid
doc.firma = firma
doc.salesnum = salesnum
doc.status = status
...
Dann sollen 3 nächsten ToDo für den markierten Kunden aus der Maske "ToDo" ausgelesen werden (das funktioniert auch)
Dim collection1 As NotesDocumentCollection
SSTR = "FORM = ""ToDo"" & firma = """ + firma + """ & salesnum = """ + salesnum + """"
Set collection1 = db.Search(SSTR, Nothing, 0)
For I=1 To collection1.Count
Dim doc1 As NotesDocument
Set doc1 = collection1.GetNthDocument(I)
ansprpart = doc1.GetItemValue ("ansprpart")
...
Und hier habe ich mein Problem: ich will jetzt die ausgelesenen Informationen aus der Kollektion in die entsprechenden RichTextFelder schreiben (um die vorherigen Werte der Collection nicht zu überschreiben), was aber nicht funktioniert
Dim item As NotesItem
Set item = doc.GetFirstItem("ansprpart")
Call item.AppendToTextList (ansprpart)
...
Next
'Document anzeigen
Call ws.EditDocument (False , doc, False)
End Sub
Debugger hängt an der Zeile Call.item.AppendToTextList... mit der Fehlermeldung: "Object variable not set" obwohl alles initialisiert ist. Könnt ihr mir sagen wo ich Fehler mache oder wie ich es lösen kann?
Vielen Dank!
-
Das
Set item = doc.GetFirstItem("ansprpart")
geht nicht, da das Feld "ansprpart" vorher nie gesetz wurde. Also weiter oben
doc.firma = firma
doc.salesnum = salesnum
doc.status = status
doc.ansprpart = "" 'Item initialisieren
Und dann noch
ansprpart = doc1.GetItemValue ("ansprpart")
durch
ansprpart = doc1.GetItemValue ("ansprpart")(0)
ersetzen, sonst hast Du keinen String.
oder - falls es ein Variant sein muss -
Call item.AppendToTextList (ansprpart(0))
Andreas
-
Vielen, vielen Dank Glombi!
Ich habe das übersehen, jetzt funktioniert`s!
-
Hallo,
kennt ihr irgendeinen Trick, mit dem ich eine leere Zeile (newline) in NotesItem-Klasse machen kann. Ich schreibe nämlich verschiedene Werte in ein RT-Feld und würde sie gerne mit der leeren Zeile trennen.
Bis jetzt werden alle Einträge in eine Zeile geschreiben :-(
Ich habe schon auch mit NotesRichtTextItem-Klasse versucht, sie weist nämlich die Methode AppendText und AddNewLine auf.
....
Dim item As NotesRichTextItem
Set item = doc.GetItemValue("kontakt1")
Call item.AppendText (thema (0))
Call item.AddNewLine (1)
....
Aber das Problem ist hier, dass die Methode GetFirstItem (s.o.)ein Objekt vom Typ NotesItem zurückliefert, das an eine Objektvariable vom Typ NotesRichTextItem zugewiesen wird. Der Compiler meldet einen Fehler (Type mismatch), weil er nicht weiss, dass tatsächlich ein Objekt vom Typ NotesRichTextItem zurückgegeben wird.
Kennt Ihr Lösungen zu diesem Problem?
Ich bin für alle Antworten sehr dankbar!
-
Du musst ein Chr$(13) verwenden:
"Das ist eine Zeile" & chr$(13) & "und das die nächste"
oder war es ein andere ASCII-Code?
Andreas
-
Um auf Nummer sicher zu gehen: Chr$ (10)
Damit hatte ich noch nie Probleme (auch bei Exports), obwohl es in alten Zeiten ja eigentlich Chr$ (10) & Chr$ (13) heissen musste:
10 = Neue Zeile resp. "Eine Zeile tiefer - bei gleicher CharPos
13 = Zeilenschaltung resp. Zeilenanfang
Bernhard
-
Historisches:
Carriage Return / Wagenrücklauf: Chr (13)
war ursprünglich alleine Positionierung des Schreibmaschinenwagens auf die erste Position (Rücklauf, wie der Name sagt, ohne Zeilenschaltung). Wurde schon früh auch für die Zeilenschaltung verwendet, weil das bei der elektrischen Schreibmaschine miteinander gekoppelt war.
Line Feed / Zeilenschaltung: Chr 10
war ursprünglich reine Zeilenschaltung, ohne den Wagen neu zu positionieren. Wenn wir also auf Pos 23 waren, blieb der wagen dort, einfach auf der nächsten Zeile
Anders ausgedrückt: für eine vollständige, saubere neue Zeile müssten theoretisch beide Kontrollzeichen verwendet werden.
Leider ist die Theorie einfach und die Praxis kompliziert.
Wir haben es allgemein mit 4 Zeichensequenzen zu tun, mit denen eine Neue Zeile definiert sein kann, plus noch eine Notes-Spezialvariante:
Allgemein: eine oder mehrere der folgenden Zeichen(kombinationen) können in einer Umgebung als "NewLine" definiert sein, wobei das sowohl vom Betriebssystem als auch von der Applikation abhängig sein kann:
10
13
10 + 13
13 + 10
Manchmal funktionieren mehrere, manchmal funktioniert aber genau eine Variante. Ein regelrechtes Rätselraten, wenn Dateien zwischen unterschiedlichen Plattformen ausgetauscht werden sollen.
Notes-spezifisch: Zum Teil wird von Notes Chr (0) als Zeichen für eine neue Zeile verwendet.
-
Hallo!
Vielen Dank für die zahlreichen Antworten. Ich habe verschiedene Kombinationen von Chr(10) und Chr(13) ausprobiert und bekomme jetzt meinen nächsten Eintrag aus der Collection in der nächtsten Zeile aber am ihren Ende, was etwas unstrukturiert in meiner Maske aussieht.
Wie kann ich die Eintrage zum Anfang der Zeile ziehen?
Ich möchte auch die letzten 3 Dokumente aus der Collection in meiner neuen Maske schreiben. Könnt ihr mir ungefähr sagen wie ich das machen kann? Ich habe schon mit GetLastDocument versucht, wusste aber nicht wie ich hier die letzten drei definiren kann. Oder soll ich alle Dokus zählen, dann drei abziehen und die Ordungsnummer an die GetNthDocument übergeben.
Ich hoffe, ich nerve Euch nicht mit meinen Fragen nicht.
Vielen Dank!
-
Hi,
poste doch mal etwas Code - so aus der Luft gegriffen ist das eher mühsam.
Generell: Um was in ein Textfeld vorne anzuhängen (wenn es keine Mehrfachwerte sind):
doc.FeldMitText = "Neuer Text" & Chr$(13) & doc.FeldMitText(0)
Es sei darauf hingewiesen, dass man nicht allzuviel in ein Textfeld schreiben kann - bei 32K ist Finito.
Andreas
-
Wenn ich mir den Thread nochmal genau ansehen: Hast Du denn jetzt ein Text- oder ein Rich-Text-Feld ???
Andreas
-
Danke für so schnelle Antwort! Ich habe ein Richtext-Feld (ich will an das Feld letzten 3 Einträge aus Collection anhängen=> wenn ich mich nicht irre ist das in einem Textfeld nicht möglich). Hier mein Code:
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim ws As New NotesUIWorkspace
Dim collection As NotesDocumentCollection
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
Dim coldoc As NotesDocument
Set coldoc = collection.GetFirstDocument
' Daten lesen aus der Sales-Maske...
coldocid = coldoc.UniversalID
firma = coldoc.GetItemValue("firma")(0)
salesnum = coldoc.GetItemValue("salesnum")(0)
projnum = coldoc.GetItemValue("projnum")(0)
status = coldoc.GetItemValue("status")(0)
ansprpart1 = coldoc.GetItemValue("ansprpart")(0)
....
'Die ausgelesenen Daten in Maske SchnellInfo(2)-sdoc schreiben....
Dim doc As NotesDocument
Set doc= db.CreateDocument
doc.Form = "SchnellInfo(2)-sdoc"
doc.salesdocid= coldocid
doc.firma = firma
doc.salesnum = salesnum
doc.projnum = projnum
doc.status = status
...
doc.kontakt1 = ""
...
Dim collection1 As NotesDocumentCollection
SSTR = "FORM = ""ToDo"" & firma = """ + firma + """ & salesnum = """ + salesnum + """"
Set collection1 = db.Search(SSTR, Nothing, 0)
For I=1 To collection1.Count
Dim doc1 As NotesDocument
Set doc1 = collection1.GetNthDocument(I)
ansprpart = doc1.GetItemValue ("ansprpart")(0)
datum = doc1.GetItemValue ("ddatum")(0)
kontart = doc1.GetItemValue ("kontart")(0)
thema = doc1.GetItemValue ("ToDo")(0)
Dim item As NotesItem
Set item = doc.GetFirstItem("kontakt1")
Call item.AppendToTextList (thema + Chr(10))
....
Next
'Document anzeigen
Call ws.EditDocument (False , doc, False)
End Sub
Wie oben beschrieben:
1. AppendToTextList (thema +Chr(10)) hängt neuen Eintrag am Ende der nächsten Zeile
2. Collection1 liefert jetzt alle Einträge, ich möchte aber die letzten 3 auslesen und anhängen. :-[
Danke!
-
Hallo Glombi!
Ich habe die Lösung für das erste Problem (Anhängen der EInträge am Ende der nächsten Zeile).
Für RT-Felder sollte die Zeile so aussehen: Call item.AppendToTextList (Chr(13) + thema(0))
Jetzt werden die EInträge richtig angehängt
Kennst Du welche Lösung für mein zweites Problem? Schlage mir bitte was vor.
Danke!
-
Wie wäre es mit
For I=collection1.Count - 2 To collection1.Count
Das ist doch dann die Schleife über die letzten drei Einträge.
HTH,
Bernhard
-
Um nur die letzten 3 Dokumente der Collection zu bekommen, kannst Du folgendes machen:
dim lbounb_i as integer
select case collection1.Count
case > 4: lbounb_i = collection1.Count -3
case else: lbounb_i = 1
End select
For I = lbounb_i To collection1.Count
Dim doc1 As NotesDocument
Set doc1 = collection1.GetNthDocument(I)
ansprpart = doc1.GetItemValue ("ansprpart")(0)
datum = doc1.GetItemValue ("ddatum")(0)
kontart = doc1.GetItemValue ("kontart")(0)
thema = doc1.GetItemValue ("ToDo")(0)
Dim item As NotesItem
Set item = doc.GetFirstItem("kontakt1")
Call item.AppendToTextList (thema + Chr(10))
....
Next
Andreas
-
Vielen Dank!
Beide von Euch gezeigten Lösungen funktionieren! :D
Somit ist das Thema abgeschlossen
Danke für Eure Hilfe!