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.