Archive

Posts Tagged ‘SSAS’

Usando Named Sets no Analysis Services para entregar “Ranges” de datas pré-definidos para o usuário final

October 29, 2010 4 comments

Autor:

Thiago Silva

Publicação:

29/Out/10

Overview

Desenvolvendo soluções de BI, usando o SQL Server Analysis Services (SSAS), damos para o usuário final a possibilidade de navegar nos dados usando uma dimensão de tempo. Mas, quando o usuário começa a utilizar, ele sempre quer mais, por exemplo: Como faço para filtrar somente os dados do último mês, ou dos últimos três até a data atual?”.

Por padrão, este filtro não existe. O usuário teria que selecionar os meses que ele gostaria de ver, por exemplo, o mês anterior ao que vigente em que ele estava montando os filtros. Mas, e quando virar o próximo mês? Não será automático, ou seja, ele precisará fazer um novo filtro ou seu filtro inicial irá trazer dois meses anteiores, agora que ele está no próximo mês ao que ele estava antes.

Podemos então ajudar o usuário dando a possibilidade para que ele insira cálculos pré-configurados que farão o que ele precisa, de forma automática. Para isso, usamos Calculated Members e/ou Named Sets.

Solução

Para essa solução vou trabalhar com os seguintes produtos e tecnologias:

· Windows 7 Enterprise

· Microsoft SharePoint 2010 Server Enterprise (PerformancePoint Services);

· SQL Server 2008 Enterprise;

· Business Intelligence Development Studio;

· PerformancePoint Dashboard Designer.

O foco deste artigo não é a criação de um projeto no Analysis Services. Para ajuda neste assunto, consulte: http://msdn.microsoft.com/en-us/library/ms166552.aspx – Designing and Implementing: Tutorials (Analysis Services – Multidimensional Data)

1. Criando os Named Sets.

a. No seu projeto do Analysis Services, clique duas vezes sobre o seu cubo (.cube) no Solution Explorer.

b. Clique na tab Calculations, clique em Script View, para ver o script inteiro como na imagem abaixo.

image

c. Logo abaixo de “CALCULATE;”, insira o seguinte script.

/*

Dimensão Data

*/

CREATE HIDDEN DYNAMIC SET CURRENTCUBE.[TodaySet]

AS filter([Data].[Calendar Date].[Date].Members,

[Data].[Calendar Date].CurrentMember.Properties(“Data As Int”)

= Format(Now(), “yyyyMMdd”)) ;

CREATE HIDDEN DYNAMIC SET CURRENTCUBE.[CalendarTodaySet]

AS exists([Data].[Calendar Date].[Date].Members, [TodaySet]).ITEM(0).ITEM(0) ;

CREATE DYNAMIC SET CURRENTCUBE.[Current Year To Date]

AS [CalendarTodaySet].ITEM(0).ITEM(0).Parent.Parent.FirstChild.FirstChild :

[CalendarTodaySet].ITEM(0).ITEM(0);

CREATE DYNAMIC SET CURRENTCUBE.[Last Month]

AS [CalendarTodaySet].ITEM(0).ITEM(0).Parent.Lag(1).FirstChild :

[CalendarTodaySet].ITEM(0).ITEM(0).Parent.Lag(1).LastChild;

CREATE DYNAMIC SET CURRENTCUBE.[Last Three Month]

AS [CalendarTodaySet].ITEM(0).ITEM(0).Parent.Lag(3).FirstChild :

[CalendarTodaySet].ITEM(0).ITEM(0).Parent.Lag(1).LastChild;

CREATE DYNAMIC SET CURRENTCUBE.[Last Three Month To Date]

AS [CalendarTodaySet].ITEM(0).ITEM(0).Parent.Lag(3).FirstChild :

[CalendarTodaySet].ITEM(0).ITEM(0);

/*

[Data] = Dimensão de Tempo

[Calendar Date] = Hierarquia com os seguintes atributos (Year → Month → Date)

[Date] = Atributo relacionado ao dia 

*/

