Table of Contents

November 2018

Web-Client

Berichte in Aktionen erzeugen

Der Web-Client unterstützt jetzt das Erzeugen von SSRS-Berichten aus einer Aktion heraus. Bisher konnte nur der Vollclient einen Bericht mit einer Aktion erzeugen. Der Grund dafür war, dass die Aktion das Ergebnis der Berichtserzeugung auf der Festplatte des Benutzers speichern konnte.

Der Web-Client verfolgt einen anderen Ansatz. Er speichert einen erzeugten Bericht vorübergehend in einem Azure Blob Storage, von wo der Benutzer den Bericht anschließend herunterladen kann. Das folgende Beispiel zeigt, wie Sie einen erzeugten Bericht in einer time cockpit-Aktion zurückgeben

clr.AddReference("System")
clr.AddReference("System.IO")
clr.AddReference("System.Text.Encoding")
clr.AddReference("TimeCockpit.Windows.Controls")
from System.Text import Encoding
from System.Collections.Generic import List, Dictionary, IEnumerable
from TimeCockpit.Data.QueryLanguage import QueryParameter
from TimeCockpit.Windows.Controls import ReportFormat
from TimeCockpit.Windows.Controls.Reporting import ReportBuilder, ReportConfiguration

def actionSample(actionContext):
	dataContext = actionContext.DataContext
	parameters = List[QueryParameter]()
	configuration = ReportConfiguration()
	data = Dictionary[String, IEnumerable[EntityObject]]()
	
	customerQuery = '''From Current In APP_Customer
	        Order By Current.APP_Code 
	        Select New With
	        {
	            .ObjectUuid = Current.APP_CustomerUuid,
	            Current.APP_Country,
	            Current.APP_Code,
	            Current.APP_CompanyName,
	            Current.APP_Phone,
	            Current.APP_Street,
	            Current.APP_ZipCode,
	            Current.APP_Town
	        }'''
	customers = dataContext.Select(customerQuery)
	data.Add("Customers", customers)
	
	userQuery = '''From U In APP_UserDetail Where U.APP_UserDetailUuid = @UserDetailUuid Select New With { U.Firstname, U.Lastname }'''
	users = dataContext.SelectWithParams({ "Query": userQuery, "@UserDetailUuid": dataContext.Environment.CurrentUser.UserDetailUuid })
	data.Add("User", users)
	        
	reportDefinition = # load report definition from e.g. EntityViewReport table
	        
	reportBuilder = ReportBuilder(dataContext)
	bytes = reportBuilder.GetReport(
		reportDefinition,
	    ReportFormat.Pdf, 
	    data, 
	    parameters, 
	    configuration)
			
	result = FileActionResult()
	result.ContentType = "text/plain"
	result.Inline = False
	result.FileDownloadName = "customer-report.pdf"
	result.FileContents = bytes
	actionContext.ActionResult = result

Im Grunde müssen Sie nur eine Instanz von FileActionResult erzeugen, den erzeugten Bericht result.FileContents zuweisen und das ActionResult der Aktion setzen.

Diese Art, einen Bericht zu erzeugen, ist besonders praktisch, wenn Sie keine time cockpit-Liste haben, der Sie einen Bericht zuordnen können.

Mehrere Datasets in Berichten

Bisher unterstützten sowohl der Vollclient als auch der Web-Client nur ein Dataset pro Bericht. Mit der neuen Version werden mehrere Datasets pro Bericht unterstützt.

configuration = ReportConfiguration()
data = Dictionary[String, IEnumerable[EntityObject]]()
	
customerQuery = # some customer query
customers = dataContext.Select(customerQuery)
data.Add("Customers", customers)

userQuery = # some userdetail query
users = dataContext.SelectWithParams({ "Query": userQuery, "@UserDetailUuid": dataContext.Environment.CurrentUser.UserDetailUuid })
data.Add("User", users)

reportDefinition = # load report definition from e.g. EntityViewReport table

reportBuilder = ReportBuilder(dataContext)
bytes = reportBuilder.GetReport(
	reportDefinition,
    ReportFormat.Pdf, 
    data, 
    parameters, 
    configuration)

Das ist besonders hilfreich, wenn Sie den Daten in Ihrem Bericht mehr Struktur geben möchten.

Performanceverbesserungen im Zeiterfassungskalender

Wenn Sie in früheren Versionen viele Zeitbuchungen in einer Woche hatten, sank die Performance beim Hinzufügen oder Ändern von Einträgen, weil die ganze Woche neu gezeichnet wurde. Jetzt werden die Änderungen im Zeiterfassungskalender feiner verfolgt, und nur die Zeitbuchungen, die sich geändert haben, werden am Bildschirm neu gezeichnet.

Elemente aus einer RelationCell anlegen

Diese Funktion gibt es im Vollclient schon lange, und jetzt ist sie auch im Web-Client verfügbar. Wenn Sie die Relation-Zelle öffnen, finden Sie in ihrer Fußzeile ein +-Zeichen. Wenn Sie darauf klicken, erscheint ein neues Formular, zum Beispiel für einen neuen Kunden. Sie müssen nicht mehr zu den Stammdatenlisten wechseln, um Daten hinzuzufügen.

Element aus einer RelationCell hinzufügen

Höchstarbeitszeit

Mit 2018/09 ist in Österreich eine neue Arbeitszeitgrenze in Kraft getreten. Mit der neuen Version haben wir eine neue Höchstarbeitszeit angelegt, die diese Änderungen abbildet. Wenn Sie noch den Vollclient verwenden, aktualisieren Sie time cockpit bitte auf die neueste Version. Wenn Sie keinen Squirrel-Build haben, laden Sie bitte die neueste Version von unserer Website herunter. Wenn Sie bereits einen sich automatisch aktualisierenden Squirrel-Build haben, sollten Sie bereits zur Aktualisierung von time cockpit aufgefordert worden sein.

Um die neue Grenze zu aktivieren, öffnen Sie Ihre globalen Einstellungen und setzen Sie die Grenze auf Default Working Time Limit Austria Valid From 2018/09.

Die wichtigsten Änderungen sind:

  • Max Working Time Per Day Excluding Travel Time [h]: 12 h
  • Max working time per week including active travel time [h]: 60 h

Details finden Sie unter:

Höchstarbeitszeit

Fehlerbehebungen & Verbesserungen

  • Die DisplayProperty in der RelationCell wurde in HTML5 nicht verwendet, wenn die Abfrage automatisch generiert wurde
  • Tooltips im Kalender werden HTML-kodiert
  • USR_TimesheetUserDetailSelectionList wird im HTML5-Client verwendet
  • Shell auf Angular 7 aktualisiert