Customizing-Beispiele

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

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 = ""
    • 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()

Beispiel für einen Python-Wertebereich

Ziel

  • DI041088 DF-Python-ID im Modul Datenbereiche

Beispiel

from ppms import ppms_cu

di_prefix = "DI: "
di_prefix_lenghth = len(di_prefix)

def get_df_cust_name(di):
    df_name = di.get_dtp_record().df_customizing_name.get_value()
    if df_name: return df_name # return name on DF level if set
    return None

def get_di_cust_name(di):
    di_nr = di.get_dtp_record().di.get_value()
    di_cust_name = str()

    if not di_nr: return None

    di_record = ppms.search_record(412,[di_nr],[41035], True)

    if di_record: di_cust_name = di_record.di_customizing_name.get_value()
    else: return None

    if di_cust_name: return di_cust_name

def computeOutput(di):
    name = str()
    if get_df_cust_name(di):
        return get_df_cust_name(di)
    elif get_di_cust_name(di):
        return di_prefix + get_di_cust_name(di)
    return ""

computeOutput.deps = ("DI041036","DI000213","DI000984")

def checkInput(di, old_value):
    return ppms_cu.Helper.validate_python_id(di,di.get_value())
checkInput.deps=("DI001862",)

def processInput(di, old_value):
    new_value = di.get_value()
    rec = di.get_dtp_record()

    #in case of copy
    if new_value[:4]==di_prefix:
        rec.df_customizing_name.set_string_value("")
        return di_prefix + get_di_cust_name(di)

    #in case of empty python ID
    if not new_value.strip():
        rec.df_customizing_name.set_string_value("")
        if not get_di_cust_name(di):
            return ""
        return di_prefix + get_di_cust_name(di)

    #in case of new value = old value
    if new_value.strip() == old_value:
        return ppms_cu.Helper.get_python_id_by_license(new_value)

    rec.df_customizing_name.set_string_value(ppms_cu.Helper.get_python_id_by_license(new_value))
    return  ppms_cu.Helper.get_python_id_by_license(new_value)

processInput.deps = ("DI041036",)

Abbilden der Menüpunkte 154/151 (Alles markieren/Alles demarkieren) mit Python

Ziel

  • Die Menüpunkte 154 (Alles markieren) und 151 (Alles demarkieren) mit Python abbilden

Beispiel Alles markieren

# get module object
mod_obj=ppms.get_target_module() 

#mark all records of all datareas in the module
ppms.echo_off()
[[mts_rec.mark() for mts_rec in mts_rec_list]for mts_rec_list in [da_obj.get_records() for da_obj in mod_obj.get_das()]]
ppms.echo_on() 

Beispiel Alles demarkieren

# get module object
mod_obj=ppms.get_target_module() 

#unmark all marked records of all dataareas in the module
ppms.echo_off()
[[mts_rec.unmark() for mts_rec in mts_rec_list]for mts_rec_list in [da_obj.get_marked_records() for da_obj in mod_obj.get_das()]]
ppms.echo_on() 

Kundenlogo einbinden

Ziel

  • Das Kundenlogo soll in Modulen und im Druckkopf ausgegeben werden.

Schritt 1

  • Kundenlogo als JPG-Datei bereitstellen.
    • Größe:
      • Modullogo (Höhe max.49, Breite max. ca. 250)
      • Logo für den Druckkopf

Schritt 2: Das Logo in den Modulen verwenden

  • 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 vorher erstellte JPG-Datei für die Module einfügen.
  • Speichern.
  • Bei dem neu angelegten 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 vorher erstellte JPG-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.
  • 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.

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 Rückmeldung 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 Aufgaben, 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 Rückmeldung 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:
def call_resource(resource_id=ppms.get_target_module().get_current_L_var()[5]):
    rec467=ppms.search_record(467, [resource_id[0]], [1218,3414], True)
    if rec467 == None:
        message=ppms_cu.Helper.get_const_title("001247")
        ppms.ui_message_box(message.replace("@user_id",resource_id[0]), blocking=1)
        mod_obj.menu(49)
    elif rec467.get_di("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 import ppms_cu

mod_obj = ppms.get_target_module()

rm_modul=ppms_cu.Helper.get_global_setting("L100_employee_board_for_reporting").alpha120.get_value()

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 DI 004336 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.get_di ("L100_prognose_vom").set_value(ppms.uvar_get ("@15"))
    rec.get_di ("L100_prognose_von").set_value(ppms.uvar_get ("@1"))
    return di.get_value()
processInput.deps = ("DI100102","DI100103")

Beispiel für Datenübertrag via Python und SQL

Ziel

  • Daten sollen aus der DT472 in die DT600 per Makro übertragen werden.

Beispiel

mod_obj = ppms.get_target_module()

current_user="ORA"
rwdu="775"

sql="""

MERGE INTO DT600 b
USING (
        select
          di001395                                                as pr_id,
          TO_CHAR(di001519, 'YY-MM')                              as monat, 
          di001395||'-'||TO_CHAR (di001519, 'YY-MM')              as pr_id_monat,
          sum (dI001509)                                          as soll,
          sum (dI001510)                                          as ist,
          sum (dI001511)                                          as rest,
          min (di001519)                                          as min_datum,        
          (select di001052 from dt461 
           wehre di001001=di001395)                               as hpr_id
       from dt472
       group by di 001395||'-'||TO_CHAR (di001519, 'YY-MM') , TO_CHAR (di001519, 'YY-MM' ) , TO_CHAR (di001519 , 'YY-MM' ) ,  di001395   
       )e
ON (b.di504132 = e.pr_id_monat)
WHEN MATCHED THEN
  UPDATE SET
    b.DI504135 = e.soll, -- Soll
    b.DI504134 = e.ist. -- Ist
    b.DI504133 = e.rest, -- Rest
    b.DI504146 = sysdate, -- geaendert datum
    b.DI504136 = e.min_datum -- min Datum

WHEN NOT MATCHED THEN
  INSERT ( 
          b.di504132, b.di504137, b.di504136, b.di504131,b.di504148, -- keys
          b.di504135, b.di504134, b.di504133, -- aufwand
          b.di504144, b.di504143, b.di504147, b.di504146, -- obs user and date
          b.DI504145, b.DI504140, b.DI504139, b.DI504138 -- rwdu
          )
  VALUES (e.pr_id_monat,e.pr_id,e.min_datum,e.monat,e.hpr_id,
          e.soll,e.ist,e.rest,
          '{0}','{0}',sysdate,sysdate,
          '{1}','{1}','{1}','{1}'
          )
""".format(current_user,rwdu)

affected=ppms.db_modify(sql)

mod_obj.set_statusbar(str(affected))

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 ("L504_values").get_records():
    rec.L504_planned_load_fixed.set_raw_value (rec.L504_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)

         PLANTA project









 
  • Suche in Topic-Namen

  • Suche in Topic-Inhalten
This site is powered by the TWiki collaboration platform Powered by Perl