Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Totvs custom tabs box
tabsPasso 01, Passo 02, Passo 03, Passo 04, Passo 05
idspasso1,passo2,passo3,passo4,passo5
Totvs custom tabs box items
defaultyes
referenciapasso1

Passo 01: Servidor de Data Warehouse

Para realizar a criação e configuração do Servidor de Data Warehouse, deverá seguir as orientações disponíveis no link abaixo:

Totvs custom tabs box items
defaultno
referenciapasso2

Passo 02: Atualiza DW

A partir da versão 23.01, a atualização do módulo Data Warehouse é feita através do executável Atualiza DW. Este componente é encontrado no pacote de atualização do DW, onde sua distribuição é feita pelo Agente de Atualização.

Para realizar a atualização, deverá seguir as orientações disponíveis no link abaixo (o Atualiza DW considerará como base do ERP a mesma que estiver apontada para os usos das aplicações do ERP).

Para clientes com a versão do ERP acima da 23.01, é necessário executar o Atualiza DW primeiro da versão 23.01 e depois das versões seguintes.

IMPORTANTE: O pacote que for executado em uma base não deve ser utilizado novamente em outras bases. Neste caso, o correto é baixar novamente o pacote ou criar uma cópia para cada base que for atualizar, antes de executar.

Conector de Widget
urlhttps://www.youtube.com/watch?v=s7fDiN53y5Q

Vídeo 1 - Exemplo de atualização do DW após implantado

Totvs custom tabs box items
defaultno
referenciapasso3

Passo 03: Gerenciador DW

A aplicação Gerenciador DW possibilita que o usuário realize configurações relativas à fatos e dimensões, execução de cargas avulsas, acompanhamento de cargas, dentre outras opções.

Caso tenha dúvidas com relação à aplicação, poderá seguir as orientações disponíveis no link abaixo:

Totvs custom tabs box items
defaultno
referenciapasso4

Passo 04: Configuração do Job de Atualização de Cargas

Para que as informações do ERP estejam atualizadas na base de dados do Data Warehouse, existem duas formas: Manualmente através do Gerenciador DW - DW00010 ou automaticamente através de um job no banco de dados.

Manualmente

É feita através da aplicação Gerenciador DW / Aba Cargas onde o usuário pode iniciar cargas gerais, ou separadas de fatos e dimensões.

Automática

É feita através de um JOB que poderá ser parametrizado o período de atualização.

OBS: É importante realizar a configuração do Job de forma diária, após a execução da baixa de PDV e média de venda.

O script padrão de carga geral é:

Bloco de código
titleJOB GERAL
collapsetrue
Begin

Pkg_Etl_Gerencial.sp_Executacargageral( null );

End;

Este primeiro modelo dispara uma carga geral, atualizando primeiro todas as tabelas dimensão e depois todas tabelas fato ativas no ambiente, considerando os dias de refresh cadastrados no Gerenciador DW e todas empresas.

O exemplos abaixo disparam, respectivamente, uma carga somente nas tabelas dimensão e outra carga geral somente das tabelas fato ativas.

Bloco de código
titleJOB DIMENSÃO E FATO
collapsetrue
Begin

Pkg_Etl_Gerencial.sp_Executacargageral( '', sysdate, sysdate, 'D');

End;

Begin

Pkg_Etl_Gerencial.sp_Executacargageral( '', sysdate, sysdate, 'F');

End;

O exemplo abaixo dispara uma carga isolada das tabelas de venda no DW somente das empresas ativas no ERP.

Bloco de código
titleJOB VENDA
collapsetrue
Begin

Pkg_Etl_Gerencial.sp_FatoVenda( 'A',
                                '01-jan-2024',
                                '31-jan-2024',
                                'S',
                                'S' );

End;

O exemplo abaixo dispara uma carga isolada dos últimos 15 dias de estoque

Bloco de código
titleJOB ESTOQUE
collapsetrue
Begin

