Document Dispatch-Platzhalter mit eigener Codeunit füllen
Mit einer eigenen Codeunit können Sie den vollständigen Textwert eines Document Dispatch-Platzhalters selbst zusammensetzen. Die Codeunit erhält den aktuellen Beleg und liefert beispielsweise eine Kombination aus Rechnungsnummer, Kundenname und eigenen Berechnungen zurück. Document Dispatch setzt diesen Text anschließend für den zugeordneten Platzhalter in der E-Mail-Vorlage ein.
Die Zuordnung erfolgt im Versandprofil über Ausgabetypeinrichtung → E-Mail-Platzhalter → Data Mapping Code. Das ausgewählte CORE-Datenmapping enthält eine Zeile vom Typ CODEUNIT, die Ihre Codeunit aufruft. Für jeden benötigten Platzhalter, beispielsweise %1 oder %2, wählen Sie das passende Mapping; damit legen Sie dessen Inhalt selbst fest. Das folgende Beispiel zeigt die vollständige Einrichtung für eine gebuchte Verkaufsrechnung.
Aktueller Beleg → CORE-Datenmapping (CODEUNIT) → eigene Codeunit → Rückgabetext → Platzhalter in der E-Mail-Vorlage.
Voraussetzungen
- Eine eigene AL-Erweiterung mit einer Abhängigkeit von CORE by Simova und den zugehörigen Symbolen.
- Berechtigungen zum Einrichten von CORE-Datenmappings, zum Ausführen Ihrer Codeunit und zum Lesen der verwendeten Datensätze.
- Für das E-Mail-Beispiel: Document Dispatch mit einer E-Mail-Vorlage und einem Versandprofil für Sales Invoice Header (Tabelle 112, gebuchte Verkaufsrechnungsköpfe).
1. Codeunit implementieren
Fügen Sie die folgende Codeunit Ihrer Erweiterung hinzu. Passen Sie Objekt-ID und Namen an Ihre Erweiterung an und veröffentlichen Sie diese, bevor Sie die Codeunit im Mapping auswählen.
codeunit 50100 "My Placeholder Mapping"
{
TableNo = "SIM_CORE Temp Table";
trigger OnRun()
var
SalesInvoiceHeader: Record "Sales Invoice Header";
SourceRecordRef: RecordRef;
DocumentTextLbl: Label '%1 | %2', Locked = true;
UnsupportedFunctionErr: Label 'Unsupported function: %1.', Comment = '%1 = Function name';
MissingRecordErr: Label 'The source record could not be found.';
WrongTableErr: Label 'This function requires a posted sales invoice.';
begin
Rec."Function List" := 'DOCUMENTTEXT';
Clear(Rec."Dyn Mapping Return Value");
if Rec.Param = '' then
exit;
if Rec.Param <> 'DOCUMENTTEXT' then
Error(UnsupportedFunctionErr, Rec.Param);
if not SourceRecordRef.Get(Rec.RecID) then
Error(MissingRecordErr);
if SourceRecordRef.Number <> Database::"Sales Invoice Header" then
Error(WrongTableErr);
SourceRecordRef.SetTable(SalesInvoiceHeader);
SourceRecordRef.Close();
Rec."Dyn Mapping Return Value" := CopyStr(
StrSubstNo(DocumentTextLbl,
SalesInvoiceHeader."No.",
SalesInvoiceHeader."Bill-to Name"),
1, MaxStrLen(Rec."Dyn Mapping Return Value"));
end;
}
Für eine gebuchte Rechnung mit der Nummer INV-1001 und dem Rechnungsempfängernamen Contoso lautet das Ergebnis INV-1001 | Contoso. Trennzeichen und Textzusammensetzung legen Sie in Ihrer Codeunit fest.
CORE führt die Codeunit über ihren Trigger OnRun mit einem Puffer der Tabelle SIM_CORE Temp Table aus:
| Feld | Verwendung |
|---|---|
RecID |
ID des aktuellen Ausgangsdatensatzes, beispielsweise der gebuchten Verkaufsrechnung. |
Param |
Wert aus Execute Codeunit Param, hier DOCUMENTTEXT (maximal 50 Zeichen). |
Company |
Aktueller Mandantenname, begrenzt auf 30 Zeichen. Das Beispiel liest im aktuellen Mandanten. |
Function List |
Durch Kommas getrennte Funktionsnamen für die Parameterauswahl. Bei leerem Parameter füllt das Beispiel ausschließlich diese Liste. |
Dyn Mapping Return Value |
Rückgabetext für den Platzhalter, maximal 250 Zeichen. |
Schreiben Sie das Ergebnis in Rec."Dyn Mapping Return Value". Diese Textausgabe benötigt weder einen Rückgabedatensatz noch einen Wert im BLOB Return Value. Das Beispiel kürzt längere Ergebnisse mit CopyStr auf die Feldlänge. Wenn Sie andere Ausgangstabellen unterstützen möchten, passen Sie Datensatzverarbeitung und Prüfung entsprechend an.
2. CORE-Datenmapping einrichten
- Suchen Sie nach CORE - Data Mappings und wählen Sie Neu.
- Tragen Sie unter Code
DOC-TEXTund eine aussagekräftige Beschreibung ein. - Setzen Sie die Ausgangstabelle (Starting Table) auf der Karte auf Sales Invoice Header (112).
- Fügen Sie genau eine Mappingzeile hinzu und wählen Sie zuerst Typ
CODEUNIT. - Füllen Sie die Zeile wie folgt aus. Zur eindeutigen Zuordnung sind die Feldnamen des englischen Clients angegeben.
| Feld der Mappingzeile | Wert |
|---|---|
| Type | CODEUNIT |
| Starting Table | Sales Invoice Header (112) |
| Execute Codeunit | 50100 (oder Ihre eigene Objekt-ID) |
| Execute Codeunit Param | DOCUMENTTEXT |
Tragen Sie DOCUMENTTEXT direkt ein oder wählen Sie den Wert über die Parameterauswahl aus. Die Auswahl führt die Codeunit mit leerem Parameter aus und liest Function List. Deshalb verarbeitet das Beispiel diesen Aufruf, ohne einen Ausgangsdatensatz zu lesen.
Lassen Sie Source Table, Source Field, Starting Field und Field Filter für dieses Beispiel leer. Fügen Sie keine Zeilen vom Typ RETURN, RETURNFIELD oder CODEUNITRECORD hinzu: Dieses Mapping gibt seinen Text direkt über die Codeunit zurück. Verwenden Sie auf der Zeile dieselbe Ausgangstabelle wie auf der Karte, damit Test Data Mapping Datensätze der richtigen Tabelle zur Auswahl anbieten kann.
3. Mapping einem Platzhalter zuordnen
- Öffnen Sie das Document-Dispatch-Versandprofil für gebuchte Verkaufsrechnungen und dessen Ausgabetypeinrichtung.
- Wählen Sie E-Mail-Platzhalter und wählen oder erstellen Sie einen Platzhalter, beispielsweise
%1. - Wählen Sie im Feld Data Mapping Code den Wert
DOC-TEXT. Lassen Sie Feld leer und Mit BC-Anrede füllen (Fill with BC Salutation) für diesen Platzhalter deaktiviert. - Verwenden Sie
%1in der zugeordneten E-Mail-Vorlage, beispielsweiseBeleg: %1.
Beim Auflösen des Platzhalters übergibt CORE den aktuellen Datensatz an die Codeunit und verwendet deren Rückgabetext. Aus dem Beispieltext der Vorlage wird Beleg: INV-1001 | Contoso.
4. Ergebnis prüfen
- Wählen Sie auf der Mappingkarte Test Data Mapping und eine gebuchte Verkaufsrechnung aus. Vergleichen Sie den angezeigten Text mit deren Nummer und Rechnungsempfängernamen.
- Bereiten Sie über das eingerichtete Document-Dispatch-Profil eine E-Mail vor und prüfen Sie den aufgelösten Platzhalter im E-Mail-Text vor dem Versand.
- Wiederholen Sie den Vorgang mit einer anderen Rechnung, um zu prüfen, dass der Wert aus dem aktuellen Beleg stammt.
Bleibt der Wert leer, prüfen Sie den ausgewählten Mappingcode, Typ, Codeunit-ID, Parameter und die Zuweisung an Dyn Mapping Return Value. Erscheint beim Mappingtest keine Datensatzauswahl, prüfen Sie Starting Table auf der Mappingzeile. Prüfen Sie bei einem Fehler außerdem die Ausgangstabelle sowie die Berechtigungen zum Ausführen der Codeunit und Lesen des Ausgangsdatensatzes. Kürzen Sie das Ergebnis, wenn es 250 Zeichen überschreitet; für den E-Mail-Betreff gilt zusätzlich eine Gesamtlängenbegrenzung.