No artigo de hoje, vamos demonstrar em como montar uma query, que na mesma traga informação de duas tabelas diferentes, por exemplo, notas da SF2 que mostrem o nome do Fornecedor (SA2) ou do Cliente (SA1).
Algumas tabelas do Protheus, podem apresentar informações e relacionamentos de campos com mais de uma tabela. No nosso exemplo, vamos tomar como base a tabela SF2 (notas de saída), sendo que ela pode ter os seguintes cenários:
| Descrição | Tipo | Relacionamento |
| Notas de Devolução / Usa Fornecedor | F2_TIPO igual a B ou D | Tabela SA2: F2_CLIENTE com A2_COD e F2_LOJA com A2_LOJA |
| Outras Notas | Outros tipos no F2_TIPO | Tabela SA1: F2_CLIENTE com A1_COD e F2_LOJA com A1_LOJA |
Agora imagina ter que montar em uma única query (sem utilizar union), e nessa query, trazer o nome do fornecedor e do cliente dependendo do tipo da nf.
A lógica seria +- assim:
- Montar a query com base na SF2
- No seu where, filtre um período, no nosso exemplo, Julho de 2022
- Adicione dois joins, um com a tabela SA1 de Clientes e um com a tabela SA2 de Fornecedores, sendo que ambos utilize LEFT
- Nos campos do Select, utilize CASE para testar o F2_TIPO, e se ele for B ou D, pegue informações da SA2 do contrário, pegue da SA1
Abaixo um print de exemplo:
E abaixo o código da query:
SELECT
F2_DOC AS DOCUMENTO,
F2_SERIE AS SERIE,
F2_EMISSAO AS DT_EMISSAO,
F2_CLIENTE AS CODIGO,
CASE
WHEN F2_TIPO IN ('B', 'D') THEN 'FORNECEDOR'
ELSE 'CLIENTE'
END AS TIPO,
CASE
WHEN F2_TIPO IN ('B', 'D') THEN A2_NOME
ELSE A1_NOME
END AS NOME
FROM
SF2010 SF2
LEFT JOIN SA1010 SA1 ON (
A1_FILIAL = ' '
AND A1_COD = F2_CLIENTE
AND A1_LOJA = F2_LOJA
AND SA1.D_E_L_E_T_ = ' '
)
LEFT JOIN SA2010 SA2 ON (
A2_FILIAL = ' '
AND A2_COD = F2_CLIENTE
AND A2_LOJA = F2_LOJA
AND SA2.D_E_L_E_T_ = ' '
)
WHERE
F2_FILIAL = '0101'
AND F2_EMISSAO >= '20220701'
AND F2_EMISSAO <= '20220731'
AND SF2.D_E_L_E_T_ = ' '
Bom pessoal, por hoje é só.
Abraços e até a próxima.

Olá Daniel.
Estou com uma questão com uma empresa que trabalha com vendas via distribuidores para o cliente final, a nota fiscal deve estar em nome do cliente final, porém o financeiro (boleto ou outros) deve estar em nome do distribuidor. É possível esse processo no Protheus?
Já procureis documentação sobre e não achei.
Desde já, Obrigado.
Bom dia Eduardo, tudo joia?
Infelizmente eu nunca vi, então não vou saber afirmar se realmente existe algo assim no padrão do sistema.
O que eu recomendaria, seria abrir um chamado na TOTVS ou chat, perguntando se tem isso no padrão do Protheus, e se tiver, se podem mandar a documentação de como parametrizar o sistema.
Se não tiver algo no padrão, uma ideia seria:
a. Criar um campo customizado na SC5, que defina o código do distribuidor na SA1
b. Criar o ponto de entrada no momento que gera a SE1 ao faturar e gerar a SF2
c. Nesse ponto de entrada, você valida, se esta preenchido esse campo customizado
d. Você altera o código do cliente na SE1 no lugar do consumidor final para o do distribuidor
Lembrando que como o cliente é campo chave na SE1, precisaria testar bem, e estressar bastante a rotina e as paralelas (baixas, bordero, cnab, etc) para ver se o comportamento funcionaria bem.
Tenha uma ótima e abençoada quinta feira.
Um forte abraço.