Das Notes Forum

Lotus Notes / Domino Sonstiges => Projekt Bereich => Help-Desk Applikation !!Help!! => Thema gestartet von: Thomas Schulte am 27.04.06 - 09:32:37

Titel: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: Thomas Schulte am 27.04.06 - 09:32:37
IBM hat mit Domino und Notes ein in der Regel brauchbares Produkt geschaffen. Es wäre perfekt, wenn sie es schaffen würden ihre vorhandenen Fehler und Ungereimtheiten in absehbarer Zeit zu lösen.
Über eine dieser Ungereimtheiten bin ich gestern wieder einmal gestolpert.

Ausgehend von der hier gestellten Frage bezüglich der Übernahme von Texten mit CRLF in derselben, strukturierten Weise, für die wir eine Lösung gefunden haben die nicht so wirklich logisch ist, aber immerhin funktioniert, habe ich mir gedacht, ok das könnte der Weg sein um auch Richtext Felder mit ihrem kompletten Inhalt an einer bestimmten Stelle in ein anderes Richtext Feld einzufügen.

Durch Schaden klug geworden (naja, mehr oder weniger). habe ich mir erst einmal die Online Hilfe durchgelesen und da steht zu diesem Thema:
AppendRTItem method 

Beispiel
Inserts the contents of one rich text item in another.
Defined in
NotesRichTextItem
Syntax
Call notesRichTextItem.AppendRTItem( notesRichTextItem2 )
Parameters
notesRichTextItem2
The item to be appended. If you specify Nothing, this method generates an error.
Usage
By default the insertion occurs at the end of the item. You can change the insertion point with BeginInsert and EndInsert.

Vor allen der letzte Satz ist wichtig impliziert er doch, das diese Funktion AUCH benutzt werden kann um ein Richtextitem an einer bestimmten Stelle in ein anderes Richtextitem einzubauen.

Ja denkste, Pustekuchen, beim Ausführen bekommt man folgende Fehlermeldung:
Error: 'Method is not available' when calling LotusScript AppendRTItem after BeginInsert Method
Die dann ja eigentlich schon alles sagt.

ABER, Moment mal, in der Online Hilfe steht doch das es funktioniert.

Ein paar Minuten später und nach etwas Buddelarbeit in den Niederungen von Notes.net und der KB findet man einen SPR# LGAA5N6FHT der zu genau diesem Thema geschrieben wurd. Dieser SPR ist vom November 2004 und hat als Lösung anzubieten:

Solution
This issue was reported to Quality Engineering as SPR# LGAA5N6FHT and was determined not to be a software problem. Notes and Domino are functioning as designed.
Workaround:
Use the AppendText method rather than the AppendRTItem method where appropriate.

HALLO, gehts noch? Wer ist hier bescheuert, ihr oder ich?

Liebe IBM. ein Richtext Feld in ein anderes Richtext Feld an einer definierten Stelle einfügen zu können ist Sinn und Wertvoll für Zig Anwendungen. Erzählt mir bitte nicht das es nicht machbar wäre, denn Ben Langhinrichs macht es euch mit Midas seit Jahren vor. Erzählt mir bitte auch nicht das die Software an dieser Stelle wie gewünscht funktioniert, denn offensichtlich tut sie das nicht, sonst würdet ihr in der Online Hilfe nicht behaupten das es funktioniert.
Anstatt Millionen von $ auszugeben um mit Webshpere und jetzt Workplace neue Löcher aufzureisen, wie wäre es denn damit erst einmal die alten Fehler zu eliminieren. beziehungsweise nicht zuende gedachte Ansätze, von denen es in Domino/Notes nur so wimmelt fertigzustellen


Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: DerAndre am 27.04.06 - 09:47:29
Hallo Thomas.

So ein ähnliches Problem hatte mein Kollege letztens auch. Die Funktion ( ich weis leider nicht mehr was es war, irgendwas mit http ) steht auf der Tapete und in der Onlinehilfe. Also, genau das was man braucht und wo man annimmt es sollte klappen. Also Implementiert und laufen lassen... :P
Äääätsch, was kommt als Fehlermeldung, "This Function is not implemented".
Was soll man jetzt noch dazu sagen?

