FAQ
Allgemeines
Was ist Python?
Python ist eine Programmiersprache, die mehrere Programmierparadigmen ermöglicht. So werden objektorientierte, aspektorientierte und funktionale Programmierung unterstützt.
Warum Python?
Python hat eine wunderbar einfache Syntax und lässt sich extrem gut in C integrieren.
Wo finde ich die Beschreibung der Python-Funktionen, die PLANTA bereitstellt?
Die Funktionen werden in der Python-API beschrieben.
Was ist der DTP?
DTP bedeutet Data Table Pool. Die PLANTA-Software legt dort alle aus der Datenbank geladenen (z.B. per Modul-Suche oder mit den Python-Funktionen: search_record, get_children etc.) Datensätze ab. Die Datensätze werden dann dort zur Darstellung in einem oder mehreren Modulen vorgehalten.
Was ist ein MTS Record?
MTS bedeutet Module Tree Structure.
- MTS Records sind Moduldatensätze, d.h., die Datensätze, die im Modul angezeigt werden.
- Zu jedem MTS Record gehört genau ein DTP Record.
- Beispiel: Ein Projekt mit all seinen Feldern
Wie wird die I-Nummer für einen I-Text generiert?
PLANTA generiert anhand des Eintrages in der schemaspezifischen Zählerstandtabelle eine neue I-Nummer für einen I-Text. Abhängig von der Lizenz und des I-Nr. DIs, wird der Wert des Zählerstand 1 DIs ausgelesen und für einen neuen I-Text genommen.
- Beispiel für Q2B
- Zählerstandtabelle: DT 396 Zählerstand Q2B
Lizenzdataitem: DI 008150 Lizenz = Kundenlizenz
DI-Dataitem: DI 008152 DI = 000985 (I-Nr. DI aus der DT434 I-Nr. Q2B)
Zählerstanddataitem: DI 008164 Zählerstand 1
- Zählerstandtabelle: DT 396 Zählerstand Q2B
Hat sich etwas bei den I-Texten im Vergleich zu Releases < 39 geändert?
I-Texte werden in PLANTA project nur noch in der schemaspezifischen I-Text-Tabelle abgelegt. Die I-Nummern-Tabelle wird nicht mehr gepflegt und befüllt.
Warum wird keine automatische Nummer erzeugt?
Eine automatische Nummer wird erst erzeugt, wenn alle DIs des Fremdschlüssels des Datensatzes mit gültigen Werten und, falls vorhanden, alle Muss-Datenfelder gefüllt sind.
Hinweis
- Ein Datensatz mit NULL-Wert ist nur dann ein gültiger Wert, wenn für die entsprechende Datentabelle der Parameter NULL erlaubt aktiviert ist (die Änderung ist nur durch PLANTA möglich).
Einstellungen
Wie richte ich die PLANTA-E-Mail-Funktion (um E-Mails direkt zu versenden) ein?
Im Modul Globale Einstellungen (gesamt) oder im Modul Globale Einstellungen (Projekt) muss die richtige IP-Adresse des SMTP-Servers und eine System-E-Mail-Adresse hinterlegt werden. Weitere Informationen
Wie kann man den Systemtitel ändern?
Der Systemtitel (im Titelbalken/Titelleiste) wird im Modul Lizenz, Systemparameter und DB-Instanzen im Feld Systembezeichnung hinterlegt und kann dort geändert werden. Hinweis
- Alternativ kann auch zur Laufzeit der Systemtitel mit der folgenden Python-Funktion geändert werden:
ui_set_system_title(title: string)
Siehe auch: Python API |
Tipp
- Zur Auseinanderhaltung von verschiedenen Sessions können z.B. der aktuell angemeldete Benutzer und die PID im Systemtitel angezeigt werden.
- Wird das Standard-Benutzermenü MOD0099QC verwendet:
- Das Modul Pythonmakros öffnen und in der
on_load
-Methode die VariableCHANGE_TITLE
vonCHANGE_TITLE=FALSE
aufCHANGE_TITLE=TRUE
ändern.
- Das Modul Pythonmakros öffnen und in der
- Wird ein individuelles Benutzermenü verwendet:
- Das Modul Pythonmakros öffnen und in der
on_load
-Methode des Benutzermenüs folgende Zeilen einfügen: - Die folgenden Zeilen müssen, wie auch die anderen Zeilen in der
on_load
-Methode, mit jeweils vier Leerzeichen eingerückt werden.
- Das Modul Pythonmakros öffnen und in der
- Wird das Standard-Benutzermenü MOD0099QC verwendet:
PID = str(os.getpid())
ppms.ui_set_system_title('Systemtitel' + ', PID: ' + PID + " - " + ppms.uvar_get("@1"))
Details
- Ab dem nächsten Start von PLANTA project wird die PID im Systemtitel angezeigt.
- Die PID ist auch Bestandteil des Logfiles, sodass ein Logfile immer der entsprechenden Session zugeordnet werden kann.
Wie kann man den Editor ändern, der zum Bearbeiten von Makros, Wertebereichen etc. benutzt wird?
In mehreren Modulen kann über einen Schaltfläche ein Editor aufgerufen werden, z.B. im Modul Module über den Schaltfläche Python-Makrobearbeitung aufrufen. Welcher Editor dabei verwendet wird, wird in der globalen Einstellung py_editor im Modul Globale Einstellungen hinterlegt. Wird dort ein falscher Pfad angegeben, kommt die Meldung „Error executing python script: Das System kann die angegebene Datei nicht finden“.
Wie kann ich ein eigenes Produktlogo (Firmenlogo) hinterlegen bzw. systemweit einsetzen?
- Um pro Modul ein individuelles Produktlogo zu hinterlegen:
- Im Modul OLEs ein neues OLE-Objekt für das Produktlogo anlegen.
- Für das gewünschte Modul im Modul Weitere Modulparameter im Feld Produktlogo die Identnummer des neu angelegten OLE-Objekts eintragen.
- Um das Logo in der Kopfzeile (Druckkopf) in den Standarddruckbereichen auszutauschen:
- Den Datenbereich mit Positionierung = 3 (Druckbereich: Kopfzeile) des Moduls, das im Skin des angemeldeten Benutzers im Datenfeld Modul für Druckber. hinterlegt ist, aufrufen.
- Dort die Identnummer des OLE-Objekts mit der des neu angelegten OLE-Objekts ersetzen.
- Das Logo in individuellen Druckbereichen muss ggf. genauso ausgetauscht werden.
- Um das eigene Produktlogo systemweit einzusetzen:
- Ein neues OLE-Objekt für das Produktlogo anlegen und der Kategorie Produktlogos zuordnen.
- In die Modulvariante Produktlogos wechseln.
- Bei dem neu angelegten OLE-Objekt die Schaltfläche Systemweit als Logo verwenden betätigen.
Fragen zum Verhalten ("Warum?")
Warum wird ein DI in einem Modul nicht angezeigt?
- Das DI ist in Fenster 9.
- Das DI ist in einer Maske ohne Maskenposition.
- Das DI ist ist virtuell und deaktiviert ( Aktiviert (DT412) = ), die Datentabelle, in der sich das DI befindet, ist deaktiviert ( Aktiviert (DT415) = ) oder das Schema, in dem sich das DI befindet, ist deaktiviert ( Aktiviert (DT420) = ).
Warum wird ein neu gecustomiztes Kontextmenü nicht angezeigt?
Das entsprechende Datenfeld muss in einem der sichtbaren Fenster (Fenster 1-3) gecustomized werden.
Siehe auch: Kontextmenü customizen |
In welchem Verhältnis stehen die Größen Feldbreite, Einrückung und Breite Fenster 1, 2 und 3 zueinander?
- Die Werte für DF-Breite und Einrücken werden in der gleichen Einheit, in Zehntelmillimetern angegeben.
- Die Angabe in Breite F1 etc. ist keine Größenangabe, sondern dient lediglich zur Berechnung des Anteils des Fensters an der gesamten Bildschirmbreite.
- Da die Breite von Bildschirmen (und damit die dem Panel "zur Verfügung stehende Breite") unterschiedlich ist, ist dies kein fest definierter Wert.
Was sind implizite Hol-Exits?
Für den Fall, dass Daten aus übergeordneten Datentabellen angezeigt werden sollen, muss kein Exit gecustomized werden, es kann einfach das Dataitem selbst in den Datenbereich mit aufgenommen werden. Dies wird impliziter Hol-Exit genannt.
Siehe auch: Exits |
Warum werden Felder in einem neuen Fenster nicht angezeigt?
Soll ein Feld im Fenster 2 (bzw. Fenster 3) angezeigt werden, muss zusätzlich im Modul Weitere Modulparameter ein Wert im Datenfeld Breite F2 (bzw. Breite F3) eingetragen werden.
- Beim Anlegen eines neuen Moduls im Modul Module wird über einen Standardwert in Breite F1 eine Breite für das Fenster 1 festgelegt, daher muss hier nicht explizit eine vergeben werden.
Hinweis
- Wenn das Feld Breite Fx ( Breite F1 , Breite F2 , Breite F3 ) gefüllt ist, aber im Modul kein Datenfeld Fenster = x hat, wird Fenster x trotzdem (leer) angezeigt.
Woran liegt es, dass eingetragene und gespeicherte Werte unter der Skala nach einem Neustart verschwunden sind?
Bei Modulen, bei denen eine Eingabe in eine Projektion möglich sein soll, muss geprüft werden, ob im Datenbereich, der die Projektions-Dataitems enthält, der Parameter Ausgabe deaktiviert ist. Wenn nicht, kann der Wert nicht gespeichert werden (er wird angezeigt, aber nach Neustart sieht man, dass er nicht gespeichert wurde).
Warum kann man ein neu angelegtes DI nicht verwenden/Warum wirken Änderungen am DI nicht?
Nach jeder Änderung an Dataitems der Systemdatenbanken (Schemas Q1 und Q2) muss der Server neugestartet werden. Im Data Dictionary und im Dataitems gibt es dafür die Schaltfläche Server-Neustart.
- Ausnahme ist eine Änderung an
- I-Texten z.B. der DI-Bezeichnung oder
- Wertebereichen (auch der WB-Art )
- Metadaten zum Data Dictionary sind im Verzeichnis target enthalten. Die dafür verantwortlichen POJO-Klassen werden durch den Neustart des PLANTA-Dienstes nicht neu generiert. Das target-Verzeichnis muss gelöscht werden, damit die POJO-Klassen beim nächsten Neustart des PLANTA-Dienstes neu generiert werden.
Warum kann aus einer Listbox kein Wert ausgewählt werden?
Bei dem Wert, der aus der Listbox übernommen werden soll, muss im Listboxmodul der Parameter LB: Wertübernahme aktiviert sein.
Tipp
- Über den Parameter LB: Teilstringsuche kann festgelegt werden, welche Datenfelder der Listbox bei einer Teilstringeingabe durchsucht werden.
Warum kann ich im Maskeneditor, obwohl der Customizing-Modus aktiviert ist, keine Felder anklicken?
Es gibt zwei mögliche Ursachen:
- Der Datenbereich, in dem die Felder sind,
- wurde noch nicht durch Reinklicken aktiviert (der Datenbereich wird noch grün angezeigt) oder
- ist keine Maske ( Layout = 0 oder 1). Der Datenbereich wird grau angezeigt.
- Tipp: Durch Rechte Maustaste in einem Bereich und Auswahl des entsprechenden Eintrags kann das Layout geändert werden.
Siehe auch: Masken customizen |
Warum werden alternierende Schattierungen schwarz angezeigt?
Im entsprechenden Datenbereich ist das DI Farbintensität F1 ( Farbintensität F2 bzw. Farbintensität F3 ) zwar gefüllt, das dazugehörige DI Altern. Farbe F1 ( Altern. Farbe F2 bzw. Altern. Farbe F3 ) jedoch nicht. Ist dieses Feld leer, wird standardmäßig die Farbe Schwarz (in der angegebenen Intensität) für die alternierende Schattierung verwendet.
- Um dies zu ändern, muss im Modul Datenbereiche in die Modulvariante Layout gewechselt werden und im entsprechenden Datenbereich für das DI Altern. Farbe F1 ( Altern. Farbe F2 bzw. Altern. Farbe F3 ) der gewünschte Wert aus der Listbox ausgewählt werden.
Warum wirkt ein Filterkriterium in rekursiven Strukturen nicht wie erwartet?
Beim Customizen mit rekursiven Strukturen den Parameter Filter anwenden auf prüfen. Dieser steuert, auf welcher Ebene in der rekursiven Struktur die Filterkriterien wirken.
Warum wirkt ein Filterkriterium nicht?
Über den Parameter Filter deaktiviert kann ein Filterkriterium deaktiviert werden.
Warum werden die Charts in einem kopierten Modul nicht angezeigt?
- Aus welchem Datenbereich die Daten für den Chart kommen, wird im Chart-Datenfeld im Feld Datenfeld-Konfiguration im Parameter
da_id=''
definiert.
Beispiel
"""Define Chart - Properties"""
da_id='045968'
- Wird ein Modul kopiert, ändern sich die IDs der Datenbereiche. Daher muss in Chart-Datenfeldern die Datenbereichs-ID des Quell-Moduls durch die des neuen ersetzt werden.
Tipp
- Welche Datenbereichs-ID verwendet werden muss, findet man am einfachsten heraus, in dem man sich anschaut, welcher Datenbereich im Quell-Modul verwendet wurde und welcher diesem im kopierten Modul entspricht.
Warum kann in einem Hyperlink-Feld eine aus der Vorlage einkopierte Datei nicht geöffnet werden?
Möglichweise ist der im Customizing hinterlegte Pfad der Vorlage-Datei nicht korrekt. Dieser Pfad wird im Unter-DI mit der Funktion CR hinterlegt.
Siehe auch: Hyperlink-Funktion, Hyperlink-Customizing |
Warum wird nach Ändern einer Variable, diese nicht mehr abgeändert im System angezeigt, nachdem der Client neugestartet wurde?
- Variablen verhalten sich in PLANTA project 39 genauso wie in den vorhergehenden Releases, wie z.B. 3.7 und 3.8.
- Das heißt, sie werden beim Starten der Session in den Hauptspeicher geladen und ihre Werte gelten dann, sofern sie nicht direkt in der Datenbank geändert werden, nur für die laufende Session.
- So wird durch die Erhöhung einer Variablen per Python -Makro auch nur der Wert im Hauptspeicher verändert, nicht der in der Datenbank gespeicherte.
- Nach Beenden der Session und Neustarten verfällt daher der Wert im Hauptspeicher und es wird erneut der Wert aus der Datenbank geholt.
- Gleiches gilt, wenn eine zweite Session parallel geöffnet wird. Auch hier wird der in der Datenbank gespeicherte Wert eingelesen.
Warum kann in einem Hyperlink-Feld eine aus der Vorlage einkopierte Datei nicht geöffnet werden?
Dieses Problem tritt in Zusammenhang mit der Fehlermeldung Datei [Pfad-Angabe] kann nicht geöffnet werden. Der Pfad ist ungültig oder die Datei existiert nicht. auf. Diese erscheint, wenn auf einem Hyperlink-Feld versucht wird, eine aus der Vorlage einkopierte Datei zu öffnen, der im Customizing hinterlegte Pfad der Vorlage-Datei jedoch nicht korrekt ist. Dieser Pfad wird im Unter-DI mit der Funktion CR hinterlegt.
Siehe auch: Hyperlink-Funktion, Hyperlink-Customizing |
Customizing-Tipps ("Wie?")
Was kann ich tun, um die Performance zu verbessern?
- Sind die meisten Module langsam,
- prüfen, ob die Umgebung den Hardware-Anforderungen (im speziellen: Hauptspeicherdimensionierung, Latenz zwischen Datenbank- und Applikationsserver und Datenbank-Performance (z.B. Indizes)) entspricht.
- Ist ein spezielles Modul langsam,
- die Modulkonstruktion prüfen. Z.B.: sind im Modul nicht benötigte Datenbereiche oder Datenfelder enthalten?
- Generell sollten aus Performance-Gründen in einem Modul nur Customizing-Objekte (d.h. Datenbereiche, Datenfelder) eingebunden werden, die wirklich benötigt werden.
- Die Daten in Datenbereichen mit Nie anzeigen = werden ebenfalls geladen, d.h. es reicht nicht aus, einen nicht-benötigten Datenbereich auf Nie anzeigen = zu setzen.
- Filterkriterien überprüfen ( Filtern von , Filtern bis , Regulärer Ausdruck )
- Sind auch Filterkriterien auf reellen und nicht nur auf virtuellen Datenfeldern (Dataitems)?
- Grund: Filterkriterien auf reellen Dataitems werden in der Datenbank und die auf virtuellen Dataitems werden im Hauptspeicher ausgewertet, d.h. wenn in einem Modul nur Filterkriterien auf virtuellen Dataitems gesetzt sind, werden erst alle Daten in den Hauptspeicher geladen, um dann dort auf die Filterkriterien einzuschränken.
- Bei virtuellen Datenfeldern wird der Wert in Filtern von und Filtern bis rot und fett markiert.
- Das gleiche gilt für reguläre Ausdrücke.
- Grund: Filterkriterien auf reellen Dataitems werden in der Datenbank und die auf virtuellen Dataitems werden im Hauptspeicher ausgewertet, d.h. wenn in einem Modul nur Filterkriterien auf virtuellen Dataitems gesetzt sind, werden erst alle Daten in den Hauptspeicher geladen, um dann dort auf die Filterkriterien einzuschränken.
- Die meisten Wertebereiche und Hol-Exits können in einen Python-Wertebereich mit der Funktion
computeSqlValueRange()
umgewandelt werden. Felder mit solchen Wertebereichen sind der Datenbank bekannt. Daher wirken Filterkriterien auf diesen Feldern nicht erst im Hauptspeicher, sondern auf der Datenbank.
- Sind auch Filterkriterien auf reellen und nicht nur auf virtuellen Datenfeldern (Dataitems)?
- prüfen, ob in diesem Modul viele Implizite Hol-Exits verwendet werden.
- Implizite Holexits sollten aus Performancegründen nicht in Modulen mit großen Datenmengen verwendet werden.
- prüfen, ob in diesem Modul Wertebereiche verwendet werden, in denen die Python-Methode
DtpRecord.get_children()
ohne Angabe einer DI-Liste verwendet wird.
- die Modulkonstruktion prüfen. Z.B.: sind im Modul nicht benötigte Datenbereiche oder Datenfelder enthalten?
- Ist das Laden eines Panels langsam oder stockt das Laden der Reiter bei bestimmten Untermodulen,
- Ist eine bestimmte gecustomizte Funktion langsam,
- überprüfen, ob das Makro dieser Funktion das Nachladen von noch nicht vollständig geladenen Untermodulen im aktuellen Panel auslöst.
- Zudem
- sollten häufige bzw. wiederkehrende Datenbankzugriffe über das Customizing, z.B. durch das Einrichten von Caches vermieden werden.
- sollten in Wertebereichen nur als Dependency vergeben werden, wenn dies aus fachlichen oder technischen Gründen zwingend notwendig ist. Grund: Wertebereiche mit Dependency werden bei jeder Aktion im System neu berechnet, d.h. auch wenn man z.B. ein anderes Modul öffnet.
Wie müssen Pfade in der Python-Funktion client_exec()
angegeben werden?
Für eine Pfadangabe gibt es mehrere Möglichkeiten. ( Die folgenden Varianten der Pfadangabe werden anhand eines beispielhaften Excel-Exports gezeigt.)
- Variante 1:
ppms.client_exec("""
env = get_Env()
mod = env.ActivePanel.ModuleManager.__getitem__('%s')
doc = mod.CreateExcelExportDocument(fullExportPath = 'C:\\\\Ordner\\\\Unterordner\\\\dateiname')
env.GenerateExcelFile(doc)
""" % uid)
- Variante 2:
ppms.client_exec(r"""
env = get_Env()
mod = env.ActivePanel.ModuleManager.__getitem__('%s')
doc = mod.CreateExcelExportDocument(fullExportPath = 'C:\\Ordner\\Unterordner\\dateiname')
env.GenerateExcelFile(doc)
""" % uid)
- Variante 3:
ppms.client_exec("""
import os
env = get_Env()
mod = env.ActivePanel.ModuleManager.__getitem__('%s')
doc = mod.CreateExcelExportDocument(fullExportPath = os.path.normpath('C:/Ordner/Unterordner/dateiname'))
env.GenerateExcelFile(doc)
""" % uid)
Hinweise
- Die Angabe der Dateiendung ist optional.
- Wird nur der Dateiname ohne Angabe eines Pfades angegeben, wird die Datei in den eigenen Dokumenten (=%USERPROFILE%\My Documents=) abgelegt.
Siehe auch: IronPython Api, Python API, Python-Dokumentation zu \ (Backslashes) |
---|
Wie sind die Währungsformate standardmäßig gecustomized?
Im Standard werden systemweit Währungsformate mit zwei Stellen nach dem Komma verwendet. Wenn man dieses Format für einzelne Module bzw. Datenfelder anpassen möchte, kann das auf Datenfeld-Ebene individuell geändert werden (Feld Format-ID ).
Wie wird die Höhe und Breite von Listboxen eingestellt?
- Die Höhe (bzw. Breite) von Listboxen muss nicht manuell eingestellt werden, sondern sie wird anhand der Anzahl der Werte (bzw. Breite der Felder) berechnet.
- Es gibt eine minimale und eine maximale Höhe bzw. Breite.
Siehe auch: Listbox-Customizing |
Wie können Zeilenumbrüche in einem Datenfeld eingestellt werden?
Über den Parameter Mehrzeilig können sowohl manuelle als auch automatische Zeilenumbrüche eingefügt bzw. angezeigt werden.
Wie wird der (im Standard blaue) Rahmen um eine Listbox gecustomized?
Die Farbe für den Rahmen um eine Listbox wird im Modul Weitere Modulparameter im Parameter Background-Symbol hinterlegt.
Hinweis
- Das Blau im Standard hat die Symbol-ID 001975.
Wie kann der Inhalt der aktuellen @L-Variablen (Listenvariablen) angezeigt werden?
Ein Anwender mit Customizer-Rechten kann durch Klick auf die Schaltfläche Aktuelle @L-Werte anzeigen im Modul Variablen die aktuellen @L-Werte einsehen.
Wie kann der Inhalt einer bestimmten Variablen angezeigt werden?
Ein Anwender mit Customizer-Rechten kann im Modul Variablen durch Klick auf die Schaltfläche Variableninhalt anzeigen und durch Eingabe der entsprechenden Variablen ihren Inhalt einsehen.
Wie kann die Ausrichtung des Datenfeldinhalts geändert werden?
Durch Setzen des Parameters Ausrichtung auf Datenfeldebene.
Wie kann man die Performance beim Customizen der Ressourcenstruktur verbessern?
Wenn die Struktur nicht mit einem Datenbereich aus der DT469 Ressourcenstruktur gecustomized wird, sondern in dem Datenbereich der DT467 in dem Feld Rekursive Relation eine entsprechende Relation gecustomized wird.
Siehe auch: Strukturierung über Rekursive Relation |
Wie kann man ein neu aufgerufenes Untermodul als Reiter hinter dem Hauptmodul customizen?
Der Parameter dock_to_module
in der Methode open_module()
muss gleich der UID des Moduls, an das das Untermodul angedockt werden soll gesetzt werden.
Beispiel
mod_obj = ppms.get_target_module()
mod_obj.open_module('ID des Moduls',forced_status=2,dock_to_module=mod_obj.get_uid(),dock_style=0,foreground=0,focus=0)
- Erklärung:
mod_obj
ist das Hauptmodul, an das Untermodul angedockt werden soll.
Wie kann ich einen Datensatz aus dem DTP auslesen bzw. aus der Datenbank in den Pool holen?
Dafür wird die Python-Methode search_record(dt_num, key_list, di_list, dblookup)
verwendet.
Parameter
dt_num
: ID der Datentabellekey_list
: Liste der Python-IDs der 1:1-Schlüssel der Datentabelle- Bei zusammengesetzten Schlüsseln müssen alle DIs (Reihenfolge wie in der Datentabelle) angegeben werden.
di_list
: Liste mit den DI-IDs (ohne führende Nullen) die im DTP enthalten sein sollen- Hier müssen alle DIs angegeben werden, auf die in der weiteren Berechnung zugegriffen wird.
dblookup
: Gibt an, ob der Wert aus der Datenbank gelesen werden soll, falls der Datensatz im Pool nicht existiert.
Hinweise
- Die Liste di_list muss mindestens ein DI enthalten.
- 1:1-Schlüssel und Fremdschlüssel werden automatisch in den DTP geladen, auch wenn sie nicht in der Liste di_list enthalten sind.
Beispiele
- Beispiel 1
pr_id = ‘4711’
rec461=ppms.search_record(461, [pr_id], [1052,1062], True)
- Erklärung
- Die Variable rec461 enthält nun eine DTP-Datensatz mit den folgenden DIs (zusätzlich zu den Primär- und Fremdschlüsseln der DT461)
- 001052 Hauptprojekt-ID
- 001062 Manager
- Die Variable rec461 enthält nun eine DTP-Datensatz mit den folgenden DIs (zusätzlich zu den Primär- und Fremdschlüsseln der DT461)
- Beispiel 2
pr_id = ‘4711’
task_id = ‘2010’
res_id = ‘R1’
rec466=ppms.search_record(466, [pr_id,task_id,res_id], [1510], True)
- Erklärung
- Die Variable rec466 enthält nun eine DTP-Datensatz mit dem DI 001510 Belastung-Ist (zusätzlich zu den Primär- und Fremdschlüsseln der DT466).
Wie kann man zwei (oder mehr) Datenfelder hinter einem Balken anzeigen?
Um neben einem Balken zwei (oder mehr) sogenannte Balkenhilfsfelder anzuzeigen,
- für beide Datenfelder im Parameter Balkenlink (DF-Python-ID) die Python-ID des Balken-Datenfelds eintragen
- im Parameter Andockpunkt die Position des Balkenhilfsfelds definieren z.B. 1 Startpunkt ist Balkenende
- X-Pos des 2. Datenfelds = X-Pos des 1. Datenfelds + DF-Breite des 1. Datenfelds + 1
Siehe auch: Balkenhilfsfelder customizen |
Wie kann ich ein Datenfeld ohne Überschrift anzeigen lassen?
- Wenn der Datenbereich ein horizontales Layout (Parameter Layout = 0) oder ein vertikales Layout ( Layout = 1) hat,
- im Modul Datenbereiche für das Datenfeld, dessen Überschrift nicht angezeigt werden soll, in den Parameter DF-Überschrift ein geschütztes Leerzeichen (Alt+ 0160) eintragen.
- Ist der Datenbereich eine Maske ( Layout = 2), so kann man die Überschrift ausblenden
- indem man im Modul den Menüpunkt Customizing-Modus aktiviert, die Überschrift anklickt und auf ENTF drückt oder
- indem man die X/Y-Positionen der Überschrift in der Modulvariante Layout im Modul Datenbereiche entfernt.
Customizen in zwei Sessions
Ist in der planta_server.conf der Parameter
DTP_CUSTOMIZING_MODE
=1, sieht man Customizing-Änderung nur in der aktuellen Session und in allen danach gestarteten, aber nicht in allen, die bereits offen sind. Der Vorteil dieser Einstellung ist eine bessere Performance ab dem zweiten Aufruf. Ist der Parameter deaktiviert, sieht man eine Änderung auch in allen bereits offenen Sessions nach Neustart des Moduls, allerdings dauert jeder nachfolgende Modulaufruf gleich lang wie der erste. Begründung: Ist der oben genannte Parameter aktiviert (=1), werden die Daten aus den entsprechenden Datentabellen beim ersten Laden in den DTP Cache geladen und bei jedem weiteren Zugriff werden die Daten nicht aus der Datenbank, sondern aus dem DTP Cache verwendet.
STRG + F3 zum Öffnen des aktuellen Datenbereichs/F9 zum Öffnen des Moduls
Nur Benutzer mit Customizer-Rechte = können
- mit F9 das Customizing des aktuellen Moduls im Modul Module aufrufen
- mit STRG + F3 den Datenbereich, in dem sich der Fokus befindet, im Modul Datenbereiche aufrufen.
Hinweis
- Es ist nicht mehr ausreichend, allein den Zugriff auf Customizer-Menüpunkte zu besitzen um auf die oben genannten Customizing-Module zugreifen zu können.
Automatisches Anlegen von Inkarnationen
Im Data Dictionary gibt es die Möglichkeit Inkarnationen automatisch anzulegen.
Siehe auch: Inkarnationen |
Round Wertebereiche aus Performancegründen in computeSqlValueRange()-Wertebereiche umwandeln
Ein Round Wertebereich wie z.B. der von DI003394 kann unter Umständen performancekritisch sein. Wir empfehlen daher diesen in einen computeSqlValueRange()
-Wertebereich umzuwandeln.
Beispiel alt
(ROUND(DI001510,2) != 0.00) ||
(ROUND(DI002669,2) != 0.00) ||
(ROUND(DI002671,2) != 0.00)
Beispiel neu
def computeSqlValueRange(dt_name):
val = """case
when nvl(DI001510,0)+nvl(DI002669,0)+nvl(DI002671,0) > 0 then 1
when nvl(DI001510,0)+nvl(DI002669,0)+nvl(DI002671,0) = 0 then 0
end"""
return str(val)
Python: Wie füge ich Elemente zu einer Liste hinzu?
- Variante 1
value_list = [["R1"],["R2"],["R3"]]
f_list = []
i = 0
for rec in value_list:
f_list.append(value_list[i][0])
i = i + 1
- Variante 1 (Strukturiert)
value_list = [["R1"],["R2"],["R3"]]
f_list = []
for rec in value_list:
f_list.append(value_list[0])
- Variante 1 (Einzeiler)
value_list = [["R1"],["R2"],["R3"]]
f_list = [rec[0] for rec in value_list]
Wie kann ich Menüpunkte mit Python-Funktionen überschreiben?
from ppms import ppms
from ppms.module_subclasses.base_class import Base
from ppms.constants import MENU_FILTER, MENU_RESET, MENU_SAVE
class ModuleThatOverwritesSave(Base):
def menu_override(self, menu_id):
if menu_id == MENU_SAVE:
ppms.ui_message_box('No saving allowed!')
return self.MENU_OVERRIDE_SUCCESS
# Don't allow resetting as that brings up a save prompt
elif menu_id == MENU_RESET:
return self.MENU_OVERRIDE_SUCCESS
return super(ModuleThatOverwritesSave, self).menu_override(menu_id)
Wie kann ich die Menüpunkte 154/151 (Alles markieren/Alles demarkieren) mit Python abbilden
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
with ppms.echo_disabled():
[[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()]]
Beispiel Alles demarkieren
# get module object
mod_obj=ppms.get_target_module()
#unmark all marked records of all dataareas in the module
with ppms.echo_disabled():
[[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()]]
Wie kann ich die Funktion Terminplan kopieren erweitern?
Dafür muss das Modul Terminplan kopieren angepasst werden.
Beispiel: Es sollen zusätzlich die Aufgabennotizen kopiert werden.
- Einen Datenbereich aus der DT805 Aufgabennotizen anlegen.
- Tipp: den entsprechenden Datenbereich aus dem Terminplan (im Standard: 0099AN) kopieren.
- Eine DA-Python-ID vergeben (z.B.
open_item_notices_area
). - Den Datenbereich in das Modul Terminplan kopieren (0099J9) einbinden.
Hinweis
- Es werden nur Werte von Eingabedatenfeldern (Datenfeldverhalten z.B. i, i2 oder li) kopiert.
Wie kann das Summenzeichen Σ angezeigt werden?
Das Symbol mit "Font" = "Symbol" customizen, auf dem gewünschten Feld bzw. der gewünschten Überschrift hinterlegen und S reinschreiben.
Wie kann ich ein individuelles Benutzermenü einbinden?
Das Standard-Benutzermenü-Modul 0099QC kann kopiert und individuell angepasst werden. Die Kopie des Benutzermenüs kann im Modul Skins im Skin der Benutzer im Feld Benutzermenü hinterlegt werden.
Wie kann der Splash Screen ausgetauscht werden?
- Die Datei splash.png unter %client_folder%/Resources/ mit der bereitgestellten Datei ersetzen.
Siehe auch: Splash Screen, Produkt- bzw. Firmenlogos verwenden |
Wie können Texte in E-Mails, z.B. Signaturen, geändert werden?
Für E-Mails können Texte hinterlegt werden, die beim Anlegen einer E-Mail automatisch eingefügt werden; z.B. für Signaturen.
Vorgehensweise
- Customizer → Modul-Customizer → Modul Module aufrufen
- Die Modul-ID 009A3F einfügen
- Den Datenbereich DA041375 Stakeholder aufrufen
- Die Baumstruktur von DI026625 E-Mail aufklappen
- Im Datenfeld Datenfeld-Konfiguration in den Parametern subject_text und body_text können automatisch einzufügende Texte für den Betreff und den E-Mail-Inhalt hinterlegt werden.
Meldungen
Was bedeutet die Meldung Achtung: Ihre Änderung an einer Customizing-Tabelle erzwingt ein Update der Java-Pojo-Klassen. Bitte informieren Sie die Serverentwicklung!
Diese Meldung kommt, wenn in einer Datentabelle der Schemas Q1B und Q2B ein ein neues reeles DI angelegt wird. Das Anlegen, Ändern und Löschen der Dataitems in den Datentabellen der Schemas Q1B und Q2B dürfen nur von PLANTA durchgeführt werden. Die einzige Ausnahme bildet die Datentabelle DT400, die auch kundenindividuelle DIs enthalten darf.
Was bedeutet die Meldung IE: (MV creation/application/saving) "[Modulvarianten-ID]" uses these unsupported DIs:DI[Dataitem-ID]
Wenn man für eine Modulvariante im Modul Optionsmodul für MV einen Parameter ändert, deren Bearbeitung vom Programm nicht unterstützt wird, kommt die oben genannte Meldung. Mehr dazu...
Beim Customizen eines Python-Wertebereichs kommt eine Fehlermeldung. Was bedeutet sie?
Generell gibt es beim Customizen von Python-Wertebereichen verschiedene Arten von Fehlermeldungen.
Beispiele für Fehlermeldungen
- IE: "deps" attribute of computeOutput() function in WB code of DI[Dataitem-ID] must be a tuple. The function won't be available.
- Bedeutung: In der Dependency muss ein Tupel angegeben werden. D.h., soll die Funktion nur eine Dependency haben, gibt man das wie folgt an:
deps
= ('DI[Dataitem-ID],). Weitere Informationen zu Dependencies
- Bedeutung: In der Dependency muss ein Tupel angegeben werden. D.h., soll die Funktion nur eine Dependency haben, gibt man das wie folgt an:
- IE: processInput() function must take exactly 2 arguments (DataItem reference and old DI value), but in WB code of DI [Dataitem-ID] it takes 1 argument(s) and thus won't be available.
- Bedeutung: Die Funktion processInput() erfordert zwei Übergabe-Werte (di, oldvalue). Weitere Informationen zu den Python-Wertebereichs-Funktionen
Hinweis
Was bedeutet die Fehlermeldung: Python error in macro [Makro-ID]. Class 'SyntaxError': ("Non-UTF-8 code starting with...)
Diese Fehlermeldung bedeutet, dass im Python-Code des entsprechenden Makros nicht zulässige Zeichen verwendet werden, z.B. Umlaute. Dies gilt nicht nur für Python-Code in Makros, sondern für sämtliche Python-Verwendungsbereiche.
- Nicht zulässige Zeichen dürfen auch in Kommentaren des Python-Code nicht verwendet werden.
Warum kommt beim Starten eines Moduls die Meldung Skalenzuordnung nicht möglich: MOD [Modul-ID], DA [Datenbereichs-ID], horizontal bar DF [Datenfeld-ID] (DI [Dataitem-ID])?
Diese Meldung kommt, wenn einem Modul kein Skalenbereich zugeordnet ist oder im Skalenbereich der Parameter DA-Klasse ungleich 1 (Skalenbereich) ist.