Ticketstatusereignis
Das Ticketing-System von Business Portals kann ein Ereignis auslösen, wenn der Ticketstatus im Frontend geändert wird. Diese Statusänderung wird an Business Central gesendet, wo sie von einer benutzerdefinierten Codeunit verarbeitet werden kann, um Aktionen wie das Protokollieren der Interaktion oder das Berechnen der Zeit, die das Ticket im vorherigen Status verbracht hat, durchzuführen.
Dieser Abschnitt bietet ein Beispiel dafür, wie man eine benutzerdefinierte Codeunit implementiert, die ausgelöst wird, wenn der Ticketstatus vom Benutzer geändert wird.
Codebeispiel
In diesem Beispiel verwenden wir die Ticket-Tabelle in einem Szenario, in dem die Änderung des Ticketstatus ein Ereignis auslöst, das beispielsweise die Interaktionshistorie protokollieren und/oder berechnen kann, wie lange das Ticket im vorherigen Status war.
Die Änderung des Ticketstatus sendet Daten an Business Central, wo sie in einer Business Central-Codeunit verarbeitet werden.
// Protokolliere Web-Interaktionsparameter
'LogWebInteraction':
begin
EnsureInteractionTemplateExists();
CreateInteractionLog(Rec, LocalRecordSIMDPSTicketStatus);
end;
// Protokolliere Übergangszeitparameter
'LogTransitionTime':
CalculateTransitionTime(Rec);
// Protokolliere sowohl Web-Interaktion als auch Übergangszeitparameter
'LogWebAndTransitionTime':
begin
EnsureInteractionTemplateExists();
CreateInteractionLog(Rec, LocalRecordSIMDPSTicketStatus);
CalculateTransitionTime(Rec);
end;
// Diese Prozedur stellt sicher, dass die Interaktionsgruppe in den Interaktionsprotokolleinträgen existiert. Wenn sie nicht existiert, wird sie erstellt.
local procedure EnsureInteractionTemplateExists()
var
LocalRecordInteractionTemplate: Record "Interaction Template";
LocalRecordInteractionGroup: Record "Interaction Group";
begin
// Sicherheitsüberprüfung: Sicherstellen, dass die Interaktionsgruppe existiert, um Validierungsfehler zu vermeiden
if not LocalRecordInteractionGroup.Get('TICKET') then begin
LocalRecordInteractionGroup.Init();
LocalRecordInteractionGroup.Code := 'TICKET';
LocalRecordInteractionGroup.Description := 'Ticket-Operationen';
LocalRecordInteractionGroup.Insert();
end;
// Erstelle die Interaktionsvorlage, wenn sie fehlt
if not LocalRecordInteractionTemplate.Get('TKT_STATUS') then begin
LocalRecordInteractionTemplate.Init();
LocalRecordInteractionTemplate.Code := 'TKT_STATUS';
LocalRecordInteractionTemplate."Interaction Group Code" := 'TICKET';
LocalRecordInteractionTemplate.Description := 'Änderung des Ticketstatus';
// Setze den Standard-Korrespondenztyp auf leer (Leerzeichen) unter Verwendung der Enum/Option-Referenz
LocalRecordInteractionTemplate."Correspondence Type (Default)" := LocalRecordInteractionTemplate."Correspondence Type (Default)"::" ";
LocalRecordInteractionTemplate.Insert();
end;
end;
// Diese Prozedur erstellt das Interaktionsprotokoll in den Interaktionsprotokolleinträgen
local procedure CreateInteractionLog(var ParamRecordSIMDPSTicket: Record "SIM_DPS Ticket"; ParamRecordSIMDPSTicketStatus: Record "SIM_DPS Ticket Status")
var
LocalRecordInteractionLogEntry: Record "Interaction Log Entry";
LocalRecordSIMDPSWUBusinessMapping: Record "SIM_DPS WU Business Mapping";
LocalRecordContact: Record Contact;
LocalContactFoundBoolean: Boolean;
LocalStatusChangeLabelMsg: Label 'Ticket %1 geändert zu %2 (%3)', Comment = '%1 = Ticketnummer, %2 = Ticketstatus, %3 = Ticketkategorie';
begin
// Sichere die nächste Eintragsnummer für das Interaktionsprotokoll
LocalRecordInteractionLogEntry.LockTable();
if LocalRecordInteractionLogEntry.FindLast() then
LocalRecordInteractionLogEntry."Entry No." += 1
else
LocalRecordInteractionLogEntry."Entry No." := 1;
// Initialisiere die Standard-Auditfelder
LocalRecordInteractionLogEntry.Init();
LocalRecordInteractionLogEntry.Date := Today();
LocalRecordInteractionLogEntry."Time of Interaction" := Time();
LocalRecordInteractionLogEntry."User ID" := CopyStr(UserId(), 1, MaxStrLen(LocalRecordInteractionLogEntry."User ID"));
LocalRecordInteractionLogEntry.Description :=
CopyStr(StrSubstNo(LocalStatusChangeLabelMsg, ParamRecordSIMDPSTicket."No.", ParamRecordSIMDPSTicketStatus.Code, ParamRecordSIMDPSTicketStatus.Category), 1, MaxStrLen(LocalRecordInteractionLogEntry.Description));
// Weisen Sie die Vorlagen-Codes zu
LocalRecordInteractionLogEntry."Interaction Template Code" := 'TKT_STATUS';
LocalRecordInteractionLogEntry."Interaction Group Code" := 'TICKET';
// -------------------------------------------------------------------------
// KONTAKT-MAPPING-LOGIK
// -------------------------------------------------------------------------
LocalContactFoundBoolean := false;
// Überprüfen Sie das Webbenutzer-Geschäftsmapping
LocalRecordSIMDPSWUBusinessMapping.Reset();
LocalRecordSIMDPSWUBusinessMapping.SetRange(Username, ParamRecordSIMDPSTicket.Author);
LocalRecordSIMDPSWUBusinessMapping.SetRange(Company, CompanyName());
LocalRecordSIMDPSWUBusinessMapping.SetRange("DPS Business Mapping Code", 'CONTACT');
if LocalRecordSIMDPSWUBusinessMapping.FindFirst() then begin
LocalRecordInteractionLogEntry."Contact No." := LocalRecordSIMDPSWUBusinessMapping."No.";
LocalContactFoundBoolean := true;
end;
// Fallback für interne BC-Benutzer
if not LocalContactFoundBoolean then begin
LocalRecordContact.Reset();
LocalRecordContact.SetRange(Type, LocalRecordContact.Type::Company);
LocalRecordContact.SetRange("Company Name", CompanyName());
// Wenn ein generischer Unternehmenskontakt für das aktuelle BC-Unternehmen existiert, verlinke ihn
if LocalRecordContact.FindFirst() then
LocalRecordInteractionLogEntry."Contact No." := LocalRecordContact."No.";
end;
// Übertrage in das Interaktionsprotokoll
LocalRecordInteractionLogEntry.Insert(true);
end;
// Diese Prozedur berechnet die Übergangszeit, seit der Status zuletzt geändert wurde
local procedure CalculateTransitionTime(var ParamRecordSIMDPSTicket: Record "SIM_DPS Ticket")
begin
if ParamRecordSIMDPSTicket."Status Last Changed At" <> 0DT then
ParamRecordSIMDPSTicket."Transition Duration" := CurrentDateTime() - ParamRecordSIMDPSTicket."Status Last Changed At"
else
if ParamRecordSIMDPSTicket.Created <> 0DT then
ParamRecordSIMDPSTicket."Transition Duration" := CurrentDateTime() - ParamRecordSIMDPSTicket.Created;
end;