Você está na página 1de 30

Buscar

favorito (6) marcar como lido tirar dvidas

Transformao de bases de
dados transacionais em Data
Warehouse
Veremos neste artigo como construir um Data Warehouse para
aplicaes em Business Intelligence partindo de uma base de dados
transacional. Veremos, passo a passo, como fazer o processo de
converso a partir do Delphi.

! (5) " (0)

Fique por dentro


Data Warehouses tm a funo de armazenar dados referentes s operaes de uma

determinada empresa, possibilitando a visualizao de relatrios estratgicos, grficos


e/ou anlises de grandes volumes de informaes. por meio de uma estrutura como

esta que tcnicas de BI (Business Intelligence) podem ser aplicadas, bem como a

utilizao de ferramentas OLAP (On-Line Analytical Processing) ou algoritmos de

minerao de dados. Este artigo til para quem deseja efetuar a construo de uma

estrutura assim a partir de uma base de dados transacional. Para isso, veremos neste

artigo como desenvolver uma aplicao em Delphi para automatizar esse processo.

O conceito de data warehouse (DW) est relacionado ao armazenamento de dados

histricos de empresas em bases de dados, de forma que estes possam ser utilizados

posteriormente para tomada de decises estratgicas. Para que isso seja possvel, aps o

DW estar construdo, necessria a utilizao de tcnicas de BI e/ou minerao de

dados, com o intuito de encontrar conhecimento til nos dados apresentados. A sua

estrutura a base para os sistemas de informaes gerenciais e sistemas de apoio

deciso, pois ele possibilita a organizao dos dados de forma a facilitar a integrao com

esses tipos de sistemas.

Dentro deste contexto, existem os sistemas OLTP (Online Trasaction Processing), que se

enquadram na categoria dos sistemas de informaes transacionais. Esse tipo tem a

funo principal de gerenciar as atividades dirias das empresas, como reserva de

quartos em um hotel, processamento de folha de pagamento, controle de estoque, vendas

em um supermercado, transaes bancrias, dentre outros. Outras caractersticas dos

sistemas transacionais so: possuir um alto grau de detalhe das informaes, ser voltil e

focado nas transaes que esto ocorrendo em um determinado momento. Considerando

o exemplo de um mercado, um sistema transacional pode ter a funo principal de

registrar as vendas, as quais so armazenadas em diversas tabelas que em geral seguem

as formas normais da rea de projeto de banco de dados.

Por outro lado, um data warehouse deve ser estruturado para possibilitar um alto nvel de
agregao das informaes, bem como possibilitar uma viso dos dados integrados

referentes s atividades ocorridas durante um tempo pr-determinado. Enquanto um

sistema OLTP voltil e rpido para oferecer detalhes minuciosos nos dados, um DW

deve ser projetado para ser estvel e rpido para fornecer agregaes sobre os dados. A

Figura 1 apresenta um comparativo que mostram as diferenas entre ele e um sistema

transacional, na qual possvel observar que as principais operaes em OLTP so:

incluir, alterar, excluir e acessar. Por outro lado, em um data warehouse os dados so

carregados e o foco principal o acesso. Em geral, os dados armazenados em uma base

desse tipo no podem ser alterados depois de carregados a menos que seja necessrio

fazer algum tipo de correo.

Figura 1. Sistema transacional x data warehouse

Para que a construo de um data warehouse seja possvel necessrio existir pelo

menos uma fonte da qual os dados sero extrados. Normalmente, esses dados so

importados dos sistemas transacionais/operacionais que existem nas empresas, porm,

diversas outras fontes podem ser utilizadas, tais como dados de webservices, documentos

de texto ou planilhas eletrnicas. A Figura 2 apresenta um esquema que mostra esse fato,

no qual possvel visualizar diversas fontes de dados unindo-se ao data warehouse no

centro da figura. Aps a juno dos dados, diversos tipos de acesso podem ser feitos,

desde a utilizao de geradores de relatrios tradicionais (Fast Reports, por exemplo),


ferramentas OLAP (FastCube, por exemplo) e/ou outros aplicativos.

Figura 2. Fontes de dados para o data warehouse

Esse tipo de base de dados possui caractersticas distintas de uma base transacional. Por

esse motivo, caso uma empresa deseje trabalhar com essa tecnologia, primeiramente

precisa que sua base transacional, que utiliza normalizao de dados, seja convertida

para um novo padro que se adeque s caractersticas do data warehouse, chamado de

modelagem multidimensional. Esse processo normalmente no trivial, pois requer

diversas adaptaes no novo banco, bem como a importao dos dados transacionais

para o novo formato. Baseado nisso, o objetivo do presente artigo DW. Ser construdo

um importador no Delphi 10 Seattle utilizando o SQL Server e os componentes da

biblioteca FireDAC. Em suma, o objetivo principal transferir os dados, abordando os

principais processos envolvidos nesta tarefa, bem como a reduo de registros e o pr-

processamento dos dados existentes.

As prximas sees apresentam as duas bases de dados utilizadas no exemplo proposto,


bem como explicaes sobre as principais diferenas entre uma base de dados

transacional e um DW.

Entendendo a base de dados transacional


A Figura 3 apresenta o diagrama entidade relacionamento da base transacional. O

objetivo principal desta base de dados controlar a venda de produtos nas diversas filiais

de uma determinada empresa, existindo para isso nove tabelas. possvel notar que o

controle dos produtos feito por quatro delas, a saber: produtos, produto_categorias,

produto_departamentos e produto_familias. A tabela produtos armazena todos os itens

existentes na loja, sendo representada somente pelo nome e pela categoria do produto. A