Pkg_Etl_Gerencial.sp_FatoEstoque( '',
                                  trunc(sysdate - 15),
                                  trunc(sysdate)) ;

End;

Sugestão de estrutura de carga: As cargas de tabelas dimensão funcionam um pouco diferente das tabelas fato, onde, algumas fato possuem dependência das dimensões, portanto os fatos não devem ser atualizados antes das dimensões.

Outro ponto é que os fatos podem ser executados em paralelo agrupados por empresa sem problemas de conflito de dados.

Uma estrutura performática ficaria da seguinte forma

  1. Um job inicial que fará a atualização das dimensões

    Bloco de código
    titleJOB DIMENSÃO
    collapsetrue
    Begin
    
    Pkg_Etl_Gerencial.sp_Executacargageral( '', sysdate, sysdate, 'D');
    
    End;
    
    
  2. Jobs agrupados por empresa que vão executar em paralelo e serão disparados pelo job de dimensão quando o mesmo terminar. 

    Bloco de código
    titleJOB FATO
    collapsetrue
    -- Supondo que exista o NROEMPRESA 1 até o 30 cadastrados, a carga pode ser dividida em 3 jobs com 10 empresas cada, ficando da forma:
    -- JOB 1
    Begin
    
    Pkg_Etl_Gerencial.sp_Executacargageral( '1,2,3,4,5,6,7,8,9,10', sysdate, sysdate, 'F' );
    
    End;
    
    -- JOB 2
    Begin
    
    Pkg_Etl_Gerencial.sp_Executacargageral( '11,12,13,14,15,16,17,18,19,20', sysdate, sysdate, 'F' );
    
    End;
    
    -- JOB 3
    Begin
    
    Pkg_Etl_Gerencial.sp_Executacargageral( '21,22,23,24,25,26,27,28,29,30', sysdate, sysdate, 'F' );
    
    End;    

Foi criada uma rotina de divisão da carga que atende os ambientes configurados com paralelismo para execução de jobs. Esta rotina consiste em criar uma tabela de agrupamento onde será feita a distribuição das empresas de acordo com o volume de vendas do ano de 2023 e depois, a partir deste agrupamento, são disparados 5 cargas em paralelo a partir da chamada de um job principal.

