Python Dialoge

In Python Scripts definierbare Dialoge

Product line

Standard

|

Expert

Operating mode

CLOUD ABO

|

ON-PREMISES

Modules

Services & CRM

Budget & Phases

Purchases

Resource Planning

Business Intelligence

Created: 16.11.2016
Updated: 11.07.2019 | Rückgabewert der Buttons genauer beschrieben.

Ab Version 6.1 gibt es eine Dialog-Funktion, mit welcher in Python Scripts Dialoge definiert und vom Script angezeigt werden können. Der Dialogaufruf erfolgt über die API Funktion

vtcapp.showcustomdialog(Dialogdefinition, Initialwerte)

Dialogdefinition

Für die Erstellung des Dialogs gibt es ein Element namens Dialog mit folgenden Eigenschaften:

Title Setzt den Titel des Dialogs
Width

Legt die Breite des Dialogs fest. Der Dialog im Beispiel weiter unten hat z.B. Width="500" gesetzt.

Die Höhe des Dialogs ergibt sich aus der Anzahl der Controls, die darauf platziert werden.

InitialFocus

Hier kann festgelegt werden, wo sich der Fokus befindet, wenn der Dialog geöffnet wird. Zur Auswahl stehen die Optionen First, Last und None. Wenn nichts gesetzt wird, gilt First.

Buttons

Es können Buttons auf dem Dialog platziert werden, an welche Dialog-Kommandos gebunden werden können.

Der Dialog bietet folgende Kommandos an:

  • CloseCommand: Dialog mit eigenem Button schliessen.
  • OkCommand: Dialog mit dem Ergebnis 'Ok' schliessen.
  • CancelCommand: Dialog mit dem Ergebnis 'Cancel' schliessen.

OkCommand und CancelCommand werden in der Regel in den Dialog.Buttons geführt. CloseCommand kann genutzt werden, um den Dialog durch einen eigenen Button zu schliessen. Das Dialog-Ergebnis ist 'Ok' und im Values-Dictionary hat der entsprechende Button den Wert 'True'.

Controls

Auf dem Dialog werden wie beim Customizing die benötigten Controls platziert. Grundsätzlich können die gleichen Controls wie im UI Customizing verwendet werden. Jedes Control, für welches Werte gesetzt oder abgefragt werden soll, braucht einen eindeutigen Namen innerhalb des Dialogs.

Bei Controls, welche mehr als eine Property haben, sind sekundäre Properties mit dem Punkt abgetrennt, z.B. ListBox.Items, AuswahlBox.Items.

Es gelten folgende Anmerkungen:

  • Die AdditionalFieldComboBox lässt sich in dem Zusammenhang nicht verwenden.
  • Die Custom-Dialoge erlauben keine Bindung an Business-Objekte, z.B. Eventscripts.
  • Konfigurationen von Controls via OCL, wie z.B. <ProjectComboBox Name="Projekt" Label="Projekt" ListExpression="Projekt.allinstances->select(aktiv)" />, sind möglich. Das OCL ist immer global, weil es keinen Kontext gibt.

Initialwerte

Die Initial-Werte der Funktion werden als Argument mitgegeben und die Resultat-Werte als Resultat zurückgeliefert. Sowohl die Initial-Werte wie auch die Return-Werte werden jeweils als Python Dictionary übergeben. Die Keys im Dictionary entsprechen den Control-Namen, z.B.

initValues = {}
initValues["AuswahlBox.Items"] = ("Option 1", "Option 2", "Option 3")
initValues["Value1"] = "Default 1"

Einen Defaultwert zuweisen

Es kann auch ein Defaultwert zugewiesen werden (wenn das Form z.B. nicht vollständig ausgefüllt ist und man es nochmal aufrufen muss mit bereits erfassten Daten), z.B.

initValues["Projekt.SelectedValue"] = Projekt.eval("boldid")

SelectedValue ist eine Eigenschaft des verwendeten UI Controls.

Beispiel

Dieser Dialogaufruf sieht in Python so aus:

# Python Script für Custom Dialog
dlgDefinition="""
<Dialog Title="Test Dialog" Width="500">
    <TextBlock Text="Bitte geben Sie folgende Werte ein:" Appearance="Info"/>
    <Group Label="Auswahl" ShowLabel="True">
        <ListBox Name="AuswahlBox" Lines="6"/>
    </Group>
    <ProjectComboBox Name="Projekt" Label="Projekt"/>
    <TextBox Name="Value1" Label="Wert 1"/>
    <CheckBox Name="Check1" Label="Option 1"/>
    <Group Appearance="NoSpacing" FlexWidth="0" Width="300" HorizontalAlignment="Left">
        <Button Name="Option21" FlexWidth="0" Width="100" Text="Option21" Command="{Binding CloseCommand}" />
        <Button Name="Option22" FlexWidth="0" Width="100" Text="Option22" Command="{Binding CloseCommand}" />
        <Button Name="Option23" FlexWidth="0" Width="100" Text="Option23" Command="{Binding CloseCommand}" />
    </Group>
    <Dialog.Buttons>
        <Button Text="OK" IsAccept="True" Command="{Binding OkCommand}" />
        <Button Text="Cancel" IsCancel="True" Command="{Binding CancelCommand}" />
    </Dialog.Buttons>
</Dialog>
"""
initValues = {}
initValues["AuswahlBox.Items"] = ("Option 1", "Option 2", "Option 3")
initValues["Value1"] = "Default 1"
ok, values = vtcapp.showcustomdialog(dlgDefinition, initValues)
if ok:
    vtcapp.msgbox('Dialog OK, Werte: %s' % values)

Rückgabewert

Die showcustomdialog Funktion gibt ein Tuple aus Return-Value und Values-Dictionary zurück. Return-Value ist true für OK und false für Cancel. Für jedes Control mit einem Namen besteht ein Eintrag (Name/Wert) im Values-Dictionary. Die Controls liefern folgende Werte:

  • Input-Control: Eingabewert
  • ListBox: Index des selektierten Eintrags
  • DataGrid: Index des selektierten Eintrags
  • Button: 'True', falls dieser Button das CloseCommand ausgelöst hat, ansonsten 'False' (siehe Buttons in der Dialogdefinition)

Gewisse Input-Controls (z.B. ComboBox, ReferenceBox usw.) liefern nicht das Objekt, sondern dessen interne ID.

Beispiel

Beispiel für einen Rückgabewert aus obigem Beispiel:

Das Auslesen der einzelnen Werte aus dem Values-Dictionary geschieht wie folgt, z.B.:

ProjektID = values["Projekt"]
Bitte wählen Sie Ihren Standort