Customizing-Beispiele
Erweiterung der Listbox für dynamische Gruppierung
Vorgenhesweise
- Im Modul Textkonstanten eine Textkonstante für das neue Kriterium anlegen, z. B. für DI005352 Produkt.
- Im Wertebereich des DI029130 die neue Textkonstante an Stelle 12 eintragen.
- DI005352 Produkt in die Listbox-Kategorie 00000333 analog den anderen eintragen.
- In der ppms_cu.py unter groupings 12: ‘product‘ ergänzen (…./py/api/ppms/customizing/venus/ppms):
GROUPINGS = {1:'customer', 2:'pr_manager_name', 3:'ht_pr_code_name', 4:'pr_group_1',
5:'pr_group_2', 6:'pr_group_3', 7:'ou_cctr_name', 8:'calculated_end_date',
9:'phase_name', 10:'ht_pr_plan_idea', 12:'product'}
- In DI029160 im Wertebereich das DI005352 analog den anderen eintragen.
- Server neustarten.
- DI005352 im Datenbereich 041023 in F9 eintragen.
- Client neustarten.
Hinweis
- Die Vorgehensweise gilt für alphanummerische Datenfelder. Für Aufnahme der Termin-Datenfelder in die Listbox, kontaktieren Sie bitte Ihren PLANTA-Consultant, da hierfür Anlage von neuen DIs und Wertebereichen erforderlich ist.
Angemeldete Benutzer anzeigen
Ziel
- Customizen eines Moduls, das die angemeldeten Benutzer anzeigt.
Vorgehensweise
- Anlegen eines Moduls mit drei Datenbereichen
- Datenbereich 1:
- Gruppiert nach DI001603 Startdatum
- Angezeigt in Fenster 1: DI001603 Startdatum
- Datenbereich 2:
- Gruppiert nach DI001606 Benutzer
- Angezeigt in Fenster 1: DI001606 Benutzer, DI010670 Benutzername
- Datenbereich 3:
- Angezeigt in Fenster 1: DI001603 Startdatum (Filtern von @15), DI = 004353 Startzeit, DI004376 Endzeit (Filtern von= 00:00, Fenster = 9)
- Datenbereich 1:
Schritt 1: Neues Modul anlegen
- Im Modul Module ein neues Modul mit dem gewünschten Namen anlegen und ein Makro einfügen, das bei Modulaufruf filtert.
Schritt 2: Datenbereich Datum anlegen
- Neue Datenbereichszuordnung einfügen:
- Einen neuen Datenbereich mit den folgenden Parametern anlegen:
- DDI = 001603 Startdatum
- Gruppierung =
- Das folgende Datenfeld einfügen:
- DI = 001603 Startdatum
- Speichern
- Datenbereich dem Modul zuordnen und folgende Parameter anpassen:
- Pos. = 1
- Modul speichern
Schritt 3: Datenbereich Benutzer anlegen
- Neue Datenbereichszuordnung einfügen
- Einen neuen Datenbereich mit den folgenden Parametern anlegen:
- DDI = 001606 Benutzer
- Gruppierung =
- Zwei neue Datenfelder im Modul Datenbereiche einfügen:
- DI = 001606 Benutzer
- DI = 010670 Benutzername
- Speichern
- Datenbereich dem Modul zuordnen und folgende Parameter anpassen:
- Pos. = 2
- Oberbereich = 1
- Ausgabe =
- Modul speichern
Schritt 4: Datenbereich Anmeldezeiten anlegen
- Neue Datenbereichszuordnung einfügen
- Einen neuen Datenbereich mit den folgenden Parametern anlegen:
- DDI = 001595 Session
- Die folgenden Datenfelder im Modul Datenbereiche einfügen:
- DI = 001603 Startdatum
- DI = 004353 Startzeit
- DI = 004376 Endzeit
- Für das Datenfeld Startdatum in den Parameter Filtern von @15 eintragen
- Für das Datenfeld Endzeit die folgenden Parameter anpassen
- Filtern von = 00:00
- Fenster = 9
- Speichern
- Datenbereich dem Modul zuordnen und folgende Parameter anpassen:
- Pos. = 3
- Oberbereich = 2
- Ausgabe =
- Modul speichern
Schritt 5: Modul testen
- Im Modul Module die Schaltfläche Aktuelles Modul starten betätigen, um das neu erstellte Modul zu testen.
- Mit aktivierter Baumdarstellung sowie mit Symbolen sieht das Ergebnis z.B. folgendermaßen aus:
Beispiel:
Customizing-Lösung zum Kopieren von technischen Vorgangs-IDs beim Kopieren von Terminplänen
Vorgehensweise
- Den Customizer aufrufen und im Modul 0099J9 im Datenbereich 041668:
- die rekursive Relation entfernen
- das DI001098 an erste Stelle schieben (Fenster 1, wenn man es sehen möchte)
- DI008845 und DI008851 auf input setzen
- Speichern, PLANTA neustarten.
Anzeigen einer Grafik aus einem Hyperlink-Datenfeld in einem OLE-Dataitem
Ziel
- Anzeigen einer Grafik aus einem Hyperlink-Datenfeld in einem OLE-Dataitem
Vorgehensweise
- Ein OLE-Dataitem customizen
- Für das neu angelegte DI den folgenden Wertebereich hinterlegen.
- Legende:
<Python-ID>
und<Dataitem-ID>
fungieren als Platzhalter für die Python-ID sowie die ID des Hyperlink-Dataitems.
- Legende:
def computeOutput(di):
hl_di = di.get_dtp_record().get_di('<Python-ID>')
hl = hl_di.get_hyperlink()
if (hl != None):
ppms.ui_message_box(hl.get_uid())
return hl.get_uid()
else:
return ""
computeOutput.deps = ('DI<Dataitem-ID>',)
Hinweise
- Dies funktioniert für die gängigen Bildformate jpg, bmp, gif und png.
- Das verwendete Hyperlink-DI muss ein HL: Dateien in der DB sein.
- Das OLE wird erst nach Speichern des Hyperlinks angezeigt.
Siehe auch: OLE-Dataitem, Hyperlink-Customizing |
Customizing eines Menüpunkts zum Excel-Export
Ziel
- Customizen eines Menüpunkts für einen individuell angepassten Excel-Export
Vorgehensweise
- Anlegen eines Menüpunkts für Modulaufruf.
- Für diesen Menüpunkt ein Makro-Modul mit dem folgenden Code anlegen.
- Sollen bestimmte Parameter, die im Export-Dialog angegeben werden können, vorbelegt werden, muss dieses Makro individuell angepasst werden. Bei Fragen hierzu wenden Sie sich bitte an Ihren PLANTA-Consultant
mod_obj = ppms.get_target_module()
uid = mod_obj.get_uid()
ppms.client_exec("""
env = get_Env()
mod = env.ActivePanel.ModuleManager.__getitem__('%s')
doc = mod.CreateExcelExportDocument()
env.GenerateExcelFile(doc)
""" % uid)
Siehe auch: IronPython Api |
---|
Beispiel für ein individuelles Customizing von Listboxen
Ziel
- Es soll eine Listbox gebaut werden, die einen kombinierten Schlüssel direkt auswählt.
Hinweis
get_listboxvalue()
aus dem Customizing Helper Modul implementiert lediglich ein Mapping zwischen tatsächlichen Werten in Datentabellen und den IDs festgelegter Listboxwerte in der entsprechenden Tabelle, kann aber kein X-beliebigen Werte aus einem Listbox-Datensatz auslesen.- Lösungsvorschlag: Zusammensetzen und Auseinanderschneiden der Schlüsselwerte über einen Python-Wertebereich
Vorgehensweise
- Ein neues DI vom Typ X / ALG wird als Python-Wertebereich angelegt.
- Dieses DI wird in der Inkarnation als ID-Feld und im Datenbereich der Listbox für LB-Auswahl benutzt.
- Die Methode computeOutput liest die entsprechenden Schlüssel-DIs aus und konkateniert sie mit einer Pipe "|" als Trennzeichen, was mit der Methode format der String-Klasse in Python erreicht werden kann.
- Die processInput-Methode trennt die Werte analog wieder auf und schreibt sie in die einzelnen Schlüssel-DIs.
- Als Voraussetzung für das korrekte Funktionieren dieses Verfahrens ist die Verwendung des Pipe-Zeichens in Schlüsselwerten verboten.
- Die Beispielimplementierung prüft nicht auf das Vorhandensein von Pipes in Schlüsselwerten beim Zusammensetzen und auch nicht auf überschüssige Trenner bzw. Werte beim Zerschneiden
def computeOutput(di):
record = di.get_dtp_record()
key0 = record.get_di_by_id(<key0_numeric_di_no>).get_value()
# etc. für weitere DIs
multicol_key_template = '{0}|{1}|{2}'
multicol_key_value = multicol_key_template.format(key0, key1, key2)
return multicol_key_value
computeOutput.deps = ('DI<key0_textual_di_no>', 'DI<key1_textual_di_no>', ) # etc. für weitere DIs
def processInput(di, oldvalue):
record = di.get_dtp_record()
key0_di = record.get_di_by_id(<key0_numeric_di_no>)
# etc. für weitere DIs
new_value = di.get_value()
key_values = new_value.split('|', 3)
key0_di.set_value(key_values[0])
return new_value
processInput.deps = ('DI<key0_textual_di_no>', 'DI<key1_textual_di_no>', ) # etc. für weitere DIs
Hinweise
- Eine
textual_di_no
ist z.B. der String 000123,numeric_di_no
dagegen die Zahl 123 - Weiterführende Dokumentation ist zu finden unter PythonValueRange sowie in der Python-Referenz: http://docs.python.org/py3k/ bzw. http://docs.python.org/py3k/library/stdtypes.html#str.split
E-Mail-Client aufrufen
Ziel
- Customizing von Hyperlink-Datenfeldern zum Aufrufen eines E-Mail-Clients mit Python
- Für Datenfelder mit Dataitems, die den DF-Typ AM besitzen
Vorgehensweise
- Modul Datenbereich aufrufen
- Neuen Datenbereich anlegen
- Datenfeld mit folgenden Eigenschaften einfügen:
- Für dieses Datenfeld folgende Parameter setzen:
- DF-Verhalten = e4
- Aktions-ID = 009AAK
- Symbol-ID = 001807
- DF-Python-ID = email_id
- Die Baumdarstellung des Datenfelds öffnen und in Datenfeld-Konfiguration Folgendes eintragen:
subject_text = "" body_text = ""
subject_text
= Betreff der E-Mailbody_text
= Inhalt der E-Mail
Anpassungsmöglichkeiten der Werte: Betreff und Inhalt:
- Mit dem obigen Customizing werden Betreff und Inhalt nicht befüllt. Es ist eine manuelle Eingabe in der E-Mail nötig.
- Um den Betreff oder Inhalt zu befüllen kann die PythonAPIReference benutzt werden.
- Hierzu im Datenfeld Datenfeld-Konfiguration die Variablen
subject_text
undbody_text
über Python setzen. - Um auf die Werte der Datensätze zuzugreifen kann man sich des Objekts record bedienen, das eine Instanz der MTSRecord Klasse darstellt.
- Hierzu im Datenfeld Datenfeld-Konfiguration die Variablen
subject_text = record.name.get_raw_value()
Erfassung fremder Stunden erleichtern
Ziele
- Aus einem neu erstellten Modul für die Ressourcenübersicht soll in ein verkürztes Panel Mitarbeiterboard gesprungen werden.
- Das verkürzte Panel Mitarbeiterboard soll mit dem Modul Zeiterfassung (MOD009ABV) geöffnet werden.
Vorgehensweise
- Eine Kopie vom Modul Mitarbeiterboard (MOD0099GU) erstellen. (Hier: MOD100003)
- Im neu erstellten Modul die nicht gewünschten Untermodule löschen (hier: Meine Tätigkeiten, Wochenkalender, Infos, Meine Planungsobjekte) oder bei diesen Untermodulen im Feld Anzeigen die gleichnamige Checkbox deaktivieren.
- Die Reihenfolge der restlichen Untermodule so anpassen, dass das Untermodul Zeiterfassung (MOD009ABV) als erstes geöffnet wird. Hierzu für dieses Modul folgende Parameter bearbeiten:
- Im Feld Positionierung eine 3 eintragen.
- Im Feld Modulgröße 0,869 eintragen.
- Die Checkbox Vordergrund aktivieren.
- Für die Rückmeldung auf ungeplante Vorgänge müssen ggf. noch die Listboxen individualisiert werden
- Im Makro des kopierten Mitarbeiterboards die Funktion
call_resource()
wie folgt anpassen:
from ppms.text_constant import get_text_constant
def call_resource(resource_id=ppms.get_target_module().get_current_L_var()[5]):
resource_record = ppms.search_record(467, [resource_id[0]], ['resource_type'], True)
if not resource_record :
message = get_text_constant("001247")
ppms.ui_message_box(message.replace("@user_id", resource_id[0]), blocking=1)
mod_obj.menu(49)
elif resource_record.resource_type.get_value() == "2":
ppms.ui_message_id("0860")
mod_obj.menu(49)
else:
mod_obj.set_current_L_var(5, [resource_id[0]])
- Im Modul Globale Einstellungen im Feld Python-ID die Python-ID für das neue Modul (MOD100003) erstellen, hier: L100_employee_board_for_reporting
- Ein neues Makro (hier: 100004) erstellen, welches das verkürzte Mitarbeiterboard mit der gewählten Ressource (@L5) aufruft.
from ppms.global_setting import get_global_setting_value
mod_obj = ppms.get_target_module()
rm_modul = get_global_setting_value("L100_employee_board_for_reporting", 'alpha120')
inv_rec = ppms.get_context_df().get_record()
res_id = inv_rec.res_id.get_raw_value()
mod_obj.set_new_L_var(5, [res_id])
mod_obj.open_module(rm_modul)
- Ein Modul mit Ressourcenübersicht erstellen.
- Soll das Modul über einen Link auf der Ressourcen-ID aufgerufen werden,
- bei dem gewünschten Ressourcen-DI im Feld Aktions-ID die Nummer des neuen Makros (hier: 100004) und im Feld DF-Verhalten e4 eintragen.
- Soll das Modul über ein Kontextmenü aufgerufen werden,
- das DI004336 Button/IronPython hinzufügen und bei diesem im Feld Aktions-ID die Nummer des neuen Makros (hier: 100004) und im Feld DF-Verhalten m4 eintragen.
Aktualisierung von Feldern beim Speichern, wenn ein Wert geändert wurde
Ziel
- Die individuellen Felder Prognose vom und Prognose von sollen aktualisiert werden, wenn der Prognosewert geändert wurde.
Vorgehensweise
- Customizer → System-Customizer → Data Dictionary aufrufen.
- Individuelle Dataitems anlegen (hier: DI100102 und DI100103).
- Customizer → System-Customizer → Dataitems aufrufen.
- Den Wertebereich vom Dataitem Prognose (DI006530) wie folgt anpassen:
def processInput(di, oldvalue):
rec = di.get_dtp_record()
rec.L100_prognose_vom.set_value(ppms.uvar_get("@15"))
rec.L100_prognose_von.set_value(ppms.uvar_get("@1"))
return di.get_value()
processInput.deps = ("L100_prognose_vom", "L100_prognose_von")
Beispiel für Drag & Drop-Kopieren via Python
Ziel
- Der Wert aus dem Feld Aufwand-Soll soll in das Feld Aufwand-Soll fix übertragen werden.
Beispiel
mod_obj = ppms.get_target_module()
mod_obj.menu(12)
for rec in mod_obj.get_da ("Python_ID_DA_name").get_records():
rec.DF_Python_ID_planned_load_fixed.set_raw_value(rec.DF_Python_ID_planned_load.get_raw_value())
mod_obj.menu(34)
mod_obj.menu(49)
Beispiel für Aufruf einer externen Applikation mit Python
Ziel
- Eine Anwendung soll aus PLANTA heraus aufgerufen werden und dabei einen bestimmten Parameter mitgeschickt bekommen
Beispiel
PATH = r'C:\Program Files (x86)\Applikation\anwendung.exe'
# Der String, der den Pfad zur Applikation darstellt, wird mit "r" vorangestellt,
# weil sonst der Backslash \ als Escape-Zeichen interpretiert werden würde.
# Siehe http://docs.python.org/reference/lexical_analysis.html#string-literals
ARGS = 'argument1=PLANTA argument2=Nocheins'
# Die Argumente, die an die Applikation übertragen werden sollen, einfach als
# einen fortlaufenden String deklarieren.
def execute_client_script(path, args):
ppms.client_exec("""import clr
clr.AddReference('System')
from System.Diagnostics import Process
Process.Start(r'{path}', r'{args}')""".format(path=path, args=args))
execute_client_script(PATH, ARGS)
Customizen einer Prozessregel zum Einkopieren einer Phase
Ziel
- Customizen einer Prozessregel, mit der eine Phase eines anderen Prozessmodells einkopiert werden kann
Vorgehensweise
- Anlegen einer neuen Prozessregel mit dem nachfolgenden Code im Modul Prozessregeln (MOD0099X6) unter PM-Administration → Stammdaten → Prozessmodelle
- In diesem Code die folgenden Parameter anpassen:
- <Prozessmodell-ID>: Die ID des Prozessmodells, in dem sich die einzukopierende Phase befindet
- <Phasen-ID>: Die ID der Phase, die einkopiert werden soll
def executeProcessAction(mts_rec=None,object_id=None):
from ppms.processrules import copy_phase_into_model
phase = mts_rec.phase.get_raw_value()
copy_phase_into_model(object_id, mts_rec, <Prozessmodell-ID>, <Phasen-ID>, phase)
return True
ppms.get_session_dict()["planta_functions"]=[executeProcessAction]
- Anlegen eines neuen Prozessschritts im Modul Prozessmodel-Tempaltes (MOD0099TY) unter PM-Administration→ Stammdaten →Prozessmodelle
- Auswählen dieser Regel im Feld Prozessregel-Bezeichnung
Customizen einer Prozessregel zum Einkopieren von Prozessschritten in eine zukünftige Phase
Ziel
- Customizen einer Prozessregel, mit der eine zukünftige Phase eines Prozessmodells um bereits vorhandene Prozessschritte eines anderen Prozessmodells erweitert werden kann
Vorgehensweise
- Anlegen einer neuen Prozessregel mit dem nachfolgenden Code im Modul Prozessregeln (MOD0099X6) unter PM-Administration → Stammdaten → Prozessmodelle
- In diesem Code die folgenden Parameter anpassen:
- <Prozessmodell-ID>: Die ID des Prozessmodells, in dem sich die einzukopierenden Prozessschritte befinden
- <Phasen-ID>: Die ID der Phase, deren Prozessschritte einkopiert werden sollen
- <Zielphasen-ID>: ID der künftigen Phase, auf die sich die Regel auswirken soll
def executeProcessAction(mts_rec=None,object_id=None):
from ppms.processrules import replace_phase_in_model
replace_phase_in_model(project_id=object_id,
prozess_templ_id=<Prozessmodell-ID>,
phase=<Phasen-ID>,
forced_phase=<Zielphasen-ID>)
return True
ppms.get_session_dict()["planta_functions"]=[executeProcessAction]
- Anlegen eines neuen Prozessschritts im Modul Prozessmodel-Tempaltes (MOD0099TY) unter PM-Administration→ Stammdaten →Prozessmodelle
- Auswählen dieser Regel im Feld Prozessregel-Bezeichnung
Customizen eines individuellen Moduls zum Bearbeiten von Ressourcen
Information
- Sollen in einem individuellen Modul die übergeordnete Ressource oder die Start- und Endperiode angepasst werden, müssen in diesem Modul folgende Anpassungen durchgeführt werden:
- Im Parameter Python-Modulunterklasse im Modul Module die Python-Modulunterklasse
ppms.module_subclasses.resource.ResourceDatasheet
hinterlegen. - Den Menüpunkt Speichern (34) mit einem Makro mit dem folgenden Code überschreiben:
- Im Parameter Python-Modulunterklasse im Modul Module die Python-Modulunterklasse
ppms.get_target_module().on_save_check_person_resource()