Para criar a estrutura é necessário seguir os passos:

  1. Criação da tabela de agrupamentos

    Bloco de código
    titleTabela de agrupamento de cargas
    collapsetrue
    CREATE TABLE ETL_AGRUPAMENTOCARGA( AGRUPAMENTO INTEGER, NROEMPRESA NUMBER(6) );
  2. Execução do script de agrupamento das empresas

    Bloco de código
    titleAgrupamento de empresas por volume de vendas
    collapsetrue
    declare
           qtdQuebra integer := 4;
           vnJob     integer := 1;
    
    begin
           for vtEmp1 in (   select a.nroempresa, sum(a.qtdvda)
                               from mrl_custodia a
                              where a.dtaentradasaida between '01-JAN-2023' and '31-DEC-2023'
                             group by a.nroempresa
                             order by sum(a.qtdvda) desc )
             loop
               insert into etl_agrupamentocarga( agrupamento, nroempresa ) values ( vnjob, vtEmp1.Nroempresa );
               vnJob := vnJob + 1;
               commit; 
    
               if vnJob > qtdQuebra then 
                 vnJob := 1;
               end if;
               
             end loop;
             
             vnJob := 1;
             
             for vtEmp2 in ( select e.nroempresa
                               from max_empresa e
                              where not exists ( select 1
                                                   from etl_agrupamentocarga c
                                                  where e.nroempresa = c.nroempresa ) )
             loop
               
               insert into etl_agrupamentocarga( agrupamento, nroempresa ) values ( vnjob, vtEmp2.Nroempresa );
               vnJob := vnJob + 1;
               commit; 
    
               if vnJob > qtdQuebra then 
                 vnJob := 1;
               end if;
               
             end loop;
                 
    end;
    /
  3. Criação dos jobs da carga

    Bloco de código
    titleCriação dos jobs paralelos
    collapsetrue
    -- CRIA O JOB DE CARGA DO PRIMEIRO AGRUPAMENTO
    BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
       job_name          =>  'DW_CARGA_FATO_1',
       job_type          =>  'PLSQL_BLOCK',
       job_action        =>  'declare 
       vsNroEmpresa varchar2(4000);
    begin
      
      select listagg(a.nroempresa, '','') within group (order by a.nroempresa)
        into vsNroEmpresa
        from etl_agrupamentocarga a
       where a.agrupamento = 1;
       
      pkg_etl_gerencial.sp_dimprodutoempresa( vsNroEmpresa );
      
      pkg_etl_gerencial.sp_dimprodutoempresasegmento( vsNroEmpresa );
        
      pkg_etl_gerencial.sp_ExecutaCargaGeral( vsNroEmpresa,
                                              trunc(Sysdate),
                                              trunc(Sysdate),
                                              ''F'');
     
    end;',
       start_date        => to_date(null),
       auto_drop         => false,
       comments          => 'Grupo 1 carga DW - disparado pelo DW_CARGA_DIM_1'
       );
    END;
    /
    
    
    -- CRIA O JOB DE CARGA DO SEGUNDO AGRUPAMENTO
    BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
       job_name          =>  'DW_CARGA_FATO_2',
       job_type          =>  'PLSQL_BLOCK',
       job_action        =>  'declare 
       vsNroEmpresa varchar2(4000);
    begin
      
      select listagg(a.nroempresa, '','') within group (order by a.nroempresa)
        into vsNroEmpresa
        from etl_agrupamentocarga a
       where a.agrupamento = 2;
       
      pkg_etl_gerencial.sp_dimprodutoempresa( vsNroEmpresa );
      
      pkg_etl_gerencial.sp_dimprodutoempresasegmento( vsNroEmpresa );
        
      pkg_etl_gerencial.sp_ExecutaCargaGeral( vsNroEmpresa,
                                              trunc(Sysdate),
                                              trunc(Sysdate),
                                              ''F'');
     
    end;',
       start_date        => to_date(null),
       auto_drop         => false,
       comments          => 'Grupo 2 carga DW - disparado pelo DW_CARGA_DIM_1'
       );
    END;
    /
    
    -- CRIA O JOB DE CARGA DO TERCEIRO AGRUPAMENTO
    BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
       job_name          =>  'DW_CARGA_FATO_3',
       job_type          =>  'PLSQL_BLOCK',
       job_action        =>  'declare 
       vsNroEmpresa varchar2(4000);
    begin
      
      select listagg(a.nroempresa, '','') within group (order by a.nroempresa)
        into vsNroEmpresa
        from etl_agrupamentocarga a
       where a.agrupamento = 3;
       
      pkg_etl_gerencial.sp_dimprodutoempresa( vsNroEmpresa );
      
      pkg_etl_gerencial.sp_dimprodutoempresasegmento( vsNroEmpresa );
        
      pkg_etl_gerencial.sp_ExecutaCargaGeral( vsNroEmpresa,
                                              trunc(Sysdate),
                                              trunc(Sysdate),
                                              ''F'');
     
    end;',
       start_date        => to_date(null),
       auto_drop         => false,
       comments          => 'Grupo 3 carga DW - disparado pelo DW_CARGA_DIM_1'
       );
    END;
    /
    
    -- CRIA O JOB DE CARGA DO QUARTO AGRUPAMENTO
    BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
       job_name          =>  'DW_CARGA_FATO_4',
       job_type          =>  'PLSQL_BLOCK',
       job_action        =>  'declare 
       vsNroEmpresa varchar2(4000);
    begin
      
      select listagg(a.nroempresa, '','') within group (order by a.nroempresa)
        into vsNroEmpresa
        from etl_agrupamentocarga a
       where a.agrupamento = 4;
       
      pkg_etl_gerencial.sp_dimprodutoempresa( vsNroEmpresa );
      
      pkg_etl_gerencial.sp_dimprodutoempresasegmento( vsNroEmpresa );
        
      pkg_etl_gerencial.sp_ExecutaCargaGeral( vsNroEmpresa,
                                              trunc(Sysdate),
                                              trunc(Sysdate),
                                              ''F'');
     
    end;',
       start_date        => to_date(null),
       auto_drop         => false,
       comments          => 'Grupo 4 carga DW - disparado pelo DW_CARGA_DIM_1'
       );
    END;
    /
    
    -- CRIA O JOB DE CARGA DO QUINTO AGRUPAMENTO - NOVAS EMPRESAS
    BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
       job_name          =>  'DW_CARGA_FATO_5',
       job_type          =>  'PLSQL_BLOCK',
       job_action        =>  'declare 
       vsNroEmpresa varchar2(1000);
    begin
      
      select listagg(a.nroempresa, '','') within group (order by a.nroempresa)
        into vsNroEmpresa
        from max_empresa a 
       where not exists( select 1
                           from etl_agrupamentocarga b
                          where b.nroempresa = a.nroempresa );
                          
      if vsNroEmpresa is not null then
        
        pkg_etl_gerencial.sp_dimprodutoempresa( vsNroEmpresa );
        
        pkg_etl_gerencial.sp_dimprodutoempresasegmento( vsNroEmpresa );
         
        pkg_etl_gerencial.sp_ExecutaCargaGeral( vsNroEmpresa,
                                                trunc(Sysdate),
                                                trunc(Sysdate),
                                                ''F'');
                                              
      end if;
     
    end;',
       start_date        => to_date(null),
       auto_drop         => false,
       comments          => 'Carga de novas empresas - disparado pelo DW_CARGA_DIM_1'
       );
    END;
    /
  4. Criação do job principal que vai executar todo dia e vai disparar as demais rotina

    Bloco de código
    titleCriação do job principal
    collapsetrue
    -- CRIA O JOB DE CARGA PRINCIPAL, QUE VAI INSERIR AS DIMENSÕES QUE SAO DEPENDENCIA DE FATOS E DISPARAR OS OUTROS JOBS
    -- NO EXEMPLO ELE ESTA CONFIGURADO PARA EXECUTAR TODO DIA AS 00:05H
    -- PARA ALTERAR A HORA DE EXECUÇAO É NECESSARIO ALTERAR O PARAMETRO repeat_interval   => 'Freq=Daily;ByHour=00;ByMinute=05;BySecond=00'
    BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
       job_name          =>  'DW_CARGA_DIM_1',
       job_type          =>  'PLSQL_BLOCK',
       job_action        =>  'begin
        pkg_etl_gerencial.sp_DimCidade;
        pkg_etl_gerencial.sp_DimEmpresa;
        pkg_etl_gerencial.sp_DimCheckout;
        pkg_etl_gerencial.sp_DimCliente;
        pkg_etl_gerencial.sp_DimClienteEnd;
        pkg_etl_gerencial.sp_DimProduto;
        pkg_etl_gerencial.sp_DimProdutoembalagem;
        pkg_etl_gerencial.sp_DimProdutoCodigo;
        pkg_etl_gerencial.sp_DimProdutoPrincipioAtivo;
        pkg_etl_gerencial.sp_DimFornecedor;
        pkg_etl_gerencial.sp_DimComprador;
        pkg_etl_gerencial.sp_DimRepresentante;
        pkg_etl_gerencial.sp_DimArvoreCategoria;
        pkg_etl_gerencial.sp_DimArvoreCategoriaFam;
        pkg_etl_gerencial.sp_DimCategoria;
        pkg_etl_gerencial.sp_DimConcorrente;
        pkg_etl_gerencial.sp_DimSegmento;
        pkg_etl_gerencial.sp_DimCodgeraloper;
        pkg_etl_gerencial.sp_DimLocal;
        pkg_etl_gerencial.sp_DimFormaPagto;
        pkg_etl_gerencial.sp_DimCondicaoPagto;
        pkg_etl_gerencial.sp_DimTabVenda;
        pkg_etl_gerencial.sp_DimTributacao;
        pkg_etl_gerencial.sp_DimClienteSeg;
        pkg_etl_gerencial.sp_DimReceitaRendto;
        pkg_etl_gerencial.sp_DimLista;
        pkg_etl_gerencial.sp_DimListaItem;
        pkg_etl_gerencial.sp_DimClassifComercial;
        pkg_etl_gerencial.sp_DimClienteEndSetor;
        pkg_etl_gerencial.sp_DimProdSimilar;
        pkg_etl_gerencial.sp_DimUsuario;
        pkg_etl_gerencial.sp_DimZonaVenda;
        pkg_etl_gerencial.sp_DimOcorrenciaDevolucao;
        pkg_etl_gerencial.sp_DimClientePromotor;
        pkg_etl_gerencial.sp_DimClienteGrupo;
        pkg_etl_gerencial.sp_DimSazonalidade;
    
        dbms_scheduler.run_job(''DW_CARGA_FATO_1'', false);
        dbms_scheduler.run_job(''DW_CARGA_FATO_2'', false);
        dbms_scheduler.run_job(''DW_CARGA_FATO_3'', false);
        dbms_scheduler.run_job(''DW_CARGA_FATO_4'', false);
        dbms_scheduler.run_job(''DW_CARGA_FATO_5'', false);
    end;',
       start_date        => to_date(null),
       repeat_interval   => 'Freq=Daily;ByHour=00;ByMinute=05;BySecond=00',
       auto_drop         => false,
       comments          => 'Carga dimensoes que nao sao associadas a empresa e que sao dependencia dos fatos'
       );
    END;
    /
