Execute on server

4D - Documentation   Français   English   German   Spanish   Japanese   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next

Version 2004.3 (Geändert)


Execute on server (Methodenname; Stapel{; Prozessname{; Param{; Param2; ...; ParamN}{; *}}}) Numerisch

ParameterTypBeschreibung
MethodennameStringZu startende Methode
StapelNumerischGröße des Stapelspeichers in Byte
ProzessnameStringName des erzeugten Prozesses
ParamAusdruckParameter für die Methode
*Einmaliger Prozess
FunktionsergebnisNumerischProzessnummer für neu erstellten
oder bereits laufenden Prozess

Beschreibung

Die Funktion Execute on server startet einen neuen Prozess auf dem Server-Rechner (aufgerufen im Client/Server-Betrieb) oder auf demselben Rechner (aufgerufen im Einzelbetrieb) und gibt die Prozessnummer für diesen Prozess zurück.

Mit Execute on server starten Sie eine Serverprozedur. Weitere Informationen dazu finden Sie im 4D Serverhandbuch im Abschnitt Serverprozeduren.

Rufen Sie Execute on server auf einem Client-Rechner auf, gibt der Befehl eine negative Prozessnummer zurück. Rufen Sie Execute on server auf dem Server-Rechner auf, gibt Execute on server eine positive Prozessnummer zurück. Beachten Sie, dass Aufrufen von New process auf dem Server-Rechner dasselbe ausführt wie Aufrufen von Execute on server.

Konnte der Prozess nicht erstellt werden, z.B weil der Speicher dafür nicht ausreicht, gibt Execute on server den Wert Null (0) zurück und es wird ein Fehler generiert. Sie können diesen Fehler mit ON ERR CALL in einer Fehlerverwaltungsmethode ausfindig machen.

Methodenname ist der Name der Methode, die im Prozess gestartet werden soll.

Nachdem 4D den Kontext für den neuen Prozess bestimmt hat, beginnt es mit der Ausführung dieser Methode. Sie wird zur Prozessmethode.

Stapel: Stapel gibt die Größe des Stapelspeichers in Bytes an. Im Stapelspeicher werden Methodenaufrufe, lokale Variablen, Parameter in Unterroutinen und gestapelte Datensätze angehäuft. Die minimale Größe ist 16 000 Bytes, die maximale Größe ist theoretisch durch die Speichergröße beschränkt. Sie sollten dem Speicher zwischen 16 000 und 32 000 Bytes zuweisen, abhängig von den internen Prozessoperationen. Bei sehr langen, verschachtelten Methoden weisen Sie 32 000 Bytes oder mehr zu. Soll der Prozess jedoch beispielweise nur ein Palettenfenster öffnen, genügen 16 000 Bytes. Geben Sie einen Wert unter 16 000 an oder übergeben Sie einen leeren Parameter, ändert ihn das Programm automatisch auf 16 000. Wenn Sie zuwenig Speicher zuweisen, kann die Fehlermeldung "Der Stapelspeicher ist voll" auftreten. Der angegebene Wert muss ein Vielfaches von 2 sein.

Hinweis: Der Stapelspeicher ist NICHT der Gesamtspeicher des Prozesses. Prozesse teilen den Speicher auf für Datensätze, Interprozessvariablen usw.. Prozessvariablen werden in einem Extraspeicher gespeichert.

Prozessname ist optional. Im Einzelplatz erscheint dieser Name in der Designumgebung im Fenster Prozessliste. Er wird von dem Befehl PROCESS PROPERTIES zurückgegeben, wenn er auf diesen neuen Prozess angewendet wird. Im Client/Server-Betrieb erscheint dieser Name im Hauptfenster des Servers in der Liste Serverprozeduren in Blau.

Der Name kann bis zu 31 Zeichen lang sein. Geben Sie diesen Parameter nicht an, ist Prozessname ein leerer String. Soll der Prozess nur lokal gelten, stellen Sie das Dollarzeichen ($) voran.

Warnung: Machen Sie im Gegensatz zu New Process mit der Funktion Execute on server den Prozess NICHT durch das vorangestellte Dollarzeichen lokal. Das funktioniert nur im Einzelplatzbetrieb, da Execute on server hier als New Process agiert. Im Client/Server-Betrieb ruft das einen Fehler hervor.

Parameter für Prozessmethode: Ab Version 6 können Sie für die Prozessmethode Parameter übergeben, und zwar genauso wie für eine Unterroutine. Lediglich Ausdrücke vom Typ Zeiger und Arrays können Sie nicht übergeben. Sobald die Ausführung im Kontext des neuen Prozesses startet, erhält die Prozessmethode die Parameterwerte in $1, $2, etc.

Hinweis: Übergeben Sie Parameter in der Prozessmethode, müssen Sie auch Prozessname übergeben. In diesem Fall können Sie ihn nicht weglassen.

Optionaler Parameter *: Geben Sie diesen Parameter an, erhält 4D die Anweisung, zuerst zu prüfen, ob bereits ein Prozess Prozessname vorhanden ist. Ist dies der Fall, startet 4D keinen neuen Prozess und gibt die Prozessnummer des Prozesses Prozessname zurück.

Beispiel

