SOG-Helpcenter Logo SOG Business - Software

Dialogmasken


Um neue Dialogmasken für die Active Skin Oberfläche zu erstellen und einzubinden, sollte der SOGDevAssistant verwendet werden.
Starten Sie den SOGDevAssistant über das entsprechende Icon der SOGToolbar.

Wählen Sie das gewünschte Verzeichnis, falls dieses noch nicht korrekt eingestellt ist.

Geben Sie unter "Dlg" den gewünschten Dialognamen ein. z. B. "TestStolle1" Der Name der CSharp-Klasse wird dann "DlgTestStolle1" lauten.
Checken Sie "Parameter", wenn der Dialog mit einer Parameter-Aufrufklasse ausgestattet werden soll.
Geben Sie in Lizenz den gewüsnchten Lizenznamen an: z. B. vacos/center oder vacos/basis
Geben Sie die gewünschten Einstellung unter "Eintrag erzeugen" an.
Für neue Funktionen, die noch nicht freigegeben sind, wählen Sie "SOGSichtbar".

Folgende Dateien werden angelegt: (Am Beispiel des Zielordners Sources\SOG.ERP.Modules\Allgemein.Dialog\Test

dd\DlgName.ddx
Sources\SOG.ERP.Modules\Allgemein.Dialog\Test\DlgTestStolle1.cs
Sources\SOG.ERP.Modules\Allgemein.Dialog\Test\DlgTestStolle1.soggenerate.cs
Sources\SOG.ERP.Data\Copy\Dialog\DlgTestStolle1Parameter.cs

In den Menüfunktionen (c064):
Funktion VacosObjectDefinition - Datensatz mit Id = "TestStolle1"

Anschließend übersetzen per DeveloperStudio oder makeallcs

Ausprobieren:
pn
Direktstart TestStolle1

Zur Laufzeit: In der neuen, leeren Maske
Ctrl-S (Erzeugt/Bearbeitet c064 Dialogschritt)
  Text Eintragen
  KeyBack auf "99" einstellen.

Vor dem Bearbeiten der Maske:
  Per Ctrl-W auf Maskenvariante "base" schalten


Neugenerieren der Dialogmaske


Wenn Datenfelder auf die Dialogmaske gelegt werden sollen, sollten diese über das DataDictionary erzeugt werden.
Öffnen Sie die gewünschte Datei (Die Dialogklasse DlgTestStolle1.cs) und klicken Sie aus der SOGToolbar die Funktion "SOGDD".
Wahlweise: Aus der Entwicklungsumgebung das Kommando
  sogdd DlgTestStolle1

Fügen Sie nun mit Level "05" neue Datenfelder hinzu. Achten Sie darauf, das diese Datenfelder das "V" Attribut gesetzt haben.

Wählen Sie aus der SOGToolbar die Funktion "Generate".
Wahlweise: Führen Sie in dem Verzeichnis, in dem die Datei liegt, das Kommando aus, das in der generierten Datei unter
  // SOGGENERATED:
eingetragen ist.

Die Datei DlgTestStolle1.soggenerate.cs wird ggf. neu generiert.

Neugenerieren aller generierten Dateien eines Verzeichnisses



Entwicklungsumgebung:
hhcsgen2 -a upddir -input Verzeiczhnisname

z. B.:
hhcsgen2 -a upddir -input Sources\SOG.ERP.Modules\Allgemein.Dialog\Test

oder:

hhcsgen2 -force -a upddir -input Sources\SOG.ERP.Modules\Allgemein.Dialog\Test

Die Option "-force" erzwingt eine Neugenerierung auch dann, wenn die Quellen (DataDictionary) sich nicht geändert haben.

Einstellen der Cursorposition auf einer Dialogmaske


Verwenden Sie die Funktion "SetCursor" um einem bestimmten Datenfeld den Eingabefocus zu geben.
Beispiel:

    SetCursor(nameof(m_anl_termin));


Aktivieren eines bestimmten TabReiters


Um einen bestimmten TabReiter zur Anzeige zu bringen, sollte ein logischer TabReiter-Name definiert und verwendet werden.

    [GuiElement(ElementType = GuiElementType.TabPage, Description = "Tabpage die bei einer neuen Aufgabe angezeigt werden soll.")]
    public const string TAB_INFO = "info";


    // bestimmten TabReiter zur Anzeige bringen:
    ShowTab(TAB_INFO);

Damit dies korrekt funktioniert muss entweder auf dem TabReiter selbst oder außerhalb des TabControls ein Feld existieren, auf welches der Cursor gesetzt werden kann. (siehe philip201804120713)

Verwendung von Control-Connectoren


Über Control-Connectoren kann mit bestimmten Controls auf der ActiveSkin Maske kommuniziert werden. Damit können z.B. Nachrichten an Controls geschickt, oder Daten abgefragt werden. Außerdem können Connectoren dazu verwendet werden, den Anwender beim Design von Masken zu unterstützen.

 

Siehe auch: activeskin.entwickler.meldungen

 

Festlegung von Voreinstellungen für ObjectSelectoren


Über DialogParameter können auf der Maske konfigurierte ObjectSelectoren so eingestellt werden, dass sie automatisch bestimmte Bedingungen selektieren.

 

    DialogParameter.Add(SOGDialogParameter.SetField(_sel1.Name, nameof(Pinnwand.m_aktiv_bis), SOGObjectFilterItem.OpCodes.GreaterOrEqual, DateHelper.Now.Date));

 

Über die "SetField" Methode wird ein DialogParameter erzeugt, der eine bestimmte Selektion für ein Datenfeld einrichtet. Als "Klasse" kann entweder der Name eines Selektors (z. B. _sel1.Name oder "sel1") übergeben werden, oder "null". In diesem Fall richtet sich der Parameter an alle oder den einzigen Selector auf der Maske.

Geben Sie den Namen des gewünschten Datenfeldes immer über "nameof" des unterliegenden Datentyps an.

 

    DialogParameter.Add(SOGDialogParameter.SelectView(null, Anschrift.VIEW_KONTO));

 

Mit "SelectView" kann die im Selector dargestellte Ansicht ausgewählt werden.

 

    DialogParameter.Add(SOGDialogParameter.ShowData(null));

 

Die Funktion "ShowData" weißt den Selector an, sofort die ausgewählte Datenmenge anzuzeigen. Achtung: Dies kann auch (besser) durch Optionen der ausgewählten Ansicht erreicht werden.

 

Festlegung von nicht änderbaren Voreinstellungen für ObjectSelectoren

 

Die WPF Oberfläche unterstützt die Verwendung von nicht änderbaren Voreinstellungen für den ObjectSelector. Dies kann verwendet werden, wenn in einer Maske z.B. visualisiert werden soll, dass Daten nur zu einem festgelegten Konto angezeigt werden. Gehen Sie dazu wie folgt vor:

 

    var para = SOGDialogParameter.SetField(null, nameof(Kundenstamm.m_konto), SOGObjectFilterItem.OpCodes.Equal, _parameter.Konto);

    para.IsFixed=true;

    DialogParameter.Add(para);

 

Durch die Angabe von "IsFixed = true", wird der eingestellte Parameter für den Benutzer unveränderbar.

Aus Sicherheitsgründen muss aber zusätzlich die gewünschte Bedingung noch in der erzeugten SQL Anweisung programmatisch eingeschränkt werden. Der Benutzer hat sonst Möglichkeiten, an der so festgelegten Bedingung vorbei kommen.

 

Festlegung von komplexen Bedingungen

 

DialogParameter erlauben in der WPF Oberfläche auch die Verwendung von komplexen Bedingung, die mit "UND" und "ODER" miteinander verknüpfbar sind.

 

    SOGDialogParameterGroup grp1 = new SOGDialogParameterGroup(null, nameof(LieferscheinLeitsatz.m_sa), SqlLogical.OR);

    SOGDialogParameterGroup grp11 = new SOGDialogParameterGroup(null, nameof(LieferscheinLeitsatz.m_ek_vk), SqlLogical.AND);

    SOGDialogParameterGroup grp12 = new SOGDialogParameterGroup(null, nameof(LieferscheinLeitsatz.m_sa), SqlLogical.AND);

    grp1.AddField(grp11);

    grp1.AddField(grp12);

 

    grp11.AddField(SOGDialogParameter.SetField(null, nameof(LieferscheinLeitsatz.m_ek_vk), SOGObjectFilterItem.OpCodes.Equal, 1));

    grp11.AddField(SOGDialogParameter.SetField(null, nameof(LieferscheinLeitsatz.m_rg), SOGObjectFilterItem.OpCodes.Less, 2));

 

    grp12.AddField(SOGDialogParameter.SetField(null, nameof(LieferscheinLeitsatz.m_sa), SOGObjectFilterItem.OpCodes.Equal, 2));

    grp12.AddField(SOGDialogParameter.SetField(null, nameof(LieferscheinLeitsatz.m_rg), SOGObjectFilterItem.OpCodes.Equal, 2));

 

    DialogParameter.Add(grp1);

 

In diesem Beispiel werden 3 Gruppen erzeugt, die jeweils mit "OR" und "AND" verknüpft werden. In jeder Gruppe liegen mit "SetField" definierte Datenfelder.

Solche komplexen Definitionen werden für die "WinForms" Oberfläche in eine SQL Anweisung umgesetzt. Diese Umsetzung erlaubt jedoch nur rudimentäre Bedingungen. In der WPF Oberfläche sind auch kompliziertere Bedingungen denkbar.

 

Der aus dem obigen Beispiel in der WinForm Oberfläche erzeugte SQL sieht wie folgt aus:

 

     ((#TABNAME#.ek_vk = 1 AND #TABNAME#.rg < 2) OR (#TABNAME#.sa = 2 AND #TABNAME#.rg = 2))

 

Der in der WPF Oberfläche gefüllte SQL Selector hat folgenden Inhalt:

 

 

Wird später, z. B. durch das Senden von "DefineSelection" die Selektion eines Selectors z. B. durch ein Event verändert, so kann die angelegte Gruppe verworfen werden, indem dem als Gruppenname genutzten Datenfeld ein anderer Wert zugewiesen wird:

 

    _sel1.DefineSelection(SOGDialogParameter.SetField(null, nameof(LieferscheinLeitsatz.m_sa), SOGObjectFilterItem.OpCodes.Equal, 1));

 

DefineSelection ersetzt die Definition des Datenfeldes "m_sa" auch wenn dies bislang eine komplexe Gruppe war.