PMS32 Online- Hilfereferenz

MISC.BENUTZERMENUES.HTML

Diese Datei ist ein Dokumentation für Menü- Scripte im Verzeichnis cNetDir+"MENUS\" oder auch cNetDir+"MENUS\MandantenID\" Mit der Version ePMS32 stehen weitere Erweiterungen zur Verfügung.


Verzeichnisstruktur

Im Verzeichnis ..\MENUS\ können jetzt Unterordner mit der ID des Mandanten angegeben werden die in diesen Ordneren enthaltenen Dateien haben Vorrang vor den Dateien des Ordners MENUS\. Ein Beispiel soll dies verdeutlichen:
..\MENUS\PMS_DEMO_PMS_DEMO\SYSTEM00.INI
..\MENUS\PMS_DEMO_PMS_DEMO\SYSTEM44.INI
..\MENUS\PMS_DEMO_PMS_DEMO\SYSTEM88.INI
..\MENUS\SYSTEM00.INI
..\MENUS\SYSTEM33.INI
..\MENUS\SYSTEM44.INI
..\MENUS\SYSTEM99.INI

Im diesem Fall würden die Dateien SYSTEM00.INI, SYSTEM44.INI, SYSTEM88.INI des Unterverzeichnisses \MENUS\PMS_DEMO_PMS_DEMO\ genommen, die Dateien SYSTEM00.INI und SYSTEM44.INI im Ordner ..\MENUS\ werden ignoriert. In der Liste der definierten Menüdateien würden dann folgende Dateien in folgender Reihenfolge abgearbeitet:
..\MENUS\PMS_DEMO_PMS_DEMO\SYSTEM00.INI
..\MENUS\SYSTEM33.INI
..\MENUS\PMS_DEMO_PMS_DEMO\SYSTEM44.INI
..\MENUS\PMS_DEMO_PMS_DEMO\SYSTEM88.INI
..\MENUS\SYSTEM99.INI

Die ID des Mandanten kann aus der C-Struktur Datei PMS32.PTH ermittelt werden.:

 
[USER]                            */ Bereich - Benutzer
  (MBB)                           */ Benutzername unter WINDOWS Anmeldung
    cIdx02 = "PMS_DEMO_PMS_DEMO"  */ ID des Mandanten, definiert für diesen Benutzer
  ()
[]

Die neuen Strukturdateien werden wie folgt aufgebaut:

 
[Bereich0] */ Oberster Bereich, Im Menüscript die Bereichsdefinition
(Bereich1) */ Bereich der PAD Definitionen
{Bereich2} */ Bereich der POPUP Definitionen
?Bereich3? */ Bereich der BAR Definitonen
?? */ Kennzeichen des Bereichendes, wird in Menuüscripten nicht benötigt (alte Version)
>Script */ Start eines Script's
<Script */ Ende eines Script's

Dateinamen

Die Dateinamen können zwischen SYSTEM00.INI bis SYSTEM999.INI liegen. Damit besteht die Möglichkeit mehrere Dateien zu erzeugen. Die letzten Werte müssen Zahlen sein und eine Zahl zwischen 0 und 999 ergeben! Die Reihenfolge, in der die Dateien nachher verarbeitet werden, wird durch diese Nummerierung vorgegeben.

Überladen von Menüs

Da die Menüdateien nach ihrer Nummerierung verarbeitet werden, besteht die Möglichkeit, dass gleiche Bereiche überschrieben werden. Ein Beispiel soll dies an zwei angenommen Menüdateien SYSTEM01.INI und SYSTEM02.INI verdeutlichen:

 
  */ Menüdatei SYSTEM01.INI
  [MAIN]                         */ Bereich, MAIN - Hauptmenü
    (ZUSATZPRGS)                 */ Definition des PAD's
      def = "PROMPT 'Zusatzprogramme' AFTER tabelle"
      on  = "ACTIVATE POPUP zusatz"
      {ZUSATZ}                   */ Definition des POPUS's
        def = "MARGIN RELATIVE SHADOW COLOR SCHEME 4"
        ?1?                      */ Defintion der BAR
          def = "PROMPT 'Testanzeige'"
        ?2?
          def = "PROMPT '\-'"  */ Leitet eine Menü-Unterteilung ein
        ?3?
          def = "PROMPT 'Unterhalb des Bereichs'"

Ohne eine weitere Menüdatei, die beim Einlesen überladen wird, würde der Menüaufbau im Hauptmenü dann in etwa so aussehen:

§        Testanzeige

§        -----------------------------------

§        Unterhalb des Bereichs