(1) Folgendes Beispiel zeigt, wie Sie den Datenimport im Client/Server-Betrieb entscheidend beschleunigen können. Mit der nachfolgenden Methode Regular Import können Sie prüfen, wie lange der Import von Datensätzen mit dem Befehl IMPORT TEXT auf der Arbeitsstation dauert:

      ` Projektmethode Regular Import 
   $vhDocRef:=Open document("")
   If (OK=1)
      CLOSE DOCUMENT($vhDocRef)
      INPUT FORM([Table1];"Import")
      $vhStartTime:=Current time
      IMPORT TEXT([Table1];Document)
      $vhEndTime:=Current time
      ALERT("Es dauerte "+String(0+($vhEndTime-$vhStartTime))+" Sekunden.")
   End if 

Bei regulären Importdaten zeigt 4D Client das Durchlaufen der Textdatei an, und erstellt dann für jeden Datensatz einen neuen Datensatz, füllt die Felder mit den importierten Daten und sendet den Datensatz an den Server-Rechner, damit er der Datenbank hinzugefügt wird. Auf diese Weise gehen viele Anfragen über das Netz. Diese Operation können Sie über eine Serverprozedur optimieren, die den Vorgang lokal auf dem Server-Rechner ausführt. Der Client-Rechner lädt das Dokument in ein BLOB, übergibt das BLOB als Parameter und startet so eine Serverprozedur. Die Serverprozedur speichert das BLOB in ein Dokument auf der Festplatte des Server-Rechners und importiert das Dokument dann lokal. Der Datenimport wird mit der Geschwindigkeit einer Einzelplatz-Version ausgeführt, da die meisten Anfragen über das Netz eliminiert wurden.

Hier ist die Projektmethode CLIENT IMPORT. Sie wird auf dem Client-Rechner ausgeführt und startet die nachfolgende Serverprozedur SERVER IMPORT:

      ` Projektmethode CLIENT IMPORT
      ` CLIENT IMPORT ( Pointer ; String )
      ` CLIENT IMPORT ( -> [Table] ; Input form )

   C_POINTER($1)
   C_STRING(31;$2)
   C_TIME($vhDocRef)
   C_BLOB($vxData)
   C_LONGINT(spErrCode)

      `Wähle das zu importierende Dokument
   $vhDocRef:=Open document("")
   If (OK=1)
         ` Wurde ein Dokument ausgewählt, lasse es nicht offen 
      CLOSE DOCUMENT($vhDocRef)
      $vhStartTime:=Current time
         ` Versuche, es in den Speicher zu laden
      DOCUMENT TO BLOB(Document;$vxData)
      If (OK=1)
            ` Das Dokument konnte ins BLOB geladen werden,
            ` Starte Serverprozedur, die Daten auf dem Server-Rechner importiert
         $spProcessID:=Execute on server("SERVER IMPORT";32*1024;
                              "Server Import Services";Table($1);$2;$vxData)
            ` Wir benötigen das BLOB nicht länger in diesem Prozess
         CLEAR VARIABLE($vxData)
            ` Warte bis von Serverprozedur ausgeführte Operation fertig ist.
         Repeat 
            DELAY PROCESS(Current process;300)
            GET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
            If (Undefined(spErrCode))
                  ` Hinweis: Wurde die Serverprozedur nicht mit der eigenen Instanz
                  ` der Variablen spErrCode initialisiert, wird evtl. eine undefinierte 
                  ` Variable zurückgegeben  
               spErrCode:=1
            End if 
         Until (spErrCode<=0)
            ` Teile der Serverprozedur mit, dass wir bestätigen
         spErrCode:=1
         SET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
         $vhEndTime:=Current time
         ALERT("Es dauerte "+String(0+($vhEndTime-$vhStartTime))+" Sekunden.")
      Else 
         ALERT("Der Speicher reicht nicht aus zum Laden des Dokuments.")
      End if 
   End if 

Die Projektmethode SERVER IMPORT ausgeführt als Serverprozedur:

      ` SERVER IMPORT Project Method
      ` SERVER IMPORT ( Long ; String ; BLOB )
      ` SERVER IMPORT ( Tabellennummer ; Eingabeformular ; Importdaten )

   C_LONGINT($1)
   C_STRING(31;$2)
   C_BLOB($3)
   C_LONGINT(spErrCode)

      ` Operation ist noch nicht beendet, setze spErrCode auf 1
   spErrCode:=1
   $vpTable:=Table($1)
   INPUT FORM($vpTable->;$2)
   $vsDocName:="Import File "+String(1+Random)
   DELETE DOCUMENT($vsDocName)
   BLOB TO DOCUMENT($vsDocName;$3)
   IMPORT TEXT($vpTable->;$vsDocName)
   DELETE DOCUMENT($vsDocName)
      ` Operation ist beendet, setze spErrCode auf 0
   spErrCode:=0
      ` Warte bis der anfragende Client das Ergebnis erhalten hat
   Repeat 
      DELAY PROCESS(Current process;1)
   Until (spErrCode>0)

Mit diesen beiden Projektmethoden in einer Datenbank können Sie einen Datenimport über eine Serverprozedur ausführen. Schreiben Sie z.B.:

   CLIENT IMPORT (->[Table1];"Import")

Mit einigen Benchmarks werden Sie entdecken, dass Sie mit dieser Methode Datensätze bis zu 60 Mal schneller importieren können als über regulären Import.

Referenz

New process, Serverprozeduren.

Anwendung des Befehls

Execute on Server, Taking Advantage of Execute on Server


4D - Documentation   Français   English   German   Spanish   Japanese   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next