d. Na Solution Explorer, vá até o DataSourceView que possui a sua tabela de Tempo. Clique duas vezes nela para criarmos um campo calculado que terá a data atual como “int”, no formato yyyymmdd.

e. Clique com o botão direito na sua tabela que contém as datas, e selecione Add New Named Calculation.

image

f. Em Column Name, dê o nome de Data As Int.

g. Em Expression, insira a seguinte expressão para transformar a data em um número inteiro.

i. convert(varchar(8), PK_Date, 112)

PK_Date = coluna que contém a data na tabela de datas.

h. Clique OK, e depois clique com o botão direito na tabela e selecione Explore Data para verificar se a expressão funcionou. Navegue com as barras, se necessário, até encontrar a coluna que acamos de criar.

image

image

i. Na Solution Explorer, clique duas vezes sobre a sua dimensão de Datas.

j. Em Data Source View, na tabela de Datas, localize a coluna que acabamos de criar, clique com o botão direito e selecione New Attribute from Column.

image

NOTA: Repare na hierarquia Calendar Date, é nela que o script é baseado.

k. Pronto. Agora é só fazer Deploy e Processar o cubo. Na dimensão de Data teremos nossos filtros!

image

l. E onde entra o SharePoint nisso tudo? Podemos gerar gráficos dinâmicos usando o PerformancePoint e/ou Excel Services acessando informações do cubo criado no SQL Server com Analysis Services.

m. E estes Named Sets podem ser utilizados no PerformancePoint Dashboard Designer para filtrar os dados!

image

Conclusão

Nesse artigo mostrei como podemos criar filtros/membros calculados para automatizar ações do usuário final. Assim, ele não precisa ficar atualizando o mesmo relatório sempre que alguma variável já conhecia mude, como é o caso de um relatório que traz informações do mês anterior.

Sem estes filtros/membros calculados, o usuário precisaria atualizar o relatório sempre que o mês mudasse, selecionando então, o anterior vigente.

Advertisements

“The attribute key cannot be found” e “The record was skipped because the attribute key was not found” ao tentar processar um Cubo no Analysis Services – SSAS 2008

October 8, 2010 Leave a comment

Olá! Smile

Overview:

O SharePoint, cada dia que passa, me impressiona mais e mais! E, nestes últimos projetos, não foi diferente.

Algumas pessoas já viram o poder do SharePoint, muitos ainda relutam em entender o potencial da ferramenta.

Desta vez, usando o PerformancePoint Services, para mostrar dados de um Cubo no SQL para tomadas de decisão, ao invés de usar uma base de dados de algum CRM/ERP, usei o SQL Server Integration Services – SSIS – para fazer o ETL das informações do SharePoint, transformá-las no SQL e depois montar um cubo para disponibilizar posteriormente no SharePooint.

IMPRESSIONANTE!!! Smile

Cenário:

Enfim, vamos ao problema enfrentado ao processar o cubo. Espero escrever um artigo em breve sobre PerformancePoint no SharePoint 2010.

Desenvolvi o cubo inteiro, tudo rodando perfeitamente com uma base de dados de teste que trabalhei durante todo o desenvolvimento do ETL e do processamento do Cubo.

Horas antes de efetuar o deploy dos pacotes do SSIS, e do Cubo, peguei a base “real” de dados, que estava em ambiente de homologação, fiz backup e restaurei na minha máquina de desenvolvimento.

ETL – Success!

Deploy do Cubo – Success!

Process Cube – Fail! Sad smile

ERRO:

Errors in the OLAP storage engine: The attribute key cannot be found: Table: <TableName>, Column: <ColumnName1>, Value: <Value1>.

Mas, ao verificar a base de dados, o registro existe! E agora?!

SOLUÇÃO:

Este problema ocorre por que a tabela fato do Cubo tem um ou mais registros que contém uma chave de registro, e a chave deste registro não existe na tabela dimensão correspondente. Este comportamento pode ocorrer quando você não processou a dimensão correspondente antes de processar o Cubo.

Ou seja, antes de mandar processar o Cubo, mande processar todas Dimensões envolvidas. E então, só depois, processe o Cubo! Smile

Abraço!