Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: Implementando Funções de Criptografia com "Nós" e "Trançados"

_Créditos da imagem: Gerada com auxílio do ChatGPT_ # Implementando Funções de Criptografia com "Nós" e "Trançados" A criptografia é um dos campos mais fascinantes da ciência da computação. Recentemente, no projeto experimental [Braided Encryption Message](https://github.com/naldodj/naldodj-braided_encryption_message), explorei como conceitos de "nós" e "trançados" podem ser aplicados na criação de algoritmos de criptografia. Este projeto, embora básico, é uma experiência rica para aprender mais sobre a implementação de funções criptográficas e algumas curiosidades relacionadas ao tema. ## Visão Geral do Projeto O repositório contém duas peças fundamentais: 1. [Arquivo C - `c_braided_encryption_message.c`](https://raw.githubusercontent.com/naldodj/naldodj-braided_encryption_message/refs/heads/main/src/c_braided_encryption_message.c): Implementa funções de criptografia em baixo nível, manipulando diretamente a estrutura dos dados para "...

BlackTDN :: Como Criar Relatórios de Cotações com Dados Agrupados Usando SQL

img: DALL·E 2024-08-09 07.00.00 - A high-quality image showcasing a detailed SQL query being written in a code editor, such as VS Code, on a dark theme background.
...
## Como Criar Relatórios de Cotações com Dados Agrupados Usando SQL

Quando trabalhamos com sistemas ERP e precisamos gerar relatórios de cotações que apresentam dados de múltiplos fornecedores, é comum encontrarmos a necessidade de pivotar registros que, originalmente, são apresentados de forma vertical. Isso é especialmente útil quando o objetivo é comparar preços ou condições de diferentes fornecedores para um mesmo produto em uma única linha do relatório.

Neste artigo, vamos explorar uma abordagem para transformar registros verticais em colunas, facilitando a impressão de relatórios que consolidam informações de vários fornecedores em uma única linha. Vamos utilizar SQL com técnicas de pivotagem, e ao final, mostraremos como estender essa técnica para um número variável de fornecedores.

### Estrutura do Relatório

Vamos imaginar um relatório que precise apresentar dados como na tabela abaixo:

```plaintext
+------------------------------------------------+-----------+----------------------+----------------------+----------------------+----------------------+
|                                                |fornecedor:|     FORNECEDOR 1     |     FORNECEDOR 2     |     FORNECEDOR 3     |     FORNECEDOR 4     | 
|                                                +-----------+----------------------+----------------------+----------------------+----------------------+
|                                                |contato:   | CONTATO FORNECEDOR 1 | CONTATO FORNECEDOR 2 | CONTATO FORNECEDOR 3 | CONTATO FORNECEDOR 4 |
|                                                +-----------+----------------------+----------------------+----------------------+----------------------+
|                                                |Codigo:    |        000001        |        000002        |        000003        |        000004        |
+--------+-----------------------------+---------+------+----+------------+---------+------------+---------+------------+---------+------------+---------+
| codigo |       descrição produto     | armazem | qtd. | un | vlr. unit. | subtotal| vlr. unit. | subtotal| vlr. unit. | subtotal| vlr. unit. | subtotal|
+--------+-----------------------------+---------+------+----+------------+---------+------------+---------+------------+---------+------------+---------+
|00000001|PRODUTO 00000001             |   01    |  10  | UN |       10,00|   100,00|       15,00|   150,00|       11,50|   115,00|       10,01|   100,10|  
+--------+-----------------------------+---------+------+----+------------+---------+------------+---------+------------+---------+------------+---------+
```

No entanto, os dados podem estar armazenados em um formato vertical:

```plaintext
+--------+-----------------------------+------+------------+-------+-----+--+-------+--------+
|codpro  |descricao                    |codfor|fornecedor  |armazem|qtd  |un|vlrunit|subtotal| 
+--------+-----------------------------+------+------------+-------+-----+--+-------+--------+
|00000001|PRODUTO 00000001             |000001|FORNECEDOR 1|01     |10.00|UN|  10.00|  100.00|
|00000002|PRODUTO 00000002             |000002|FORNECEDOR 2|01     |10.00|TN|  10.00|  100.00|
|00000003|PRODUTO 00000003             |000003|FORNECEDOR 3|02     |10.00|MT|  10.00|  100.00|
|00000004|PRODUTO 00000004             |000004|FORNECEDOR 4|01     |10.00|LT|  10.00|  100.00|
+--------+-----------------------------+------+------------+-------+-----+--+-------+--------+
```

### Solução: Usando Pivot para Transpor Registros

Para transformar a estrutura vertical em uma apresentação horizontal, podemos utilizar a técnica de `PIVOT` no SQL, criando uma consulta que agrupa os dados por produto e distribui as informações dos fornecedores em colunas distintas.

#### Passo 1: Preparando os Dados

Primeiro, vamos criar uma tabela temporária usando uma Common Table Expression (CTE) para ordenar os fornecedores:

