| 4D v18Método banco de dados On Exit | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 | 
    4D v18
 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:
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:
Sem importar como se inicie a saída do banco, 4D realiza as seguintes ações:
O Método banco de dados On Exit é perfeito para:
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.”
  ` 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")  ` 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.
  ` 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.
  ` Método de formulário [Tabela1];"Entrada"
 Case of
    :(Form event code=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  ` 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  ` 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)
          POST OUTSIDE CALL($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.
	Produto: 4D
	Tema: Métodos banco de dados
	Número 
        905252
        
        
        
	
	Criado por:  
	Manual de linguagem 4D ( 4D v18)
	
	
	
 Adicionar um comentário
Adicionar um comentário