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:
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.
Abaixo é apresentado um vídeo com a contextualização sobre a equiparação das bases:
Vídeo 1 - Contextualização da atualização do DW após implantado
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:
Abaixo é apresentado um vídeo com a demonstração prática de como deve ser feita a equiparação das bases:
Vídeo 2 - Exemplo prático de atualização do DW após implantado
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 é:
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.
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.
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
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
Um job inicial que fará a atualização das dimensões
Begin
Pkg_Etl_Gerencial.sp_Executacargageral( '', sysdate, sysdate, 'D');
End;
Jobs agrupados por empresa que vão executar em paralelo e serão disparados pelo job de dimensão quando o mesmo terminar.
-- 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:
Criação da tabela de agrupamentos
CREATE TABLE ETL_AGRUPAMENTOCARGA( AGRUPAMENTO INTEGER, NROEMPRESA NUMBER(6) );
Execução do script de agrupamento das empresas
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;
/
Criação dos jobs da carga
-- 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;
/
Criação do job principal que vai executar todo dia e vai disparar as demais rotina
-- 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;
/
Abaixo são apresentados alguns vídeos práticos sobre as configurações de carga:
Vídeo 3 - Configuração dos Fatos
Vídeo 4 - Sugestão 1 de rotina de carga
Vídeo 5 - Sugestão 2 de rotina de carga
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
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
DATA
DIA DA SEMANA
DIA DO ANO
DIA DO MÊS
SEMANA
SEMANA DO ANO
Agrupamento 3 - MÊS
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
Abaixo é demonstrado um vídeo com alguns exemplos de primeiras validações:
Vídeo 6 - Exemplos de validações