categorizao dos produtos dada pelas trs outras tabelas. Para exemplificar, considere

a famlia de produtos Bebidas, relacionado a ela o departamento Bebidas alcolicas e, por

fim, o relacionamento com a categoria Cervejas. Em suma, a cerveja pertence ao grupo

das bebidas alcolicas, que por sua vez est ligado famlia de produtos das bebidas.

A tabela cidades est relacionada com as tabelas de clientes e lojas, que por sua vez

esto ligadas com a tabela de vendas. Como pode ser notado no esquema da base de

dados, cada venda possui um cliente e uma loja na qual a venda foi realizada. Uma venda

pode conter vrios produtos, os quais so representados pela tabela vendas_produto.

O esquema apresentado na Figura 3 tem o intuito de ser didtico apenas para m


ostrar a transformao de uma base transacional em um data warehouse. Por es
se motivo, as tabelas apresentam um nmero reduzido de campos.
abrir imagem em nova janela

Figura 3. Diagrama ER da base de dados transacional

Entendendo o data warehouse


A Figura 4 apresenta o diagrama entidade relacionamento da estrutura do DW j definida.

possvel observar que a quantidade de tabelas diminuiu de nove para cinco,

apresentando somente os dados que sero utilizados nas anlises. Foram adicionados os

campos cidade e estado diretamente nas tabelas de clientes e lojas. Nessas tabelas,

pode-se notar tambm que os campos nome foram retirados, pois este tipo de informao

normalmente no relevante em agrupamento e/ou anlise de dados. Utilizar o nome do

cliente no traria muitos benefcios e insights para os gestores, pois talvez no faa muito

sentido agrupar as vendas de todos os clientes com o nome de Maria, por exemplo. J

com relao s lojas, talvez fosse interessante agrupar os totais de vendas pelo nome da

loja, pois assim o gestor poderia tomar decises baseado em cada filial. Neste data

warehouse, ento, este campo no foi considerado.

Outra abreviao realizada na base de dados foi a juno das quatro tabelas sobre os
produtos somente em uma, a qual possui a famlia, o departamento e a categoria dos

produtos (produtos_classe). Essa reduo foi necessria porque na tabela de produtos

existem 10.281 registros distintos, o que tornaria o processo de anlise e agrupamento

dos dados invivel. Desta forma, foram utilizadas somente as 47 categorias existentes na

base transacional, reduzindo muito a quantidade de registros nicos a serem

processados; o que facilita tambm o agrupamento dos dados. Com isso, possvel

visualizar os valores totais vendidos em cada grupo, como o total de unidades vendidas na

categoria Cervejas.

A tabela vendas_fato a principal, pois apresenta os campos que so as medidas, ou

seja, as unidades vendidas e o valor vendido. Essa tabela, alm de apresentar as chaves

estrangeiras para clientes, lojas e classe de produtos, armazena os valores totais de cada

venda, os quais so somados e agrupados da tabela vendas_produto do esquema

transacional apresentado na Figura 3. possvel notar tambm a tabela tempo, a qual

no consta no modelo transacional e tem o intuito de realizar o agrupamento dos dados

pelo dia da semana, ms e quadrimestre. Esses dados podem ser obtidos por meio do

campo data_venda da tabela vendas da base transacional. Neste contexto, a utilizao de

tabelas de tempo neste formato bastante comum em cenrios de Business Intelligence,

j que essa separao da data completa em campos individuais possibilita melhor

desempenho das consultas e melhor poder para resumo dos dados.


abrir imagem em nova janela

Figura 4. Diagrama ER do data warehouse

Essas alteraes na base de dados podem parecer, primeira vista, redundncias e

divergncias com as formas normais se comparados ao modelo transacional. Porm,

neste tipo de aplicao essas redundncias so permitidas, pois os dados armazenados

no data warehouse so de cunho histrico e utilizados somente para consultas. O usurio

final de um sistema de informao transacional no ter acesso a esses dados, e

operaes rotineiras de incluso, alterao e excluso no so usualmente permitidas

aps as tabelas do DW serem preenchidas. Por esse motivo, no h a obrigatoriedade de

manter integridade referencial na base de dados, pois como os registros no so


excludos, a integridade referencial no ser quebrada em um relacionamento entre chave

primria e chave estrangeira, por exemplo. Outro ponto a frisar que como sua

caracterstica possibilitar consultas, a reduo do nmero de joins poder reduzir os

tempos de consultas base de dados, dependendo da quantidade de tabelas e registros.

Um exemplo claro na Figura 4 a tabela produtos_classe que contm os principais dados

dos produtos em uma nica tabela, evitando consultas SQL com juno em quatro

tabelas, originalmente oriundas do modelo transacional apresentado na Figura 3.

A estrutura apresentada na Figura 4 chamada de modelo multidimensional e, neste

contexto, importante frisar trs conceitos: tabela fato, medidas e dimenses. A tabela

fato onde encontram-se os valores numricos que iro representar algum tipo de

totalizao, como os campos unidades_vendidas e valor_vendido da tabela vendas_fato.

Esses campos que so agrupados e visualizados pelas ferramentas OLAP de Businness

Intelligence, os quais so conhecidos como medidas. Por fim, as dimenses so tabelas

que possibilitam que as medidas sejam visualizadas de forma a possibilitar o gestor tomar

decises e/ou analisar os dados existentes na empresa. Por exemplo, com base na

Figura 4 possvel agrupar os dados pela famlia dos produtos, pelo tipo da loja ou pelo

dia da semana em que as vendas foram realizadas.

Existem basicamente dois tipos de modelos dimensionais: estrela (star scheme) e floco de

