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.
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.
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:
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:
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:
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:
$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:
CONFIRM("¿Está seguro de que deseja sair?")
If(OK=1)
ESCREVER DIARIO("Saída do banco")
QUIT 4D
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:
◊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 1 | Abertura de sessão processo principal |
2/6/03 | 15:55:43 5 ML_1 | Adição do registro #23 en Tabela1 |
2/6/03 | 5:55:46 5 ML_1 | Adição do registro #24 en Tabela1 |
2/6/03 | 15:55:54 6 $DO_QUIT | Sair do banco |
2/6/03 | 15:55:58 7 $xx | Fechar sessão |
Nota: $xx é o nome do processo local iniciado por 4D para executar o Método banco de dados On Exit.