Wird jedoch der angegebene Bereich von einer weiteren Menüdatei überladen, so werden die Einträge gezielt überschrieben

 
  */ Menüdatei SYSTEM02.INI, wird nach der Menüdefinition aus SYSTEM01.INI gelesen
  [MAIN]
    (ZUSATZPRGS)
      {ZUSATZ}
        ?2?
          def = "PROMPT 'Nur dass was Überladen wird...'"

Damit würde das Menü in etwa so aussehen:

Anders als Menüdefinitionen, werden Scripte, die in Menüdateien vorhanden sind nicht überladen! Diese Scripte werden für alle Menüdateien gespeichert!

Platzhalter

Um Änderungen beim Aufruf von MenüScripts in seinen Menüdateien zu vereinfachen wurden Platzhalter definiert, die während des Einlesens der Menüdateien, ersetzt werden. Damit können Menüscripte nun dynamisch aufgebaut werden. Diese Option war bis zu PMS premium nicht möglich! Damit können Menüscripte, die für ePMS32 erstellt wurden, unter PMS premium zu Fehlern führen. Kein Downgrade! Folgende Platzhalter wurden definiert:

o                      
o                       */ Menüdatei SYSTEM02.INI
o                       [MAIN]
o                         (ZUSATZPRGS)
o                             def = "PROMPT '<<MENUFILE>>'

wird erstezt durch:

 
  */ Menüdatei SYSTEM02.INI
  [MAIN]
    (ZUSATZPRGS)
   def = "PROMPT 'SYSTEM02.INI'
o                      
o                       */ Menüdatei SYSTEM02.INI
o                       [MAIN]
o                         (ZUSATZPRGS)
o                             def = "PROMPT '<<MENUNUMBER>>'

wird erstezt durch:

 
  */ Menüdatei SYSTEM02.INI
  [MAIN]
    (ZUSATZPRGS)
   def = "PROMPT '02'
o                      
o                       */ Menüdatei SYSTEM02.INI
o                       [MAIN]
o                         (ZUSATZPRGS)
o                             def = "PROMPT '<<MENUTREE>>'

wird erstezt durch:

 
  */ Menüdatei SYSTEM02.INI
  [MAIN]
    (ZUSATZPRGS)
   def = "PROMPT 'MAIN.ZUSATZPRGS'

Unter Strukturbaum ist die Struktur des Menüaufbaus zu verstehen. Dabei werden die einzelnen Bereiche durch einen Punkt "." voneinander getrennt. Dieser Aufbau muss beim Aufruf der Routinen DoMenSc() und DoMenSc32() eingehalten werden, doch dazu später...

Präprozessorbefehle

Innerhalb von Menü- Scripts können weitere Script- Dateien nachgeladen werden. Dies ermöglicht einen Programmcode, der nur einmal geschrieben werden muss. Bessere Änderbarkeit. Der Präprozessor Befehl kann nur in Scripten innerhalb eines Menüscripts vorkommen! Präprozessoranweisungen innerhalb der Menüdefinition werden ignoriert. Die Anweisungen müssen genau dort stehen, wo später der Code ersetzt werden soll. Beispiel:

 
[MAIN]
  */ Menüdatei soll SYSTEM02.INI sein...
  (MeineRoutine)
    >Script
      * Hier beginnt mein Programm
      LOCAL lni
      lni = 1
      ACTIVATE SCREEN
      ? m.lni,MeineBerechnung1(m.lni),MeineBerechnung2(m.lni)
      * Gibt 1    1.5    2.0 aus dem Screen aus!
      RETURN   && Das Script wird hier beendet!
 
      PROCEDURE MeineBerechnung1  && Unterprogramm, geht erst ab ePMS32!
        LPARAMETERS tnWhat
        <LoadScriptFile "<<MENUFILE>>","MAIN.BERECHNUNG1" />
        * Obige Präprozessoranweisung wird ersetzt durch: RETURN m.tnWhat * 1.5
      ENDPROC
 
      PROCEDURE MeineBerechnung2
        <LoadScriptFile "<<MENUFILE>>","MAIN.BERECHNUNG2" />
        * Obige Präprozessoranweisung wird ersetzt durch: LPARAMETERS m.tnWhat und RETURN m.tnWhat * 2.0
      ENDPROC
    <Script
 
  (Berechnung1)
    >Script
      RETURN m.tnWhat * 1.5
    <Script
 
  (Berechnung2)
    >Script
      LPARAMETERS tnWhat
      RETURN m.tnWhat * 2.0
    <Script