neve (snow flake). No primeiro, as tabelas que representam as dimenses esto todas

ligadas tabela fato, o que o deixa mais simples e possibilita melhores formas de

navegao nos dados pelas ferramentas OLAP, como o FastCube, por exemplo. Por outro

lado, h um pouco de desperdcio de espao pelo fato das mesmas descries serem

repetidas em todos os registros, como na tabela produtos_classe. A Figura 4 um

exemplo de esquema de data warehouse que utiliza o modelo estrela.

Por outro lado, no modelo floco de neve as tabelas que representam as dimenses podem

no estar ligadas diretamente tabela fato. Por exemplo, na Figura 4 poderia existir a
tabela cidades relacionada com a tabela de clientes e de lojas ao invs deste campo ser

armazenado em formato texto diretamente nessas tabelas. Este modelo mais complexo

e, em geral, consome mais recursos computacionais para realizar as consultas, j que

mais joins em SQL so necessrios.

Criando o data warehouse


Esta seo tem o objetivo de mostrar os comandos em SQL para a construo do data

warehouse apresentado na Figura 4, bem como explanar os campos existentes em cada

uma das dimenses. A Listagem 1 mostra o script para a criao da dimenso clientes, e

conforme abordado na seo anterior, os tipos de dados dos campos cidade e estado so

caracteres, seguindo as definies do modelo estrela da modelagem multidimensional. A

renda_anual tambm representada por um campo alfanumrico e composta por oito

faixas de valores: R$ 0.0 R$ 30.000, R$ 30.000 R$ 50.000, R$ 50.000 R$ 70.000,

R$ 70.000 R$ 90.000, R$ 90.000 R$ 110.000, R$ 110.000 R$ 130.000, R$ 130.000

R$ 150.000 e R$ 150.000 +. Na base de dados transacional utilizado um campo

numrico para indicar o valor exato da renda, porm, no DW se faz necessria a

converso desses valores numricos em faixas para facilitar as anlises e agrupamentos.

Similarmente, o campo escolaridade composto pelos seguintes valores: Ensino mdio

incompleto, Ensino mdio completo, Ensino superior incompleto, Ensino superior completo

e Ps-graduao completo. Por fim, o campo gnero composto somente pelos valores M

para masculino e F para feminino.

Listagem 1. SQL para criao da dimenso clientes

1 create table dwclientes (


2 idcliente int primary key not null,
3 cidade varchar(15),
4 estado varchar(10),
5 renda_anual varchar(25),
6 genero char(1),
7 escolaridade varchar(26))

Em geral, em aplicaes comerciais criada uma nova base de dados para arma
zenar o data warehouse. Neste exemplo optou-se por utilizar a mesma base por
questes didticas, e para diferenciar as tabelas est sendo utilizado o prefixo d
w para indicar as tabelas que fazem parte de sua estrutura.

A Listagem 2 apresenta o script para a criao da dimenso lojas e os campos cidade e

estado seguem a mesma lgica apresentada para a dimenso clientes. A nica diferena

o campo tipo, que armazena os seguintes valores: Mercearia pequena, Mercearia

grande, Supermercado, Supermercado de luxo, Supermercado gourmet e Sede da

empresa. Similarmente aos campos cidade e estado, o campo tipo tambm do tipo

textual.

Listagem 2. SQL para criao da dimenso lojas

1 create table dwlojas (


2 idloja int primary key not null,
3 tipo varchar(20),
4 cidade varchar(15),
5 estado varchar(10))

A Listagem 3, por sua vez, apresenta o comando SQL para a criao da dimenso

relacionada aos produtos, sendo composta somente pela famlia, departamento e

categoria dos produtos, todos textuais. Esse fato foi explanado nas sees anteriores e

segue as diretrizes do modelo estrela da modelagem multidimensional.

Listagem 3. SQL para criao da dimenso classes de produtos

1 create table dwprodutos_classe (


2 idproduto_classe int primary key not null,
3 familia varchar(15),
4 departamento varchar(30),
5 categoria varchar(30))
A Listagem 4 mostra o script para criao da dimenso tempo, que composta pelo dia

da semana (domingo at sbado), pelo ms (janeiro at dezembro) e pelo quadrimestre

do ano (Q1 at Q4). Todos esses campos so alfanumricos, com exceo da chave

primria idtempo que do tipo inteiro e possui a propriedade para auto incremento

(identity). Pode-se notar que as outras dimenses no possuem auto incremento, e isso

se deve ao fato de que nas outras tabelas o valor da chave primria ser importado das

prprias tabelas da base transacional. O auto incremento utilizado na dimenso tempo

porque essa tabela no existe originalmente na base de dados.

Listagem 4. SQL para criao da dimenso tempo

1 create table dwtempo (


2 idtempo int primary key identity not null,
3 dia_semana varchar(15),
4 mes varchar(15),
5 quadrimestre char(2))

Por fim, a Listagem 5 apresenta o comando SQL para a criao da tabela fato, a qual

possui as medidas unidades_vendidas e valor_vendido, bem como as chaves estrangeiras

que fazem o relacionamento com as dimenses criadas anteriormente. importante frisar

que neste modelo as medidas j apresentam os valores totalizados para cada venda. Por

exemplo, caso a venda nmero 14 contenha cinco produtos, na tabela dwvendas_fato

sero armazenadas as respectivas totalizaes para a quantidade vendida e o valor total

referente a esses cinco produtos. Desta forma, elimina-se a necessidade de utilizar a

tabela vendas_produto da Figura 3.

Listagem 5. SQL para criao da tabela fato

