Hauptmenü

Checklisten ab v32

Begonnen von Frank Niethardt, 22.05.2024 09:11:38

⏪ vorheriges - nächstes ⏩

Frank Niethardt

Hallo,

vorweg: Ich find es klasse, wie sich die Checklisten weiterentwickelt haben. Nicht nur die neuen Möglichkeiten, sondern auch die UI zur Konfiguration.

Da die Checklisten jetzt ja "wissen", wann sie abgearbeitet sind: Gibt es eine einfache Möglichkeit eben dieses abzufragen? Per Platzhalter oder sogar als Event zur Ansteuerung von Jobs?

Viele Grüße
Frank

Torsten Thau

Hallo Frank, die Abfrage ist "semi-einfach":

via Platzhalter "<KIX_TICKET_DynamicField_MyChecklist_Short>" erhält man die Form X/Y. Wenn man das durch die Calculate-MA schickt kann man anschließend in einer Conditional-MA schauen ob es GTE 1 ist und wenn ja weitere Automatismen starten - z.B. ein anderes DF MyChecklistIsComplete (yes/no) auf den Wert yes setzen. Darüber hinaus gibt es aber noch keinen Platzhalter der das ermöglicht. 

Ein Event in der Art "ChecklistCompleted_MyChecklist" (analog zu DynamicFieldUpdate) ist eine gute Idee und würde das Handling vereinfachen. 

CU, Torsten

Frank Niethardt

Hallo Torsten,

ist das Vorgehen nur Theorie oder hast du es auch ausprobiert?

Bei mir kommt aus dem calculate immer nur 0 raus:
2024-05-22_15h10_17.png

2024-05-22_15h12_05.png

Dabei geht es mir gar nicht so sehr um den Fehler bei der "Bedingung", immerhin ist das die Chance zu sehen, was aus der Berechnung rauskommt.

BTW: Es wäre so toll, wenn man die Jobs Debuggen könnte. Also wirklich sehen, was in jedem Schritt reingeht, rauskommt. 

Viele Grüße
Frank

Frank Niethardt

Der Platzhalter kennt vermutlich die neue Zählweise noch nicht. Ich habe die Werte einfach mal einem DF zugewiesen:
2024-05-22_16h12_34.png

Torsten Thau

Hallo Frank,

ja der beschriebene Ansatz wird produktiv eingesetzt. Ich habe aber ein Detail im Verhalten von "bc" vergessen zu erwähnen. Am besten am Beispiel

tto@orion:~$ bc
>>> 4/5
0
>>> scale=3;(4/5)
.800
>>> scale=3;4
4
>>> scale=3;4/1
4.000
>>> quit

Das "scale" ist erforderlich, damit bc nicht Ganzzahlen berechnet. Ich habe hier festgelegt, dass 3 Nachkomma-Stellen ausreichend sind bevor Rundungsfehler eine "falsche" 1 ergeben. 

Im Job (siehe Screenshot) setze ich die Berechnung so um

scale=3;(<KIX_TICKET_DynamicField_MobileProcessingChecklist010_Short>)/1

Die "/1" kannst Du weglassen. Die sorgt in bc dafür, dass in Verbindung mit scale auch eine Ganzzahl mit Nachkomma-Stellen dargestellt wird. Da wir aber immer einen Bruch ausrechnen ist das redundant.

s001.png

In meinem Conditional prüfe ich aber nur auf numerische Gleichheit ("==")  statt GTE (">="). 

Das wäre der zweite Punkt in Deinem Screenshot wo meine Erklärung irreführend war - tut mir leid. Ich hatte es "pseudo-codig" aufgeschrieben. Natürlich muss der korrekte Vergleichsoperator (">=" bzw. "==") verwendet werden, statt "GTE" (greater than or equal).

Hoffe ich habe die Unklarheit und Verwirrung beseitigt.

CU, Torsten


Torsten Thau

Nachtrag: der Platzhalter sollte bereits die neue Zählweise berücksichtigen, wie es auch die Visualisierung tut. Das ist offenbar nicht der Fall. Ich stelle das als Korrektur ein. 

Frank Niethardt

Hallo Torsten,

das eigentliche Problem ist, dass _Short nur bei Standard Checklisten ordentlich zählt. Sieht man auch im Code, der zur Berechnung benutzt wird.

https://github.com/kix-service-software/kix-backend/blob/dddb9f13949a218d6f79d6895a0eb9a7cf75fd1f/Kernel/System/DynamicField/Driver/CheckList.pm#L235

        if (IsArrayRefWithData($Items)) {
            my $Done = 0;
            my $All = 0;
            for my $Item ( @{ $Items } ) {
                if ($Item && $Item->{IsCheckList}) {
                    $All++;
                    if ($Item->{Value} eq 'OK' || $Item->{Value} eq 'NOK' || $Item->{Value} eq 'n.a.') {
                        $Done++;
                    }
                }
            }
            $Value .= ($Value ? ', ' : q{}) . "$Done/$All";

An der Stelle wurden die neuen Möglichkeiten noch nicht eingebaut.

Was die Berechnung angeht, braucht man das scale nicht. bc liefert ja entweder eine 0 oder eine 1, je nachdem, ob erfüllt oder nicht. Und ganz genau genommen müsste man nicht mal vergleichen, weil 0 ein false und 1 ein true ist... ;)

Viele Grüße
Frank