4D v16.3

Método banco de dados On Exit

Página Inicial

 
4D v16.3
Método banco de dados On Exit

Método banco de dados On Exit 


 

Método banco de dados On Exit  
Este comando não requer parâmetros

  

O Método banco de dados On Exit é chamado quando se sai do banco.

Este método é utilizado nos seguintes ambientes 4D:

  • 4D em modo local
  • 4D em modo remoto (do lado do cliente)
  • Aplicação 4D compilada e fusionada com 4D Volume Desktop

Nota: o Método banco de dados On Exit NÃO é invocado por 4D Server.

O Método banco de dados On Exit é invocado automaticamente por 4D; diferentemente dos métodos de projeto, você não pode chamar este método por programação. Entretanto, pode ser executado desde o editor de métodos. Igualmente pode utilizar subrotinas.

Você sai de um banco se:

  • O usuário seleciona o comando Sair do menu Arquivo no ambiente Desenho ou desde o ambiente Aplicação (Quit standard action).
  • Uma chamada é realizada ao comando QUIT 4D.
  • Um plug-in 4D faz uma chamada ao ponto de entrada QUIT 4D.

Sem importar como se inicie a saída do banco, 4D realiza as seguintes ações:

  • Se não existir um Método banco de dados On Exit, 4D aborta cada processo em execução um por um, sem distinção. Se o usuário está introduzindo dados, os registros não serão guardados.
  • Se existir um Método banco de dados On Exit , 4D começa a execução deste método em um processo local criado recentemente. Observe que sairá eventualmente de 4D, o Método banco de dados On Exit pode realizar toda a limpeza ou fechar as operações que queira, mas não pode ser negado a sair.

O Método banco de dados On Exit é perfeito para:

  • Salvar (localmente, no disco) preferências ou parâmetros a reutilizar ao começo da seguinte sessão em Método banco de dados On Startup.
  • Realizar outras ações automaticamente cada vez que se salga de la base.

Nota: não esqueça que o processo criado pelo Método banco de dados On Exit é um processo local/cliente, portanto não pode acessar ao arquivo de dados. Se o Método banco de dados On Exit realiza uma consulta ou uma ordenação, um cliente 4D que está a ponto de sair quedará "congelado" e em realidade não sairá da aplicação. Se necessita acessar a dados quando um cliente sai da aplicação, cria um novo processo global desde o qual o Método banco de dados On Exit possa acessar ao arquivo de dados. Neste caso, tenha certeza  de que o novo processo termine corretamente antes do final da execução do Método banco de dados On Exit (utilizando por exemplo variáveis interprocesso).

Nota: em um ambiente cliente/servidor, Método banco de dados On Exit se comporta de maneira diferente dependendo de se o usuàrio sair manualmente (via o comando de menu Sair ou uma chamada ao comando QUIT 4D) ou que 4D Server se feche, o que obriga a todos os clientes a sair.

Quando sair de 4D Server e se dá um tempo de corte (por exemplo, 10 minutos), cada cliente conectado mostra uma mensagem de advertência e se o usuário sair durante o período de tempo determinado, o Método banco de dados On Exit é executado normalmente. Entretanto, em outros casos (por exemplo, o usuário não responde a tempo, o servidor solicita sar imediatamente ou o administrador desconecta manualmente ao cliente), o Método banco de dados On Exit se executa ao mesmo tempo que a conexão ao servidor se fecha. Como resultado, o código em Método banco de dados On Exit não pode iniciar outro processo local ou de servidor e não pode esperar a que se cancelem outros processos (nem esses processos podem seguir acessando ao servidor). Se tentar fazer isso, um erro de rede é gerado (como 10001 ou 10002) já que a conexão ao servidor já está fechada.

Para deter corretamente os processos em execução no caso de paradas inesperadas, deve probar o comando Process aborted em cada loop (for, while, repeat) o que pode durar mais de um segundo. Process aborted devolve true se 4D (local, remoto ou 4D Server) estiver a ponto de sair, o que significa que o processamento estiver a ponto de parar imediatamente. Neste caso, cancele todos os processos (CANCEL TRANSACTION, etc.)  e saia o mais rápido possível. Mesmo que tenha tempo, se o usuário sair manualmente, não terá tempo se a aplicação for forçada a sair.

Exemplo  

O seguinte exemplo cobre todos os métodos utilizados em um banco que siga os eventos mais importantes que ocorram durante uma sessão de trabalho e escreve uma descrição em um documento de texto chamado “Diário.”

  • O Método banco de dados On Startup inicializa a variável interprocesso vbQuit4D, a qual assinala os processos utilizados sem importar si está saindo ou não do banco. Também cria o arquivo de diário, se não existir ainda.
  ` Método banco On Startup
 C_TEXT(◊vtIPMensagem)
 C_BOOLEAN(◊vbQuit4D)
 ◊vbQuit4D:=False
 
 If(Test path name("Diario")#Is a document)
    $vhDocRef:=Create document("Diario")
    If(OK=1)
       CLOSE DOCUMENT($vhDocRef)
    End if
 End if
 ESCREVER DIÁRIO("Abertura de sessão")
  • O método projeto ESCREVER DIÁRIO, utilizado como subrotina por outros métodos, escreve a informação que recebe, no arquivo diário:
  ` Método projeto ESCREVER DIÁRIO
  ` ESCREVER DIÁRIO ( Texto )
  ` ESCREVER DIÁRIO ( Descrição evento )
 C_TEXT($1)
 C_TIME($vhDocRef)
 
 While(Semaphore("$Diario"))
    DELAY PROCESS(Current process;1)
 End while
 $vhDocRef:=Append document("Diario")
 If(OK=1)
    PROCESS PROPERTIES(Current process;$vsNomeProcesso;$vlEstado;$vlTempo;$vbVisivel)
    SEND PACKET($vhDocRef;String(Current date)+Char(9)+String(Current time)+Char(9)
    +String(Current process)+Char(9)+$vsNomeProcesso+Char(9)+$1+Char(13))
    CLOSE DOCUMENT($vhDocRef)
 End if
 CLEAR SEMAPHORE("$Diario")

