Back to Sagegmbh

Erstellung eines Stammdatendialoges

wiki-spaces-s1-pages-44105754.md

latest36.0 KB
Original Source

Erstellung eines Stammdatendialoges

By Andreas Langmaack (Unlicensed)

Aug 20, 2020

32 min

Add a reaction

Um ein funktionalen Stammdatendialog zu erstellen benötigen Sie mindestens diese Metadatenobjekte:

  • Datenquelle

  • Listen-Element

  • Kontextmenü

  • Datensatz

  • Daten-Edit-Element

Die Zusammenhänge der einzelnen Metadatenobjekte eines Stammdatendialoges veranschaulicht das nachfolgende Bild.

Open

Die Basis eines Stammdatendialoges ist der Datensatz. Das Laden, Verwerfen von Änderungen und Speichern eines Datensatzes übernimmt das System. Lediglich die Neuanlage und das Löschen eines Datensatzes müssen mittels Funktionsaufrufe, welche durch einen Kontextmenüeintrag ausgeführt werden, in den Metadaten definiert werden.

Das Laden eines Datensatzes erfolgt durch Selektion eines Datensatzes im Navigationselement. Dabei gilt folgender Zusammenhang: Der Schlüssel (also die einzelnen Felder) der zugrundeliegende Tabelle muss in den Schlüsselfelder der Datenquelle des Navigationselementes hinterlegt sein. Dabei ist die gleiche Reihenfolge zu verwenden, wie in der Definition der Schlüsselfelder des Datensatzes. Das Feld der Mandantennummer wird dabei nicht berücksichtigt. Durch die Angabe des Mandantenfeldes im Datensatz (Eigenschaft "Mandantenfeld Tabelle1/2") fügt das System der Sage 100 die Mandantennummer dem Schlüssel hinzu.

Beispiel: Themenverwaltung

Beginnen wir mit der Basis und legen den Datensatz „recProjektthemen“ an. Legen Sie dazu unter „Daten/ Datensätze“ die Metadatengruppe „Projektsteuerung“ und mit der Option „Tabelle importieren“ (Tabelle BPKProjektthemen) den Datensatz (alle Felder übernehmen) an. Hinterlegen Sie in der Eigenschaft „Sortierung“ das Feld „Thema“ (aufsteigend). Alle anderen Felder sind durch den Tabellenimport bereits richtig gesetzt.

Legen sie die neue Datenquelle „dtsProjektthemen“ an und selektieren wie oben im Assistenten die Option "Tabelle importieren". Im Dialog "Tabelle importieren" wählen sie die Tabelle "BPKProjektthemen" aus. Auch hier wird das Schlüsselfeld 1 korrekt gefüllt (das Feld „Thema“ ist in der Tabelle BPKProjektthemen als Schlüsselfeld definiert). Ändern Sie die Eigenschaft „Priorität“ des Feldes „Thema“ auf „1“ und den „Titel“ des Feldes „IstExternesThema“ in „Externes Thema“.

Legen Sie unter „Oberfläche/ Elemente/ Projektsteuerung“ das Listen-Element „lstProjektthemen“ mit dem Assistenten „Datenquelle zuordnen“ („dtsProjektthemen)“ an. Ordnen Sie die Felder („Spaltenummer“) nach „Thema“, „Bezeichnung“, „Gruppe“ und „IstExternerTermin“. Aktivieren Sie unter der Eigenschaftengruppe "Lizenzierung" die Option "für Wawi?".

Legen Sie das Kontextmenü „Projektthemen“ an. Legen Sie folgende Kontextmenüeinträge an:

  • „Funktionsname” = „Neu”

  • „Funktionsname” = „Loeschen”

Die Aktion "Neu" kann direkt nach dem Öffnen des Dialoges, also ohne Auswahl eines Datensatzes, oder nach der Auswahl eines Datensatzes, oder nach dem Bearbeiten und Speichern eines neuen/alten Datensatzes durchgeführt werden. Die Aktion "Löschen" kann nur auf einen bestehenden Datensatz ausgeführt werden. Es wäre daher auch nur konsequent, wenn der Menüeintrag "Löschen" auch nur dann aktivierbar ist.

Ein Daten-Edit-Dialog kennt zwei Zustände:

  • Neuanlage

  • Bearbeitung eines bestehenden Datensatzes

Diese Stati können abgefragt werden. Dafür gibt es die Variable _DialogState. Die Werte sind "Create" und "Edit".

Für das Freischalten eines Kontextmenüeintrags gibt es diverse Möglichkeiten (siehe Kontextmenüs). Tragen Sie in der Eigenschaft "Festlegung Aktivierung durch Feld" des Kontextmenüeintrages "Loeschen" den Ausdruck "[_DialogState]="Edit"" ein.

Legen Sie unter „Oberfläche/ Elemente/ Projektsteuerung“ das Daten-Edit-Element „ediProjektthemen“ an.

Das Daten-Edit-Element ist das UI-Element zum Bearbeiten von Daten, also nicht zwingend nur für Stammdatendialoge einzusetzen. Daher muss in der Eigenschaft „Verwendungszweck“ eben dieser eingestellt werden. Wir wollen das Daten-Edit-Element als „Stammdatendialog für einen Datensatz“ verwenden und stellen daher diese Eigenschaft entsprechend ein. Ordnen Sie den Datensatz „recProjektthemen“, das Kontextmenü „Projektthemen“ und das Navigationselment „lstProjektthemen“ zu.

