4D v14.3

Execute on server

Página Inicial

 
4D v14.3
Execute on server

Execute on server 


 

Execute on server ( proced ; pilha {; nome {; param {; param2 ; ... ; paramN}}}{; *} ) -> Resultado 
Parâmetro Tipo   Descrição
proced  cadeia in Procedimento a executar no processo
pilha  Inteiro longo in Tamanho da pilha em bytes
nome  cadeia in Nome do processo criado
param  Expression in Parâmetro(s) do procedimento
Operador in Processo único
Resultado  Inteiro longo in Número de processo para o processo criado recentemente ou de um processo que está sendo executado

O comando Execute on server inicia um novo processo na máquina servidor (quando se chama em Cliente/Servidor) ou na mesma máquina (se é chamado em monousuário) e devolve o número deste processo.

Utilize Execute on server para iniciar um procedimento armazenado. Para maior informação sobre procedimentos armazenados, consulte a seção Stored Procedures no manual de referência de 4D Server.

Se chamado Execute on server em uma máquina cliente, o comando devolve um número de processo negativo. Se chamada Execute on server na máquina servidor, Execute on server devolve um número de processo positivo. Note que chamar New process na máquina servidor faz o mesmo que chamar Execute on server.

Se o processo não foi possível criar (por exemplo, se não há suficiente memória), Execute on server devolve (0) e é gerado um erro. Pode interceptar este erro utilizando um método de gestão de erros instalado pelo comando ON ERR CALL.

Em proced, passe o nome do método de processo para o novo processo. Uma vez 4D seja definido o contexto para o novo processo, começa a execução deste método, o qual é convertido no método de processo.

En pila, se pasa la cantidad de memoria asignada para la pila del proceso. Este valor representa el espacio en memoria utilizado para “apilar” las llamadas de métodos, las variables locales, los parámetros de subrutinas y los registros apilados. Se expresa en bytes; se recomienda pasar al menos 64K (alrededor de 64 000 bytes), pero puede pasar más si la cadena de llamadas en el proceso (subrutinas llamando subrutinas en cascada) es importante. Por ejemplo, si es necesario puede pasar 200K (alrededor de 200 000 bytes).

Nota: la pila NO es la memoria total reservada para el proceso. Los procesos comparten memoria para los registros, las variables interproceso, etc. Un proceso utiliza igualmente la memoria extra para almacenar sus variables proceso. La pila sólo contiene variables locales, llamadas de métodos, parámetros en subrutinas y registros apilados.

Nota 4D Server 64 bits: la pila de un proceso ejecutado en 4D Server 64 bits requiere más memoria que en 4D Server 32 bits (alrededor del doble). Le recomendamos en este contexto pasar un valor de 128 000 bytes en general y 400 000 bytes en caso de una cadena de llamada importante. Asegúrese de verificar este parámetro cuando su código esté destinado a ser ejecutado en 4D Server 64 bits.

El nombre del nuevo proceso se pasa en nombre. En monousuario, este nombre aparecerá en la lista de procesos del entorno Diseño, y será devuelto por el comando PROCESS PROPERTIES cuando se aplica a este nuevo proceso. En cliente/servidor, este nombre aparecerá en azul en la lista de Procedimientos almacenados de la ventana principal de 4D Server.

Puede omitir este parámetro; si lo hace, el nombre del proceso será una cadena vacía.

Advertencia: a diferencia del comando Nuevo Proceso, no intente crear un proceso local colocándole el signo dólares ($) como prefijo al nombre mientras utiliza Execute on server. Funcionará correctamente en monousuario, porque Execute on server actúa como New Process en este entorno. Por otra parte, en Cliente/Servidor, esto generará un error.

Pode passar parâmetros ao método de processo. Pode passar parâmetros da mesma forma como os passaria a uma sub rotina. No entanto, há uma restrição, não pode passar expressões de tipo ponteiro. Igualmente, lembre que os arrays não podem ser passados como parâmetros a um método. Uma vez comece a execução no contexto do novo processo, o método de processo recebe os valores dos parâmetros em $1, $2, etc.

Nota: Se passar parâmetros ao método de processo, deve passar o parâmetro nome; neste caso não se pode omitir.

