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
- Bei allen programmierten Teiltabellen muss das Property
Parent
im XPO-Modell auf Delayed-Loading umgestellt werden.
- 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. - 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 kannorm.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.