Auch diesem Element („ediProjektthemen“) muss die Definiton der Schlüsselfelder bekannt gegeben werden. Und zwar wird hier die Nummer des Schlüsselfeldes der Datenquelle des Navigationselementes eingetragen. In unserem Fall tragen wir in der Eigenschaft „Primärschlüssel 1 für Datensatz“ den Wert „1“ ein.

Stamdaten- oder Erfassungsdialoge können recht komplex sein. Eine Unterteilung und Gruppierung von Daten ist daher in den meisten Fällen von Nöten. Diese Einteilung erfolgt durch Definition von Registern und innerhalb eines Registers von Feldgruppen. Diese Hinterlegung (Registaer und Feldgruppen) muss aber in allen Fällen erfolgen, also auch dann, wenn man nur wie in diesem Beispiel 4 Felder zur Anzeige/Bearbeitung bereit stellt. Bei der Darstellung (Rendering) in der Applikation entscheidet das System, ob Register/Feldgruppen angezeigt werden. Ist nur eine Registerkarte aktiv, wird keine Registerkarte angezeigt. Ist nur eine Feldgruppe auf einer Registerkarte aktiv, dann wird keine Gruppierung (also Überschrift und Trennlinie) angezeigt. Aktiv kann hier zwei Zustände bedeuten:

  • Es ist nur eine Registerkarte definiert worden

  • Es sind alle Felder einer oder mehrerer Register auf unsichtbar gesetzt worden (durch Lizenzierung oder Makros möglich), so dass nur eine Registerkarte "aktiv" ist.

  • Es ist nur eine Feldgruppe definiert worden

  • Es sind alle Felder einer oder mehrerer Feldgruppen auf unsichtbar gesetzt worden (durch Lizenzierung oder Makros möglich), so dass nur eine Feldgruppe "aktiv" ist.

Selektieren Sie das Daten-Edit-Element "ediProjektthemen" und wählen Sie aus dem Kontextmenü (rechte Maustaste) "Neue Data-Edit-Element-Registerkarte" aus. Geben Sie als Name und Titel "Projektthemen" ein. Selektieren Sie die neue Registerkarte und wählen Sie aus dem Kontextmenü (rechte Maustaste) "Neue Data-Edit-Element-Gruppe" aus. Geben Sie als Name und Titel "Projektthemen" ein. Selektieren Sie die neue Element-Gruppe und wählen Sie aus dem Kontextmenü (rechte Maustaste) "Felder importieren" aus.

Aktivieren Sie für Testzwecke die Lizenzoption „im Regiezentrum verfügbar?“ und rufen den Stammdatendialog unter „Stammdaten/ Weitere Stammdaten“ auf. Sie können alle für einen Datensatz benötigten Aktionen durchführen. Das wird durch die Bekanntgabe der Schlüsselfelder in allen beteiligten Elementen ermöglicht.

|

Datenquelle des Navigationselementes

|

Datensatz

|

Daten-Edit-Element

| | --- | --- | --- | |

Feldname in Schlüsselfelder

|

Feldname in Primärschlüsselfelder

|

| |

Nummer der Schlüsselfelder

|

|

Nummer Schlüsselfeld für Primärschlüssel des Datensatzes

|

Frage: Basieren Daten, die in der Liste und/oder des Daten-Edit-Elementes angezeigt werden, auf Daten, die in der Mandanten-Datenbank mit Werten gespeichert werden, die nicht der gewünschten Anzeige entsprechen (in unserem Beispiel „Gruppe“ und „IstExternesThema“)?
  • Antwort ist Ja: Sie benötigen zusätzlich String Ressourcen.

  • Antwort ist Nein: Daten werden weiterhin als Integerwerte bzw. Checkboxen angezeigt

Analog dem Beispiel für die Auskünfte werden wir die Strings „Ja“ und „Nein“ aus dem Standard verwenden. Die Strings für das Feld „Gruppe“ müssen wir anlegen.

Bei der Beschreibung des Beispiels, sind die Bedeutungen der Intergerwerte aufgeführt. Legen Sie also folgende Strings an:

Open

Wie bei den Auskünften beschrieben, werden die Strings über den „Datentyp“ = „Indizierter String“ in der Eigenschaft „Datentyp Ergänzung“ zugewiesen. Der Wert in der Spalte „Index“ entspricht dem geschpeicherten Wert. Ändern Sie in der Datenquelle „dtsProjektthemen“ und dem Datensatz „recProjektthemen“ die Felder „Gruppe“ und „IstExternesThema“ entsprechend.

Frage: Soll man auch Daten in der Navigationsliste bearbeiten können?
  • Die Antwort ist Ja: Ändern Sie die Eigenschaft „Editiermodus“ des Navigationselementes des Daten-Edit-Elements „ediProjektthemen“ auf „Editierbar mit Detailbereich“.

  • Die Antwort ist Nein: Weiter mit Validierungen

Frage: Soll man Daten nur in der Navigationsliste bearbeiten können?
  • Die Antwort ist Ja: Ändern Sie die Eigenschaft „Editiermodus“ des Navigationselementes des Daten-Edit-Elements „ediProjektthemen“ auf „Editierbar ohne Detailbereich“.

  • Die Antwort ist Nein: Weiter mit Validierungen

Sobald Sie den Editiermodus auf „Editierbar…“ ändern, kann ein Datensatz auch im Navigationselement geändert werden. Sollen auch neue Datensätze angelegt werden, dann kann nur die Einstellung "Editierbar mit Detailbereich" verwendet werden, da ein neuer Datensatz nur im Detailbereich angelegt werden kann. Sollen Felder in der Navigationsliste bearbeitbar sei, ist folgender Zusammenhang zu beachten: ein Feld kann in der Navigationsleiste bearbeitet werden, wenn Feldname und Datentyp von der Datenquelle des Navigationselementes und des Datensatzes identisch sind.

Ferner ist zu beachten: technisch bearbeitet man das Feld des Daten-Edit-Elementes und damit das dahinter liegende Datensatzfeld. Daher werden Eigenschaften des Daten-Edit-Elementes und des Datensatzfeldes (z.B. „Schreibschutz?“) innerhalb der Liste berücksichtigt.

Laut Beispiel soll der Stammdatendialog „ediProjektthemen“ ohne Detailbereich angelegt werden, es sollen aber natürlich auch neue Datensätze angelegt werden können. Stellen Sie also die Eigenschaft „Editiermodus“ auf „Editierbar mit Detailbereich“.

Frage: Müssen Eingaben/Änderungen vor dem Speichern validiert werden?
  • Die Antwort ist Ja: Sie brauchen einen Makroaufruf und eine .Net-Assembly, die serverseitig ausgeführt wird.

  • Die Antwort ist Nein: Die Erstellung des Stammdatendialoges ist abgeschlossen.

Die Kommunikation zwischen Client und Server erfolgt mittels Übertragung basierend auf einen Protokoll (bei Sage ist es das SData-Protokoll). Diese Übertragungen könnte man abfangen, die Daten ändern und den geänderten Request des Clients weiter an den Server schicken. Somit werden andere (schlimmstenfalls invalide) Daten gespeichert.

Eine Validierung der Daten kann einzig auf der Serverseite stattfinden.

Schreibende Metadatenobjekte, sowie zugehörigen UI-Metadatenobjekte führen bei bestimmten Aktionen Ereignisse aus. Beim Ausführen dieser Ereignisse werden Makrobefehle ausgeführt. Man hinterlegt also Makrobefehle bei dem Ereignis, bei dem man beim Ausführen der Aktion eingreifen möchte.

Wir wollen vor dem Speichern des Datensatzes eingreifen. Also können wir nur ein Ereignis des Datensatzes verwenden, da nur dieses Metadatenobjekt zum Server geschickt wird. Bei einem Datensatz gibt es diese Ereignisse:

|

Ereignisse (Makros)

| | --- | |

Vor Änderung

| |

Vor Löschung

| |

Nach Einfügung

| |

Nach Änderung

| |

Nach Löschung

|

Die Namen der Ereignisse erklären bereits, bei welcher Aktion Makrobefehle ausgeführt werden können. Man könnte sich allerdings die Frage stellen, warum es kein „Vor Einfügen“ Ereignis gibt. Die Antwort ist, dass das System im Ereignis „Vor Änderung“ die Möglichkeit bietet, abzufragen, ob es sich um einen neuen oder ein geänderten Datensatz handelt (IsRecordInsert()). Außerdem werden einige Ereignisse clientseitig (zuerst) und serverseitig (dannach) ausgeführt. Auch dafür stellt das Sytem eine Möglichkeit der Abfrage (IsRunningOnServer()) zur Verfügung.

Was wir nun noch benötigen ist ein Makrobefehl, der eine serverseitige .Net-DLL aufruft. Dieser Makrobefehl lautet „AufrufenDLL“. Laut Beschreibung in Makro-Funktionalität benötigt der Befehl den Namen der Assembly und den Namen der Klasse, die von „MacroProcessBase“ ableitet. Daher erstellen wir erst die Assembly.

Laut Beispiel sollen vor dem Speichern folgende Punkte geprüft werden:

  • Das Feld „Thema“ ist bei gespeicherten Themen nicht mehr änderbar.

  • Ein Thema darf nicht gelöscht werden, wenn es bereits in der Projektsteuerung verwendet wird.

  • Die Einstellung „Externes Thema“ darf nicht auf „Nein“ umgestellt werden, wenn es bereits Termine mit diesem Thema und einem Eintrag in „Kontakt“ gibt.

  • Die Gruppe darf nur mit einer speziellen Berechtigung geändert werden.

Für die Codierung legen wir das Projekt „Sagede.ADID.Projektsteuerung.RealTimeData.dll“ an.

Die Erstellung Ihrer .Net-Assemblies erfolgt natürlich anhand Ihren Vorgaben von Namespace und Styleguide. Da wir aber immer mehr Code anlegen werden, hier kurz der Aufbau unserer Solution.

Open

Um die geforderten Validierungen zu codieren, müssen wir uns in die Ereignisse „Vor Änderung“ und „Vor Löschung“ integrieren. Für beide Ereignisse legen wir jeweils eine Klasse an.

Hinweis für Developer Partner

WDB-Eintrag 203334:

Dokument "Zusatzdokumentation zum Wiki für Developer Partner", MacroProcessBase

Anhang ADID.Projektsteuerung.rar

Dateien/Klassen ProjektthemenBeforeDelete und ProjektthemenBeforeUpdate

Der Aufruf der Dll muss nun noch in den Ereignissen hinterlegt werden. Dabei können wir die beiden Parameter cancel und cancelMessage mit den lokalen Variablen [_Canceled] und [_CanceledMessage] abfragen. Für die Ausgabe benötigen wir einen String, den wir unter „Grundlagen/ Strings“ wie folgt anlegen:

Open

Wir hinterlegen in den Ereignissen „Vor Änderung“ und „Vor Löschung“ folgende Makros (PartnerId und LösungId entsprechen Ihren Daten):

Ereignis „Vor Änderung“

|

Zeile

|

Befehl

|

