Nach dem der erste Teil des Artikel für euphorische Kommentare gesorgt hat :), hier der zweite Teil.
Die PSP-Shell
Wer sich als Admin anmeldet, der kann über RMT > Shell die PSP Shell aufrufen, die die direkt Eingabe von PSP Funktion erlaubt. Nützlich ist die Shell, um Datenbankwerte auszulesen (oder auch zu ändern) und PSP Funktionen auszuführen. Hier ein paar Beispiele, die auch einen kleinen Einblick in die Programmierung von PSP erlauben.
Datenbankfeld auslesen
Fangen wir mit einem einfachen Beispiel an, dem Auslesen eines Datenbankfeldes zum markierten Datensatz. Dazu ein Konstruktionsdokument wählen und RMT > Shell ausführen. Nun in das Shellfenster eingeben:
read() #IDENT
Nach einem Klick auf OK bekommt ihr die Antwort auf eure Eingabe.
In dem Fall die Dokumentnummer des markierten Dokuments. read() heisst: “Mach ein Ausgabefenster auf und schreibt rein, was ich dahinter hingeschrieben habe”. #IDENT bedeutet: “Lies mir das Datenbankfeld mit Namen IDENT aus”. Stell sich die Frage, was soll das “#” vor IDENT, den das Datenbankfeld heisst IDENT und nicht #IDENT. # ist als eine Funktion zu sehen, die den Inhalt des dahinter angegeben Datenbankfeldes ausgibt. Soll ein Text davor stehen schreibst du einfach:
read() Die Dokumentnummer lautet: #IDENT
Das Ergebnis sieht dann so aus:
Woher weiß ich, welche Datenbankfelder es gibt und wie diese heißen?
Um ein Datenbankfeld auszulesen sollte man wissen, wie es heißt. Das kann man über die Konfiguration oder direkt im SQL Server nachschauen. Um in den SQL Server “hineinzuschauen”nutzt man das SQL Server Management Studio. Dort findet man z.B. an der entsprechenden View (Sicht) die Felder für einem bestimmten Entitytype, u.a. unseren IDENT.
Variablen auslesen
Variablen werden beim Start von PSP oder auch während der Arbeit gesetzt und enthalten gewisse “Einstellungen”, wie etwa den Benutzernamen. Variablen kann man mittels $<Variablename> auslesen, z.B. den Benutzernamen mittels
read() $USERNAME
Wie wir im ersten Beitrag gesehen haben, werden in der compass.ini verschiedene Variablen gesetzt, wie etwa DATPATH die sich so auch auslesen lassen.
Neue Variable erstellen
Über die Shell können wir alle PSP Funktion ausführen, auch solche, die für die Programmierung verwendet werden. Es gibt z.B. die Funktion ___Environment (3 Unterstríche vorweg!) mittels der sich Variablen mit Werten versehen lassen. Mittels dieses Ausdrucks kann eine neue Variable “test” erstellt und mit dem Wert “12345” gefüllt werden.
___Environment (test=12345)
Ausgelesen wir die Variable wie? Richtig mittels: read() $test
Wie müsste des Ausdruck aussehen, um die Variable “test” mit dem IDENT des markierten Konstruktionsdokuments zu versehen? Genau, wieder richtig überlegt, lieber Leser :) ___Environment (test=#IDENT)
Liste aller vergeben Variablen anzeigen
Wer eine Liste aller Variablen sehen möchte, ruft einfach auf:
___CmpUtility(WriteSyspar)
Pfad der Datei ermitteln
Im welchem Pfad die Datei zu aktuell markierten Datensatz gespeichert ist, zeigt die Funktion read() #DOCNAME0 an.
Aller Err-Log Dateien im Workverzeichnis löschen
Mittels
rmwild("$(WsPath:|+)*.err")
lassen sich alle Dateien mit der Endung “.err” aus dem Workverzeichnis löschen.
rmwild (“…”) ist die Funktion, um Dateien, die einem bestimmten Muster entsprechen, zu löschen.
$(WsPath:|+)*.err bedeutet: lies die Variable WsPath aus (= Workverzeichnis, wie an der Startverknüpfung angegeben), hänge an den Pfad einen Backslash an (:|+) und und lösche wähle alle Dateien mit der Endung .err aus.
Errlog.err anzeigen
Wer “mal schnell” die errlog.err öffnen will, dem hilft diese Zeile:
ShellExecute ( open "$(SystemRoot:|+)system32\notepad.exe" "$(WsPath:|+)Errlog.err")
Was soviel heisst wie: Starte das Programm notepad.exe aus dem Verzeichnis das sich aus der Variable SystemRoot (=Windowsverz.) und system32 zusammensetzt und übergeben an das Programm notepad.exe als Parameter die zu öffnende Datei die im Workverz. liegt und errlog.err heisst.
Feldinhalt an einem Datensatz ändern
Auch Feldinhalte lassen sich über die Shell ändern. Mittels
___Changefield "SHORT_DESC=TEST"
kann das Feld SHORT_DESC (=Bezeichnung) auf den Inhalt “TEST” geändert werden.
Für die komplette Verwirrung :)
Für eine Liste aller Funktionen im PSP ruf mal an der Shell auf:
___CmpUtility(WritePublic)
Du erhältst eine Liste aller Funktionen und wo sie definiert sind. Ist aber ein bisschen viel Info auf einmal, aber zu beginn der Liste findest du einige interne Funktionen wie etwa “___Changefield”.
Woher soll ich die ganzen Befehle wissen?
Stellt sich allgemein vielleicht für dich die Frage: Woher soll ich die ganzen Befehle wie ___Changefield, ShellExecute, ___CmpUtility usw. wissen? Antwort: Sie stehen in der Entwicklerdokumentation, wie sie bis PSP 2009 und wieder seit PSP 2010 in PSP enthalten ist. Suche mal im PSP Serververz. nach compass5developer.pdf, PSProfDeveloperManualEnglish 2010.pdf oder auch Entwicklerhandbuch_Pro_pro.pdf. Gibt dir aber bitte keine Mühe: ich verschicke das Dokument nicht und beantworte keine Mails diesbezüglich! Wende dich an deinen PSP-Händler für weitere Infos. Wenn ich dein PSP-Händler sein sollte: Mail an meine Geschäftsemailadresse genügt ;)
Und jetzt viel Spaß beim spielen und probieren, z.B. wie du mit einer Zeile Code in der Shell ein PDF-Nebendokument von einer Inventor 2009 oder 2010 IDW erstellen kannst:
ApplCall AIMDSaveAsAttachment #DOCNAME0 "PDF" 0
Ich find das recht gefährlich was du hier veröffentlichst.
AntwortenLöschenSchließlich kann man auf der Shell Ebene auch einiges manipulieren was über die Oberfläche nicht möglich ist.
Und der unerfahrene User weiß letztendlich nicht was er da tut.
Ein unerfahrener User sollte auch keine Adminrechte haben.
AntwortenLöschenAlso ich find's top das du dein Wissen mit anderen teilst!
AntwortenLöschenBin schon gespannt auf Teil 3 :)
Klasse Beitrag. Interessiert mich sehr.
AntwortenLöschenBin auch schon gespannt auf mehr.
Vielleicht ein kleines Programmierbeispiel und wie man es mit p2Q_2000.exe kompiliert und anschließend in die Oberfläche von PSP einbaut.
Danke.