Durch die Präprozessoranweisung <LoadScriptFile "Dateiname.INI","Strukturbaum" /> wird an genau der bezeichneten Stelle der angegebene Code nachgeladen. Dadurch können auch ganze Unterprogramme nachgeladen werden. Da in ePMS32 die Scripte vor dem Ausführen kompiliert werden ist die Ausführung des Programmcodes schneller als der Aufruf durch DoMenSc() oder DoMenSc32(), da in diesem Routinen der Scriptcode jedesmal vor der Ausführung kompiliert werden muss.

PROCEDURE Anweisung

Innerhalb von Script's (auch Scriptdateien im Ordner SCRIPTS\) können PROCEDURE Anweisungen stehen. Damit können Programmroutinen, die mehrmals benötigt werden in einem Unterprogramm untergebracht werden. Dies erspart Zeit und Fehler. Die Scripte werden unter ePMS32 mit dem Befehl EXECSCRIPT(...) (FoxPro ab V8) ausgeführt. Dieser Befehl kompiliert den Code vor der Ausführung und führt ihn dann aus. Damit ist sowohl die Verarbeitungsgeschwindigkeit schneller (PMS-16) und es besteht die Möglichkeit Unterroutinen (PROCEDURE) anzugeben. Diese Möglichkeit war unter PMS-16 nicht möglich, da der FoxCode dort mit einem Fox-2.6 Programm Zeile für Zeile übersetzt und ausgeführt wurde. Beispiel:

 
[MAIN]
  */ Menüdatei: SYSTEM00.INI
  (MeineKalkulation)
    >Script
      LPARAMETERS tnWert
      LOCAL lnReturn
      lnReturn = ;
        tnWert * 1.5 +;
        Schnuersenkellaenge(m.tnWert) / 10
      RETURN m.lnReturn  && Das Script wird hier beendet und der Wert lnReturn zurückgegeben
 
      PROCEDURE Schnuersenkellaenge (tnWert AS Number) AS Number
        * RAND() - Zufallszahl zwischen 0-1
        * SQRT() - Quadratwurzel
        RETURN m.tnWert * RAND(m.tnWert) * SQRT(m.tnWert)
      ENDPROC
    <Script
[B01]
  (SAVE_BF)
    >Script
      * Wird ausgeführt, bevor der Artikel gespeichert wird!
      WAIT WINDOW "Seltsam Kalkuliert:"+TRANSFORM(DoMenSc32("","MAIN.MeineKalkulation",B01.EKBR))
    <Script

Die obige Menüdefinition würde beim Speichern eines Artikels das Script "MAIN.MeineKalkulation" ausführen dass das Unterprogramm "Schnuersenkellaenge" enthält, was einen übergebenen num. Wert erhält und diesen verändert zurückgibt. Wichtig in diesem Zusammenhang ist der Aufruf im Bereich "B01.SAVE_BF" (vor dem Speichern) mit DoMenSc32(...). Diese Routine ist neu und übergibt die Parameter EXAKT an die Routine, die aufgerufen wird. Anders als in PMS premium, in der Übergabeparameter durch die Variablen tp1 - tp9 abgefragt werden konnten.

Aufruf mit DoMenSc() und DoMenSc32()

Innerhalb von Menüscripten können weitere Scripte aufgerufen werden. Dies kann mit den Befehlen DoMenSc() und DoMenSc32() erfolgen. Beide Varianten führen das angegebene Menüscript aus, jedoch bestehen hinsichtlich der Parameter Unterschiede.
eReturn = DoMenSc(cMenueDatei,cStrukturbaum[,eParameter1[,eParameter2[,...,eParameter9]]])
Beim Aufruf von DoMenSc() müssen mindestens zwei Parameter angegeben werden. Diese können unterschiedlich gefüllt sein.

Ein Beispiel für den Aufruf von Scripten:

 
[MAIN]
  */ Menüdatei: SYSTEM01.INI
  (MeinProgramm)
    >Script
      WAIT WINDOW "<<MENUFILE>>-<<MENUTREE>>"
    <Script
  (MeinProgramm1)
    >Script
      WAIT WINDOW "<<MENUFILE>>-<<MENUTREE>>"
    <Script
 
