Por que algumas tabelas tem xFilial e outras nao?
A logica do compartilhamento entre filiais em Protheus, e por que SA1 pode ser "exclusiva" em uma empresa e "compartilhada" em outra.
Toda tabela Protheus tem campo X_FILIAL (ex: A1_FILIAL, SE1->E1_FILIAL). Mas o conteudo desse campo varia: as vezes e a filial do usuario, as vezes e "" (compartilhado), as vezes e prefixo da empresa.
Os 4 modos de uma tabela na SX2
| Modo | Compartilhamento | xFilial retorna |
|---|---|---|
E (Exclusiva) | Por filial — cada filial tem dados proprios | Codigo da filial |
C (Compartilhada) | Todas filiais da empresa veem mesmos dados | "" (vazio) |
P (Exclusiva por Empresa) | Por empresa, mas compartilhada entre filiais | Codigo da empresa |
D (Dependente) | Heranca de outra tabela | Depende |
Por que SA1 pode ser dos dois jeitos
SA1 (Clientes) e classicamente compartilhada: faz sentido que o cliente da matriz seja o mesmo cliente da filial 02. Mas em empresas multi-CNPJ com cadastros separados, pode ser configurada como exclusiva.
Essa configuracao mora na SX2, campo X2_MODO. E ela determina o que xFilial("SA1") retorna:
// Se SA1 esta compartilhada
ConOut(xFilial("SA1")) // "" (vazio)
// Se SA1 esta exclusiva por filial
ConOut(xFilial("SA1")) // "01" (filial atual)
Por isso voce SEMPRE usa xFilial
Voce nunca sabe a-priori. Hardcodar "01" quebra em base com compartilhamento ativo. Hardcodar "" quebra em base exclusiva. xFilial("SA1") abstrai isso — retorna o valor correto pra essa empresa, nessa tabela, nessa configuracao.
// SEMPRE assim
SA1->(DBSeek(xFilial("SA1") + cCod))
// NUNCA assim
SA1->(DBSeek("01" + cCod)) // quebra se compartilhada
SA1->(DBSeek("" + cCod)) // quebra se exclusiva
Pra que serve a flexibilidade
Real example:
- Holding A com 5 lojas — cadastra cliente UMA vez (SA1 compartilhada). Acelera vendas multi-loja.
- Holding B com 3 CNPJs independentes — cada um quer seu cadastro fiscal proprio (SA1 exclusiva por empresa).
- Grupo C com franchise — todos compartilham produtos (SB1 compartilhada) mas cada franquia tem clientes proprios (SA1 exclusiva).
Pegadinhas em customizacao
- Cliente trocou modo entre projetos — codigo que funcionava em homolog quebra em prod se modos divergem.
- Sempre crie indice com X_FILIAL primeiro — performance e migracao de modo precisam disso.
- Reports multi-filial — pra somar todas filiais, loop sobre SM0 + xFilial dinamico.