Gruss

André
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: Thomas Schulte am 27.04.06 - 10:22:18
Ich hab jetzt mal dear Mr.Ed himself angeschrieben. Mal schauen ob sich da was tut. Auf der anderen Seite überlege ich schon noch ob das in Form eines offenen Briefes vielleicht zu einer meiner Meinung notwendig werdenden Diskussion beitragen kann. Ob es hilft ????
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: eknori am 27.04.06 - 20:04:48
Thomas, ich glaube E.B. ist da nicht die richtige Adresse. Der ist Vertriebler durch und durch und hat von der Technik ( m.M. ) keinen blassen Schimmer. Ich denke, daß du in den Labs auf der DNUG eher Gehör findest.

Wenn ich es schaffe meinen Chef dazu zu bewegen, mir die Teilnahme an der DNUG zu genehmigen, können wir mit geballter Power auftreten  ;D
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: eknori am 28.04.06 - 17:47:59
in der DesignerHilfe zu Notes 7 steht das etwas anders

The insertion occurs at the end of the item. AppendRTItem cannot be called after BeginInsert.

Auch eine Möglichkeit, einen SPR zu lösen. Man ändere einfach den Hilfetext und schon kommt keiner mehr auf die Idee ein AppendRTItem in ein bestehendes RTItem an eine bestimmte Stelle zu machen.
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: eknori am 28.04.06 - 18:14:26
Es wird schlussendlich auf das Konstrukt herauslaufen, das ich mir schon überlegt habe.

Dem FindAndReplace musst du ja in irgendeiner Weise klarmachen, daß es sich nicht um einen Feldwert handelt, sondern daß ein RTFeld an die Stelle des Tags eingefügt werden soll. Zudem wird das Feld ja nicht mitten in einen Text eingefügt, sondern stellt quasi einen Abschnitt dar.

Zitat
Im Template sieht dass dann etwa so aus:

Hier kommt ein text mit einem <<tag>> Dann geht es weiter und jetzt soll ein

<<RT:SomeFieldName>>

eingefügt werden. und so <<weiter>>

Ich denke, es wird jetzt nichts anderes übrigbleiben, als das FindAndReplace in 2 Durchgängen zu erledigen. Der erste Durchlauf ersetzt alle <<>> Tags. Jetzt bleibt nur noch das <<RT:SomeFieldName>> übrig.

Wir bauen ja eh für das SpoofMessage ein neues RTItem.
Also schreiben wir zunächst mittels NotesRichTextRange class  und SetBegin / SetEnd den Inhalt bis zum <<RT: ... in das ( temp ) RTItem und hängen im nächsten Schritt das RTItem SomeFieldName mittels AppendRTItem an.

Anschließend muss der RTNavigator hinter das >> gesetzt werden und eine neue RTRange ( als idealerweise bis zum Ende des RTItems ) gebaut werden. Den Inhalt kopieren wir dann wieder in ein (Hilfs-) RTItem und hängen dieses an das bereits vorhandene TempRTItem an.

Das ist zwar eine Menge Code, aber von ein paar kleinen Einschränkungen lassen wir uns doch nicht aufhalten. Oder, Thomas ?  ;D



Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: Thomas Schulte am 28.04.06 - 18:58:47
Genau ....
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: eknori am 28.04.06 - 20:36:24
Zitat
Genau ....

ich fasse das jetzt mal als Aufforderung auf, eine

function InsertRTItem ( rtiItem as NotesRichTextItem, Position as WasWeissIch, rtiToInsert as NotesRichTextItem ) as NotesRichTextItem

zu schreiben  ;D
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: eknori am 29.04.06 - 16:07:54
Was für ein Scheiss ... Es gibt einfach keine Methoden, mit der man das oben beschriebene hinbekommt. Auch mit einer Von-hinten-durch-die-Brust-ins-Auge Programmierung ist es nicht möglich, ein RTItem an eine bestimmte Stelle eines anderen RTItem einzufügen.

Bleibt evtl. noch die Möglichkeit über DXLImport und Export, wenn man die beiden Files entsprechend zusammenführt.

