Fazendo uma consulta que lista notas de clientes e fornecedores em uma única query

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çãoTipoRelacionamento
Notas de Devolução / Usa FornecedorF2_TIPO igual a B ou DTabela SA2: F2_CLIENTE com A2_COD e F2_LOJA com A2_LOJA
Outras NotasOutros tipos no F2_TIPOTabela 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:

  1. Montar a query com base na SF2
  2. No seu where, filtre um período, no nosso exemplo, Julho de 2022
  3. Adicione dois joins, um com a tabela SA1 de Clientes e um com a tabela SA2 de Fornecedores, sendo que ambos utilize LEFT
  4. 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:

Exemplo da Query

 

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Eduso disse:

    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.

Deixe uma resposta

Terminal de Informação