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)
-
-
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
-
-
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.
-
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_noist z.B. der String 000123,numeric_di_nodagegen 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-Mail -
body_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_textundbody_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.
-
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.ResourceDatasheethinterlegen. -
Den Menüpunkt Speichern (34) mit einem Makro mit dem folgenden Code überschreiben:
-
ppms.get_target_module().on_save_check_person_resource()