4D v16.3

Execute on server

Página Inicial

 
4D v16.3
Execute on server

Execute on server 


 

Execute on server ( proced ; pilha {; nome {; param {; param2 ; ... ; paramN}}}{; *} ) -> Resultado 
Parâmetro Tipo   Descrição
proced  String in Procedimento a executar no processo
pilha  Inteiro longo in Tamanho da pilha em bytes
nome  String 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.

O parâmetro pilha permite indicar a quantidade de memória atribuída para a pilha do processo. É o espaço em memória utilizada para "empilhar" chamadas de método, as variáveis ​​locais, parâmetros nas sub-rotinas e registros empilhados.

  • Passe 0 em pilha para usar um tamanho da pilha padrão, adequado para a maioria das aplicações (configuração recomendada).
  • Em certos casos especiais, você pode querer usar um valor personalizado. Ele deve ser expresso em bytes. Recomenda-se para passar um mínimo de 64 KB (cerca de 64.000 bytes) epode usar valores acima de 512 KB, em particular, se o processo pode realizar chamadas de longas cadeias (sub-rotinas de chamada em cascata).

Nota: A pilha não é o total de memória para o processo. Processos compartilham memória para registros, variáveis ​​entre processos, e assim por diante. Um processo também usa memória extra para armazenar suas variáveis ​​de processo. A pilha contém vários itens de informações internas 4D; a quantidade de informação guardada na pilha depende do número de método aninhada chama o processo empregará, o número de formularios que irão abrir antes de fechar os e o número e tamanho das variáveis ​​locais utilizadas em cada chamada de método aninhada.

Nota para 64-bit 4D Server: A pilha para um processo executado em um 4D Server de 64 bits geralmente requer mais memória do que em um servidor 4D de 32 bits (cerca de duas vezes mais). Certifique-se de que você verifique este parâmetro quando o código é destinado para execução em um servidor 4D de 64 bits.

O nome do novo processo é passado em nome. Em monousuário, este nome aparece na lista de processos ambiente de Design, e será devolvido pelo comandoPROCESS PROPERTIES quando aplicada a este novo processo. Em Cliente / Servidor, esse nome aparece em azul na lista de procedimentos armazenados da janela principal de 4D Server.

Você pode omitir este parâmetro; se isso acontecer, o nome do processo é uma string vazia.

Atenção: Ao contrário do comando
New process, não tente fazer com que o processo seja local em escopo,  colocando o prefixo cifrão ($)  enquanto usa o comando Execute on server. Isso irá funcionar corretamente em um único usuário, porque Execute on server age  como New process neste ambiente. Por outro lado, em cliente / servidor, este irá gerar um erro.

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  

