Veraltet: nur für den internen Gebrauch

Erweiterung der Listbox für dynamische Gruppierung

Vorgehensweise

  • 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'}
PY
  • 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:
  • Das folgende Datenfeld einfügen:
    • DI = 001603 Startdatum
  • Speichern
  • Datenbereich dem Modul zuordnen und folgende Parameter anpassen:
  • 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:
  • 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.

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>',)
PY

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.
    • HL: Dateien in der DB haben ein Unter-Dataitem mit der Funktion ST und der Option = 1.
  • Das OLE wird erst nach Speichern des Hyperlinks angezeigt.

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)
PY
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
PY
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
PY

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

subject_text = "" body_text = ""
PY
  • 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_text und body_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()
PY

Kundenlogo einbinden

Ziel

  • Das Kundenlogo soll in Modulen (als Produktlogo), im Druckkopf und als Splash Screen ausgegeben werden.

Schritt 1: Kundenlogos als Grafikdateien bereitstellen

  • PLANTA unterstützt die Formate .png und .jpg.
  • Die maximale Bildgröße kann, z.B. je nach Windows-Einstellung, variieren.
    • Unter Verwendung der Standard-Windows-Einstellungen können Sie sich an den Bildgrößen der default-mäßig hinterlegten PLANTA-Logos orientieren (Höhe * Breite).
      • Produktlogo: 49 px * 458 px
      • Druckkopf: 32 px * 32 px
      • Splash Screen: 478 px * 475 px

Schritt 2: Das Logo in Modulen verwenden (als Produktlogo)

  • Customizer → Darstellungsobjekte OLEs → Modulvariante: Produktlogos aufrufen.
  • Einen neuen Datensatz einfügen.
  • Im Feld Bezeichnung einen Namen vergeben.
    • Die OLE-Identnummer wird automatisch generiert.
  • Im Feld Kategorie den Wert Produktlogos aus der Listbox auswählen.
  • Im Feld Standard-OLE die bereit gestellte Datei für die Module einfügen.
  • Speichern.
  • Bei dem gewünschten OLE die Schaltfläche Systemweit als Logo verwenden betätigen.
    • Die Dialogmeldung Soll die gewünschte Grafik systemweit als Produktlogo eingebunden werden? Das Produktlogo aller Module wird durch dieses Logo ersetzt. erscheint.
    • Die Meldung mit Ja bestätigen.
    • Das Programm neu starten.
    • Alle bestehenden Module des Systems haben nun das neue Logo als Produktlogo.
    • Neue Module werden automatisch mit dem neuen Produktlogo als Default-Produktlogo belegt.

Schritt 3: Das Logo im Druckkopf verwenden

  • Customizer → Darstellungsobjekte OLEs aufrufen.
  • Im Feld Bezeichnung einen Namen vergeben.
    • Die OLE-Identnummer wird automatisch generiert.
  • Im Feld Standard-OLE die bereit gestellte Datei für den Druckkopf einfügen.
  • Speichern.
  • Customizer → Darstellungsobjekte Skins aufrufen.
  • Die ID-Nummer des Moduls für Druckbereiche im Feld Modul für Druckber. merken bzw. mit STRG + C kopieren.
  • Customizer → Modul-Customizer Module aufrufen.
  • Das individuelle Druckmodul durch Kopieren des Moduls für Druckbereiche erstellen.
    • Identnummer des zu kopierenden Moduls in das Datenfeld Kopieren von eingeben.
    • Nach Betätigen der ENTER-Taste wird im Datenfeld MOD eine neue Modulidentnummer vergeben.
    • Im Datenfeld Modul den neuen Modultitel eingeben.
    • Speichern. Beim Speichern werden alle Parameter des Quellmoduls sowie seine Unterobjekte (Untermodule, Datenbereiche, Modulvarianten) in das neue Modul kopiert.
  • Im individuellen Druckmodul den Datenbereich Druckkopf aufrufen.
  • Im Feld Standardwert die OLE-Identnummer (DBOLE (Identnummer)) eintragen.
  • Die Positionsfelder ggf. anpassen.
  • Speichern.
  • Customizer → Darstellungsobjekte Skins aufrufen.
  • Den verwendeten Skin aus der Listbox auswählen.
  • Im Feld Modul für Druckber. die ID-Nummer des individuellen Moduls eintragen.
  • Speichern.

Schritt 4: Das Logo als Splash Screen verwenden

  • Die Datei splash.png unter %client_folder%/Resources/ mit der bereitgestellten Datei ersetzen.

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 geöffnet werden.

Vorgehensweise

  • Eine Kopie vom Modul Mitarbeiterboard (MOD0099GU) erstellen. (Hier: MOD100003)
  • Im neu erstellten Modul nicht gewünschte 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 als erstes geöffnet wird:
    • Beim Untermodul Rückmeldung folgende Parametern bearbeiten:
    • 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]])
PY
  • 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)
PY
  • 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")
PY

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)
PY

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)
PY


Customizen eines Farbvorschaufelds

Ziel

  • Customizen eines Farbvorschaufelds, hier am Beispiel von DI028197 Hervorhebungsfarbe in der DT030 Skin

Details

DI anlegen

  • Im Data Dictionary DT 030 mit dem Quell-DI 028197 öffnen.
  • Ein neues DI anlegen und folgende Parameter setzen:
  • Speichern
  • System-Customizing aktualisieren (über den Menüpunkt Tools → PLANTA-Dienst neu starten ).
    • Hinweis: Betätigt man den Menüpunkt, werden alle offenen Client-Verbindungen (Sessions) geschlossen. Neue Client-Verbindungen sind während des Neustarts nicht möglich.

Unter-Dataitem zuordnen

  • Rechtsklick auf das gerade angelegte DI und den Kontextmenü-Befehl Dataitem bearbeiten auswählen.
  • Rechtsklick auf das DI → Einfügen → Unter-DataItem.
    • In das Feld SUBDI die ID des Quell-DIs eintragen ( 028197).
    • Aus der Listbox Funktion den Wert F (Farbe) auswählen.

  • Speichern.

DI in Datenbereich einfügen

  • Das angelegte DI nun dem Datenbereich zuordnen, in dem das Quell-DI enthalten ist.
  • Das DF-Verhalten auf o (output) setzen.

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
  • 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]
PY

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
  • 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]
PY

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 mit einem Makro mit dem folgenden Code überschreiben:
ppms.get_target_module().on_save_check_person_resource()
PY