Hallo,
ich gebe auch mal meinen Senf dazu.
Ich glaube, dass du es dir komplizierter machst als notwendig. Wenn ich deine Beschreibung richtig verstanden habe, dann bereitest du deine Daten auf für einen folgenden E-Mail-Schritt.
Dies im Frontend zu machen mit timeouts und allem drum und dran wird nicht verlässlich funktionieren, da du den netzwerkseitigen Aspekt der Enduser betrachten musst und deren Performance nicht kennst. Daher die Frage:
Was hält dich davon ab, die Funktionalität schlicht und ergreifend in eine PHP-RegelausführungsFunktion auszulagern? Dann hast du diese ganzen Probleme gelöst und kannst dich auf korrekte Ausführung verlassen.
Ich sehe zwei Möglichkeiten dazu:
Entweder gehst du über die Standardgunktionalität
private function getUniqueInformAddresses() {
$uniqInformAddresses = [];
$sub = 'SUBV_DEBIT_RULES';
$rids = $this->getSubtableRowIds($su);
foreach ($rids as $rid) {
if ($this->getSubtableValue($sub, $rid, 'INFORM') == 1) {
$uniqInformAddresses[] = $this->getSubtableValue($sub, $rid, 'RECEIVER_SQL');
}
}
return array_unique($uniqInformAddresses);
}
Oder du gehst die SQL-Route
private function getUniqueInformAddressesviaSQL() {
$uniqInformAddresses = [];
$sql = "SELECT DISTINCT RECEIVER_SQL FROM SUBV_DEBIT_RULES WHERE INFORM = 1 AND step_id=?";
$res = $this->jrSQLSelect($sql, [$this->getStepId()]);
foreach ($res as $row) {
$uniqInformAddresses[] = $row['RECEIVER_SQL'];
}
return $uniqInformAddresses;
}
Dann schreibst du dir die in die Untertabelle und schickst an diese die E-Mail.
Was meinst du?
EDIT:
Auf Wunsch mehr Infos.
Du willst keine Dialogfunktion, die Handhabung ist etwas komplizierter und du machst dir das Leben wieder schwerer als notwendig. Diese Funktionen sind speziell dafür da, innerhalb des Lifecycles des Schrittes Backend-Aktivitäten auszuführen. Hierbei müssen weitere Nebeneffekte betrachtet werden.
Was du möchtest ist eine Regelausführungsfunktion anzulegen und dann diesen Code einzufügen und anzupassen (siehe Kommentar):
<?php
class className extends JobRouter\Engine\Runtime\PhpFunction\RuleExecutionFunction
{
public function execute($rowId = null) {
$uniqueAddresses = $this->getUniqueInformAddresses();
$this->writeAddresses($uniqueAddresses);
}
private function getUniqueInformAddresses() {
$uniqInformAddresses = [];
//Hier den Namen der Untertabelle, NICHT der Untertabellenansicht
//Ebenso unten die Untertabellenfeldnamen einfügen, NICHT die Untertabellenansichtsfeldnamen
$sub = 'SUBV_DEBIT_RULES';
$rids = $this->getSubtableRowIds($su);
foreach ($rids as $rid) {
if ($this->getSubtableValue($sub, $rid, 'INFORM') == 1) {
$uniqInformAddresses[] = $this->getSubtableValue($sub, $rid, 'RECEIVER_SQL');
}
}
return array_unique($uniqInformAddresses);
}
private function writeAddresses($uniqueAddresses) {
$sub = 'SUBT_SETTLEMENT_EMAIL';
$this->clearSubtable($sub);
$rid = 1;
foreach ($uniqueAddresses as $address) {
$rowData = ['SETTLEMENT_RECEIVER' => $address];
$this->insertSubtableRow($sub, $rid, $rowData);
$rid++;
}
}
}
?>
Dann gehst du mit der Rechten Maustaste auf den Schritt, Regeln -> und fügst eine neue Ausführungsregel ein und wählst unter PHP diese Funktion aus. Sie wird nun beim Senden des Schrittes ausgeführt. Im Folgeschritt solltest du dann in deiner Untertabelle die korrekten Einträge sehen.
Hallo Daniel,
vielen Dank für deinen Vorschlag! Ich bin mir nicht sicher, ob ich dich richtig verstanden habe.
Im Grunde sollen den Verantwortlichen nur FYI Emails zukommen. Ich möchte Ihnen keine Schritte zuweisen. Daher weiß ich nicht inwieweit mir eine Parallelisierung hilft. Könntest du das bitte weiter ausführen?
Ich habe die Erfahrung gemacht, dass wenn ich mich im Email-Schritt auf den Wert aus der Untertabelle (RECEIVER_SQL) beziehe und der Anwender den Haken mehrmals gesetzt hat, dann der User entsprechend der Anzahl der gesetzten Haken informiert wird.
In der Untertabelle sind pro Kostenstelle immer zwei Zeilen; wenn zwei Haken gesetzt wurden, wird entsprechend in dem Untertabellen Feld RECEIVER_SQL zweimal der gleiche Wert abespeichert (z.B. Zeile 1 und 2). Dies wiederum führt dazu, dass zwei Emails an die selbe Person rausgehen (eben pro Zeile). Um dies zu verhindern, habe ich mich für die Maninpulation im Text Feld entschieden.
Da ich allerdings bei dem Email Schritt über ein Feld mehrere User ansprechen möchte, bin ich wieder auf die Form einer Untertabelle angewiesen. Vereinfacht gesagt ein hin und her: Untertabelle >> Dialogfeld zum Dubletten löschen >> (Hilfs-)Untertabelle
Viele Grüße, Karim
Hallo Karim,
ich bin jetzt nicht so tief in deinen Text eingestiegen, aber wäre es nicht eine Idee, die Empfänger der Benachrichtigung in ein Feld der Untertabelle zu schreiben (in einem späteren Schritt) und dann über die Parallelisierung die Schritte pro Benutzer aufzuteilen. In der Parallelisierung kann man doch dann eine E-Mail-Systemaktivität erstellen, die das ganze übernimmt, aber vom System nur einmal ausgeführt wird.
Liebe Grüße
Daniel
Hey Stefan, vielen Dank für deinen tollen Vorschlag! Obwohl ich ihn wirklich gut finde, muss ich zugeben, dass ich aufgrund meiner rudimentären Kenntnisse im Bereich PHP nicht auf die Idee gekommen bin, eine entsprechende Funktion zu nutzen.
Ich habe versucht, deinen Vorschlag umzusetzen, aber leider ist es mir nicht gelungen. Könntest du mir bitte etwas weiterhelfen? Ich habe die PHP-Funktion "TransferUniqueReceiver" (zum Testen) als Dialogfunktion mit der API-Version 2 angelegt. Leider erhalte ich beim Ausführen im Dialog die folgende Fehlermeldung in der Konsole: "status":"error","message":"Class 'ILA_Approval_FI_1_TransferUniqueReceiver' not found"
Der Name "ILA_Approval_FI" bezieht sich auf die Prozesstabelle. Könntest du mir auch gleich den Teil des Codes schreiben, der die einzigartigen Werte in die Untertabelle "SUBT_SETTLEMENT_EMAIL" und die Spalte "SETTLEMENT_RECEIVER" einfügt?
Viele Grüße, Karim