Totvs custom tabs box items
defaultno
referenciapasso5

Passo 05: Primeiras validações da implantação

Aqui estão algumas sugestões das primeiras validações que podem ser feitas após a implantação para garantir que o produto está funcional:

  • Validação da parametrização da Análise ABC de Venda (Data Warehouse):

A Análise ABC de Venda (Data Warehouse) foi desenvolvida com base na Análise ABC de Vendas Distribuição, onde nela, existem alguns parâmetros dinâmicos que dependendo do valor, podem mudar os valores apresentados na aplicação.

Para acompanhar este mesmo conceito, existe uma aplicação específica dentro do módulo DataWarehouse para equiparar esta parametrização. Se trata da Configuração de Parâmetros Análise ABC de Vendas (Data Warehouse).


Dentro da documentação da aplicação existe um DE-PARA no trecho Comparação das funcionalidades dos parâmetros da Análise ABC de Vendas Distribuição com os parâmetros da Análise ABC de Venda (Data Warehouse), que é referente a exportação dos parâmetros de uma ABC para a outra.

A exportação é feita de forma automática durante a implantação do DW, porém, é indicado que seja feita uma validação comparando os parâmetros dinâmicos da ABC Venda Distribuição com os parâmetros equivalentes na aplicação citada.


  • Validação da carga de Dimensões

    A validação das cargas deve começar pelas tabelas dimensão, visto que algumas delas são dependências dos fatos.

    A carga pode ser disparada tanto via banco, utilizando o trecho JOB DIMENSÃO E FATO do Passo 04 do guia, ou então via aplicação através do Gerenciador DW - DW00010.

    No final da carga, o log deve ser analisado no Gerenciador, aba Logs e nenhum erro deve ser listado.


  • Validação da carga de Fatos

    Depois de validar a carga de dimensões, deve ser validada a carga dos fatos.

    A carga pode ser disparada tanto via banco, utilizando o trecho JOB DIMENSÃO E FATO do Passo 04 do guia, ou então via aplicação através do Gerenciador DW - DW00010.

    No final da carga, o log deve ser analisado no Gerenciador, aba Logs e nenhum erro deve ser listado.


  • Comparação enrte Análise ABC de Vendas Distribuição e Análise ABC de Venda (Data Warehouse) validando os três agrupamentos de venda.

