Customizing-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 ein DTP?
DTP bedeutet Data Table Pool. Die PLANTA-Software legt dort alle aus der Datenbank geladenen (z.B. per Modul-Suche, oder mit Python-Funktionen:
search_record,
get_children etc.) Datensätze ab. Die Datensätze werden dann dort zur Darstellung in einem oder mehreren Modulen vorgehalten.
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)
Tipp
- Zur Auseinanderhaltung von verschiedenen Sessions können z.B. der aktuell angemeldete Benutzer und die PID im Systemtitel angezeigt werden.
- 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.
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 aufgerufen wird?
In mehreren Modulen kann über einen Button ein Editor aufgerufen werden, z.B. im Modul
Module über den Button
Python-Makrobearbeitung aufrufen. Welcher Editor dabei verwendet wird, wird in der globalen Einstellung
py_editor (in Modul
Globale Einstellungen) hinterlegt. Wird ein falscher Pfad angegeben, kommt die Meldung
„Error executing python script: Das System kann die angegebene Datei nicht finden“.
Wie richte ich die PLANTA-E-Mail-Funktion (um E-Mails direkt zu versenden) ein?
Im Modul
Globale Einstellungen muss die richtige IP-Adresse des smtp-Servers beim Parameter
smtp_server_adress im Feld
Alpha (120) eingetragen werden.
Weitere Informationen
Technik
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
Hat sich etwas bei den I-Texten generell 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.
Customizing
Was kann ich tun, um die Performance zu verbessern?
- Sind die meisten Module langsam,
- Ist ein spezielles Modul langsam,
- 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 ausgewertet, die auf virtuellen im Hauptspeicher – 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.
- Das gleiche gilt für reguläre Ausdrücke.
- 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.
- Implizite Hol-Exits sollten aus Performancegründen nicht in Modulen mit großen Datenmengen verwendet werden.
- Ist das Laden eines Panels langsam, oder stockt das Laden der Reiter bei bestimmten Untermodulen,
- Ist eine bestimmte gecustomizte Funktion langsam,
Wie kann ein Hol-Exit mit den neuen Python-Wertebereichen ersetzt werden?
Ausgangszustand
- Auf DI A ist ein Hol-Exit mit den folgenden Eigenschaften gecustomized:
- Schlüssel-DI der DT X = DI D
- DI-Python-ID von DI A = python_name
Vorgehensweise
- Auf dem DI A
- das Exit entfernen
- WB-Art auf PY umstellen
- den folgenden Wertebereich in das Feld Wertebereich einfügen
def computeSqlValueRange(dt_name):
val = "Select diC from dtX where diD={0}.diB".format(dt_name)
return str(val)
Hinweis
- Mit diesem Customizing ändert sich das DI nicht sofort, wenn sich etwas am Quell-DI ändert, sondern erst nach erneutem Filtern.
- Damit sich das DI sofort ändert, muss zusätzlich die folgende Vorgehensweise durchgeführt werden.
Vorgehensweise
def processInput(di, oldvalue):
val = ppms.db_select("Select diC from dtX where diB='{0}'".format(di.get_value()))
# check if resource exists
if val: return_value=val[0][0]
else: return_value=""
# set new value on resource_name (sql value range)
di.get_dtp_record().get_di("python_name").set_value(return_value)
return di.get_value()
processInput.deps = ("DIA",)
Beim Customizen eines Python-Wertebereichs kommt eine Fehlermeldung. Was bedeutet sie?
Generell gibt es beim Customizen von Python-Wertebereichen verschiedenene
Arten von Fehlermeldungen.
Beispiele für Fehlermeldungen
- IE: "deps" attribute of computeOutput() function in WB code of DI100001 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
= ('DI012345',). Weitere Informationen zu Dependencies
- IE: processInput() function must take exactly 2 arguments (DataItem reference and old DI value), but in WB code of DI 100001 it takes 1 argument(s) and thus won't be available.
Hinweis
Wie kann ich die Funktion Terminplan kopieren erweitern?
Dafür muss sowohl das Modul
Terminplan kopieren (0099J9), als auch die Python Modulunterklasse
schedule_copy.py angepasst werden.
Beispiel: Es sollen zusätzlich die Offene Punkte-Notizen kopiert werden.
- Einen Datenbereich aus der DT805 Offene Punkte-Notizen 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.
- In der Python Modulunterklasse schedule_copy.py den neuen Bereich in die default_props aufnehmen.
- Schlüssel: DA-Python-ID des Datenbereichs
- Werte: eine Liste der DF-Python-IDs der Felder, die kopiert werden sollen, z.B.:
'open_item_notices_area': ["note","finished"]
-
- Vorsicht: Nach der folgenden Zeile das Komma nicht vergessen:
Was sind implizite Hol-Exits?
In PLANTA
project gibt es mit impliziten Hol-Exits eine Alternative zu Hol-Exits, die Dataitems aus übergeordneten Datentabellen anzeigen.
Details
- Um Daten aus übergeordneten Datentabellen anzuzeigen, muss kein Exit gecustomized werden, es kann einfach das Dataitem selbst in den Datenbereich mit aufgenommen werden.
Wie kann ich ein eigenes Produktlogo (Firmenlogo) hinterlegen?
- Um pro Modul ein individuelles Produktlogo zu hinterlegen:
- Um das Logo in der Kopfzeile (Druckkopf) in den Standarddruckbereichen auszutauschen:
- Den Datenbereich mit Positionierung = 3 ( Druckbereich: Kopfzeile) des Moduls, das im Skin des angemeldeteten 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.
Beim Starten meines Moduls kommt eine leere Dialogmeldung. Warum?
Sind in einem Modul Balken-Datenfelder eingebunden, aber kein
Skalenbereich zugeordnet, erscheint beim Starten eine leere Dialogmeldung.
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.
Wie sind die Währungsformate standardmäßig gecustomizt?
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 ).
Warum wird keine automatische Nummer erzeugt?
Die automatische Nummer wird erst erzeugt, wenn alle Fremd-IDs des Datensatzes mit gültigen Werten gefüllt sind.
- Ein Strichdatensatz ist nur dann ein gültiger Wert, wenn im Modul PLANTA Datentabelle in der dazugehörigen Datentabelle das DI004269 Strich-DS anlegen aktiviert ist.
Warum kann man ein neu angelegtes DI nicht verwenden/Warum wirken Änderungen am DI nicht?
Wurde PLANTA mit
Forking-Server installiert, muss nach jeder Änderung an Dataitems der Forking-Server neugestartet werden. Im
Data Dictionary und im
Dataitems gibt es dafür den Button
Reload Forking-Server.
Hinweise
- Bei Änderungen an folgenden Datentabellen muss der Forking-Server neu gestartet werden:
- Ausnahme ist eine Änderung an
- I-Texten, z.B. der DI-Bezeichnung oder
- Wertebereichen (auch der WB-Art)
Warum kann aus einer Listbox kein Wert ausgewählt werden?
Bei dem Wert, der aus der Listbox übernohmen werden soll, muss im Listboxmodul der Parameter
LB: Wertübernahme aktiviert sein.
Tipp
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
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.
Warum kann ich, 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.
- Weitere Informationen zum Customizing-Modus (Maskeneditor)
Kann ich im Customizing-Modus mehrere Felder auf einmal aktivieren?
- Es gibt zwei Möglichkeiten, mehrere Elemente zu markieren:
- Die gewünschten Elemente einzeln nacheinander über STRG+Linke Maustaste markieren.
- Mehrere Elemente in einem Bereich mittels "Gummiband" markieren.
- Durch Gedrückthalten der SHIFT-Taste, der linken Maustaste und Bewegen der Maus über den entsprechenden Bereich wird ein sogenanntes "Gummiband" eingeblendet.
- Durch Loslassen der linken Maustaste werden alle Elemente, die vollständig im Bereich des "Gummibandes" liegen, markiert.
- Um weitere Elemente mittels "Gummiband"-Funktion zu den schon markierten Elementen hinzuzufügen, die Prozedur mit zusätzlich gedrückter STRG-Taste wiederholen.
- Weitere Informationen zum Customizing-Modus (Maskeneditor)
Abbilden von Funktionen aus Releases <=3.8 in PLANTA project
Informationen zum Abbilden von Makrobefehlen/-Funktionen in Python finden Sie
hier
Tipps und Tricks zum Customizing
Customizen in zwei Sessions
Ist der Parameter
DTP Cache im Modul
PLANTA Datentabelle für die Datentabellen DT404, DT405, DT406. DT410, DT411 und DT412 aktiviert, 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 Parameter aktiviert, 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
Benutzer, denen die Customizer-Menüpunkte zugeordnet sind, 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.
Automatisches Anlegen von Inkarnationen
Im
Data Dictionary gibt es die Möglichkeit
Inkarnationen automatisch anzulegen.
Round Wertebereiche aus Performancegründen in Compute SQL Wertebereiche umwandeln
Ein Round Wertebereich wie z.B. der von DI003394 kann unter Umständen performancekritisch sein. Wir empfehlen daher diesen in einen Compute SQL 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
value_list = [["R1"],["R2"],["R3"]]
list = []
i = 0
for rec in value_list:
list.append(value_list[i][0])
i = i + 1
- Variante 1 (Strukturiert)
value_list = [["R1"],["R2"],["R3"]]
list = []
for rec in value_list:
list.append(value_list[0])
value_list = [["R1"],["R2"],["R3"]]
list = []
[list.append(rec[0]) for rec in value_list]