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.

Deixe uma resposta

Terminal de Informação