Munixo Support Forum - Kostenfreier Support für Munixo Anwender und Entwicklungspartner
+1 Punkt

UseCase: um Fehler einfacher zu identifizieren, möchte ich mir im Object Mitarbeiter - Stempelzeiten (TM_EmployeeTimeRecordings) zu einer erfassten Stempelung den Typ der letzten Stempelungen anzeigen lassen; entweder in derselben Stundenart oder Stundenartübergreifend. Dann könnte mit einer bedingten Formatierung alle inkorrekten Zeilen hervorgehoben werden (im Gegensatz zu nur der ersten fehlerhaften Zeile, die mit dem Bool-Feld "Error" ersichtlich ist).

Per SQL lässt sich das recht einfach realisieren, zum Beispiel mit einer Fensterfunktion:

SELECT tetr.guid,
tetr.[DateTime] ,
LEAD(tetr.[Type]) OVER (
    PARTITION BY Employee --, TypeOfHour
    ORDER BY DateTime DESC) as LastType,
be.FirstName, be.LastName ,
ttrt.Name ,
ttoh.Name
FROM TM_EmployeeTimeRecordings tetr
INNER JOIN BAS_Employees be
    ON be.GUID = tetr.Employee
INNER JOIN TM_TimeRecordingsTypes ttrt
    ON ttrt.GUID = tetr.[Type]
INNER JOIN TM_TypeOfHours ttoh
    ON ttoh.GUID = tetr.TypeOfHour
ORDER BY [DateTime] DESC

Eine andere Möglichkeit (in SQL), wäre das mit einem

WITH C AS (

SELECT tetr.GUID GUID,
LEAD(tetr.[Type]) OVER (
    PARTITION BY Employee --, TypeOfHour
    ORDER BY DateTime DESC) as LastType
FROM TM_EmployeeTimeRecordings tetr )

SELECT C.LastType

FROM C

WHERE C.GUID = @@ObjectName@@.GUID

Oder als Subquery

SELECT C.LastType
FROM (SELECT tetr.GUID as GUID,
    LEAD(tetr.[Type]) OVER (
    PARTITION BY Employee
    ORDER BY DateTime DESC) as LastType
    FROM TM_EmployeeTimeRecordings tetr
) as C
WHERE C.GUID = @@ObjectName@@.GUID

Keiner der Varianten liefert aber das gewünschte Ergebnis als Munixo SQL Text mit verschiedenen Fehlermeldungen.

Gibt es eine Möglichkeit meinen "Letzten Typ" UseCase zu implementieren?

von (1.1k Punkte)

1 Antwort

0 Punkte

Den letzten Typ kann man als SQL Feld wie folgt ermitteln:

Hier die als SQL Ausführbare Version:

SELECT

(

       SELECT TOP 1 trt.Name

       FROM TM_EmployeeTimeRecordings tr

       INNER JOIN TM_TimeRecordingsTypes trt ON tr.Type = trt.GUID

       WHERE tr.Employee = ObjectName.Employee

       AND ISNULL(tr.TypeOfHour, '00000000-0000-0000-0000-000000000000') = ISNULL(ObjectName.TypeOfHour, '00000000-0000-0000-0000-000000000000') -- Optional

       ORDER BY tr.DateTime DESC

) LastTimeRecordingTypeName

FROM TM_EmployeeTimeRecordings ObjectName

Hier die Schreibweise für ein SQL Feld am Objekt:

SELECT TOP 1 trt.Name

FROM TM_EmployeeTimeRecordings tr

INNER JOIN TM_TimeRecordingsTypes trt ON tr.Type = trt.GUID

WHERE tr.Employee = @@ObjectName@@.Employee

AND ISNULL(tr.TypeOfHour, '00000000-0000-0000-0000-000000000000') = ISNULL(@@ObjectName@@.TypeOfHour, '00000000-0000-0000-0000-000000000000') -- Optional

ORDER BY tr.DateTime DESC

von (1.2k Punkte)
Vielen Dank für die Antwort mit den ausführlichen SQL Befehlen!

Eine kleine Anmerkung:
Die o.g. SQL Abfrage sucht aus allen TimeRecordings zu einem Mitarbeiter den letzten Typ aus. Ich möchte aber zu jedem Eintrag den davor (!) zuletzt verwendeten Typ abfragen.
Wenn man im SQL-Feld Text eine zusätzliche Bedingung "DateTime < @@ObjectName@@.DateTime" einsetzt, löst das mein Problem:

    SELECT TOP 1 trt.Name
    FROM TM_EmployeeTimeRecordings tr
    INNER JOIN TM_TimeRecordingsTypes trt ON tr.Type = trt.GUID
    WHERE tr.Employee = @@ObjectName@@.Employee
    -- AND ISNULL(tr.TypeOfHour, '00000000-0000-0000-0000-000000000000') = ISNULL(@@ObjectName@@.TypeOfHour, '00000000-0000-0000-0000-000000000000') -- Optional
AND DateTime < @@ObjectName@@.DateTime
    ORDER BY tr.DateTime DESC

Das wird vom Munixo Server beim Laden der Tabelle als Subquery umgesetzt und ist performance-technisch absolut okay.
Dann hatte ich die Aufgabe nicht ganz korrekt verstanden. Aber sehr schön, wenn die kleine Erweiterung die Aufgabe löst!