O exemplo abaixo mostra como a importação de dados pode ser acelerada de maneira dramática em Cliente/Servidor. O método Importacion Clasica listado abaixo permite medir quanto tempo leva uma importação de registros utilizando o comando IMPORT TEXT no lado Cliente

  `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

Ao importar dados de maneira clássica, 4D Client analisa o arquivo ASCII, em seguida, para cada registro, cria um novo registro, preenche os campos com os dados importados e envia o registro para o servidor para que ele possa ser adicionado à unidade básica. Portanto, há muitas solicitações circulando pela rede. Uma forma de otimizar a operação é usar um procedimento armazenado para fazer o trabalho localmente na máquina do servidor. A máquina cliente carrega o documento em um BLOB, inicia um procedimento armazenado passando o BLOB como parâmetro. O procedimento armazenado coloca o BLOB em um documento no disco da máquina do servidor, depois importa o documento localmente. Portanto, a importação de dados ocorre localmente, a uma velocidade comparável à de uma versão independente de 4D, porque a maioria dos pedidos que circulam na rede foram eliminados. Este é o método de projeto CLIENTE IMPORTAR. Executado no computador cliente, inicia a execução do procedimento armazenado SERVIDOR IMPORTAR, listados abaixo:

  ` Método de projeto CLIENTE IMPORTAR
  ` CLIENTE IMPORTAR ( Ponteiro ; Alfa )
  ` CLIENTE IMPORTAR ( -> [Tabela] ; Formulario de entrada )
 
 C_POINTER($1)
 C_STRING(31;$2)
 C_TIME($vhDocRef)
 C_BLOB($vxData)
 C_LONGINT(spErrCode)
 
  ` Selecione o documento a importar
 $vhDocRef:=Open document("")
 If(OK=1)
  ` Se um documento for selecionado, não o deixe aberto
    CLOSE DOCUMENT($vhDocRef)
    $vhHoraInicial:=Current time
  ` Tente carregar na memória
    DOCUMENT TO BLOB(Document;$vxData)
    If(OK=1)
  ` Se o documento puder ser carregado no BLOB,
  ` Inicie o procedimento armazenado que importará os dados na máquina servidor
       $spProcessID:=Execute on server("SERVIDOR IMPORTAR";32*1024;"Servidor Importando";Table($1);$2;$vxData)
  ` Neste ponto, já não necessitamos mais ao BLOB neste processo
       CLEAR VARIABLE($vxData)
  ` Espere o término da operação realizada pelo procedimento armazenado
       Repeat
          DELAY PROCESS(Current process;300)
          GET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
          If(Undefined(spErrCode))
  ` Nota: se o procedimento armazenado não tiver inicializado sua própria instância
  ` da variável spErrCode, pode ser que retorne uma variável indefinida
             spErrCode:=1
          End if
       Until(spErrCode<=0)
  ` Envia um aviso de recibo ao procedimento armazenado
       spErrCode:=1
       SET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
       $vhHoraFinal:=Current time
       ALERT("A operação demorou"+String(0+($vhHoraFinal-$vhHoraInicial))+" segundos.")
    Else
       ALERT("Não há suficiente memória para carregar o documento.")
    End if
 End if

Abaixo o método de projeto SERVIDOR IMPORTAR executado como procedimento armazenado:

  ` Método de projeto SERVIDOR IMPORTAR
  ` SERVIDOR IMPORTAR ( Entero largo ; Alfa ; BLOB )
  ` SERVIDOR IMPORTAR ( Número de tabela ; Formulario de entrada ; Dados importados )
 
 C_LONGINT($1)
 C_STRING(31;$2)
 C_BLOB($3)
 C_LONGINT(spErrCode)
 
  ` A operação ainda não terminou, atribuimos 1 a spErrCode
 spErrCode:=1
 $vpTabela:=Table($1)
 FORM SET INPUT($vpTabela->;$2)
 $vsDocNome:="Archivo import "+String(1+Random)
 DELETE DOCUMENT($vsDocNome)
 BLOB TO DOCUMENT($vsDocNome;$3)
 IMPORT TEXT($vpTabela->;$vsDocNome)
 DELETE DOCUMENT($vsDocNome)
  `
 <code class="rte4d_cod">A operação terminou
, atribuimos 0 a spErrCode 0
spErrCode:=0
` Espere a que a maquina cliente receba os resultados
Repeat
DELAY PROCESS(Current process;1)
Until (spErrCode>0)

Quando estes dois métodos de projeto tenham sido implementados em seu banco de dados, pode realizar uma impotação baseada em um procedimento armazenado, escrevendo por exemplo

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

Com algumas provas  comparativas, pode comprovar que com este tipo de método, a importação dos registros pode ser 60 vezes mais rápida que uma importação clássica.



Ver também 

New process

 
PROPRIEDADES 

Produto: 4D
Tema: Processos
Número 373

 
HISTÓRIA 

Modificado: 4D 2004.3

 
ARTICLE USAGE

Manual de linguagem 4D ( 4D v16)
Manual de linguagem 4D ( 4D v16.1)
Manual de linguagem 4D ( 4D v16.2)
Manual de linguagem 4D ( 4D v16.3)