[MAIN]
  */ Menüdatei: SYSTEM02.INI
  (MeinProgramm)
    >Script
      WAIT WINDOW "<<MENUFILE>>-<<MENUTREE>>"
    <Script
  (MeinProgramm1)
    >Script
      WAIT WINDOW "<<MENUFILE>>-<<MENUTREE>>"
    <Script
 
  (ePMS32Samples)
    def = "PROMPT 'ePMS32 Samples'"
    on  = "ACTIVATE POPUP PMSSAMPLES"
    {PMSSAMPLES}
      def = "MARGIN RELATIVE SHADOW COLOR SCHEME 4"
      ?1?
        def = "PROMPT 'Ausführen MAIN.MeinProgramm in SYSTEM01.INI"
        on_selection = "=DoMenSc32('SYSTEM01.INI','MAIN.MeinProgramm')"
      ?2?
        def = "PROMPT 'Ausführen MAIN.MeinProgramm in SYSTEM02.INI"
        on_selection = "=DoMenSc32('SYSTEM02.INI','MAIN.MeinProgramm')"
      ?3?
        def = "PROMPT 'Ausführen aller Scripte in SYSTEM01.INI"
        on_selection = "=DoMenSc32('SYSTEM01.INI','')"
      ?4?
        def = "PROMPT 'Ausführen aller Main.MeinProgramm Scripte"
        on_selection = "=DoMenSc32('','Main.MeinProgramm')"

Dieses Verhalten ist bei beiden Befehlen, DoMenSc() und DoMenSc32(), gleich. Der Unterschied beider Befehle ist die Übergabe der Parameter "eParameter1" bis "eParameter9". Während beim Aufruf mit DoMenSc(...,ePara1,ePara2,...) die Parameter nicht an das Script übergeben werden sondern mit m.tp1 bis m.tp9 im Script abgefragt werden können, muss beim Aufruf mit DoMenSc32(...) eine Parameterangabe in der ersten Zeile des Scripts stehen! Beispiel:

 
[MAIN]
  */ Menüdatei: SYSTEM??.INI
  */ Script Definitionen
  (Script16)
    >Script
      * Die Übergabeparameter werden in der (alten) Version so abgefragt!
      WAIT WINDOW m.tp1 + " / " + m.tp2
    <Script
  (Script32)
    >Script
      LPARAMETERS tcVorname,tcNachname
      * Die Übergabeparameter werden in der neuen Version so abgefragt!
      WAIT WINDOW m.tcVorname + " / " + m.tcNachname
    <Script
  */ Menü Definitionen
  (ePMS32Samples)
    def = "PROMPT 'ePMS32 Samples'"
    on  = "ACTIVATE POPUP PMSSAMPLES"
    {PMSSAMPLES}
      def = "MARGIN RELATIVE SHADOW COLOR SCHEME 4"
      ?1?
        def = "PROMPT 'Aufruf mit DoMenSc()'"
        on_selection = "=DoMenSc('<<MENUFILE>>','MAIN.Script16','Michael','Bergner')"
      ?2?
        def = "PROMPT 'Aufruf mit DoMenSc32()'"
        on_selection = "=DoMenSc32('<<MENUFILE>>','MAIN.Script32','Michael','Bergner')"

Das gleiche Verhalten gilt für die Befehle ExecFile(), ExecFile32(), ExecScript_16() und ExecScript_32(). ExecFile... führt eine Programmdatei im Verzeichnis SCRIPTS\ aus. ExecScript_... führt das angegebene Script aus.

Alle EXEC - Befehle

·                 
·                * Wenn mein Programm 'irgendwo' gespeichert ist...
·                LOCAL lcCode,leReturn
·                lcCode   = FILETOSTR("C:\MeineProgramme\MeinProgramm.PRG")
·                leReturn = ExecScript_16(m.lcCode[,...])

Kommentaranweisungen

Kommentaranweisungen innerhalb von Scrptdateien können mit den Zeichenfolgen: **, */, /* oder // eingeleitet werden. Der Kommentar endet mit dem Zeilenende. && kann nach einer Anweisung gesetzt werden!
Mit diversen Tricks können alle Anweisungen variabel gestaltet werden, in wie weit dann der Code noch lesbar ist bleibt dem Benutzer selbst überlassen. Benutzen Sie Kommentare, um Ihren Code lesbar zu halten.

Beispiel : MISC.BENUTZERMENUES.HTML

Nun zu einem Beispiel. Den nachfolgenden Code können Sie unter ..\MENUS\SYSTEM??.INI speichern (?? steht für eine Zahl zwischen 00 und 99). Bitte überschreiben Sie sich auf keinen Fall irgendwelche vorhanden Scriptdateien! Denken Sie auch daran, dass Menüs im entsprechenden Bereich überschrieben werden!


Siehe auch : Hauptmenü / Hauptindex; / Dictionary Module / Programm- Module / Tabellen Index / Masken Index

Lokale Benutzerhilfe : Meine eigene Hilfe / Zurück zur PMS32 - Hilfe


Dateiversion:1.0.00.09.00 - H.U.DD.V1.V2
Senden Sie Ihren Kommentar zu diesem Thema an das Entwicklungsteam von PMS32
Weitere Informationen finden Sie unter der aktuellen PMS32 WEB-Hilfe . © PMS Compelec GmbH 2006 ® el-Projekt