GetArea/RestArea
Preserva e restaura o estado da area de trabalho (alias, ordem, posicao). Pattern obrigatorio em funcoes utilitarias.
Assinatura: aArea := GetArea() // RestArea(aArea) -> NIL
Retorna: Array (GetArea) / NIL (RestArea)
Dupla de funcoes fundamental pra escrever codigo educado. GetArea retorna um array com alias atual, ordem, recno; RestArea restaura. Sem isso, sua funcao bagunça a area da funcao chamadora.
Padrao basico
User Function MinhaFunc()
Local aArea := GetArea() // salva estado
Local aAreaSA1 := SA1->(GetArea()) // salva especifico de SA1
SA1->(DBSetOrder(1))
SA1->(DBSeek(xFilial("SA1") + cCod))
// ... trabalho
RestArea(aAreaSA1) // restaura SA1
RestArea(aArea) // restaura geral
Return
Quando usar
- Toda funcao utilitaria que mexe em tabela — User Function chamada por outros
- Pontos de Entrada — voce nao sabe o estado da rotina que te chamou
- Antes de loops que mudam ordem ou alias
Pegadinhas
- RestArea so funciona se a area ainda existir — se voce fechou (
DBCloseArea) entre o GetArea e o RestArea, restaurar quebra. - Preserve por tabela —
SA1->(GetArea())e mais barato queGetArea()geral. - Esquecer o RestArea em codigo com varios
Return— saidas precoces vazam o estado. - Begin Sequence — coloque o RestArea no
Recovertambem.
Exemplos
Funcao bem-comportada
User Function GetNomeCli(cCod)
Local cNome := ""
Local aArea := SA1->(GetArea())
SA1->(DBSetOrder(1))
If SA1->(DBSeek(xFilial("SA1") + cCod))
cNome := AllTrim(SA1->A1_NOME)
EndIf
RestArea(aArea)
Return cNome