Examples: query, "exact match", wildcard*, wild?ard, wild*rd
Fuzzy search: cake~ (finds cakes, bake)
Term boost: "red velvet"^4, chocolate^2
Field grouping: tags:(+work -"fun-stuff")
Escaping: Escape characters +-&|!(){}[]^"~*?:\ with \, e.g. \+
Range search: properties.timestamp:[1587729413488 TO *] (inclusive), properties.title:{A TO Z}(excluding A and Z)
Combinations: chocolate AND vanilla, chocolate OR vanilla, (chocolate OR vanilla) NOT "vanilla pudding"
Field search: properties.title:"The Title" AND text
Beantwortet
OnSubmit Value Transfer

Hallo zusammen,
Ich komme irgendwie einfach nicht weiter und brauche eure Unterstützung.
Es geht um Folgendes:

  • In einer Untertabelle (SUBV_DEBIT_RULES) gibt es drei Spalten: Kostenstelle, Checkbox, Verantwortlicher.

  • In der Untertabelle werden Kostenstellen (EMPGE) eingetragen. Der Anwender soll die Möglichkeit haben dann per Checkbox (INFORM) zu bestimmen, wer der Verantwortlichen (RECEIVER_SQL) eine Benachrichtigung erhält.

  • Durch Setzen des Hakens in der Checkbox (INFORM) wird das SQL-Feld Verantwortlicher (RECEIVER_SQL) aktualisiert.

  • Durch Herausnehmen des Hakens wird das SQL-Feld geleert.

  • Ein späterer E-Mail-Schritt soll sich die entsprechenden Personen/User greifen und benachrichtigen. Dabei soll sichergestellt werden, dass die User nicht zugespammt werden und nur eine Email pro User rausgeht, auch wenn vielleicht der Haken für die selbe Person in mehreren Zeilen gesetzt ist.

  • Dazu habe ich mir folgendes überlegt: Um die Werte zu manipulieren ziehe ich mir die Einträge aus der Untertabelle in ein Textfeld (settlement_receiver_email_txt) und lösche mit Hilfe von Java die Dubletten.

  • Da ich (glaube ich zumindest) für den E-Mail-Schritt, die User wieder in einer Tabellenform benötige, schreibe ich die manipulierten Werte aus dem Textfeld in eine leere Hilfsuntertabelle (SUBV_SETTLEMENT_EMAIL).

  • Dieser letzte Schritt soll idealerweise am Ende, beim Versenden des Schrittes erfolgen. Dabei benötige ich auch eure Unterstützung.

Aktuelles Setup:
Untertabelle: SUBV_DEBIT_RULES
o Kostenstelle = EMPGE
o Checkbox = INFORM
o Verantwortlicher = RECEIVER_SQL
Hilfsuntertabelle: SUBV_SETTLEMENT_EMAIL
Dialog Textfeld: settlement_receiver_email_txt
OnSubmit: ExtractSUBTFinal();

function ExtractSUBTFinal() {
  // Disable send at the beginning of transfer_values_to_subtable
  jr_disable_send(true);
 ExtractSUBTReceiverEmail();

  // Wait for ExtractSUBTReceiverEmail to complete before transferring values
  setTimeout(function() {
    transfer_values_to_subtable();
  }, 1000); // delay in milliseconds
}


function ExtractSUBTReceiverEmail() {
  // Get the number of rows in the subtable
  var rowCount = jr_get_subtable_count("SUBV_DEBIT_RULES");

  // Initialize an array to store the values
  var values = [];

  // Iterate through the rows of the subtable and extract the "Settlement Receiver" value for each row
  for (var i = 0; i < rowCount; i++) {
    // Extract value
    var value = jr_get_subtable_value("SUBV_DEBIT_RULES", i, "RECEIVER_SQL");
    if (value !== null && value !== "") {
      // Check if value already exists in the array
      if (values.indexOf(value) === -1) {
        // Push value to array if it doesn't already exist
        values.push(value);
      }
    }
  }

  // Set the value of the input field to the concatenated values
  var concatenatedValues = values.join(", ");
  jr_set_value("settlement_receiver_email_txt", concatenatedValues);
}

var allow_send = false;