1 create table dwvendas_fato (


2 idvendas_fato int primary key not null,
3 idproduto_classe int foreign key references dwprodutos_classe (idproduto
_classe),
4 idtempo int foreign key references dwtempo (idtempo),
5 idcliente int foreign key references dwclientes (idcliente),
6 idloja int foreign key references dwlojas (idloja),
7 unidades_vendidas int,
8 valor_vendido float )

Uma venda pode possuir vrios produtos, porm, na tabela dwvendas_fato exist
e somente um campo idproduto, o qual armazenar somente o primeiro produto
da tabela vendas_produto. Caso o projeto fosse de um data warehouse real, seri
a necessrio um melhor tratamento desta questo.

Criando a interface grEca e conEgurando o


acesso aos dados no Delphi
As sees anteriores apresentaram a estrutura do banco de dados transacional e do data

warehouse, bem como as principais diferenas entre ambos. Neste contexto, o objetivo

das prximas sees mostrar como importar os dados da base transacional e popular as

dimenses e a tabela fato do DW. Esse procedimento ser implementado via cdigo e,

para isso, a prxima etapa a criao de uma aplicao do tipo VCL no Delphi

(File>New>VCL Forms Application). A Figura 5 apresenta a janela principal (frmPrincipal),

a qual contm cinco componentes TButton (btnClientes, btnLojas, btnProdutos, btnTempo

e btnFato), um componente TFDConnection (conexao) e dois componentes TFDQuery

(qryConsulta e qryInsercao) da biblioteca FireDAC. Cada boto realizar a importao dos

dados das tabelas correspondentes do modelo transacional para as tabelas de dimenses

e para a tabela fato, enquanto que o componente de conexo o responsvel por realizar

a ligao com a base de dados do SQL Server. Por outro lado, os componentes

TFDQuery so os responsveis pelas consultas e inseres que sero realiza1das

posteriormente. Esses dois componentes devem ter a sua propriedade Connection setada

para o componente conexao.


Figura 5. Componentes da janela

Duplo clique no componente de conexo abre o editor de conexo do FireDAC, o qual

deve ter a sua propriedade DriverID configurada para MSSQL. Os outros parmetros que

devem ser preenchidos so o Database com o nome da base de dados (Vendas), o Server

com o valor localhost e a propriedade OSAuthent deve estar com o valor Yes. O SQL

Server possui integrao com a segurana do prprio Windows, e esse parmetro informa

que usurios autenticados no sistema operacional tero acesso base de dados. Caso a

instalao do SQL Server tenha um usurio e senha especficos, os campos User_Name e

Password devem ser preenchidos no editor de conexo do FireDAC. Adicionalmente, a

propriedade Login Prompt do TFDConnection deve ser definida como False para que a
janela de login e senha no seja aberta a cada tentativa de conexo. A Figura 6 apresenta

a janela de configurao.

Figura 6. Configurao do acesso base de dados

Importando os clientes
O objetivo geral da importao dos dados basicamente: (i) ler os dados da base

transacional, (ii) realizar possveis pr-processamentos e/ou ajustes nos dados e (iii)

grav-los no data warehouse. Para isso, a Listagem 6 apresenta o cdigo fonte do

procedimento que ser executado ao clicar no boto para importao dos dados dos

clientes. Pode-se notar na linha 6 que adicionado na propriedade SQL da qryInsercao o

comando insert com parmetros para inserir os registros na dimenso de clientes

(dwclientes). Por outro lado, na linha 7 executada uma consulta que une a tabela de

clientes com a tabela de cidades do modelo transacional, com o intuito de retornar os

dados de acordo com as necessidades do data warehouse. Como existem 10.282 clientes

nesta tabela, na linha 8 definida uma estrutura de repetio para percorrer cada um dos

registros existentes, executando assim os comandos para passagem dos valores

retornados pela consulta por parmetros. Entre as linhas 13 e 30 executada uma

operao de pr-processamento chamada de codificao, que consiste em mapear os

valores numricos existentes no campo renda do modelo transacional em intervalos. Esse

processo necessrio devido ao fato de que existe uma grande variabilidade de rendas

com valores nicos. Por exemplo, caso seja executado o comando SQL select

distinct(renda) from clientes, sero obtidos 9.936 valores de rendas distintas, o que

inviabilizaria a anlise e agrupamentos dos clientes por este campo.

Listagem 6. Importao dos clientes

1 procedure TfrmPrincipal.btnClientesClick(Sender: TObject);