Note que o documento é aberto e fechado todas as vezes. Também observe que o uso de um semáforo como “proteção de acesso” ao documento—não queremos dois processos tratando de acessar o arquivo diário ao mesmo tempo.

  • O método projeto M_AGREGAR_REGISTROS se executa quando o comando de menu Agregar registro é selecionado no ambiente Aplicação:
  ` Método de projeto M_AGREGAR_REGISTROS
 SET MENU BAR(1)
 Repeat
    ADD RECORD([Tabela1];*)
    If(OK=1)
       ESCREVER DIÁRIO("Adição do registro #"+String(Record number([Tabela1]))+" em Tabela1")
    End if
 Until((OK=0) | ◊vbQuit4D)

Este método realiza um loop até que o usuário que o usuário cancele a entrada de dados ou saia do banco.

  • O formulário de entrada para [Tabla 1] inclui o tratamento dos eventos On Outside Call. De maneira que, inclusive se um processo está em entrada de dados, pode sair sem problemas e o usuário pode salvar ou não a entrada de dados atual:
  ` Método de formulário [Tabela1];"Entrada"
 Case of
    :(Form event=On Outside Call)
       If(◊vtIPMessage="QUIT")
          CONFIRM("Deseja salvar as modificações realizadas a este registro?")
          If(OK=1)
             ACCEPT
          Else
             CANCEL
          End if
       End if
 End case
  • O método projeto M_QUIT é executado quando o comando Sair do menu Arquivo é selecionado no ambiente Aplicação:
  ` Método de projeto M_QUIT
 $vlProcessID:=New process("SAIR";32*1024;"$SAIR")

Este método utiliza um truque. Quando se chama a QUIT 4D, o comando tem um efeito imediato. Portanto, o processo do qual se faz a chamada está em “modo detenção” até que o banco se fecha em realidade. Como este processo pode ser um dos processos no qual ocorra a entrada de dados, a chamada a QUIT 4D se realiza em um processo local que começa apenas com este propósito. Este é o método SAIR:

  ` Método de projeto SAIR
 CONFIRM("¿Está seguro de que deseja sair?")
 If(OK=1)
    ESCREVER DIARIO("Saída do banco")
    QUIT 4D
  ` QUIT 4D tem um efeito imediato, nenhuma linha de código a continuação será executada
  ` ...
 End if
  • Finalmente, há aqui o Método banco de dados On Exit o qual indica a todos os processos de usuário abertos que “É hora de sair!”. A variável <>vbQuit4D toma o valor True e envia mensagens interprocesso aos processos de usuário que estão realizando entrada de dados:
  ` Método de banco On Exit
 ◊vbQuit4D:=True
 Repeat
    $vbFeito:=True
    For($vlProceso;1;Count tasks)
       PROCESS PROPERTIES($vlProcesso;$vsNomeProcesso;$vlEstado;$vlTempo;$vbVisivel)
       If(((($vsNomeProcesso="ML_@")|($vsNomeProcesso="M_@")))&($vlEstado>=0))
          $vbHecho:=False
          ◊vtIPMensagem:="SAIR"
          BRING TO FRONT($vlProcesso)
          CALL PROCESS($vlProcesso)
          $vhInicio:=Current time
          Repeat
             DELAY PROCESS(Current process;60)
          Until((Process state($vlProceso)<0)|((Current time-$vhInicio)>=?00:01:00?))
       End if
    End for
 Until($vbFato)
 ESCRIBIR DIARIO("Fechamento de sessão")

Nota: Os processos que começam com "ML_..." ou "M_..." são iniciados por comandos de menu para os quais a propriedade Novo processo tiver sido selecionada. Neste exemplo, estes são os processos iniciados quando se selecionar o comando de menu Agregar registro.

A prova (Current time-$vhInicio)>=?00:01:00? permite ao método de banco sair do loop “a espera de outro processo” se o outro processo não agir de imediato.

O seguinte é um exemplo típico de um arquivo de diário produzido pelo banco:
2/6/03 15:47:25 1Abertura de sessão processo principal
2/6/03 15:55:43 5 ML_1Adição do registro #23 en Tabela1
2/6/03 5:55:46 5 ML_1Adição do registro #24 en Tabela1
2/6/03 15:55:54 6 $DO_QUITSair do banco
2/6/03 15:55:58 7 $xxFechar sessão

Nota: $xx é o nome do processo local iniciado por 4D para executar o Método banco de dados On Exit.



Ver também 

Método banco de dados On Startup
QUIT 4D

 
PROPRIEDADES 

Produto: 4D
Tema: Métodos banco de dados

 
HISTÓRIA 

Criado por:

 
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)