function transfer_values_to_subtable() {
  console.log('transfer_values_to_subtable called');
  
  if (allow_send) {
    jr_disable_send(false);
    console.log('enable send button');
    console.log('End');
    return;
  }
  
  var subtableCount = jr_get_subtable_count("SUBV_SETTLEMENT_EMAIL");
  
  if (subtableCount > 0) {
    console.log('subtableCount > 0');
    console.log('values have already been transferred to the subtable');
    jr_disable_send(false); // enable send if rows have already been added
    console.log('enable send button');
    allow_send = true;
    jr_execute('send'); // execute send after all rows have been added
    console.log('execute send');
    return; // exit early if values have already been transferred to the subtable
  }
  
  var concatenatedValues = jr_get_display_value("settlement_receiver_email_txt");
  
  if (!concatenatedValues) {
    jr_disable_send(false); // enable send if input is empty or undefined
    console.log('input is empty or undefined');
    console.log('enable send button');
    allow_send = true;
    return; // exit early if input is empty or undefined
  }
  
  var valuesArray = concatenatedValues.split(",");
  
  var index = 0;
  function addNextRow() {
    var value = valuesArray[index].trim();
    
    if (value !== "") {
      jr_add_subtable_row("SUBV_SETTLEMENT_EMAIL");
      var newRow = jr_get_subtable_count("SUBV_SETTLEMENT_EMAIL"); // get the index of the last row (i.e. the new row)

      setTimeout(function() {
        jr_set_subtable_value("SUBV_SETTLEMENT_EMAIL", newRow, "SETTLEMENT_RECEIVER", value);
        index++;
        if (index < valuesArray.length) {
          addNextRow();
        } else {
          jr_disable_send(false); // enable send if all rows have been added
          console.log('all rows have been added_1');
          console.log('send button enabled');
          allow_send = true;
          jr_execute('send'); // execute send after all rows have been added
          console.log('execute send');
        }
      }, 1000);
    } else {
      index++;
      if (index < valuesArray.length) {
        addNextRow();
      } else {
        jr_disable_send(false); // enable send if all rows have been added
        console.log('all rows have been added_2');
        console.log('send button enabled');
        allow_send = true;
        jr_execute('send'); // execute send after all rows have been added
        console.log('execute send');
      }
    }
  }

  //jr_disable_send(true);
  //console.log('Initial send button disabled');
  addNextRow();
}

Der Code sollte Folgendes widerspiegeln:
• Deaktivieren des Sendevorgang zu Beginn von "transfer_values_to_subtable", damit das Skript genügend Zeit hat, um die Zeilen hinzuzufügen, falls Werte in "settlement_receiver_email_txt" vorhanden sind.

• Wenn keine Werte in "settlement_receiver_email_txt" vorhanden sind, dann aktivieren des Sendevorgang ohne Hinzufügen von Zeilen.

• Es muss sichergestellt werden, dass "ExtractSUBTReceiverEmail" genügend Zeit hat, um abgeschlossen zu werden, damit "transfer_values_to_subtable" keine Zeilen hinzufügt, weil alte Werte aus "settlement_receiver_email_txt" gegriffen werden, bevor sie gelöscht werden.

• Falls tatsächlich Werte in "settlement_receiver_email_txt" vorhanden sind, sollte das Skript "transfer_values_to_subtable" diese Werte nehmen und sie in die Untertabelle kopieren.

Wie ihr wahrscheinlich erkennt, habe ich teilweise Fehler/ungewollte Aktionen, die sich nach meiner Vermutung auf Timing zurückführen lassen. Ich bin mir auch unsicher, inwieweit disable_send und OnSubmit die richtige Kombination ist. Ich vermute dies führt nämlich dazu, dass der Schritt nie abgesendet wird.

Ich gewinne so langsam den Eindruck, dass ich mich immer weiter von der richtigen Lösung entferne, und werde das Gefühl nicht los, dass ich so langsam mit Kanonen auf Spatzen schieße. Über Ideen und Anregungen freue ich mich sehr. Viele Grüße, Karim

  
  
Gepostet vor einem Jahr
Stimmen Neuste

Antworten 4


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

  
  
Gepostet vor einem Jahr

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

  
  
Gepostet vor einem Jahr

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

  
  
Gepostet vor einem Jahr
  
  

@<1344621243923435520|Karim - Lukas> Siehe erweiterte Antwort

Stefan Köngeter   vor einem Jahr Melden

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.

1
1
Gepostet vor einem Jahr
Bearbeitet vor einem Jahr
Stefan Köngeter
309 × 7 Administrator
  
  

Vielen lieben Dank, Stefan! Funktioniert einwandfrei!

Karim - Lukas   vor einem Jahr Melden