2 var
3 ARendaAnual: real;
4 ARotuloRendaAnual, ARotuloEscolaridade: string;
5 begin
6 qryInsercao.SQL.Add('insert into dwclientes (idcliente, cidade, estado, rend
a_anual, genero, escolaridade) values (:idcliente, :cidade, :estado, :renda_anual
, :genero, :escolaridade)');
7 qryConsulta.Open('select idcliente, cd.nome as cidade, estado, renda, genero
, escolaridade from clientes cl left outer join cidades cd on cl.idcidade = cd.i
dcidade');
8 while not qryConsulta.Eof do
9 begin
10 qryInsercao.ParamByName('idcliente').AsInteger := qryConsulta.FieldByName
('idcliente').AsInteger;
11 qryInsercao.ParamByName('cidade').AsString := qryConsulta.FieldByName('ci
dade').AsString;
12 qryInsercao.ParamByName('estado').AsString := qryConsulta.FieldByName('es
tado').AsString;
13 ARendaAnual := qryConsulta.FieldByName('renda').AsFloat;
14 if (ARendaAnual >= 0) and (ARendaAnual <= 30000) then
15 ARotuloRendaAnual := 'R$ 0.0 - R$ 30.000'
16 else if (ARendaAnual > 30000) and (ARendaAnual <= 50000) then
17 ARotuloRendaAnual := 'R$ 30.000 R$ 50.000'
18 else if (ARendaAnual > 50000) and (ARendaAnual <= 70000) then
19 ARotuloRendaAnual := 'R$ 50.000 R$ 70.000'
20 else if (ARendaAnual > 70000) and (ARendaAnual <= 90000) then
21 ARotuloRendaAnual := 'R$ 70.000 R$ 90.000'
22 else if (ARendaAnual > 90000) and (ARendaAnual <= 110000) then
23 ARotuloRendaAnual := 'R$ 90.000 R$ 110.000'
24 else if (ARendaAnual > 110000) and (ARendaAnual <= 130000) then
25 ARotuloRendaAnual := 'R$ 110.000 R$ 130.000'
26 else if (ARendaAnual > 130000) and (ARendaAnual <= 150000) then
27 ARotuloRendaAnual := 'R$ 130.000 R$ 150.000'
28 else if (ARendaAnual > 150000) then
29 ARotuloRendaAnual := 'R$ 150.000 +';
30 qryInsercao.ParamByName('renda_anual').AsString := ARotuloRendaAnual;
31 qryInsercao.ParamByName('genero').AsString := qryConsulta.FieldByName('ge
nero').AsString;
32 case qryConsulta.FieldByName('escolaridade').AsInteger of
33 1: ARotuloEscolaridade := 'Ensino mdio incompleto';
34 2: ARotuloEscolaridade := 'Ensino mdio completo';
35 3: ARotuloEscolaridade := 'Ensino superior incompleto';
36 4: ARotuloEscolaridade := 'Ensino superior completo';
37 5: ARotuloEscolaridade := 'Ps-graduao completo';
38 end;
39 qryInsercao.ParamByName('escolaridade').AsString := ARotuloEscolaridade;
40 qryInsercao.ExecSQL;
41 qryConsulta.Next;
42 end;
end;

O mapeamento em intervalos realizado na dimenso de clientes tambm conh


ecido como discretizao. No exemplo proposto, as faixas de valores j estavam
definidas, porm, mtodos estatsticos de distribuio de frequncia podem ser
utilizados quando no se tem certeza sobre o melhor conjunto de intervalos.

Entre as linhas 32 e 38 da Listagem 6 tambm executada a codificao dos dados

numricos em alfanumricos por meio do comando case. Na base de dados transacional,

cada categoria de escolaridade representada por um nmero inteiro, enquanto que

neste data warehouse esto sendo armazenadas as categorias em formato textual. Por

fim, na linha 40 a instruo insert executada e na linha 41 o cursor da consulta aponta

para o prximo cliente a ser inserido na dimenso cliente.

Importando as lojas
Semelhante importao dos clientes, o procedimento para importar as lojas bastante

similar e mostrado na Listagem 7. A nica diferena a codificao dos tipos de lojas

em descries completas entre as linhas 10 e 23. Pode-se observar que o campo

escolaridade na importao dos clientes similar, porm, representado de forma

numrica, enquanto que para as lojas essa representao apresenta-se no formato de

siglas. Optou-se por essa representao para demonstrar que em bases de dados

transacionais os campos nem sempre podem estar padronizados, fato que torna

necessria uma anlise mais detalhada dos campos das tabelas.

Listagem 7. Importao das lojas

1 procedure TfrmPrincipal.btnLojasClick(Sender: TObject);


2 var
3 ATipoLoja, ARotuloTipoLoja: string;
4 begin
5 qryInsercao.SQL.Add('insert into dwlojas (idloja, tipo, cidade, estado) val
ues (:idloja, :tipo, :cidade, :estado)');
6 qryConsulta.Open('select idloja, cd.nome as cidade, cd.estado, tipo from lo
jas lj left outer join cidades cd on lj.idcidade = cd.idcidade');
7 while not qryConsulta.Eof do
8 begin
9 qryInsercao.ParamByName('idloja').AsInteger := qryConsulta.FieldByName('id
loja').AsInteger;
10 ATipoLoja := qryConsulta.FieldByName('tipo').AsString;
11 if (ATipoLoja = 'MG') then
12 ARotuloTipoLoja := 'Mercearia grande'
13 else if (ATipoLoja = 'MP') then
14 ARotuloTipoLoja := 'Mercearia pequena'
15 else if (ATipoLoja = 'SE') then
16 ARotuloTipoLoja := 'Sede da empresa'
17 else if (ATipoLoja = 'SP') then
18 ARotuloTipoLoja := 'Supermercado'
19 else if (ATipoLoja = 'SL') then
20 ARotuloTipoLoja := 'Supermercado de luxo'
21 else if (ATipoLoja = 'SG') then
22 ARotuloTipoLoja := 'Supermercado gourmet';
23 qryInsercao.ParamByName('tipo').AsString := ARotuloTipoLoja;
24 qryInsercao.ParamByName('cidade').AsString := qryConsulta.FieldByName('ci
dade').AsString;
25 qryInsercao.ParamByName('estado').AsString := qryConsulta.FieldByName('es
tado').AsString;
26 qryInsercao.ExecSQL;
27 qryConsulta.Next;
28 end;
29 end;

Importando os produtos
A Listagem 8 apresenta o cdigo fonte para realizar a importao dos produtos. Na linha

3 foi declarada uma varivel para armazenar a instruo SQL da consulta na base

transacional. Pode-se observar na linha 5 que a consulta longa, pois a seleo dos

dados para o data warehouse feita com base em todos os produtos existentes na base

de dados (10.281 registros), e deve-se relacionar o produto com a categoria, a categoria

com o departamento e o departamento com a famlia de produtos. Conforme abordado

nas sees anteriores, o objetivo desta dimenso apresentar os dados somente da

categorizao que existe entre os produtos. Isso se deve ao fato de que dependendo da

base de dados, pode existir uma grande variedade de produtos, o que pode tornar as

anlises e agrupamentos mais difceis para o analista.


Listagem 8. Importao dos produtos

1 procedure TfrmPrincipal.btnProdutosClick(Sender: TObject);


2 var
3 ASQL: string;
4 begin
5 ASQL := 'select idproduto, pf.nome as familia, pd.nome as departamento, pc.
nome as categoria '
+ ' from produtos pr inner join produto_categorias pc on pr.idproduto_cate
goria = pc.idproduto_categoria '
+ ' inner join produto_departamentos pd on pc.idproduto_departamento = pd.
idproduto_departamento inner join produto_familias pf on pd.idproduto_familia = p
f.idproduto_familia';
6 qryInsercao.SQL.Add('insert into dwprodutos_classe (idproduto_classe, famili
a, departamento, categoria) values (:idproduto_classe, :familia, :departamento, :
categoria)');
7 qryConsulta.Open(ASQL);
8 while not qryConsulta.Eof do
9 begin
10 qryInsercao.ParamByName('idproduto_classe').AsInteger := qryConsulta.Fiel
dByName('idproduto').AsInteger;
11 qryInsercao.ParamByName('familia').AsString := qryConsulta.FieldByName('f
amilia').AsString;
12 qryInsercao.ParamByName('departamento').AsString := qryConsulta.FieldByNa
me('departamento').AsString;
13 qryInsercao.ParamByName('categoria').AsString := qryConsulta.FieldByName(
'categoria').AsString;
14 qryInsercao.ExecSQL;
15 qryConsulta.Next;
16 end;
17 end;

Similar s importaes anteriores, na linha 8 definida uma estrutura de repetio para

percorrer os 10.281 produtos existentes na tabela da base transacional, ou seja, a

dimenso dwprodutos_classe conter esse mesmo nmero de registros, porm, o nome

do produto foi suprimido. Por esse motivo, na linha 10 a chave primria da dimenso

recebe o mesmo valor da chave primria da tabela de produtos. Por meio dessa

importao, posteriormente o analista poder agrupar os dados por essas categorias, por

exemplo: existem trs famlias de produtos (select distinct(familia) from

dwprodutos_classe), 19 departamentos (select distinct(departamento) from


dwprodutos_classe) e 45 categorias (select distinct(categoria) from dwprodutos_classe).

Importando os dados de tempo


Diferentemente das outras importaes realizadas at o momento, para construir a

dimenso tempo necessrio processar somente o campo data_venda da tabela de

vendas do modelo transacional. Isso ocorre porque a dimenso tempo formada somente

pelo dia da semana, pelo ms e pelo quadrimestre, os quais so extrados da data da

venda. A Listagem 9 apresenta o cdigo necessrio para realizar essa operao, no qual

possvel observar na linha 4 que utilizada a funo datepart para extrair o dia da

semana e o quadrimestre, e a funo month para extrair o ms. Essas funes retornam

um nmero inteiro que corresponde a cada perodo, por exemplo: considerando o campo

dia da semana, o valor 1 representa o domingo e o 7 representa o sbado. Essa mesma

lgica tambm utilizada para o ms e o quadrimestre. Na instruo SQL da linha 4

tambm possvel observar que utilizado o comando distinct, que tem a funo de buscar

da tabela de vendas somente os registros nicos que pertenam ao mesmo tempo a um

dia da semana, a um ms e a um quadrimestre. Esse processo reduz a quantidade de

registros nicos nessa dimenso para 84, conforme pode ser observado caso a consulta

da linha 4 seja executada no editor de consultas do SQL Server.

Listagem 9. Importao das datas

1 procedure TfrmPrincipal.btnTempoClick(Sender: TObject);


2 begin
3 qryInsercao.SQL.Add('insert into dwtempo (dia_semana, mes, quadrimestre) va
lues (:dia_semana, :mes, :quadrimestre)');
4 qryConsulta.Open('select distinct datepart(dw, data_venda) as dia_semana, m
onth(data_venda) as mes, datepart(qq, data_venda) as quadrimestre from vendas');
5 while not qryConsulta.Eof do
6 begin
7 qryInsercao.ParamByName('dia_semana').AsInteger := qryConsulta.FieldByNam
e('dia_semana').AsInteger;
8 qryInsercao.ParamByName('mes').AsInteger := qryConsulta.FieldByName('mes'
).AsInteger;
9 qryInsercao.ParamByName('quadrimestre').AsInteger := qryConsulta.FieldByN
ame('quadrimestre').AsInteger;
10 qryInsercao.ExecSQL;
11 qryConsulta.Next;
12 end;
13 end;

Nota: A importao realizada na Listagem 9 est gravando na dimenso tempo os

valores numricos relativos aos dias da semana, meses e quadrimestres. Um pr-

processamento adicional necessrio para que esses valores sejam convertidos para

dados textuais, por exemplo: domingo no lugar de 1. Esse processo no abordado no

cdigo fonte por j ter sido mostrado anteriormente e por questes de espao.

Adicionalmente, o SQL Server apresenta variaes dessas funes que retornam os

valores em formato textual

Importando as vendas (tabela fato)


A importao dos dados das vendas um pouco mais complexa do que as dimenses,

pois preciso associar as chaves estrangeiras e realizar as totalizaes na tabela

vendas_produto do modelo transacional. Para isso, foi definida uma varivel do tipo record

e mais trs funes auxiliares na seo, conforme mostrado na Listagem 10.

Listagem 10. Definio do record e das funes

1 type
2 TotalVenda = Record
3 UnidadesVendidas: Integer;
4 ValorTotal: Real;
5 End;

6 type
7 TfrmPrincipal = class(TForm)
...

8 private
9 function GetIdTempo(ADiaSemana, AMes, AQuadrimestre: Integer): Integer;
10 function GetIdProdutoClasse(AIdVenda: Integer): Integer;
11 function GetTotalVenda(AIdVenda: Integer): TotalVenda;
12 public
13 end;

Para gerar a implementao das funes, deve-se pressionar ao mesmo tempo as teclas

CRTL+SHIFT+C, para que elas sejam criadas na seo implementation do arquivo. A

Listagem 11 apresenta o cdigo das funes para buscar a classe do produto e os dados

de tempo. A primeira funo (GetIdProdutoClasse) recebe como parmetro o identificador

da venda (idvenda) e retorna a classe do produto relacionado a essa venda. Na linha 3

criada uma query em tempo de execuo, que executa o comando SQL definido na linha

6, retornando na linha 9 a classe do produto correspondente. Conforme explanado

anteriormente, no projeto deste data warehouse possvel ligar uma venda somente a um

produto, e por esse motivo na linha 6 utilizado o comando top 1 para retornar o primeiro

produto retornado pela consulta.

Listagem 11. Funes para retornar valores

1 function TfrmPrincipal.GetIdProdutoClasse(AIdVenda: Integer): Integer;


2 begin
3 with TFDQuery.Create(nil) do
4 try
5 Connection := conexao;
6 SQL.Add('select idproduto_classe from dwprodutos_classe where idproduto_c
lasse = (select top 1 idproduto from vendas_produto where idvenda = :idvenda)');
7 ParamByName('idvenda').AsInteger := AIdVenda;
8 Open();
9 Result := FieldByName('idproduto_classe').AsInteger;
10 finally
11 Free;
12 end;
13 end;
14 function TfrmPrincipal.GetIdTempo(ADiaSemana, AMes, AQuadrimestre: Integer):
Integer;
15 begin
16 with TFDQuery.Create(nil) do
17 try
18 Connection := conexao;
19 SQL.Add('select idtempo from dwtempo where dia_semana = :dia_semana and m
es = :mes and quadrimestre = :quadrimestre');
20 ParamByName('dia_semana').AsInteger := ADiaSemana;
21 ParamByName('mes').AsInteger := AMes;
22 ParamByName('quadrimestre').AsInteger := AQuadrimestre;
23 Open();
24 Result := FieldByName('idtempo').AsInteger;
25 finally
26 Free;
27 end;
28 end;

Similarmente, a funo GetIdTempo recebe como parmetro o dia da semana, o ms e o

quadrimestre, retornando na linha 24 o campo idtempo da dimenso tempo. Isso feito

por meio da consulta definida na linha 19, que filtra os registros com base nos parmetros

recebidos. A Listagem 12 apresenta o cdigo que realiza a totalizao da venda, pois

como explanado anteriormente, a tabela fato armazena somente os totais das unidades

vendidas e do valor vendido que so campos da tabela vendas_produto da Figura 3. Para

isso, a funo recebe como parmetro o idvenda e retorna uma varivel do tipo record

TotalVenda que foi declarado na Listagem 10. O record possui dois campos: um para

representar as unidades e outro para representar o valor total, e seu objetivo facilitar o

retorno da funo. O comando SQL da linha 8 faz a soma das unidades vendidas, bem

como realiza a multiplicao do valor vendido pelas unidades para obter o valor total. Nas

linhas 12 e 13 o record recebe o resultado da consulta e na linha 14 feito o retorno da

funo.

Listagem 12. Funo para totalizar as vendas

1 function TfrmPrincipal.GetTotalVenda(AIdVenda: Integer): TotalVenda;


2 var
3 ATotal: TotalVenda;
4 begin
5 with TFDQuery.Create(nil) do
6 try
7 Connection := conexao;
8 SQL.Add('select sum(unidades_vendidas) as unidades_vendidas, sum(valor_v
endido * unidades_vendidas) as valor_vendido from vendas_produto where idvenda =
:idvenda');
9 ParamByName('idvenda').AsInteger := AIdVenda;
10 Open();
12 ATotal.UnidadesVendidas := FieldByName('unidades_vendidas').AsInteger;
13 ATotal.ValorTotal := FieldByName('valor_vendido').AsFloat;
14 Result := ATotal;
15 finally
16 Free;
17 end;
18 end;

Por fim, a Listagem 13 realiza o processo de importao das vendas. Na linha 7

definido o comando SQL que faz a busca na tabela de vendas da base transacional,

enquanto que na linha 8 definido o comando para insero dos dados. O processo

bastante similar s outras importaes realizadas, com exceo das linhas 13 a 17, que

buscam a classe do produto e associam ao parmetro de insero. Uma estrutura

condicional foi feita para verificar se existe alguma venda sem produtos cadastrados, e,

nesta situao, o parmetro da classe do produto setado para nulo. Neste exemplo

esto sendo carregados para o data warehouse todas as vendas, independente de terem

produtos associados. Na base de dados de exemplo, existem mais de 100 vendas nesta

situao, e isso pode gerar problemas de interpretao ou at mesmo representar

inconsistncias presentes na base de dados transacional. Em uma aplicao comercial,

esses dados teriam que ser avaliados pelo analista, e possivelmente ajustados ou

excludos. Entre as linhas 18 e 23 so chamadas as funes criadas nas Listagens 11 e

12, as quais retornam o cliente, a loja e o tempo.

Listagem 13. Importando as vendas

1 procedure TfrmPrincipal.btnFatoClick(Sender: TObject);


2 var
3 ASQL: string;
4 ATotalVenda: TotalVenda;
5 AIdProdutoClasse: Integer;
6 begin
7 ASQL := 'select idvenda, idcliente, idloja, datepart(dw, data_venda) as dia
_semana, month(data_venda) as mes, datepart(qq, data_venda)
as quadrimestre from vendas';
8 qryInsercao.SQL.Add('insert into dwvendas_fato (idvendas_fato, idproduto_cl
asse, idtempo, idcliente, idloja,
unidades_vendidas, valor_vendido) values (:idvendas_fato, :idproduto_classe
, :idtempo,
:idcliente, :idloja, :unidades_vendidas, :valor_vendido)');
9 qryConsulta.Open(ASQL);
10 while not qryConsulta.Eof do
11 begin
12 qryInsercao.ParamByName('idvendas_fato').AsInteger := qryConsulta.FieldB
yName('idvenda').AsInteger;
13 AIdProdutoClasse := GetIdProdutoClasse(qryConsulta.FieldByName('idvenda'
).AsInteger);
14 if (AIdProdutoClasse > 0) then
15 qryInsercao.ParamByName('idproduto_classe').AsInteger := AIdProdutoCla
sse
16 else
17 qryInsercao.ParamByName('idproduto_classe').Value := null;
18 qryInsercao.ParamByName('idtempo').AsInteger := GetIdTempo(qryConsulta.F
ieldByName('dia_semana')
.AsInteger, qryConsulta.FieldByName('mes').AsInteger, qryConsulta.FieldBy
Name('quadrimestre').AsInteger);
19 qryInsercao.ParamByName('idcliente').AsInteger := qryConsulta.FieldByNam
e('idcliente').AsInteger;
20 qryInsercao.ParamByName('idloja').AsInteger := qryConsulta.FieldByName('
idloja').AsInteger;
21 ATotalVenda := GetTotalVenda(qryConsulta.FieldByName('idvenda').AsIntege
r);
22 qryInsercao.ParamByName('unidades_vendidas').AsInteger := ATotalVenda.Un
idadesVendidas;
23 qryInsercao.ParamByName('valor_vendido').AsFloat := ATotalVenda.ValorTot
al;
24 qryInsercao.ExecSQL;
25 qryConsulta.Next;
26 end;
27 end;

A importao de dados de uma base transacional para um data warehouse pode ser uma

tarefa trabalhosa, principalmente se a quantidade de dimenses e registros for grande.

Como visto no exemplo desenvolvido, so necessrios vrios procedimentos para realizar

essa operao. Somente devem ser carregados no DW dados consistentes e que possam

representar algum tipo de informao til, portanto, em bases comerciais deve-se tomar
um maior cuidado antes de transferir os dados. Neste contexto, diversas outras formas de

pr-processamento podem ser realizadas, bem como a aplicao de algoritmos de filtros

para escolher quais so os campos mais relevantes, a identificao e a reduo de

hierarquias entre os atributos, a limpeza de dados inconsistentes, o tratamento de

informaes ausentes e a normalizao. Alguns desses mtodos ou todos eles podem e

devem ser aplicados, dependendo da necessidade da base de dados.

Referncias

J. Granatyr, E. E. Scalabrin, F. A. Taffe, A. D. Darold, Business Intelligence

utilizando o Fast Cube, Clube Delphi, v. 166, 2016.

R. Angelantonio, Processo de modelagem de Data Warehouse, SQL Magazine, v.

131, 2015.

A. G. D. Ferreira, Como definir um Data Warehouse na prtica usando Transact

SQL, v. 130, 2015.

R. Goldschmidt, E. Passos, Data Mining: um guia prtico, Editora Campus, 2005.

F. N. R. Machado, Tecnologia e Projeto de Data Warehouse, Editora rica, 2004.

Publicado no Canal Delphi

por Jones Granatyr


Delphi na veia (!)

Ajude-nos a evoluir: voc gostou do post? ! (5) " (0)

Compartilhe:
Ficou com alguma dvida?

Renato Oliveira
Parabns! Excelente artigo.

h +1 ms

Jefferson Augusto CONSULTOR

Ol, Renato
Que bom que gostou ficamos felizes.
Qualquer dvida estamos a disposio.

Abraos.

h +1 ms

Adicionar um comentrio...

Estevao Dias
Muito bom Pessoal,

Parabns!

h +1 ms

Douglas
Opa Estevo,

Agradecemos pelo seu comentrio e elogio.

Um abrao. :)

h +1 ms

Adicionar um comentrio...

Fernando Gaspar
muito bom, parabns!
h +1 ms

[autor] Jones Granatyr CONSULTOR

Obrigado Fernando, qualquer dvida estou a disposio! :)

h +1 ms

Adicionar um comentrio...

Mais posts
Microartigo

Introduo criptograEa no MySQL BANCO DE DADOS MYSQL

Microartigo

Mobile no Delphi: Mudando a visualizao dos dados no


ListView MOBILE DELPHI
Aplicativo com fontes

Cdigo Fonte - Curso Criando um Servio RESTful com Java


BANCO DE DADOS

Artigo

Desenvolva aplicaes com MongoDB DELPHI MONGODB NOSQL

Artigo

Tcnicas de debug no Delphi DELPHI

Listar mais contedo


Publique | Assine | Fale conosco

Hospedagem web por Porta 80 Web Hosting

Você também pode gostar