Hat noch jemand eine andere Idee ?? ( ausser MIDAS zu verwenden  ;D )
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: koehlerbv am 29.04.06 - 17:10:02
Ist dieser Parameter
Position as WasWeissIch
nicht das eigentliche Problem?
Würde dieses Problem überhaupt bei einem DXL-Ex-/Merge-//Import-Verfahren eher auflösbar sein?

Bernhard
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: mibo11 am 29.04.06 - 17:55:10
Hat noch jemand eine andere Idee ?? ( ausser MIDAS zu verwenden  ;D )

Ich arbeite für solche Fälle ebenfalls ausschließlich mit Midas. Eine von-hinten-durch-die Brust-ins-Auge-Methode wäre evtl. das gewünschte Richtext-Feld in einer eigenen Maske mit RT Feld aufzurufen, dann das übliche "uidoc.SelectAll, ...Copy, ...Close, ...Paste" Gedönse. Ich geb zu, dass dies natürlich nur im Frontend funktioniert, evtl. bringt euch dieser Ansatz aber weiter. Viel Erfolg.

Gruß Sascha
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: eknori am 29.04.06 - 18:16:19
Zitat
Würde dieses Problem überhaupt bei einem DXL-Ex-/Merge-//Import-Verfahren eher auflösbar sein?

Ich denke, daß das gehen könnte.

Zuerst exportiert die Routine das RTFeld1; dabei gibt es dort irgendwo einen TAg <<RT:RT2>> Diesen Tag findet man ja auch im exportierten File wieder. An diese Stelle wird dann das ebenfalls exportierte RT2 ( natürlich nur die DATEN ) eingefügt ( wie auch immer, aber das sind ja lediglich Ttextfiles )
Anschließend wird das gemergede RT wieder importiert und kann dann über SpoofMessage versendet werden. So zumindest die Theorie ...

@Sascha: Frontend kommt in diesem Fall nicht in Frage ...

Und MIDAS kommt nicht in Frage; immerhin ist das Projekt Open Source. Wir können ja keinen zwingen, wegen einer Funktion Geld in die Hand zu nehmen ...
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: flaite am 30.04.06 - 07:46:32
Ich würd testweise so anfangen:
1. Schritt -> dxl eines Dokuments auf die Festplatte kopieren.
2. Schritt -> dxl manuell ändern
3. Schritt -> dxl in die Datenbank re-importieren.

Gruß Axel
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: eknori am 30.04.06 - 10:09:45
@Axel: Habe getestet; es funktioniert  :D
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: eknori am 30.04.06 - 11:02:33
hier noch eine kleine DB für diejenigen, die damit auch ein bisschen rumspielen wollen.
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: eknori am 30.04.06 - 14:29:09
Im Groben funktioniert das jetzt ( die zu ersetzende Information beschränkt sich auf kurzen, formatierten Text )

Ich mache einen Export des RTFeldes, in das ich den Inhalt eines anderen RTFeldes einfügen möchte; die Einfügemarke steht im ersten Feld als TAG <<RT:RTONE>>.
Das Ergebnis des Exports streame ich in ein temporäres RichTextFeld.

Jetzt exportiere ich das Document, dessen RTFeld eingefügt werden soll mit dem DXLExporter.
Nun kann ich in dem Export nach dem Feld suchen, das ich brauche ( hier RTONE ) Die Position ermittele ich mit

SearchItem = "<item name='RTONE'><richtext>"
StartTagAt = Instr(buffer$, SearchItem ) + Len ( SearchItem )

StartTagAt enthält nun die Position des ersten Zeichens hinter SearchItem.

EndTagAt = Instr(buffer$, "</richtext></item>" )
length = ( EndTagAt - StartTagAt )

ermittele ich analog.

Mittels Msgbox Mid$ ( buffer$ , StartTagAt  , Length ) erhalte ich den Inhalt des RTONE mit allen Formatierungen.

Ein FindAndReplace im temporären RTFeld fügt den Inhalt von buffer$ anstelle des Tags <<RT:RTONE>> ein.

