top of page

Sage 100 RichText (RTF)

(alle Versionen/all versions)

Montag, 18. September 2023

Hintergrund

Möglichkeiten aus Entwicklersicht

AppDesigner Makro

.net-Code



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.

ree

Wie die Hilfe zum Befehl "EinfügenText" klarmacht, wird dort auch RichText (RTF) unterstützt.

ree

.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.


ree

Demgegenüber nachfolgend die .net-Referenzen der o.g. DevExpress-Bibliothek "DevExpress.RichEdit.v21.2.Core.dll":


ree

Referenzen auf "System.Windows.Forms" finden sich ausschließlich indirekt, z.B. in der Printing-Assembly von DevExpress.













bottom of page