DBSelectArea em ADVPL — Como Posicionar Áreas de Trabalho

Tempo de leitura: 5 minutos

No desenvolvimento de rotinas customizadas no ERP Protheus, a manipulação de múltiplas tabelas simultaneamente é uma constante. Seja para realizar um join manual, validar dados entre diferentes módulos ou gerar relatórios complexos, o desenvolvedor precisa saber exatamente em qual “gaveta” de dados está operando. A função DBSelectArea em ADVPL é o comando fundamental responsável por alternar o foco da thread entre as diversas áreas de trabalho abertas, sendo um conceito vital dentro de ADVPL no Protheus: Dados e Estrutura.

 

Neste guia completo, vamos explorar o funcionamento da DBSelectArea, entender a diferença entre selecionar por número ou por Alias e aplicar as melhores práticas de SQL e Banco de Dados para evitar erros de posicionamento em suas customizações. Se você trabalha com o Dicionário de Dados ADVPL, dominar esta função é o primeiro passo para garantir que suas consultas reflitam a realidade do banco de dados configurado no SIGACFG.

 

O que é a função DBSelectArea e para que serve?

A função DBSelectArea em ADVPL serve para ativar uma área de trabalho (Alias) que já foi aberta anteriormente através de funções como DBUseArea ou consultas SQL via TCGenQry.

 

Quando o Protheus executa um comando que lê um campo (ex: SA1->A1_NOME), ele precisa saber qual área está “selecionada” para realizar operações de busca como o DBSeek. Se você estiver na área da SB1 (Produtos) e tentar buscar um cliente sem antes usar a DBSelectArea, o sistema retornará erro ou buscará na tabela errada, gerando inconsistências graves.

 

Sintaxe:

DBSelectArea(xArea)

 

Parâmetro(s):

Observações:

  • xArea pode ser do tipo numérico, indicando o número da área de trabalho, ou do tipo caractere, indicando o alias de uma área de trabalho;
  • Após a seleção de uma área de trabalho, todas as operações subsequentes serão realizadas nesta área de trabalho, a menos que outra área seja informada ou que se utilize alias para se referenciar a outra área de trabalho;
  • Se xArea contiver uma string com uma alias que não foi aberto, o programa será encerrado com ocorrência de erro recuperável “Alias does not exist: AAA“, onde AAA indica o alias informado;
  • Se xArea contiver um número menor ou igual a 0 (zero) ou for maior que o número de áreas de trabalho informado pela chave “MaxWorkAreas” da seção do ambiente no arquivo ini(appserver.ini) do AppServer, o programa será encerrado com ocorrência de erro recuperável “Work area does not exist“;
  • Se for informado em xArea um número de área de trabalho válido, mas não aberto, ou uma string com um alias inexistente, ou o valor nulo (Nil), a área de trabalho atual será desativada;
  • Cada área de trabalho corresponde às informações de um único alias.

Exemplo da função DBSelectArea em ADVPL:

#include 'protheus.ch'
#INCLUDE "TBICONN.CH"
/*{Protheus.doc} User Function fDBSelAr
    (Essa função tem por finalidade mostrar a função DBSelectArea em ADVPL)
    @type  Function
    @author Adilio Costa
    @since 05/12/2023
    @version 1
    @Inscreva-se no Blog ProtheusAdvpl:
https://www.protheusadvpl.com.br
@Inscreva-se no Canal ProtheusAdvpl:
https://www.youtube.com/protheusadvpl
@Siga-nos no Instagram:
https://www.instagram.com/protheusadvpl
@Conheça os Cursos do ProtheusAdvpl:
https://cursos-e-formacoes-protheusadvpl.gr-site.com/

@Participe de nossas comunidades no WhatsApp:
-Comunidade Protheus Backoffice:https://chat.whatsapp.com/KMUIAjwZ6EZ6eAHsLkPTyb
-Comunidade Protheus-RH:https://chat.whatsapp.com/L5dUyAna6xU4ylG5DUgfOW
-Comunidade Protheus-Programação:https://chat.whatsapp.com/LsD6z0apdqKHlOz67bcaEn
-Comunidade Protheus-Framework:https://chat.whatsapp.com/BzUFpjaSnTC3vtsfa77jmG

|Se esse conteúdo foi útil pra você nos ajude divulgando 
ele e nossas redes sociais!!|

*/

User Function fDBSelAr()
	Local aArea    := GetArea()
    Local cCodFor
    Local cNomeFor := ""
    
    //Definindo a tabela SA2(Fornecedores) como à área de trabalho ativa
    DBSelectArea("SA2")
    SA2->(DBSetOrder(1))
    /*
    Como o SA2 é o alias selecionado, os comandos a partir da seleção do alias compreendem que ele
    está implícito na expressão, o que causa o mesmo efeito de SA2->A2_COD e SA2->A2_NOME
    */
    cCodFor := cValToChar(A2_COD)
    cNomeFor := A2_NOME
     
    MsgInfo("Código do Fornecedor:"+cCodFor+",Nome do Fornecedor:"+cNomeFor,"Função DBSelectArea")
    
    //Fechando a tabela de Fornecedores
    SA2->(DBCloseArea())
     
    RestArea(aArea)

Return

Boas Práticas e Cuidados com DBSelectArea

No dia a dia do ADVPL Avançado no Protheus, o uso indiscriminado da DBSelectArea pode tornar o código confuso. Aqui estão as diretrizes de ouro:

 
  1. Use a função Select antes: Sempre valide se a área está aberta com a função Select antes de tentar selecioná-la.
  2. Prefira Operadores de Alias: Em vez de ficar alternando áreas com DBSelectArea o tempo todo, você pode usar o operador ->. Exemplo: (cAlias)->(DBSeek(…)). Isso executa o comando na área específica sem mudar a área ativa da thread, o que é muito mais elegante e seguro.
  3. Cuidado com o SIGACFG: Certifique-se de que as tabelas que você está tentando selecionar estão corretamente configuradas no SIGACFG.
 

Conclusão

A função DBSelectArea em ADVPL é um dos primeiros comandos que todo desenvolvedor deve dominar. Ela é a base para qualquer manipulação de dados que envolva mais de uma tabela e é essencial para o bom funcionamento do SQL e Banco de Dados no Protheus. Ao entender como posicionar corretamente suas áreas de trabalho, você evita erros de “Alias does not exist” e garante que suas consultas retornem exatamente o que você espera.

 

Links de referência(s):

 

Conteúdos relacionados

 
🚀 Quer evoluir no ADVPL de verdade?

Receba conteúdos práticos, códigos prontos e dicas que você 

 não aprende na documentação oficial

✔ Funções essenciais do ADVPL
✔ Exemplos reais usados no Protheus
✔ Dicas de debug e performance

🔐 Seu email está seguro. Sem spam.

 

É isso aí, finalizamos aqui mais um post no Blog ProtheusAdvpl. Caso tenha ficado alguma dúvida deixe seu comentário ou nos envie um e-mail para adiliocosta@protheusadvpl.com.br, até um próximo post, grande abraço e fica com Deus.

🚀 Quer dominar o Protheus de verdade?
Entre para o ProtheusAdvpl e receba conteúdos exclusivos sobre desenvolvimento, infraestrutura, módulos e carreira no Protheus

✔ Conteúdos organizados por categorias (Programação, Framework, Backoffice e RH)
✔ Dicas práticas usadas no dia a dia do Protheus
✔ Acesso a materiais, post e atualizações do Blog
🔐 Seu email está seguro. Sem spam. Só conteúdo profissional.