OFFICIUM INSERVIO
Your reliable partner for your business software...
Sage 100 RichText (RTF)
(alle Versionen/all versions)
Montag, 18. September 2023
Möglichkeiten aus Entwicklersicht
Hintergrund
Sage erlaubt an diversen Stellen die Bearbeitung von Texten im RichText (RTF)-Format, z.B. in der Belegerfassung und in Textbausteinen.
Datentechnisch hält Sage i.d.R. drei Felder pro Textbereich vor: PlainText, z.B.
KHKVKBelege.Kopftext, RichText (RTF), z.B. KHKVKBelege.KopftextRTF und Html, z.B. KHKVKBelege.KopftextHTML.
Intern konvertiert Sage die entsprechenden Informationen dann zwischen den Feldern automatisch hin und her, je nach Bedarf.
Beim Verändern der Informationen per Quellcode ist auf die korrekte Handhabung zu achten.
Möglichkeiten aus Entwicklersicht
Es stellt sich die Frage, welche Möglichkeiten der Bearbeitung von RichText (RTF) sich per Quellcode ergeben.
Ein mögliches Anwendungszenario ist z.B. die Veränderung von Belegen, die bestehende formatierte Belegtexte enthalten.
AppDesigner Makro
In AppDesigner Makros besteht die Möglichkeit, mit dem Befehl "EinfügenText" auch einen RichText (RTF) anzufügen.
Sage führt dies selber im Rahmen der Belegerfassung durch.
Wie die Hilfe zum Befehl "EinfügenText" klarmacht, wird dort auch RichText (RTF) unterstützt.
.net-Code
Sage benutzt bei dem AppDesigner Makro-Befehl "EinfügenText" im eigenen Makro-Handler-Quellcode die DevExpress-Komponente "DevExpress.XtraRichEdit.RichEditDocumentServer".
Dies wird deutlich, wenn man sich den Sage Quellcode-Kontext "Sagede.Shared.ControlCenter.Controller.Shared.Controls.RichtextEditHelper.InsertText" anschaut.
Nachfolgender Quellcode zeigt ein Beispiel, wie ein zuvor ausgelesener RichText (RTF) mit den Sage Funktionen zunächst die Beleg-Platzhalter ersetzt bekommt.
Anschließend wird der neue Text ausschließlich dann in den Beleg-Kopftext im RichText (RTF)-Format eingefügt, wenn dieser Text noch nicht existiert.
// mandator = Sagede.OfficeLine.Engine.Mandant
// salesDocument = Sagede.OfficeLine.Wawi.BelegEngine.Beleg
// textBlockContent = Text in RichText (RFT) format
// Replace Sage ERP document placeholders
textBlockContent = Sagede.OfficeLine.Wawi.BelegEngine.BelegTexte.ErsetzePlatzhalter( mandator , textBlockContent , salesDocument , salesDocument.A0Konto , salesDocument.Kontoart( true ) , salesDocument.GetBriefanrede() , string.Empty , string.Empty , string.Empty , true );
if ( textBlockIsRtf )
{
// See Sagede.Shared.ControlCenter.Controller.Shared.Controls.RichtextEditHelper.InsertText
// !!! ATTENTION !!! Requires a link to the DevExpress lib in GAC matching exactly the DevExpress version used by Sage !!!
// C:\Windows\Microsoft.NET\assembly\GAC_MSIL\DevExpress.RichEdit.v21.2.Core\v4.0_21.2.4.0__b88d1754d700e49a\DevExpress.RichEdit.v21.2.Core.dll
var richEditDocumentServerExistingDocText = new DevExpress.XtraRichEdit.RichEditDocumentServer
{
RtfText = salesDocument.KopftextRtf
};
var richEditDocumentServerNewText = new DevExpress.XtraRichEdit.RichEditDocumentServer
{
RtfText = textBlockContent
};
// ContainsEnhanced = Extension method which searches a string none-case-sensitive
var insertText = !richEditDocumentServerExistingDocText.Text.ContainsEnhanced( richEditDocumentServerNewText.Text );
if ( insertText )
{
var richEditDocument = richEditDocumentServerExistingDocText.Document;
richEditDocument.InsertRtfText( richEditDocument.Range.Start , textBlockContent , DevExpress.XtraRichEdit.API.Native.InsertOptions.KeepSourceFormatting );
salesDocument.KopftextRtf = richEditDocument.RtfText;
}
}
else
{
if ( !salesDocument.Kopftext.ContainsEnhanced( textBlockContent ) )
{
salesDocument.Kopftext = textBlockContent + ( string.IsNullOrWhiteSpace( salesDocument.Kopftext ) ? string.Empty : Environment.NewLine + salesDocument.Kopftext );
}
}
Wie dem Quellcode entnommen werden kann, wird für diesen Ansatz eine Referenz auf die entsprechende DevExpress-Bibliothek benötigt, die zum Sage ServicePack-Stand (QSP-Stand) passend ist.
Sage rollt die DevExpress-Bibliotheken in den Global Assembly Cache (GAC) aus.
Somit ergeben sich mitunter gewisse Nachteile bei der Update-Sicherheit des o.g. .net-Quellcodes.
Eine Alternative ist der Zugriff auf die RichText-Felder mit Hilfsfunktionen in den Belegobjekten von Sage, z.B. die Funktion "Sagede.OfficeLine.Wawi.BelegBasic.BelegFunctions.AppendRtfToRTF".
Diese Funktion verarbeitet ebenfalls das RichText (RTF)-Format.
⚠️Allerdings ist an dieser Stelle Vorsicht geboten.⚠️
Sage verwendet bei Aufruf der Funktion "AppendRtfToRTF" intern das Windows.Forms-Control "System.Windows.Forms.RichTextBox".
Die Verwendung solcher Controls in Server-Prozessen, namentlich im Sage ERP Applikationsserver, kann problematisch in Bezug auf die Ressourcen sein und zu Speicherproblemen führen, wenn diese Funktionen zu häufig aufgerufen werden.
Demgegenüber nachfolgend die .net-Referenzen der o.g. DevExpress-Bibliothek "DevExpress.RichEdit.v21.2.Core.dll":
Referenzen auf "System.Windows.Forms" finden sich ausschließlich indirekt, z.B. in der Printing-Assembly von DevExpress.




