Autor Thema: RichText in RichText EINFÜGEN  (Gelesen 45915 mal)

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #40 am: 04.05.06 - 13:01:25 »
Na, ich bin in meiner Naivität davon ausgegangen, daß der DomParser die <> Tags automatisch in neue Nodes umsetzt

So sollte aus dem <par>RT:RTONE</par> ein

<par><picture height='71px' width='108px'><notesbitmap>
lQAmAAAAAAAAAAAAAAABAAAAAAAAAGwARwAIAAEACAACAE0ABwCWAFUIAAAAAAAAAAAAADIAQwgD

...
</par>

werden.

die <> werden aber in als text betrachtet, so daß an der Stelle nicht das Bild sondern halt eben der String erscheint.

Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #41 am: 04.05.06 - 13:35:45 »
Irgendwie habe ich das Gefühl, daß ich mit meinem Code in eben dieselbe Sackgasse laufe, wie Rocky Oliver

Zitat
Lesson Two: The NotesDOMParser lacks the InsertBefore method
Now that  the new node is moved into the desired document, it needs to be moved into the proper position. Normally the InsertBefore method could be used to move the node into the proper position; however the NotesDOMParser doesn't have an InsertBefore method either, so I basically decided to abandon using the NotesDOMParser altogether. Instead I went "low-tech". I now export the form to DXL, and then simply search the DXL for a particular text tag that I added to the form to find the location where the new code should go, then I use a LS version of @ReplaceSubstring to add the new code. Once the new code is added I reimport it into the database using the NotesDXLImporter. This method works GREAT, and is very very fast.

So, my basic conclusion is that the NotesDOMParser is nice for reading XML documents, but it is really not useful for manipulating XML documents in any advanced way.


