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

ModoCompartilhamentoxFilial retorna
E (Exclusiva)Por filial — cada filial tem dados propriosCodigo da filial
C (Compartilhada)Todas filiais da empresa veem mesmos dados"" (vazio)
P (Exclusiva por Empresa)Por empresa, mas compartilhada entre filiaisCodigo da empresa
D (Dependente)Heranca de outra tabelaDepende

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:

Pegadinhas em customizacao

Veja também