A importância do GetArea e RestArea

Hoje vou falar sobre a importância de se usar GetArea e RestArea em suas customizações.

O recurso FWGetArea serve para fazer um backup do que está vindo do Protheus, e o FWRestArea serve para restaurar esse backup.

Imagine o seguinte contexto, você é um pizzaiolo, e está preparando uma pizza, de repente do nada entra um garçom correndo e te pergunta “Chef, tem catupiry ainda?”, ai você para o que está fazendo, vai verificar, volta e fala, ó tem sim, ai quando você vai continuar sua pizza, ela era de qual sabor? Tinha borda recheada? Tinha alguma observação (como retirar cebolas)?

Basicamente é isso que acontece com o Protheus, imagine que você está cadastrando um produto, ai ele passa por um ponto de entrada (garçom vindo correndo), ai nesse ponto de entrada você faz várias validações (procurar catupiry), quando você acaba, o Protheus espera que você continue o que estava fazendo no mesmo ponto em que parou (continuar a pizza).

Por isso, quando criamos a função, precisamos falar, ó Protheus estamos pegando o sistema assim (preparando uma pizza de calabresa), ai você faz suas tratativas, e depois fala, ó Protheus pode continuar onde você estava (acabando de preparar a pizza de calabresa).

Do contrário, pode acontecer bugs e coisas, do tipo, Protheus, ó estamos pegando o sistema assim (preparando a pizza de calabresa), ó Protheus acabamos, pode continuar seu strogonoff de frango.

Por isso jovens, o indicado é sempre usarmos FWGetArea e FWRestArea em nossas customizações, e se soubermos o alias que iremos manipular, usar apontando para ele também, por exemplo, abaixo um ponto de entrada no cadastro de produtos. Notem que é criado dois FWGetArea, um geral e um específico da SB1, e depois é voltado o backup deles com FWRestArea.

User Function A010TOK()
	Local aArea    := FWGetArea()
	Local aAreaSB1 := SB1->(FWGetArea())
	Local lRet     := .T.
	
	//Aqui suas customizações
	
	FWRestArea(aAreaSB1)
	FWRestArea(aArea)
Return lRet

Uma observação importante pessoal, é que as funções GetArea e RestArea ganharam uma revisão e se tornaram as funções FWGetArea e FWRestArea. Então tentem sempre utilizar a versão mais atual das funções, que nesse caso é a FWGetArea e FWRestArea pois elas podem receber melhorias de performance, correções, entre outras coisas.

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

4 Responses

  1. Wanderson Fernandes de Souza disse:

    Boa Dica Daniel,

    Abraço…

  2. Victor Hugo disse:

    Olá, obrigado pelo conteúdo! só não entendi porque esse GetArea() é gerado suas vezes.
    um geral e um especifico, mas por padrão as áreas no Protheus não ficam abertas?
    é necessário criar duas GetArea() sempre e FWGetArea() e GetArea() são a mesma coisa?

    • Bom dia Victor, tudo joia?

      Vamos as suas dúvidas:
      1. Por padrão as áreas no Protheus não ficam abertas?
      R: Depende, imagina que dentro de um ponto de entrada, alguém foi e deu um DbCloseArea em um alias, ou pior, estava vindo um registro por exemplo, código 00001 e alguém foi e deu um DbSkip para o registro 00002, o sistema irá continuar em qual registro? Por isso usamos essas funções para criar um backup de como estava a tabela, e para como ela deve voltar (caso queira se aprofundar, no curso de pontos de entrada, nós exemplificamos isso na aula 3 – https://terminaldeinformacao.com/2023/09/05/curso-pontos-de-entrada/ )

      2. É necessário criar duas GetArea() sempre?
      R: Não, é necessário criar a quantidade que você for manipular. Se você não for manipular nenhum alias, ai cria apenas 1. Agora se você for manipular por exemplo, o alias do pedido (SC5), dos itens do pedido (SC6), do cliente (SA1) e da transportadora (SA4), ai você teria 5, sendo algo como:
      aArea := FWGetArea() //geral
      aAreaSC5 := SC5->(FWGetArea()) //pedido
      aAreaSC6 := SC6->(FWGetArea()) //itens do pedido
      aAreaSA1 := SA1->(FWGetArea()) //cliente
      aAreaSA4 := SA4->(FWGetArea()) //transportadora

      3. FWGetArea() e GetArea() são a mesma coisa?
      R: Não, a FW é mais recente e recebe melhorias em otimizações e performances no geral. Ela é como se fosse uma versão aprimorada da antiga. Se fôssemos fazer uma comparação, a FWGetArea é como se fosse o Windows 10 / 11, e a GetArea é como se fosse o Windows 7 (ou seja, a antiga ainda funciona, mas o ideal é você ir usando as versões mais novas).

      Um grande abraço.

Deixe uma resposta para Wanderson Fernandes de SouzaCancelar resposta

Terminal de Informação