( http://www.lotusgeek.com/SapphireOak/LotusGeekBlog.nsf/d6plinks/ROLR-6CTKKN )

Das FindAndReplace hatte ich ja anfangs auch schon probiert; allerdings habe ich das FindAndReplace der NotesRichTextRange class   verwendet, und das ist ja bei umfangreicheren Ersetzungen in die Grätsche gegangen.

Ich probiere das jetzt noch einmal mit einer eigenen Routine.
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #42 am: 04.05.06 - 17:09:22 »
DOMParser ade; auch nach Re-Konfiguration des Tachyonenstrahls und NeuAusrichtung der DiLithium Matrix ist da nix zu löten an der Holzkiste ...

Ich versuche das jetzt mal mit DXLExport in ein RichTextFeld, zeilenweises AppendText in ein weiteres RTFeld; an den Stellen, wo das RT:Irgendwas steht, hole ich mir die Informationen zeilenweise aus einem weiteren RTFeld, in das ich per DXLExport die daten aus dem einzufügenden feld exportiert habe.
Sind die daten drin, hänge ich Zeile für Zeile den Rest unten an und importiere mittels DXLImport.
Dürfte nicht sonderlich performant sein, aber darauf kommt es mir jetzt nicht mehr an. Ich will das zum Laufen bekommen !!!

Rocky macht das auch mit FindAndReplace. Er hat vermutlich nicht mit groesseren Datenmangen getestet. Ich werde ihn mal fragen ...

Weitere Möglichkeit, wäre Java zu nehmen. Da kennt Axel bestimmt irgendwas, was man in Notes verwenden kann.

Oder MSXML ...

Oder ich schreibe das in c++ und stelle die benötigtnen Funktionen als dll zur Verfügung ...

Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Thomas Schulte

  • @Notes Preisträger
  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: RichText in RichText EINFÜGEN
« Antwort #43 am: 04.05.06 - 17:43:04 »
Midas 2?

oder übernächste Woche Montag doch mit einem langen Anlauf und spitzen Stiefeln mit Stahlkappen direkt in den Backstage Bereich reintreten.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #44 am: 04.05.06 - 17:49:08 »
Ich versuche das jetzt mal mit DXLEXPORT, NotesSTREAM und DXLIMPORT. Sind dann insgesamt 3 Files auf der Festplatte (!) Man kann ja nicht direkt in ein RT Feld streamen um es dann bequem DXL importen zu können. Da fehlen beim Stream die SetInput und SetOutput Methoden

Zitat
Midas 2?

Nein, aber unter c++ gibt es einen Haufen fertiger Libs, die das XML InsertBefore gut können ...
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: RichText in RichText EINFÜGEN
« Antwort #45 am: 04.05.06 - 17:54:20 »
Ich find das alles auch sehr umständlich selbst für die Behandlung meines "personal friends" Notes Richtext.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #46 am: 04.05.06 - 18:01:03 »
Das "umständlich" resultiert aber doch eigentlich daraus, daß man zwar ein wie ich finde mächtiges Tool ( DXL /XML ) zur Verfügung hat, es aber an ein paar elementaren Methoden fehlt, um außer einem Export / Import auch Manipulationen vornehmen zu können.

Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #47 am: 04.05.06 - 18:16:55 »
Richtig umständlich wird es dann, wenn man das dynamisch macht und den Content aus mehreren RT Feldern zusmmenführen will. Ach, irgendwie ist das alles gequirlte Schei ...e.

Da hat man Ideen, wie man ein Programm funktional aufwerten kann, und dann kann man das nicht umsetzen ...

Ich frag jetzt Ben, ob er uns für HELP ein MIdas mit nur der einen Funktion zur Verfügung stellt.

Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: RichText in RichText EINFÜGEN
« Antwort #48 am: 04.05.06 - 19:40:12 »

Nein, aber unter c++ gibt es einen Haufen fertiger Libs, die das XML InsertBefore gut können ...
In Java auch. Das sind keine "xml-Probleme".
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #49 am: 04.05.06 - 20:25:14 »
Das gestreame ( Ich teste gerade mit 2 einzufügenden xml Files ) in eine 10 MB grosse Datei ist so performant, wie 10000er Schmirgelpapier auf einer ungehobelten Dachlatte  :P

Nicht wirklich der Burner ...

Egal, ich lasse jetzt einfach mal den BimBam baumeln ...
« Letzte Änderung: 04.05.06 - 20:27:56 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #50 am: 05.05.06 - 19:23:18 »
ich habe noch ein wenig rumoptimiert.

Der einzige Weg, das Ziel zu erreichen ist ein MERGE zweier XML Dateien. Der Platzhalter ( RT:RTONE ) definiert dabei das RichTextFeld des Dokuments, welches in das Originaldokument eingefügt werden soll ( und eben auch die Position des Insert )

Wie schon erwähnt, kann man kein einzelnes Feld per DXLExport in ein XML File schreiben.
Daher muß man dafür sorgen, daß die MergeXML function genau die Stellen des XML merged, die dem RTONE entsprechen.

Der folgende Code extrahiert aus einem DXLExport die für das RichtextFeld RTONE relevanten Stellen.

aus:

Code
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE document SYSTEM 'xmlschemas/domino_7_0.dtd'>
<document xmlns='http://www.lotus.com/dxl' version='7.0' replicaid='C125716400442909'
 form='Sample'>
<noteinfo noteid='8fe' unid='5F51EAD9AF6B93A0C12571650030E607' sequence='17'>
<created><datetime dst='true'>20060505T105406,15+02</datetime></created>
<modified><datetime dst='true'>20060505T184225,59+02</datetime></modified>
<revised><datetime dst='true'>20060505T184225,58+02</datetime></revised>
<lastaccessed><datetime dst='true'>20060505T184225,58+02</datetime></lastaccessed>
<addedtofile><datetime dst='true'>20060505T105424,71+02</datetime></addedtofile></noteinfo>
<updatedby><name>CN=Heinz Ulrich Krause/O=Witte/C=de</name></updatedby>
<revisions><datetime dst='true'>20060505T105424,71+02</datetime><datetime
 dst='true'>20060505T182943,24+02</datetime><datetime dst='true'>20060505T183029,98+02</datetime><datetime
 dst='true'>20060505T183236,20+02</datetime></revisions>
<item name='OriginalModTime'><datetime dst='true'>20060505T184225,58+02</datetime></item>
<item name='RTONE'><richtext>
<pardef id='1'/>
<par def='1'><run><font style='bold italic underline' color='red'/>Dieser Text soll eingefügt werden</run></par></richtext></item>
<item name='RTTWO'><richtext>
<pardef id='2'/>
<par def='2'/></richtext></item>
<item name='TextField'><text/></item></document>

wird

Code
<par def='1'><run><font style='bold italic underline' color='red'/>Dieser Text soll eingefügt werden</run></par>

Da wo jetzt ein Print m_stream_buf steht, werden die Daten über ein rt.Appendtext ( m_stream_bufbuf ) in ein RT Feld in das SoureXML gemerged.

Anschließend aktualisiert ein DXLImporter das Ursprungsdokument.

Attachments brauchen wieder eine Sonderbehandlung, da ja auch die $File - Daten  in das Ursprungsdokument übernommen werden müssen. ( wie das geht; nach der nächsten MAUS )

Code
Sub Click(Source As Button)
	
	Const RT_FIELD = "RTONE"
	
	MergeFile = "c:\RichText.xml"
	Dim s As New NotesSession
	Dim db As NotesDatabase
	Set db = s.CurrentDatabase
	
	Dim m_stream As NotesStream
	Dim m_stream_buf As String
	
	Set m_stream = s.CreateStream
	If ( Not m_stream.open ( MergeFile )) Then
		Exit Sub
	End If
	
	Do
		m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
		If Instr ( m_stream_buf, |<item name='| ) > 0 And Instr ( m_stream_buf, RT_FIELD ) > 0 Then
			Do
				m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
				If Instr ( m_stream_buf, |<pardef| ) > 0 Then
					m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
				End If
				If Instr ( m_stream_buf, |</richtext></item>| ) > 0 Then
					m_stream_buf = Left$ ( m_stream_buf, Len ( m_stream_buf ) - ( Len ( |</richtext></item>| ) +1 )  )
					Print m_stream_buf
					Exit Do
				End If
				Print m_stream_buf
			Loop Until Instr(m_stream_buf, |</item>| ) > 0
		End If
	Loop Until m_stream.IsEOS	
	
	m_stream.Close
	
End Sub

Auch wenn es bei grossen Datenmangen ( beide Files ~ 100 MB ) nicht sonderlich performant ist, kommt man schlussendlich zum Ziel: Richtext in RichText einfügen !!

Soweit mein Ansatz


Grandios auch die Tatsache, daß der Fred schon fast 600 Mal angesehen wurde; es gibt offenbar ein Bedürfnis für eine solche Funktion.
« Letzte Änderung: 05.05.06 - 20:50:55 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #51 am: 05.05.06 - 23:21:15 »
ich baue gerade an dem Code, zu ermitteln, ob in dem zu mergenden Code ein Attachment enthalten ist.

Muss ich denn jedes Stückchen Code selber hier posten ?
Ich habe zu dem Thema schon einige Steilvorlagen gegeben.

Ich wünsche mr. daß mal jemand den bisher geposteten Code aufschnappt und weiterentwickelt ... und sein  Ergebnis hier auch postet.

« Letzte Änderung: 05.05.06 - 23:31:28 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #52 am: 06.05.06 - 00:22:25 »
ich fange gerade an, meien IPod zu lieben; Stevie Nicks säuselt mir gerade DREAMS in die Ohren, während ich über meinem Code sitze. Eine nahezu ideale Symbiose zwischen Geek und Musik.  O0

Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Thomas Schulte

  • @Notes Preisträger
  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: RichText in RichText EINFÜGEN
« Antwort #53 am: 06.05.06 - 07:52:54 »
Würde ich ja gerne machen, aber was du da gerade tust ist im Moment jenseits meines Verständnishorizontes.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #54 am: 07.05.06 - 12:40:40 »
Grundsätzlich funktioniert das mergen jetzt

Hier der Code

Code
Function MergeXML ( SourceFile As String, MergeFile As String ) As Boolean
	MergeXML = False
	
	Const RT_FIELD = "RTONE"
	Dim s As New NotesSession
	Dim db As NotesDatabase
	Set db = s.CurrentDatabase
	
	Dim tmpDoc As NotesDocument
	Set tmpDoc = New NotesDocument(db)
	Dim rtXML As New NotesRichTextItem (tmpDoc, "Body")
	
	Dim s_stream As NotesStream
	Dim m_stream As NotesStream
	Dim s_stream_buf As String
	Dim m_stream_buf As String
	Dim HAS_ATTACHMENTS As Boolean 
	Dim i As Integer	
	
	Set s_stream = s.CreateStream
	If ( Not s_stream.open ( SourceFile )) Then
		Exit Function
	End If
	
	i = 1
	HAS_ATTACHMENTS = False
	' Read the Source File line by line
	Do 
		s_stream_buf = s_stream.ReadText ( STMREAD_LINE, 4 )
		Do While Instr ( Ucase ( s_stream_buf ) , Ucase ( "RT:" + RT_FIELD ) )> 0
			' insert data from merge file
			Set m_stream = s.CreateStream 
			If ( Not m_stream.open ( MergeFile )) Then
				Exit Function
			End If
		     ' Read the MergeFile line by line
			Do
				m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
				
				If Instr ( Ucase ( m_stream_buf ) , Ucase ( |<item name='| + RT_FIELD +|'>|) ) > 0  Then
					Do
						m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
						If Instr ( m_stream_buf, |<pardef| ) > 0 Then
							m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
						End If
						If Instr ( m_stream_buf, |</richtext></item>| ) > 0 Then
							m_stream_buf = Left$ ( m_stream_buf, Len ( m_stream_buf ) - ( Len ( |</richtext></item>| ) +1 )  )
							Call rtXML.AppendText ( m_stream_buf )
							Exit Do
						End If
						
						Dim pos As Long
						pos = Instr ( Ucase ( m_stream_buf ) , Ucase ( |<attachmentref name='| ) ) 
						If pos > 0  Then
							' Determine the <attachmentref name= of all attachments in mergefile
							' and store names in array for further use
							HAS_ATTACHMENTS = True
							Redim Preserve AttNames ( i ) As String
							AttNames ( i -1 ) = Mid ( m_stream_buf , pos +21 , Instr (Mid ( m_stream_buf , pos + 21 , ( Len(m_stream_buf ) - 21 ))  , |'|) -1  )
							i = i +1
						End If
						
						Call rtXML.AppendText ( m_stream_buf )
					Loop Until Instr(m_stream_buf, |</item>| ) > 0
					Exit Do
				End If
			Loop Until m_stream.IsEOS	
			
			Dim m_stream_pos As Long
			m_stream_pos = m_stream.Position 'store current stream location 
			
			m_stream.Close ' close stream
			s_stream_buf = s_stream.ReadText ( STMREAD_LINE, 4 )' read next line 
		Loop
		
		If HAS_ATTACHMENTS And Instr ( s_stream_buf,  |</document>| ) > 0 Then
			' strip the </document> tag from s_stream_buf  
			Call rtXML.AppendText ( Replace ( s_stream_buf , |</document>| , "" ) )
			' append filedata
			Set m_stream = s.CreateStream 
			
			If ( Not m_stream.open ( MergeFile )) Then
				Exit Function
			End If
			m_stream.Position = m_stream_pos
			Do
				m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
				
				'If Instr ( Ucase ( m_stream_buf ) , Ucase ( |<item name='| + RT_FIELD +|'>|) ) > 0  Then
				Call rtXML.AppendText ( m_stream_buf )	
				'End If
				
			Loop Until m_stream.IsEOS
			m_stream.Close ' close stream
			' finally add </document> tag 
			'Call rtXML.AppendText ( |</document>| )
		Else
			Call rtXML.AppendText ( s_stream_buf )
		End If
		
	Loop Until s_stream.IsEOS	
	
	s_stream.Close
	
	tmpdoc.Form = "Memo"
	tmpdoc.SendTo = "Heinz Ulrich Krause/Witte/de"
	Call tmpdoc.send ( False )
	
	Dim importer As NotesDXLImporter
	Set importer = s.CreateDXLImporter ( rtXML , db )
	importer.DocumentImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
	Call importer.Process
	
	Kill ( sourceFile )
	Kill ( mergeFile )	
	MergeXML = True
	
End Function

Es gibt noch 2 kleinere Probleme, die zu lösen sind.

1. Wenn nach der Einfügemarke am Ende des RichTextFeldes kein CRLF erfolgt, steigt der DXLImporter mit einem Fehler aus.

2. zur Zeit werden ALLE Attachments des MergeDoc übernommen. Hier muss ich noch nach den nur im gewünschten Feld enthaltenen Attachments filtern.

Ausserdem ist die Marke RT:RTONE z.Zt. noch fest verdrahtet, aber das ist kein Problem, die Marken im RT des SourceDoc zu ermitteln.  :D
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #55 am: 07.05.06 - 14:11:57 »
Hier noch der Codeteil, der die relevanten $FILE Informationen aus dem MergeDoc extrahiert

Code
			Forall m In AttNames
				
				Set m_stream = s.CreateStream 
				
				If ( Not m_stream.open ( MergeFile )) Then
					Exit Function
				End If
				m_stream.Position = m_stream_pos
				
				
				Dim FILENAME As String
				FILENAME = Cstr ( m )
				Dim tmp_buf As String
				
				Do
					m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
					If Instr ( m_stream_buf , |<item name='$FILE'| ) > 0 Then
						tmp_buf = m_stream_buf
						m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
						
						If Instr ( m_stream_buf , FILENAME ) > 0 Then
							
							Call rtXML.AppendText ( tmp_buf )
							Call rtXML.AppendText (  m_stream_buf )
							
							Do	
								
								m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
								m_stream_buf = Replace ( m_stream_buf , |</document>| , "" )
								Call rtXML.AppendText (  m_stream_buf )
								
							Loop Until  Instr ( m_stream_buf , |</item>| ) > 0 
							
						End If	
					End If
					
				Loop Until m_stream.IsEOS
				Call m_stream.Close
				
			End Forall

Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN ( Final Solution )
« Antwort #56 am: 07.05.06 - 17:04:19 »
Hier nun der endgültige Code + eine Sample DB

Code
Const PATHNAME = "c:\"

Sub Click(Source As Button)
	
	Dim s As New NotesSession
	Dim db As NotesDatabase
	Dim dc As NotesDocumentCollection
	Dim doc As NotesDocument
	Dim ret As Boolean	
	Set db = s.CurrentDatabase
	Set dc = db.UnprocessedDocuments
	Set doc = dc.GetFirstDocument
	
	Dim SourceFileName As String
	Dim MergeFileName As String
	
	SourceFileName = ExportXML ( doc )
	Set doc = dc.GetNextDocument ( doc )
	MergeFileName = ExportXML ( doc )
	
	ret  = InsertRichText ( SourceFileName , MergeFileName ,"RTONE")
	
End Sub


Function  ExportXML ( doc As NotesDocument ) As String
	
	Dim s As New NotesSession
	Dim stream As NotesStream
	Set stream = s.CreateStream
	Dim exporter As NotesDXLExporter
	Dim FILENAME As String
	Dim universalID As String*32
	
	universalID = doc.UniversalID
	
	FILENAME = PATHNAME + universalID +".xml"
	If Not stream.Open ( FILENAME ) Then
		Messagebox "Cannot open " & FILENAME,, "Error"
		Exit Function
	End If
	Call stream.Truncate
	
	Set exporter = s.CreateDXLExporter
	Call exporter.SetInput ( doc )
	Call exporter.SetOutput ( stream )
	Call exporter.Process
	ExportXML = FILENAME
	
End Function

Function InsertRichText ( SourceFile As String, MergeFile As String, FieldName As String)  As Boolean
%REM
	INSERTS a NotesRichTextItem into another NotesRichTextItem. 
	You can define the insertion point by writing a RT:<SomeFieldName> - Tag into the field where the Richtext 
	should be inserted.

	Known issues:
	
	If RT:RTONE is located at the end of the RTItem it has to be terminated by a CRLF. Otherwise the DXLImpoter
	fails.
%END REM
	InsertRichText = False
	
	Dim s As New NotesSession
	Dim db As NotesDatabase
	Set db = s.CurrentDatabase
	
	Dim tmpDoc As NotesDocument
	Set tmpDoc = New NotesDocument(db)
	Dim rtXML As New NotesRichTextItem (tmpDoc, "Body")
	
	Dim s_stream As NotesStream
	Dim m_stream As NotesStream
	Dim s_stream_buf As String
	Dim m_stream_buf As String
	Dim HAS_ATTACHMENTS As Boolean 
	HAS_ATTACHMENTS = False	
	Dim i As Integer	
	i = 1
	
	' Open source stream
	Set s_stream = s.CreateStream
	If ( Not s_stream.open ( SourceFile )) Then
		Exit Function
	End If
	' Read the Source File line by line
	Do 
		s_stream_buf = s_stream.ReadText ( STMREAD_LINE, 4 )
		Do While Instr ( Ucase ( s_stream_buf ) , Ucase ( "RT:" + FieldName ) )> 0
			' insert data from merge file
			Set m_stream = s.CreateStream 
			If ( Not m_stream.open ( MergeFile )) Then
				Exit Function
			End If
		     ' Read the MergeFile line by line
			Do
				m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
				
				If Instr ( Ucase ( m_stream_buf ) , Ucase ( "<item name='" + FieldName +"'>" )) > 0  Then
					Do
						m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
						If Instr ( m_stream_buf, "<pardef" ) > 0 Then
							m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
						End If
						If Instr ( m_stream_buf, "</richtext></item>" ) > 0 Then
							m_stream_buf = Left$ ( m_stream_buf,_
							Len ( m_stream_buf ) - ( Len ( "</richtext></item>" ) +1 ) )
							
							Call rtXML.AppendText ( m_stream_buf )
							Exit Do
						End If
						
						Dim pos As Long
						pos = Instr ( Ucase ( m_stream_buf ) , Ucase ( "<attachmentref name='" ) ) 
						If pos > 0  Then
							' Determine the <attachmentref name= of all attachments in mergefile
							' and store names in array for further use
							HAS_ATTACHMENTS = True
							Redim Preserve AttNames ( i ) As String
							AttNames ( i -1 ) =_
							Mid ( m_stream_buf , pos +21 ,_
							Instr (Mid ( m_stream_buf , pos + 21 ,_
							( Len(m_stream_buf ) - 21 ))  , "'") -1  )
							i = i +1
							
						End If
						
						Call rtXML.AppendText ( m_stream_buf )
					Loop Until Instr(m_stream_buf, "</item>" ) > 0
					Exit Do
				End If
			Loop Until m_stream.IsEOS	
			
			Dim m_stream_pos As Long
			m_stream_pos = m_stream.Position 'store current stream position 
			
			m_stream.Close ' close stream
			s_stream_buf = s_stream.ReadText ( STMREAD_LINE, 4 )' read next line 
		Loop
		
		If HAS_ATTACHMENTS And Instr ( s_stream_buf,  "</document>" ) > 0 Then
			' strip the </document> tag from s_stream_buf  
			Call rtXML.AppendText ( Replace ( s_stream_buf , "</document>" , "" ) )
			' append filedata
			Forall m In AttNames
				If Trim ( Cstr ( m )) = "" Then Exit Forall
				Set m_stream = s.CreateStream 
				
				If ( Not m_stream.open ( MergeFile )) Then
					Exit Function
				End If
				' do not read from beginning of stream but restore last position
				m_stream.Position = m_stream_pos
				
				Dim FILENAME As String
				FILENAME = Cstr ( m )
				Dim tmp_buf As String
				
				Do
					m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
					If Instr ( m_stream_buf , "<item name='$FILE'" ) > 0 Then
						tmp_buf = m_stream_buf ' 
						m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
						
						If Instr ( m_stream_buf , FILENAME ) > 0 Then
							Call rtXML.AppendText ( tmp_buf )
							Call rtXML.AppendText (  m_stream_buf )
							' loop through all lines until </item> is found
							Do	
								m_stream_buf = m_stream.ReadText ( STMREAD_LINE, 4 )
								m_stream_buf = Replace ( m_stream_buf , "</document>" , "" )
								Call rtXML.AppendText (  m_stream_buf )
							Loop Until  Instr ( m_stream_buf , "</item>" ) > 0 
						End If	
					End If
				Loop Until m_stream.IsEOS
				Call m_stream.Close
				
			End Forall
			' finally append the closing tag </document>
			Call rtXML.AppendText ( "</document>" )
		Else
			Call rtXML.AppendText ( s_stream_buf )
		End If
		
	Loop Until s_stream.IsEOS	
	s_stream.Close ' close dtream
	
	' import the XML data and update the source document	
	Dim importer As NotesDXLImporter
	Set importer = s.CreateDXLImporter ( rtXML , db )
	importer.DocumentImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
	Call importer.Process
	' delete the exported files from the filesystem
	Kill ( sourceFile )
	Kill ( mergeFile )	
	InsertRichText = True
	
End Function

« Letzte Änderung: 07.05.06 - 17:30:49 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #57 am: 07.05.06 - 19:28:26 »
ein kleines Problem gibt es noch, wenn man die Einfügemarke mehrfach einfügt ( das wirkt sich aber nur bei Anhängen aus )

Da werden dann auch die $FILE Daten mehrfach erzeugt; Solange man die Anhänge nicht bearbeitet und wieder in das Dokument einfügt, macht das aber nichts. Außer daß das Dokument in der Groesse anwächst. Ich habe aber schon eine Idee, wie man das lösen kann...

Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Re: RichText in RichText EINFÜGEN
« Antwort #58 am: 08.05.06 - 19:43:35 »
Um das Attachment Problem in den Griff zu bekommen, ist mächtig viel zusätzlicher Code nötig.

Hängt man das gleiche Attachment zweimal in ein RichtextFeld, dann sieht das im DXL so aus

1. Attachment
Zitat
<attachmentref name='2nd.jpg' displayname='2nd.jpg'><picture
 height='47px' width='43px'><notesbitmap>

2. Attachment, gleicher Dateiname
Zitat
<attachmentref name='ATT5OTO6' displayname='2nd.jpg'><picture
 height='47px' width='43px'><notesbitmap>

Verwendet man nun n-Mal den Tag <<RT:RTONE>>, dann werden auch diese Informationen dupliziert.
Das wäre soweit nicht weiter schlimm, wenn der DXLIMporter das merken würde und die
<attachmentref name='ATTxxxxxx> entsprechend selber anpassen würde. Tut er aber nicht. Das Ding ist dumm wie Brot und importiert daß, was man ihm vorsetzt; Hauptsache Well-Formed.

Probleme bekommt man dann, wenn man im Nachhinein eins der doppelten Attachments mit gleicher <attachmentref name='ATT bearbeitet. PENG !!!

Man kann jetzt sagen, OK, dann darf es halt keine doppelten Platzhalter geben. Aber daß Problem tritt auch dann auf, wenn man ( wie es in !!HELP!! beabsichtigt ist )

<<RT:RTONE>>
<<RT:RTTWO>>

verwendet, wobei RTONE und RTTWO aus unterschiedlichen Dokumenten kommen, aber durchaus das gleiche Attachment haben können ( nicht müssen )

Also muss man, nachdem das komplette XML im RT zusammengebastelt ist, <attachmentref name='ATTxxxxx und die dazugehörenden DisplayName - Tags unique machen.

Das ist noch eine Menge Arbeit, ist aber nicht unlösbar ( NotesRichTextNavigator und NotesRichTextRange )

Ich denke, daß es mit DXL im Backend eine Menge Möglichkeiten gibt. Solange es nicht zeitkritisch ist.
Schön ist auch, daß man im DXl mal sieht, wie so ein RT-Field intern "tickt".

Allerdings suche ich noch nach Informationen, wie man den DXLImporter ein wenig mehr detailliertere Informationen entlockt als ewig die gleiche monotone Fehlermeldung, wenn das XML nicht well-formed ist.
« Letzte Änderung: 08.05.06 - 19:58:04 von eknori »
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: RichText in RichText EINFÜGEN
« Antwort #59 am: 08.05.06 - 23:02:45 »
Hi,

kannst du vielleicht einfach mal eine Beispieldatenbank posten?
Oder kann ich einfach meine HELP Version nehmen, deinen Agenten da rein pasten und dann bestimmte Felder mit bestimmten Werten füllen?

Zitat
Allerdings suche ich noch nach Informationen, wie man den DXLImporter ein wenig mehr detailliertere Informationen entlockt als ewig die gleiche monotone Fehlermeldung, wenn das XML nicht well-formed ist.
Nicht normal. Aus allen mir bekannten xml Parsern bekommt man die Zeilen/Spaltennummer bzgl. wo es nicht well formed ist.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz