Munixo Support Forum - Kostenfreier Support für Munixo Anwender und Entwicklungspartner
0 Punkte

Spezieller Anwendungsfall der denke ich auch für andere Nutzer interessant sein könnte:

Ich möchte automatisch einen Rechnungslauf anstossen, wenn alle Positionen eines Lieferscheines den WorkflowStatus "Freigegeben" haben - natürlich nur für die Lieferscheine, die noch nicht abgerechnet wurden.

Wenn ich das richtig verstehe, kann das recht elegant über den MessageBus-Event-Service umgesetzt werden, aus den ERPWiki-Artikeln zum MessageBus konnte ich Teile davon verstehen, hier meine Frage wie der Rest umgesetzt werden müsste. Falls ich etwas wiederholt frage, das bereits in den Wiki Artikeln erklärt wurde, bitte ich um Verzeihung und etwas Geduld - die MessageBus Implementierung ist noch weitergehend Neuland für mich.

  • Event Beschreibung:
    • Typ Datenbank Event
    • Objekt OP_DeliveryNotes
    • Event: ValueChanged (oder besser AfterSqlUpdate?)
    • Filter: neuen Filter in DeliveryNotes anlegen (oder später über Konditionen im Abonnenten?)
      • TransferState.Value = 0
      • UND WorkflowStateApproved = 100
  • Event Service als ServerSide LUA (oder einfacher als Prozess?) - angelehnt am Beispiel4 im Wiki
    • Wie würden die GUIDs aus den Ausgangslieferscheinen übergeben, ist das ein @@EventReturnValue@@? oder per LUA abfragen  in etwa wie: Database["OP_DeliveryNotes"]:Where("WorkflowStateApproved",100) :And("TransferState.Value",eFieldComparison.LessEqual,100) :SelectGuid() :Query(Session)
  • Event-Abonnent 
  • Nebenbei bemerkt: Was ist der LUA-Befehl für den Rechnungslauf? Falls GUIDs vom ValueChanged-Event + Filter übergeben werden, wie müsste das im ParameterMapping und im LUA Code implementiert werden? Wenn das über einen Prozess einfacher ist, würden dann die Parameter im Event-Mapping an den Prozess übergeben werden? Oder können nur exakt die globalen Input Parameter aus dem Wiki-Eintrag Serverseitige_Lua-Programmierung gesetzt werden:
    • @@Event@@ = cEvent-Objekt
    • @@EventSender@@ = cEvent.Sender
    • @@EventName@@ = cEvent.Name
    • @@EventReturnValue@@ = cEvent.ReturnValue

Vielen Dank für die Erklärung zur Implementierung so eines Anwendungsfalles - einige andere Situationen sollten sich ähnlich lösen lassen vermute ich.

von (1.1k Punkte)

1 Antwort

0 Punkte

Es gibt hier grundsätzlich verschiedene Möglichkeiten. Zunächst hier die Frage, ob nach der Freigabe eines Lieferscheins tatsächlich alle Lieferscheine mit den genannten Bedingungen berücksichtigt werden sollen oder nur der freigegebene.

Performanter und meiner Meinung nach sinnvoller wäre die zweite Option. Ich möchte aber beide Varianten vorstellen.

1) Lieferschein wird freigegeben => Für alle Lieferscheine mit TransferState.Value = 1 und WorkflowStateApproved = 100 soll die Aktion "Rechnungslauf" (Code = "CreateCollectiveInvoices") ausgeführt werden.

Der Event Abonnent könnte folgendermaßen aussehen:

- Asynchron ausführen = true

- In neuer Transaktion ausführen = true

- Event Beschreibung: AfterSQLUpdate für OP_DeliveryNotes (kein Filter notwendig)

Erklärung: Der Rechnungslauf kann damit nach dem Speichern und im Hintergrund gestartet werden.

- Event Verarbeitungsservice: LUA_EXEC

- Konditionen:

WorkflowStateApproved Equals 100

WorkflowStateApproved Less 100 (alten Wert des Datensatzes verwenden)

TransferState.Value Equals 1

Erklärung: Damit wird der Abonnent nur betrachtet, wenn der Status "Freigegeben" sich beim Update geändert hat.

- Mappings:

a) Zielparameter: FireAfterExecutionEvent, Wert: true

b) Code, Wert: 

local deliveryNotes = Database[cDatabaseObjectNames.OrderProcessingDeliveryNotes]

:Where(cFieldName.TransferState.."."..cFieldName.Value, eFieldComparison.Equal, 1)

:And("WorkflowStateApproved", eFieldComparison.Equal, 100)

:Select(cFieldName.GUID)

:Query(Session);

for i = 0, deliveryNotes.Length - 1 do

ExecuteAction("CreateCollectiveInvoices", cDatabaseObjectNames.OrderProcessingDeliveryNotes,  deliveryNotes[i].Dataset[cFieldName.GUID].ValueGuid);

end

Erklärung: Es werden alle Lieferscheine geöffnet, die den Transferstatus offen haben und freigegeben sind. Für jeden einzelnen Lieferschein wird anschließend die Aktion "Rechnungslauf starten" ausgeführt. Siehe auch https://erpwiki.novicon.net/index.php?title=Technische_Dokumentation/Serverseitige_Lua-Programmierung#Aktionen_und_Prozesse_aufrufen

2) Lieferschein wird freigegeben und ist noch offen. => Für diesen Lieferschein wird der Rechnungslauf gestartet.

Der Event Abonnent könnte folgendermaßen aussehen:

- Asynchron ausführen = true

- In neuer Transaktion ausführen = true

- Event Beschreibung: AfterSQLUpdate für OP_DeliveryNotes (kein Filter notwendig)

- Event Verarbeitungsservice: EXEC_ACT

- Konditionen:

WorkflowStateApproved Equals 100

WorkflowStateApproved Less 100 (alten Wert des Datensatzes verwenden)

TransferState.Value Equals 1

- Mappings:

a) Quellparameter: GUID, Zielparameter: RecordGuid

b) Zielparameter: Name, Wert: CreateCollectiveInvoices

c) Zielparameter: DatabaseObjectName, Wert: OP_DeliveryNotes

Hinweis: Die Mandantenabhängigkeit muss beachtet werden. Im zweiten Fall kann der optionale Parameter "Client" (mit Quellparameter = Client) gesetzt werden, im ersten Fall kann das im Lua Code programmiert werden.

von (1.4k Punkte)