Umstellung auf TypeScript 4.3

TypeScript ist jetzt jetzt über NuGet Microsoft.TypeScript.MSBuild eingebunden und damit unabhängig von der installierten Visual Studio Version.
Die Version ist aktuell 4.3.2 und wird zukünftig über das NuGet aktualisiert.
Es gibt keine technische Abhängigkeit, dass dieselbe TypeScript-Version verwendt wird, solange in einer .d.ts Datei nichts enthalten ist, was in der alten Version noch nicht geht.

Mögliche ungewollte Überreste nach Nuget-Update

Sollte es in einem Projekt eine oder mehrere *.d.ts Dateien im Pfad Scripts/BA/Ui/Search geben, so müssen diese manuell gelöscht werden. Gleiches gilt für die Datei Scripts/BA/Ui/Grid/GridProperties.d.ts. Für die Kontrolle “Alle Datein anzeigen” aktivieren.

XPO Datenmodell

Auflösung von Tabelle OrmCommonFields

Die Tabelle OrmCommonFields existiert nicht mehr. CommonFields werden jetzt dynamisch wie angepasste Spalten in OrmBABase eingefügt. Es sind einige Anpassungen in Quellcodes und Formeln erforderlich:

  • Alle propgrammierten Zugriffe auf CommonFields müssen angepasst werden:
    orm.CommonFields.GetMemberValue("Common_XXX") -> orm.GetMemberValue("Common_XXX")
  • In programmierten Criteria-Formeln ist analog vorzugehen:
    [CommonFields.Common_EntityTitle] -> [Common_EntityTitle]
    Konfigurierte Formeln werden automatisch migriert.
  • CriteriaOperatorBuilder.GetCommonField existiert nicht mehr => GetField verwenden.
  • CriteriaOperatorBuilder.GetCommonEnum... existiert nicht mehr => GetEnumSingle... verwenden.
  • CriteriaOperatorBuilder.GetCommonDateWithTimeZone existiert nicht mehr => GetDateWithTimeZone verwenden.

Unterstützung der nichtgenerischen Version von CreateCollection entfallen

Wurden programmatisch Spalten vom Typ XPCollection ohne <T> anlegt, so gibt es an dieser Stelle nun eine Exception. Dies ist durch ein Devexpress Update nötig bzw. möglich geworden.

Programmierte Teiltabellen anpassen

  1. Bei allen programmierten Teiltabellen muss das Property Parent im XPO-Modell auf Delayed-Loading umgestellt werden.
  2. Des weiteren sollten die Klassen jetzt abstract deklariert werden, da von dieser keine Datensätze generiert werden dürfen. Nur die davon ableitenden Klassen für die Verwendung einer Teiltabelle in einer anderen Tabelle sind nicht abstrakt.
  3. Früher brauchten die Teiltabellenklassen immer einen speziellen Konstruktor mit XPClassInfo, um auch in konfigurierten Spalten verwendet werden zu können. Diesen gibt es nicht mehr. Entsprechende Konstruktoren im Projektcode sind zu löschen.

AttachementState nicht mehr zuweisen

Früher war es üblich, OrmBABase.AttachmentState an diversen Stellen zuzuweisen. Dies ist nicht mehr erlaubt. Der Core setzt dieses Feld immer automatisch beim Speichern, auch wenn in ORM-Events Änderungen an Attachments vorgenommen werden.

Alle Zuweisungen zu AttachmentState müssen aus Modul und Projektcode entfernt werden. Das gilt sowohl für direkte Zuweisungen zu Attachmentstate und AttachmentState_AllValues als auch für Zuweisungen mit SetEnumValue("AttachmentState", ...) oder SetMemberValue("AttachmentState", ...). Zuwiderhandlungen resultieren in undefiniertem Verhalten. Es ist nicht garaniert, dass der Core falsche Werte automatisch beim Speichern mit richtigen überschreibt.

Neuer Datentyp HTML

Es gibt einen neuen HTML-Datentyp für Datentabellen. Dieser entspricht technisch einem Textfeld unbegrenzter Länge, verhält sich aber beim Rendering und der Volltextsuche anders. Auch können bestimmte Controls nicht oder nur mit diesem Datentyp umgehen.

Der Datentyp kann wie gewohnt über das neue Spaltencontrol konfiguriert werden.
Für programmierte Spalten ist das neue `HTMLField`-Attribut zu verwenden, entweder im Code oder im XPO-Designer.

[HTMLField]
public string Description { get { ...

Migration

- Für programmierte Spalten ist eine manuelle Migration erforderlich. Siehe oben.
Der Core weist bei der automatischen Migration im Logfile darauf hin, dass man vermutlich Felder vergessen hat. Beispiel:

2021-08-09 15:08:58.080 7 ERROR - BA.Core.Migrations.V4_0.Migration_06_HtmlColumns.MigrateConfiguration "The hard coded field OrmMassEmailStatus.Body is used by an HTML form control. This is no longer allowed.
=> Add the [HTMLField] attribute to the property if it should store HTML."

- Konfigurierte Textspalten werden automatisch auf HTML-Text umgestellt, wenn mindestens ein HTML-Control in einer Maske darauf verweist. Dabei werden keine technischen Änderungen an der Datenbank vorgenommen, z.B. falls die maximale Textlänge bisher nicht unbegrenzt ist. Es gibt allerdings eine Warnung im Logfile. Wenn mehr benötigt wird, ist eine eigene Migration dafür zu schreiben.

API Änderungen

OrmBABase

Wegfall von Delete(ShowNotification)

Parameter war funktionslos und muss durch “.Delete()” ersetzt werden.

Automatische Vergabe der OID bei neuen Datensätzen

Sowohl Api.ORM.GetNewORM als auch new OrmXXX erzeugen jetzt immer Objekte mit einer gültigen OID (nicht mehr Guid.Empty), also so wie bei Teildatensätzen. Das bedeutet:

  • Zuweisungen von orm.Oid mit neuen GUIDs sollten unterbleiben und aus bestehendem Code ausgebaut werden. Es könnte sonst passieren, dass einmal die vom Core vergebene OID und einmal die zugewiesene verwendet wird.
  • orm.Oid == Guid.Empty kann nicht mehr verwendet werden, um zu Prüfen, ob ein Datensatz neu ist. Dafür kann orm.IsNew verwendet werden.

Registrierung von Script- & Style-Bundles

Das Interface IBundleConfig hat sich geändert und es gibt eine neue Basisklasse BABundleConfigBase zur Implementierung desselben. Daher müssen die Implementierungen der BundleConfig Klassen angepasst werden.

Anstatt dem Interface IBundleConfig wird nun die neue Basisklasse BABundleConfigBase verwendt. Diese hat zwei neue Funktionen:

  • protected ScriptBundle ScriptBundle(string virtualPath) und * protected StyleBundle StyleBundle(string virtualPath)@.

die nun genutzt werden.

Siehe “Kapitel”:“https://www.manula.com/manuals/business-app/business-app-leitfaden-fuer-anpassungen/4.0/de/topic/eigene-library und “”:https://www.manula.com/manuals/business-app/business-app-leitfaden-fuer-anpassungen/4.0/de/topic/include-cssKapitel

IQueryable.AsChunks erfordert Chunksize

Die Extension IQueryable<T>.AsChunks(...) erfordert jetzt verpflichtend die Angabe der ChunkSize. Der alte Defaultwert von 2000 wurde entfernt. Zu unterschiedlich sind die Anforderungen in verschiedenen Kontexten als das ein Default-Wert ein sinnvolles Verhalten ergeben würde.

Formeln

Strings mit Formeln dürfen nicht mehr mit CriteriaOperator.Parse geparst werden. Statt dessen sollte für in .NET ausgeführte Criteria immer die Compilation verwendet werden (Siehe Kapitel).

Für Criteria, die direkt gegen die Datenbank ausgeführt werden muss CriteriaOperatorHelper.ParseDBCriteria verwendet werden. Fit und Evalute mit Übergabe eines Strings mit der Formel ist nun unzulässig (Siehe Kapitel).

Das gesamte Kapitel der Formelsprache wurde überarbeitet. Es empfiehlt sich diese Kapitel insgesamt nochmal zu bearbeiten.

WorkItemBase.AddSuccessor() entfernt

Die Methode gibt es in verschiedenen Überladungen. Die Variante ohne Parameter wurde entfernt. Zu groß ist die Gefahr, sich dadurch in kurzer Zeit durch versehentliche back-to-back Starts ein paar Millionen Einträge in OrmWorkItem einzufangen, mit massiven Auswirkungen auf die gesamte Anwendung und Datenbank.

Wenn das alte Verhalten, also sofortiger Neustart, benötigt wird, ist AddSuccessor(TimeSpan.Zero) zu verwenden.

Entfernung von Constants.ExternalDirectoryFormNavigation

Die “Pseudo-Navigation” wird nicht mehr benötigt, da Grids nicht mehr zwingend eine Navigation brauchen. Wenn sie trotzdem noch angegeben wird, gibt es eine Exception, dass diese nicht gefunden wird und wenn die nicht abgefangen wurde, funktionieren die Form / das Grid / der Dialog nicht mehr. Da die Konstante auch gelöscht wird, gibt es an der Stelle einen Compilerfehler. Die Zeile mit der Zuweisung kann einfach entfernt werden.

Sichtbarkeitssteuerung von Navigationssteuerelementen (IfMethodReturnsTrue)

Die Schnittstelle der zugehörigen Funktion in TypeScript, welche unter dem Schlüssel IfMethodReturnsTrueMethod in der Struktur AdditionalClientData übergeben wird, hat sich geändert. Es muss sichergestellt werden, dass diese Funktion nun auch bei Bedarf mit den Menüeinträgen der Detailansichten arbeiten kann.

Alt: <Methodenname> (menuItem: BAClientRibbonItem, customData: CustomData)
Neu: <Methodenname> (menuItem: BAClientRibbonItem | BAClientDetailGridMenuItem, customData: CustomData)

Ausbau von OrmAppointmentBase.Description

Die Spalte OrmAppointmentBase.Description existiert nicht mehr. Diese hat den vorberechneten Text-Inhalt von OrmAppointmentBase.HTMLDescription enthalten. Statt dessen gibt es die Criteria-Funktion `BAAbstract` mit der der Text-Inhalt der HTML-Spalte abgefragt werden kann, sowie den neuen Spaltentyp HTML für Datentabellen und Ansichten.

Jegliche Formeln, die auf die Description-Spalte verweisen, müssen manuell angepasst werden.

Änderung an den mehrfachgruppierten Ansichtenspalten

Die Gruppierung von Mehrfachgruppierte Ansichtenspalten konnte nicht aufgelöst, bzw. es konnte keine Gruppierung vor diese in der UI gezogen werden. Ab der Version 4.0 ist dies nun möglich. Falls eine eigene mehrfachgruppierte Spalte implementiert wurde, muss diese nun vollständig neu implementiert werden. Dazu wurde das Interface IGridColumnMultiGroupControlRenderer komplett überarbeitet. Die einfachen Spalten sind davon nicht betroffen.

Funktionen in Gridtools (TypeScript) wurden entfernt.

Einige Funktionen in der BA.Ui.Grid.GridTools wurden entfernt und können nun auf dem Grid direkt aufgerufen werden. Dabei liefert nun GetContextGridView entweder die aktuelle Ansicht, die aktuelle Kalenderansicht oder die aktuellen Detailansicht zurück.

let gridView: BAClientGridBase = BA.Ui.Grid.GridTools.GetContextGridView(customData);

Vorher

BA.Ui.Grid.GridTools.GetGridGuid();

Jetzt

BA.Ui.Grid.GridTools.GetContextGridView(customData).GetGridGuid();

Auswahllistenfelder sollten konkreten Datentyp haben

Im Projekt definierte Auswahllistenfelder sollten auf den konkreten Datentyp umgestellt werden. In der Vergangenheit sollte er auf BA.Core.Enum.ValueEnum eingestellt werden. Prinzipiell funktioniert dies auch weiterhin aber in diesem Fall kann man nicht auf spezielle Eigenschaften in den Formeln zugreifen.