```sql
WITH SC8_ROW AS (
    SELECT
        SC8.C8_NUM,
        SC8.C8_PRODUTO,
        SB1.B1_DESC,
        SB1.B1_LOCPAD,
        SC8.C8_QUANT,
        SC8.C8_UM,
        SC8.C8_PRECO,
        SC8.C8_TOTAL,
        SC8.C8_FORNECE,
        SC8.C8_LOJA,
        ROW_NUMBER() OVER (PARTITION BY SC8.C8_NUM, SC8.C8_PRODUTO ORDER BY SC8.C8_FORNECE, SC8.C8_LOJA) AS FornecedorRow
    FROM
        SC8010 SC8
    LEFT JOIN
        SB1010 SB1 ON SB1.B1_COD = SC8.C8_PRODUTO
    WHERE
        SC8.D_E_L_E_T_ = ' ' 
        AND SB1.D_E_L_E_T_ = ' '
)
```

Aqui, `ROW_NUMBER` é usado para gerar um número sequencial para cada fornecedor, dentro do mesmo produto. Este número será usado para dividir os fornecedores em diferentes colunas.

#### Passo 2: Criando a Tabela Pivotada

Agora, podemos usar a técnica de pivotagem para transformar as linhas em colunas:

```sql
SELECT
    C8_NUM,
    C8_PRODUTO,
    B1_DESC,
    B1_LOCPAD,
    C8_QUANT,
    C8_UM,
    MAX(CASE WHEN FornecedorRow = 1 THEN C8_FORNECE ELSE '' END) AS COD_FOR1,
    MAX(CASE WHEN FornecedorRow = 1 THEN C8_PRECO ELSE 0 END) AS VUNIT_FOR1,
    MAX(CASE WHEN FornecedorRow = 1 THEN C8_TOTAL ELSE 0 END) AS VTOT_FOR1,
    MAX(CASE WHEN FornecedorRow = 2 THEN C8_FORNECE ELSE '' END) AS COD_FOR2,
    MAX(CASE WHEN FornecedorRow = 2 THEN C8_PRECO ELSE 0 END) AS VUNIT_FOR2,
    MAX(CASE WHEN FornecedorRow = 2 THEN C8_TOTAL ELSE 0 END) AS VTOT_FOR2,
    MAX(CASE WHEN FornecedorRow = 3 THEN C8_FORNECE ELSE '' END) AS COD_FOR3,
    MAX(CASE WHEN FornecedorRow = 3 THEN C8_PRECO ELSE 0 END) AS VUNIT_FOR3,
    MAX(CASE WHEN FornecedorRow = 3 THEN C8_TOTAL ELSE 0 END) AS VTOT_FOR3,
    MAX(CASE WHEN FornecedorRow = 4 THEN C8_FORNECE ELSE '' END) AS COD_FOR4,
    MAX(CASE WHEN FornecedorRow = 4 THEN C8_PRECO ELSE 0 END) AS VUNIT_FOR4,
    MAX(CASE WHEN FornecedorRow = 4 THEN C8_TOTAL ELSE 0 END) AS VTOT_FOR4
FROM
    SC8_ROW
GROUP BY
    C8_NUM,
    C8_PRODUTO,
    B1_DESC,
    B1_LOCPAD,
    C8_QUANT,
    C8_UM
```

Aqui, utilizamos `MAX` em conjunto com `CASE` para selecionar as informações de cada fornecedor, transformando as linhas em colunas.

#### Passo 3: Lidando com Mais de Quatro Fornecedores

Se houver mais de quatro fornecedores, podemos estender o relatório com uma consulta adicional utilizando `UNION ALL`:

```sql
UNION ALL
SELECT
    C8_NUM,
    C8_PRODUTO,
    B1_DESC,
    B1_LOCPAD,
    C8_QUANT,
    C8_UM,
    MAX(CASE WHEN FornecedorRow = 5 THEN C8_FORNECE ELSE '' END) AS COD_FOR1,
    MAX(CASE WHEN FornecedorRow = 5 THEN C8_PRECO ELSE 0 END) AS VUNIT_FOR1,
    MAX(CASE WHEN FornecedorRow = 5 THEN C8_TOTAL ELSE 0 END) AS VTOT_FOR1,
    -- Repita para FornecedorRow 6, 7, 8
FROM
    SC8_ROW
WHERE
    FornecedorRow > 4 AND FornecedorRow <= 8
GROUP BY
    C8_NUM,
    C8_PRODUTO,
    B1_DESC,
    B1_LOCPAD,
    C8_QUANT,
    C8_UM
```

### Conclusão

Com esta técnica, você pode transformar dados verticalmente estruturados em um relatório que apresenta as informações de forma comparativa e horizontal, facilitando a análise de cotações. A capacidade de estender o número de fornecedores utilizando `UNION ALL` garante que sua solução seja escalável, independentemente da quantidade de dados que você precise manipular. 

Essa abordagem pode ser adaptada e aplicada em diferentes contextos dentro do SQL, dependendo das necessidades do seu negócio.

Comentários

Postagens mais visitadas