Wie gesagt,  das funktioniert mit einfachen Texten; bei Attachments und eingefügten Screenshots ist das nicht ganz so einfach ( aber auch nicht unmöglich )

Bei Screenshots z.B wächst die Größe von buffer$ enorm an. Ebenso bei Attachments. Da kommt man mit einfachen Stringoperationen nicht mehr zum Ziel.

Zudem wird bei einem Attachment auch noch ein weiterer Node geschrieben:

<item name='$FILE' summary='true' sign='true' seal='true'><object><file hosttype='msdos'
 compression='none' flags='storedindoc' name='binary.gif' desiredcompression='huffman'>
<created><datetime dst='true'>19960820T192900,00+02</datetime></created>
<modified><datetime dst='true'>19960820T192900,00+02</datetime></modified><filedata
>
R0lGODdhEAAQAIcAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwMDcwKbK8AD/AP//AAAA//8A/wD/
/////wAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD//////wAAAIAA
AACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD//////wAAAIAAAACAAICAAAAA
gIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD//////wAAAIAAAACAAICAAAAAgIAAgACAgMDA
wICAgP8AAAD/AP//AAAA//8A/wD//////wAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/
AP//AAAA//8A/wD//////wAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A
/wD//////wAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD//////wAA
AIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD//////wAAAIAAAACAAICA
AAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD//////wAAAIAAAACAAICAAAAAgIAAgACA
gMDAwICAgP8AAAD/AP//AAAA//8A/wD//////wAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8A
AAD/AP//AAAA//8A/wD//////wAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA
//8A/wD//////wAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD/////
/wAAAIAAAACAAICAAAAAgIAAgACAgMDAwICAgP8AAAD/AP//AAAA//8A/wD//////wAAAIAAAACA
AICAAAAAgIAAgP/78KCgpICAgP8AAAD/AP//AAAA//8A/wD//////ywAAAAAEAAQAAAIbgANCBxI
sKDBgwgTGhzAsCFDhAMeSJS44OFCig8WPIg44CLGigBCFhygseSBBScBYCAYcQEBAhkJoFTJ0qVE
AgdwLqA5MKJOmTIP8BRIMihOnUMNtHx5MmhSkiejoty5smfIq1iTGsDAtavXlQEBADs=
</filedata></file></object></item>

Den muss man auch noch in das Zieldocument einfügen. Hier reicht es aber aus, diese Informationen an das Ende des DXLExports zu schreiben, also vor dem  </document> einzufügen.


Abschließend kann man aber sagen, daß die Aufgabenstellung mit Notes Boardmitteln zu lösen ist.  8)
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: eknori am 30.04.06 - 17:01:53
Ich habe das Thema DXL noch einmal hier neu aufgegriffen http://atnotes.de/index.php?topic=30227.new#new
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: flaite am 30.04.06 - 19:26:18
... ich vermute, dass es mit xslt einfacher geht. Gehört ja auch zu den "notes-Boardmitteln". Gibt es sogar Lotusscript Klassen für.
Kannst du vielleicht mal das folgende posten:
1. "Quell-DXL"
2. "Ergebnis - DXL"

Quell-Dxl ist bevor du darauf deine String-Magic anwendest.
Ergebnis-Dxl ist danach.


Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: eknori am 07.05.06 - 19:57:09
der Ordnung halber verlinke ich jetzt mal die ( eine  )  Lösung
http://atnotes.de/index.php?topic=30227.msg191155#msg191155
Titel: Re: RANT! Ich will jetzt ein wenig lästern ...
Beitrag von: eknori am 14.10.06 - 12:50:26
Ich habe jetzt einmal hier eine Funktion in eine DLL gepackt, mit der man Richtext an jede beliebige Stelle in einem anderen Richtext Feld einfügen kann. Der InsertionPoint wird durch einen beliebigen "Tag" definiert. ( z.B. <InsertHere> )
Die Funktion geht dabei sowohl mit Attachments als auch eingebetteten Objekten so um, wie man es im Frontend beim Einfügen von Screenshots und Attachments gewohnt ist; allerdings hier im Backend (!)

http://www.eknori.de/archives/348