Se passar um objeto 4D (C_OBJECT) como param o valor de retorno, a forma JSON se utiliza em UTF-8 para o servidor. Se o objeto [#cmd id="1216"/] contém ponteiros, se enviam seus valores não referenciados, e não os ponteiros mesmos.

Se passado este último parâmetro lhe pede a 4D verificar primeiro se está executando um processo com o mesmo nome que passou em nome. Se é assim, 4D não inicia um novo processo e devolve o número do processo com este nome.

Exemplo  

El siguiente ejemplo muestra cómo la importación de datos puede acelerarse de manera dramática en entorno Cliente/Servidor. El método Importacion Clasica listado a continuación le permite medir cuánto tiempo toma una importación de registros utilizando el comando IMPORT TEXT:

  `Método de proyecto Importacion Clasica
 $vhDocRef:=Open document("")
 If(OK=1)
    CLOSE DOCUMENT($vhDocRef)
    FORM SET INPUT([Tabla1];"Import")
    $vhHoraInicial:=Current time
    IMPORT TEXT([Tabla1];Document)
    $vhHoraFinal:=Current time
    ALERT("La operación tardó "+String(0+($vhHoraFinal-$vhHoraInicial))+" segundos.")
 End if

Con la importación de datos clásica, 4D Client analiza el archivo ASCII, luego, para cada registro, crea un nuevo registro, llena los campos con los datos importados y envía el registro al equipo servidor de manera que pueda ser añadido a la base. Por lo tanto hay muchas peticiones circulando por la red. Una manera de optimizar la operación es utilizar un procedimiento almacenado para hacer el trabajo localmente en el equipo servidor. El equipo cliente carga el documento en un BLOB, comienza un procedimiento almacenado pasando el BLOB como parámetro. El procedimiento almacenado coloca el BLOB en un documento en el disco del equipo servidor, luego importa el documento localmente. Por lo tanto, la importación de datos se lleva a cabo localmente a una velocidad comparable a la de una versión monopuesto de 4D, porque la mayoría de las peticiones que circulan por la red han sido eliminadas. Este es el método de proyecto CLIENTE IMPORTAR. Ejecutado en el equipo cliente, inicia la ejecución del procedimiento almacenado SERVIDOR IMPORTAR, listado a continuación:

  ` Método de proyecto CLIENTE IMPORTAR
  ` CLIENTE IMPORTAR ( Puntero ; Alfa )
  ` CLIENTE IMPORTAR ( -> [Tabla] ; Formulario de entrada )
 
 C_POINTER($1)
 C_STRING(31;$2)
 C_TIME($vhDocRef)
 C_BLOB($vxData)
 C_LONGINT(spErrCode)
 
  ` Seleccione el documento a importar
 $vhDocRef:=Open document("")
 If(OK=1)
  ` Si un documento fue seleccionado, no lo deje abierto
    CLOSE DOCUMENT($vhDocRef)
    $vhHoraInicial:=Current time
  ` Trate cargarlo en memoria
    DOCUMENT TO BLOB(Document;$vxData)
    If(OK=1)
  ` Si el documento puede ser cargado en el BLOB,
  ` Inicie el procedimiento almacenado que importará los datos en el equipo servidor
       $spProcessID:=Execute on server("SERVIDOR IMPORTAR";32*1024;"Servidor Importando";Table($1);$2;$vxData)
  ` En este punto, ya no necesitamos más el BLOB en este proceso
       CLEAR VARIABLE($vxData)
  ` Espere la terminación de la operación realizada por el procedimiento almacenado
       Repeat
          DELAY PROCESS(Current process;300)
          GET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
          If(Undefined(spErrCode))
  ` Nota: si el procedimiento almacenado no ha inicializado su propia instancia
  ` de la variable spErrCode, puede que retorne una variable indefinida
             spErrCode:=1
          End if
       Until(spErrCode<=0)
  ` Enviemos un acuse de recibo al procedimiento almacenado
       spErrCode:=1
       SET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
       $vhHoraFinal:=Current time
       ALERT("La operación tardó"+String(0+($vhHoraFinal-$vhHoraInicial))+" segundos.")
    Else
       ALERT("No hay suficiente memoria para cargar el documento.")
    End if
 End if

He aquí el método de proyecto SERVIDOR IMPORTAR ejecutado como procedimiento almacenado:

  ` Método de proyecto SERVIDOR IMPORTAR
  ` SERVIDOR IMPORTAR ( Entero largo ; Alfa ; BLOB )
  ` SERVIDOR IMPORTAR ( Número de tabla ; Formulario de entrada ; Datos importados )
 
 C_LONGINT($1)
 C_STRING(31;$2)
 C_BLOB($3)
 C_LONGINT(spErrCode)
 
  ` La operación no ha terminado aún, asignemos 1 a spErrCode
 spErrCode:=1
 $vpTabla:=Table($1)
 FORM SET INPUT($vpTabla->;$2)
 $vsDocNombre:="Archivo import "+String(1+Random)
 DELETE DOCUMENT($vsDocNombre)
 BLOB TO DOCUMENT($vsDocNombre;$3)
 IMPORT TEXT($vpTabla->;$vsDocNombre)
 DELETE DOCUMENT($vsDocNombre)
  ` La operación ha terminado, asignemos 0 a spErrCode 0
 spErrCode:=0
  ` Espere a que el equipo cliente reciba los resultados
 Repeat
    DELAY PROCESS(Current process;1)
 Until(spErrCode>0)

Una vez estos dos métodos de proyecto hayan sido implementados en su base de datos, puede efectuar una importación basada en un procedimiento almacenado, escribiendo por ejemplo:

 CLIENTE IMPORTAR(->[Tabla1];"Import")

Con algunas pruebas comparativas, puede comprobar que con este tipo de método, la importación de los registros puede ser 60 veces más rápida que una importación clásica.

 
PROPRIEDADES 

Produto: 4D
Tema: Processos
Número 373

 
HISTÓRIA 

Modificado: 4D 2004.3

 
VER TAMBÉM 

New process

 
ARTICLE USAGE

Manual de linguagem 4D ( 4D v14 R3)
Manual de linguagem 4D ( 4D v14 R2)
Manual de linguagem 4D ( 4D v14.3)
Manual de linguagem 4D ( 4D v14 R4)

Inherited from : Execute on server ( 4D v12.4)