A Análise ABC de Venda (Data Warehouse) possui uma lógica na sua estrutura que, dependendo da consulta que será realizada, consegue buscar os dados de tabelas agrupadas, deixando assim os resultados mais rápidos de acordo com a análise. Esta lógica é dividida em três agrupamentos e é indicado realizar uma consulta com cada um deles para validar que as vendas subiram para todas as tabelas.

Até o momento, os agrupamentos dos filtros e detalhes estão divididos da seguinte forma:

    • Agrupamento 1 - ITEM

      Bloco de código
      titleAgrupamento máximo por item
      collapsetrue
      BAIRRO
      CARGA
      CEP DO CLIENTE
      CHECKOUT
      CIDADE DO CLIENTE
      CLASSIF. COML CLIENTE
      CLIENTE
      CNPJ/CPF DO CLIENTE
      CÓD.BARRA OPERAÇÃO
      CONDICÃO DE PAGAMENTO
      DOCUMENTO
      EMBALAGEM
      EQUIPE
      EQUIPE DE PROMOTOR
      ESTADO CIVIL
      FORMA DE PAGAMENTO
      GRAU DE INSTRUÇÃO
      GRUPO
      GRUPO DE ASSOCIADOS
      GRUPO PROMOÇÃO
      HORA DO DIA
      IDADE
      LISTA PADRÃO
      NASCIMENTO ANO
      NASCIMENTO DIA
      NASCIMENTO DIA/MÊS
      NASCIMENTO MÊS
      NATUREZA DO CLIENTE
      OCORRÊNCIA DEVOLUÇÃO
      OPERADOR
      ORIGEM
      PORTE
      PRAÇA
      PRAZO MÉDIO
      PROMOÇÃO
      PROMOÇÃO COMBINADA (PDV)
      PROMOTOR
      RAIZ CNPJ/CPF DO CLIENTE
      RAIZ CNPJ/CPF FORNEC.PRINC.
      RAMO DE ATIVIDADE
      REDE/CLIENTE
      RENDA/FATURAMENTO
      REPRESENTANTE
      ROTA
      SÉRIE DO DOCUMENTO
      SETOR
      SEXO DO CLIENTE
      TABELA DE VENDA
      TELEVENDA
      TIPO DE EXPEDIÇÃO
      TRANSPORTADORA
      UF DO CLIENTE
      USUÁRIO
      ZONA DE VENDA

    • Agrupamento 2 - DIA

      Bloco de código
      titleAgrupamento máximo por dia
      collapsetrue
      DATA
      DIA DA SEMANA
      DIA DO ANO
      DIA DO MÊS
      SEMANA
      SEMANA DO ANO

    • Agrupamento 3 - MÊS

      Bloco de código
      titleAgrupamento máximo por mês
      collapsetrue
      ANO
      ÁRVORE DE CATEGORIAS
      CAMPANHA
      CATEGORIA
      CGO
      CIDADE DA EMPRESA
      CLASSIFICAÇÃO COMERCIAL
      CNPJ/CPF FORNECEDOR PRINCIPAL
      CÓD.BARRA CADASTRO EAN
      COMPRADOR
      DIVISÃO
      EMPRESA
      FAMÍLIA
      FINALIDADE
      FORMA DE ABASTECIMENTO
      FORNECEDOR PRINCIPAL
      GÔNDOLA
      GRUPO DA EMPRESA
      GRUPO DE CAMPANHA
      MARCA
      MÊS
      MÊS DO ANO
      PRINCIPIO ATIVO
      PRODUTO
      PRODUTO BASE
      RUA
      SEGMENTO
      SEGMENTO DO PRODUTO
      SENSIBILIDADE
      TIPO DOCTO FISCAL CGO
      TOTAL
      TRIBUTAÇÃO
      TRIMESTRE
      TRIMESTRE DO ANO
      UF DA EMPRESA
      ÚLTIMO NÍVEL

...