Parameter 1

|

Parameter 2

| | --- | --- | --- | --- | |

1

|

Wenn

|

IsRunningOnServer()

|

| |

2

|

AufrufenDll

|

Sagede.ADID.Projektsteuerung.RealTimeData.dll

|

Sagede.ADID.Projektsteuerung.RealTimeData.Macros.ProjektthemenBeforeUpdate

| |

3

|

Wenn

|

[_Canceled]

|

| |

4

|

FehlerMelden

|

100065830.ADID_Projektsteuerung.Platzhalter.0

|

[_CanceledMessage]

| |

5

|

Abbruch

|

|

| |

6

|

EndeWenn

|

|

| |

7

|

EndeWenn

|

|

|

Ereignis „Vor Löschung“

|

Zeile

|

Befehl

|

Parameter 1

|

Parameter 2

| | --- | --- | --- | --- | |

1

|

Wenn

|

IsRunningOnServer()

|

| |

2

|

AufrufenDll

|

Sagede.ADID.Projektsteuerung.RealTimeData.dll

|

Sagede.ADID.Projektsteuerung.RealTimeData.Macros.ProjektthemenBeforeDelete

| |

3

|

Wenn

|

[_Canceled]

|

| |

4

|

FehlerMelden

|

100065830.ADID_Projektsteuerung.Platzhalter.0

|

[_CanceledMessage]

| |

5

|

Abbruch

|

|

| |

6

|

EndeWenn

|

|

| |

7

|

EndeWenn

|

|

|

Damit haben wir erreicht, dass keine invaliden Daten gespeichert werden. Da der Aufruf aus den Ereignissen des Datensatzes erfolgt, ist es auch unerheblich von welchem Client die Daten geschickt werden. Zusätzlich könnte man Validierungen auf dem Client vornehmen, damit der Anwender nicht erst Fehleingaben tätigen kann, um dann beim Speichern eine entsprechende Meldung zu erhalten.

Client-Validierungen sind immer zusätzlich.

Frage: Soll der Stammdatendialog an definierter Stelle aus dem Regiezentrum aufrufbar sein?
  • Die Antwort ist Ja: Sie benötigen einen Eintrag unter „Oberfläche/ Regiezentrum“

  • Die Antwort ist Nein: Die Erstellung des stammdatendialoges „Projektthemen“ ist abgeschlossen

Laut Beispielbeschreibung soll der Stammdatendialog „Projektthemen“ unter dem Menüpunkt „Projektsteuerungsauskunft“ aufrufbar sein.

Wechsel Sie im AppDesigner auf „Oberfläche/ Regiezentrum“ und erstellen Sie den neuen Eintrag „mnuProjektthemen“. Hinterlegen Sie folgende Eigenschaften:

|

Eigenschaft

|

Wert

| | --- | --- | |

Applikation

|

Wawi

| |

Eltern-Knoten

|

mnuProjektsteuerung.<ihre_partnerid>.<ihre_lösungid>

| |

Titel

|

Projektthemen

| |

Typ

|

Element-Aufruf

| |

Anzeigereihenfolge

|

20

| |

Kategorie

|

Formular

| |

aufzurufendes Objekt

|

ediProjektthemen.<ihre_partnerid>.<ihre_lösungid>

|

Deaktivieren Sie die Lizenzoption „im Regiezentrum verfügbar?“ des Daten-Edit-Elementes „ediProjektthemen“.

Frage: Gibt es komplexe Stammdatendialoge (z.B. mit 1:N-Beziehungen), die sich nicht als schreibende Liste abbilden lassen?
  • Die Antwort ist Ja: Sie benötigen ein Daten-Edit-Element mit „Editiermodus“ = „Nicht editierbar“.

  • Die Antwort ist Nein: die Erstellung von Stammdatendialogen ist abgeschlossen.

Die benötigten Metadatenobjekte bleiben natürlich auch für den „Editiermodus“ = „Nicht editierbar“ gleich. Wir benötigen also:

  • Datenquelle

  • Listen-Element

  • Kontextmenü

  • Datensatz

  • Daten-Edit-Element

Die Erstellung der Metadaten erfolgt analog der Stammdaten „Projekttermine“. Nur müssen wir jetzt die Felder in Register und Feldgruppen im Detailbereich des Daten-Edit-Elementes plazieren.

Beispiel Projektsteuerung

Legen Sie die Datenquelle „dtsProjektsteuerung“ an. Basis ist die Tabelle „BPKProjektsteuerung“. Da zusätzliche Felder aus KHKProjekte und KHKKontokorrent optional angezeigt werden sollen, müssen wir in der Eigenschaft „SQL-Tabellen“ eine entsprechende SQL-Syntax hinterlegen. Die Datenquellenfelder, Titel und SQL-Abfrage sehen dann wie folgt aus:

Open

Die Sortierung erfolgt nach dem Feld „Matchcode“. Da in der Navigationsliste der Auftraggeber vorhanden ist, und es zu einem Auftraggeber mehrere Projekte geben kann, müssen wir dafür sorgen, dass bei einer Sortierung der Liste nach „Auftraggeber“ jedesmal die Datensätze in der gleichen Reihenfolge angezeigt werden. Dies gilt natürlich auch für andere Felder. Daher tragen wir in den Eigenschaften „Ergänzende Sortierung“ und „Ergänzende Sortierung absteigend“ das Feld „SteuerungId“ (aufsteigend) ein. Wir müssen nun noch den Primäschlüssel der Tabelle für die Auswahl in der Navigationsleiste und Anzeige im Daten-Edit-Element angegeben. Falls ein Assistent es nicht bereits getan hat, tragen Sie in der Eigenschaft „Schlüsselfeld 1“ das Feld „SteuerungId“ ein.

Erstellen Sie das Listen-Element „lstProjektsteuerung“ und weisen Sie die gerade angelegte Datenquelle zu. Das Feld „SteuerungId“ wird mit „Sichtbarkeit“ = „Versteckt“ und die Felder „Telefon“, „EMail“, „Mobilfunk“, „Projektmatchcode“ und „Auftraggebermatchcode“ mit „Sichtbarkeit“ = „Ausgeblendet“. Lizenzierung „für Wawi?“ aktivieren.

Legen Sie das Kontextmenü „Projektsteuerung“ an. Legen Sie die beiden Kontextmenüeinträge „Neu“ und „Löschen“ analog dem Kontextmenü „Projektthemen“ an (oder kopieren Sie dieses Kontextmenü und benennen es um).

Legen Sie den Datensatz „recProjektsteuerung“ auf Basis der Tabelle „BPKProjektsteuerung“ an (Assistent „Tabelle importieren“). Der Primärschlüsseltyp kann von dem Assistenten nicht erkannt werden. Wir müssen die Eigenschaft „Primärschlüsseltyp 1“ auf „TAN basierend auf Tabelle 1“ ändern. Wie bei der Datenquellen tragen wir bei der „Sortierung“ die Felder „Matchcode“ und „SteuerungId“ ein.

Legen Sie das Daten-Edit-Element „ediProjektsteuerung“ (ohne Assitenten) an. Hinterlegen Sie in der Eigenschaft „Verwendungszweck“ die Option „Stammdatendialog für einen Datensatz“. Hinterlegen Sie in der Eigenschaft „Primärschlüssel 1 für Datensatz“ den Wert „1“ (Schlüsselfeld 1 der Datenquelle des Navigationselementes). Ordnen Sie den Datensatz, das Kontextmenü und das Navigationselement zu.

Legen Sie das Daten-Edit-Element „ediProjektsteuerung“ (ohne Assitenten) an. Ordnen Sie den Datensatz, das Kontextmenü und das Navigationselement zu. Hinterlegen Sie in der Eigenschaft „Verwendungszweck“ die Option „Stammdatendialog für einen Datensatz“. Legen Sie ein Daten-Element-Register „Projektsteuerung“ und folgende Daten-Element-Feldgruppen an (entsprechend den Vorgaben des Beispiels):

Open

Über die Option „Felder importieren“ hinterlegen Sie die Felder in der im Beispiel angegebenen Feldgruppe. Das Feld „SteuerungId“ importieren Sie in die Gruppe „Projektsteuerung“ und setzen die „Sichtbarkeit“ auf „Versteckt“. Bei allen Feldgruppen aktivieren Sie die Eigenschaft „Feldgruppen-Rahmen?“.

Aktivieren Sie die Lizenzierung des Daten-Edit-Elementes „im Regiezentrum verfügbar?“.

Wenn Sie den Stammdatendialog aus dem Regiezentrum (Stammdaten/ Weitere Stammdaten/ Projektsteuerung/ Projektsteuerung) aufrufen, sollte er wie folgt aussehen:

Open

Frage: Gibt es eine (oder mehrere) 1:N-Beziehung(en) zu einem Stammdatensatz?
  • Die Antwort ist Ja: Sie benötigen einen Datensatz (oder mehrere), ein Multi-Daten-Edit-Element (oder mehrere) und ein Kontextmenü.

  • Die Antwort ist Nein: Die Erstellung des Stammdatendialoges mit Detailbereich und den grundlegenden Funktionen Anlegen und Bearbeiten ist abgeschlossen.

In unserem Beispiel können Mitarbeiter einer Projektsteuerung zugeordnet werden. Die Daten werden in der Tabelle „BPKProjektsteuerungMitarbeiter“ gespeichert. Wir legen also auf Basis dieser Tabelle (mit dem Assistenten „Tabelle importieren“) den Datensatz „recProjektsteuerungMitarbeiter“ an. Der Primärschlüssel der Tabelle sind „SteuerungId“ und „Mitarbeiter“ und werden auch so vom Assistenten in die Eigenschaften „Primärschlüsselfeld 1“ und „Primärschlüsselfeld 2“ eingetragen. Die SteuerungId wird aber bei der Anlage des Hauptdatensatz vergeben (dort „Primärschlüsseltyp 1“ = „Tan-basierend auf Tabelle 1“). Daher ist in dem Datensatz „recProjektsteuerungMitarbeiter“ der „Primärschlüsseltyp 1“ = „fester, vom Parent übergebener Wert“. Die Mitarbeiternummer ist ein Stringfeld und kann daher variabel vergeben werden. Damit ist der „Primärschlüsseltyp 2“ = „variabel“.

Laut Beispielbeschreibung soll bei den Mitarbeiter nicht nur die Mitarbeiternummer, sondern auch der Matchcode und die Gruppe aus dem Mitarbeiterstamm angezeigt werden.

Bei einem Daten-Edit-Element mit „Verwendungszweck“ = „Stammdatendialog für einen Datensatz“ übernimmt das Lesen und Schreiben des Datensatzes das System. Alle Felder, die im Datensatz definiert sind, werden nach der hinterlegten SQL-Syntax (Eigenschaft „SQL-Abfrage Tabelle 1 (oder 2)“) gelesen. Geschrieben werden aber nur Felder, deren Eigenschaft „Schreibschutz?“ nicht aktiviert ist. Damit können wir beliebige Felder, die kein Bestandteil des zu schreibenden Datensatzes sind, zusätzlich in den Datensatz aufnehmen.

Legen Sie im Datensatz „recProjektsteuerungMitarbeiter“ zwei Felder mit folgenden Eigenschaften an:

  • Matchcode

  • Gruppe

Die Verknüpfung erfolgt in dem Hauptdatensatz, also „recProjektsteuerung“. In der Gruppe „Beziehungen“ hinterlegen wir in der Eigenschaft „Detail-Datensätze“ den Datensatz „recProjektsteuerungMitarbeiter“ und geben dort auch die 1:N-Beziehung an.

Open

Wir haben jetzt auf Datensatzebene die 1:N-Beziehnung angelegt. Über „Logischer Feldname“ (im Bild „Virtueller Feldname“) erfolgt die Verknüpfung in den UI-Elementen (Daten-Edit- und Multi-Daten-Edit-Element), es sollte daher ein „sprechender“ Name gewählt werden.

Damit haben wir die Verknüpfung auf Datensatzebene. Nun müssen wir die Verknüpfung auf UI-Ebene erstellen. Ein Datensatz, der in einer 1:N-Beziehung zu einem Hauptdatensatz steht, wird in einem Daten-Edit-Element über das Metadatenobjekt Multi-Daten-Edit-Element integriert.

Legen Sie in „Oberfläche/ Elemente/ Projektsteuerung“ das Multi-Daten-Edit-Element „mdeProjektsteuerungMitarbeiter“ mit dem Assistenten „Datenherkunft zuordnen“ an und weisen Sie diesem Element den Datensatz „recProjektsteuerungMitarbeiter“ zu. Ändern Sie den Titel in „Mitarbeiter“. Die Eigenschaft „Sichtbarkeit“ des Feldes „SteuerungId“ wird auf „Versteckt“ eingestellt. Damit dieses Element mit Tab verlassen werden kann, aktivieren wir die Eigenschaft "Hautpfeld?" beim Feld "Mitarbeiter".

Jetzt folgt die Verknüpfung zwischen Daten-Edit- und Multi-Daten-Edit-Element. Legen Sie in „ediProjektsteuerung“ das Daten-Element-Register und die Daten-Element-Feldgruppe „Mitarbeiter“ an. In der Feldgruppe legen Sie das Feld „Mitarbeiter“ an. Der Feldname kann nicht frei gewählt werden. Er muss mit dem logischen Namen des Detail-Datensatzes übereinstimmen. Der „Typ“ des Feldes ist „Unterlement“ und in der Eigenschaft „Unterelement“ hinterlegen Sie das gerade angelegte Multi-Daten-Edit-Element.

Nachdem Sie den Typ umgestellt haben, wird in den Feldern „Unterelement“ und „Zeilenanzahl“ ein Fehler ausgewiesen. Durch die Zuweisung des Unterlementes ist bei dieser Eigenschaft der Fehler behoben. Ein Multi-Daten-Edit-Element braucht eine bestimmte Anzahl an Zeilen, um komplett gerendert zu werden. Diese Zeilen werden benötigt:

  • Feldgruppe-Rahmen (wird nicht angezeigt, wenn keine weitere Feldgruppe vorhanden ist)

  • Hamburger-Menü und Schaltflächen

  • Titelzeile

  • Datensatzzeile

Daher ist der minimale Wert „4“, den wir auch in diese Eigenschaft eintragen.

Damit ist die Verknüpfung hergestellt und Ihr Stammdatendialog/ Register Mitarbeiter sollte jetzt so aussehen:

Wenn Sie in einem bestehenden Datensatz in das Register „Mitarbeiter“ wechseln, werden Sie feststellen, dass Sie einen neuen Datensatz anlegen können. Es wird also kein Kontextmenüeintrag „Neu“ benötigt. Für das Löschen eines Datensatzes einer 1:N-Beziehung müssen wir allerdings wieder ein Kontextmenüeintrag erstellen.

Legen Sie das Kontextmenü „ProjektsteuerungMitarbeiter“ an. Legen Sie den Kontextmenüeintrag „Löschen“ analog dem Kontextmenü „Projektthemen“ an (zusätzlich: "Tastenkürzel" = "Entfernen") und weisen Sie dieses Kontextmenü dem Multi-Daten-Edit-Element zu.

Damit haben wir einen Stammdatendialog mit einer 1.N-Beziehung und den grundlegenden Funktionen wie Anlegen, Bearbeiten und Speichern erstellt.

Frage: Gibt es so viele Daten in einer 1:N-Beziehung, dass eine Bearbeitung in der Liste nicht zuzumuten wäre?
  • Antwort ist Ja: Sie benötigen ein zusätzliches Daten-Edit-Element und ein Kontextmenüeintrag.

  • Antwort ist Nein: Die Implementierung der 1:N-Beziehung (Anzeige, Anlegen, Bearbeiten und Speichern) ist abgeschlossen.

Die Implementierung eines "Bearbeiten"-Dialoges für eine 1:N-Beziehung erfolgt nach diesem Muster:

  • Kontextmenüeintrag im Kontextmenü des Multi-Daten-Edit-Elementes mit Funktionsaufruf "DatensatzBearbeiten.Sage.System"

  • Zuordnung des "Bearbeiten"-Dialoges (Daten-Edit-Element) in der Eigenschaft "Child-Element" des Kontextmenüeintrages

Wir müssen also zuerst das Daten-Edit-Element anlegen. Legen Sie in der Gruppe "Projektsteuerung" das Daten-Edit-Element "ediProjektsteuerungMitarbeiter" an. Ändern Sie die folgenden Eigenschaften:

  • "Titel" = "Mitarbeiter"

  • "Verwendungszweck" = "Stammdatendialog für einen Datensatz"

  • "Dialoggruppe" = "Stammdaten"

  • "Datensatz" = "recProjektsteuerungMitarbeiter.<partnerid>.<loesungid>"

Legen Sie das Daten-Element-Register "Mitarbeiter" mit folgenden Daten-Element-Feldgruppen und Feldern (Felder importieren) an:

  • Feldgruppe "Mitarbeiter"

  • Feldgruppe "Fahrzeug"

  • Feldgruppe "Sontiges"

Das Kontextmenü des Multi-Daten-Edit-Elementes haben wir bereits angelegt ("ProjektsteuerungMitarbeiter"). Legen Sie in diesem Kontextmenü den Kontextmenüeintrag "Bearbeiten" an und ändern Sie folgende Eigenschaften:

  • "Funktionstitel" = "Bearbeiten"

  • "Funktionskurztitel" = "Bearbeiten"

  • "Position in Sortierung" = "2"

  • "Schaltflächenposition" = "2"

  • "Festlegung Aktivierung durch Feld" = "[_DialogState]="Edit""

  • "Funktionsaufruf" = "DatensatzBearbeiten.Sage.System"

  • "Child-Element" = "ediProjektsteuerungMitarbeiter.<partnerid>.<loesungid>"

  • "für Wawi?" aktivieren

Wenn Sie in der Warenwirtschaft den Stammdatendialog "Projektsteuerung" aufrufen, einen Datensatz markieren und im Register "Mitarbeiter" den Kontextmenüeintrag "Bearbeiten" ausführen, sollte der Dialog so aussehen (das die Mitarbeiternummer editiert werden kann, wird später noch behandelt):

Open

Frage: Gibt es eine oder mehrere N:M Beziehung?
  • Antwort ist Ja: Sie benötigen einen Datensatz (oder mehrere), ein Multi-Daten-Edit-Element (oder mehrere) und ein Kontextmenü.

  • Antwort ist Nein: Die Implementierung der 1:N-Beziehung (Anzeige, Anlegen, Bearbeiten und Speichern) ist abgeschlossen.

In unserem Beispiel soll zu jedem Mitarbeiter die Zeiten erfasst werden, die für bestimmte Aktionen in einem Projekt geplant sind. Die geplanten Zeiten sind also eine N:M-Beziehung.

Wir benötigen einen Datensatz. Legen Sie den Datensatz "recProjektsteuerungMitarbeiterPlanung" an (Tabelle importieren, Tabelle = "BPKProjektsteuerungMitarbeiterPlanung"). Für die Beziehung müssen folgende Änderungen am Datensatz vorgenommen werden:

  • "Primärschlüsselfeld 2" = "SteuerungId"

  • "Primärschlüsselfeld 3" = "Mitarbeiter"

  • "Primärschlüsseltyp 1" = "TAN-basierend auf Tabelle 1"

  • "Primärschlüsseltyp 2" = "fester, vom Parent übergebener Wert"

  • "Primärschlüsseltyp 3" = "fester, vom Parent übergebener Wert"

Führen Sie an folgenden Feldern Änderungen durch:

  • Feld "DatumBis"

  • Feld "DatumVon"

Selektieren Sie den Datensatz "recProjektsteuerungMitarbeiter" und hinterlegen Sie in der Eigenschaft "Detail-Datensätze" den neuen Datensatz mit "Virtueller Feldname" = "Mitarbeiterplanung" und der Datensatzbeziehung "Schlüssel Master-Datensatz" = "SteuerungId" und "Mitarbeiter" und "Schlüssel Detail-Datensatz" = "SteuerungId" und "Mitarbeiter".

  • Anlage des Kontextmenüs "ProjektsteuerungMitarbeiterPlanung"

  • Anlage des Multi-Daten-Edit-Elementes "mdeProjektsteuerungMitarbeiterPlanung"

Bei der Beschreibung der weiteren Änderungen oder Neuanlage von Metadaten wird vorausgesetzt, dass Sie das Daten-Edit-Element "ediProjektsteuerungMitarbeiter" angelegt haben (das ist der "Bearbeiten"-Dialog der vorherigen Frage).

  • Anlegen der Daten-Element-Feldgruppe "Planung" im Register "Mitarbeiter" des Daten-Edit-Elementes "ediProjektsteuerungMitarbeiter"

Damit haben wir einen funktionsfähigen Stammdatendialog mit einer 1:N:M-Beziehung angelegt. Im Client sieht diese Beziehung so aus:

Open

Soll für die M-Beziehung ein "Bearbeiten"-Dialog zur Verfügung stehen, dann ist wie bei dem "Bearbeiten"-Dialog der N-Beziehung vorzugehen.

Frage: Basieren Daten, die in der Liste und/oder des Daten-Edit-Elementes angezeigt werden, auf Daten, die in der Mandanten-Datenbank mit Werten gespeichert werden, die nicht der gewünschten Anzeige entsprechen (in unserem Beispiel "Status“, "Projekttyp“, "Planung" und alle boolschen Felder)?
  • Antwort ist Ja: Sie benötigen zusätzlich String Ressourcen.

  • Antwort ist Nein: Daten werden weiterhin als Integerwerte bzw. Checkboxen angezeigt

Legen Sie die String Ressourcen anhand der Tabellenbeschreibung des Beispiels:

Open

Für boolsche Felder stellt das System die Ressourcen (String Ressourcen „Ja“ und „Nein“) bereit.

Der „Datentyp“ der Felder "Status", "Projekttyp", "Planung" und aller boolschen Felder (Datensatz „recProjektsteuerung“, „recProjektsteuerungMitarbeiter“ und „recProjektsteuerungMitarbeiterPlanung“) wird auf „Indizierter String“ geändert und die String Ressourcen in der Eigenschaft „Datentyp Ergänzung“ zugeordnet. Für das Feld "Planung" verwenden wir die Ressourcen der Themengruppe, die bereits für die Themenverwaltung angelegt wurden.

Frage: Müssen Daten erfasst und/oder angezeigt werden, die zwar in den zugrundeliegenden Tabellen des Stammdatendialogs gespeichert, aber auf Daten beruhen, die in anderen Bereichen der Applikation erfasst werden?
  • Antwort ist Ja: Sie benötigen zusätzliche Datenreferenzen und/oder Datenklassen und/oder serverseitige Datenbeschaffung

  • Antwort ist Nein: Weiter mit der Bearbeitung des Stammdatendialoges

Die Auswahl des Projektleiters soll sich auf angelegte Benutzer der Applikation beziehen. Die Auswahl erfolgt daher aus einer Datenreferenz. Im Standard wird diese Auswahl bereits in mehreren Bereichen verwendet. Wir hinterlegen im Feld „Projektleiter“ des Datensatzes „recProjektsteuerung“ die „Datenreferenz“ = „dtrBenutzer.Sage.System“.

Im Feld „Kontakt“ soll aus den Ansprechpartner des Projekt-Auftraggebers oder eine freie Eingabe möglich sein. Das Feld darf nicht leer sein. Das eine Eingabe erforderlich ist, haben wir bereits durch die Tabellendefinition (NOT NULL) festgelegt. Durch diese Definition ist das Feld „Kontakt“ bei der Erstellung des Datensatzes bereits mit der Aktivierung von „Pflichtfeld?“ in den Metadaten angelegt worden. Für diese Varianten müssen wir eine entsprechende Datenreferenz anlegen.

Bei der Zuordnung einer Datenreferenz zu einem Datensatzfeld gibt es zusätzliche Eigenschaften.

Open

Sollen alle Daten, die als Ergebnis der SQL-Abfrage der Datenreferenz geliefert werden, als Auswahl zur Verfügung stehen, dann reicht die Zuordnung der Datenreferenz. Soll nur eine Teilmenge des Ergebnisses zur Auswahl zur Vefügung stehen und ändert sich die erwartete Teilmenge in Abhängigkeit von Daten des Datensatzes, dann gilt: die SQL-Abfrage der Datenreferenz muss alle möglichen Daten liefern. Die Definition der Teilmenge erfolgt über die Eigenschaft „Datenreferenz-Filter“. Technisch wird nichts anderes gemacht, als diese Einschränkung an die WHERE-Bedingung der Datenreferenz anzuhängen. Kann die Einschränkung nicht über eine WHERE-Bedingung erfolgen, dann kann man eine dynamische Datenreferenz (alle Eigenschaften mit „(dynamisch)“) erstellen. Auch hier gilt: die SQL-Abfrage liefert alle Daten. Im Code teilt man dem System mit, welche „Schlüssel“ (Schlüsselfeld der Datenreferenz) angezeigt werden sollen. Ab der Version 8.1 gibt es eine weitere Variante, die die Ermittlung der Daten in einen Geschäftsprozess mit Übergabe von Parametern durchführt. Für unser Beispiel brauchen wir diesen Fall nicht. Die Verwendung bzw. die Codierung und die zu verwendende Basisklasse werden an anderer Stelle erläutert. Die Definition der Datenreferenzen und auch die Varianten der Filterung/ Erstellung sind hier Datenreferenzen beschrieben.

In der Regel besteht die Abfrage der Datenreferenz aus zwei Feldern: Schlüssel und Bezeichnung. Wobei der Schlüssel wiederum in der Applikation sichtbar oder nicht sichtbar sein kann. Ist der Schlüssel sichtbar und man möchte ihn auch in dem Feld im Daten-Edit-Element anzeigen (anlog den Datenklassen), dann muss man ein zusätzliches verstecktes, schreib geschütztes Feld anlegen. Über die Eigenschaft „Datenreferenz-Info-Felder“ kann man dann die Zuordnung der Daten aus der Datenreferenz hinterlegen. Dabei wählt man die Reihenfolge Felder des Datensatzes entsprechend der „Priorität“ der Datenreferenzfelder. Wir wollen nur den Ansprechpartner auswählbar machen, brauchen also nur ein Feld. Der Filter der Datenreferenz ist die Adresse des Auftragsgebers.

Legen Sie unter „Daten/ Datenreferenzen/ Projektsteuerung“ die Datenreferenz „dtrAnsprechpartnerProjektsteuerung“ an. Legen Sie die Datenreferenzfelder Adresse mit „Priorität“ = „0“, „Datentyp“ = „Integer“ und Ansprechpartner mit „Priorität“ = „1“ an. Die Eigenschaften der Datenreferenz legen Sie wie folgt an:

  • „Titel“ = „Ansprechpartner“

  • „Schlüsselfeld“ = „Ansprechpartner“

  • „Freie Eingabe erlaubt?“ aktivieren (damit kann auch in einem Pflichtfeld eine freie Eingabe erfolgen)

Collapse action bar

View all comments

Open Details Panel

Create page

Open Rovo Chat

Add a comment

Add a reaction