LICENÇA DO SQL SERVER NÃO PERMITE “QUEBRAR” INSTALAÇÃO EM MÚLTIPLOS SERVIDORES

É um erro comum achar que o SQL Server pode ser distribuído em várias máquinas, afinal os componentes como SSRS, SSAS e SSIS são independentes, porém é uma violação do acordo de uso do Sofware…

Veja o trecho do White Paper oficial de licenciamento…

 


 

O documento completo pode ser acessado em:

http://download.microsoft.com/download/7/3/C/73CAD4E0-D0B5-4BE5-AB49-D5B886A5AE00/SQL_Server_2012_Licensing_Reference_Guide.pdf

 

OSE significa OPERATING SYSTEM ENVIRONMENT.

Muitas vezes escuto outros fornecedores de solução tentando justificar a instalação do SQL Reporting Services (SSRS) em outra máquina a fim de justificar uma dificuldade da configuração de infraestrutura, porém vale lembrar que essa abordagem é irregular e pode implicar no licenciamento de servidores não previstos.

Outro cenário comum e a necessidade de instalar o SSRS nos servidores SharePoint a fim de prover a funcionalidade de BI (PowerView), porem ao fazer isso novamente estaria agindo de forma irregular.

Muito mais barato do que instalar uma licença de SQL Server Enterprise no Servidor SharePoint é instalar o SharePoint no servidor SQL, não é melhor abordagem técnica, mas é a mais barata.

Duvidas? vinicius@infoworker.com.br

Abcs

Publicado em Uncategorized | 2 Comentários

SQL SERVER – SSRS – SharePoint – HORÁRIO DE VERÃO

ENGLISH TITLE: SQL SERVER –SSRS – SHAREPOINT – Daylight Savings

 

Descrição do Problema

Ao apresentar valores de Data/Hora em um relatório no SSRS notamos que havia uma inconsistência ao apresentar as horas.

Explicação do Problema:

Uma lista SharePoint utiliza campos do tipo Data/Hora para armazenar informações relativas a eventos em determinado período do dia.

Embora a informação exibida para o usuário esteja correta de acordo com o nosso “Regional Settings”, o dado será armazenado no SQL Server com base em GMT 0, ou seja serão acrescentadas +3:00 horas ao horário fornecido pelo usuário de forma que o valor gravado esteja com referência em GMT 0.

ID do registro: 39266

No exemplo acima, o dado será armazenado no SQL Server da seguinte forma em uma consulta direta ao content database do SharePoint.

 

SELECT
DATETIME1, TP_COLUMNSET
,*
FROM
[SPS2013_CONTENT_DB-INTRANET].[dbo].[AllUserData]

WHERE
TP_LISTID
=
‘{A30CBFCE-533E-453D-90A2-D41902D512EB}’

                AND
tp_DeleteTransactionId
= 0x0

AND
INT1
= 2

AND
TP_ID
= 39266

ORDER
BY
DATETIME1
DESC

 



Note que os prints acima também se referem ao registro ID: 39266. Observe que o valor do campo DateTime1 (Data Hora do Registro) está como 2:00AM , sendo que o registro foi criado pelo usuário como 0:00AM.

Essa diferença ocorre por que todas os valores de Data/Hora do SharePoint são armazenados com base em GMT 0.

Como neste momento, dia 25/10/2013 estamos em horário de verão, a diferença entre o horário local (GMT-3) e o horário de Greenwich (GMT 0) é de 2 horas. Mas na maior parte do tempo a diferença é de 3:00.

 

Por que consumimos a informação diretamente do Banco de Dados de Conteúdo

Neste caso em particular a lista de dados é muito grande e contém mais de 20mil itens o que impede que os usuários possam visualizar dados em forma de lista, mesmo quando filtros são aplicados.

Para contornar essa situação, criamos então um relatório em SSRS (SQL Server Reporting Services) que além de simular a apresentação em lista ainda possibilita a aplicação de múltiplos filtros além de um tempo de resposta muito melhor à apresentação tradicional em forma de lista do SharePoint.

Sabemos que é possível consumir dados do SharePoint no SSRS usando o conector de listas, porém esta abordagem limita em muito a flexibilidade na construção das consultas.

 

Descrição da Solução

Precisamos então de uma forma de considerar a diferença na contagem de tempo para o horário de verão, a solução encontrada exigia uma forma de se realizar a conversão de data/hora levando em consideração a aplicação correta do horário de verão quando este está vigente.

Tentamos várias abordagens utilizando expressões no SSRS, porém elas falhavam ao converter Data/Hora quando o horário ocorria entre 0:00 e 2:00, resultado em uma diferença incorreta de horas e dias.

Para resolver de forma mais simples, optamos por dicionar uma Função ao SQL Server que fosse capaz de avaliar se uma data fornecida está ou não em horário de verão.

 

Passo 1 – Criar Assembly em C#

using System;

using System.Collections.Generic;

using System.Linq;

using System.Security;

using System.Text;

using System.Data.SqlTypes;

using Microsoft.SqlServer.Server;

 

[assembly: AllowPartiallyTrustedCallers]

namespace InfoWorker.SaveLight

{

    public
static
class
DateTimeZ

    {

        [SqlFunction(Name = “isSaveLight”)]

        public
static
SqlBoolean isSaveLight(DateTime dataGMT0)

        {

 

            DateTime data = Convert.ToDateTime(dataGMT0);

 

            return (SqlBoolean)data.IsDaylightSavingTime();

 

        }

 

    }

}

 

Passo 2 – Adicionar Assembly ao SQL Server

— HABILITAR ASSEMBLIES .NET NA INSTÂNCIA DO SQL (SHAREPOINT)

EXEC
SP_CONFIGURE
‘clr enabled’, 1

RECONFIGURE
WITH
OVERRIDE

GO

ALTER
DATABASE
SHAREPOINT_REPORTS
SET
TRUSTWORTHY
ON

GO

USE
SHAREPOINT_REPORTS

GO

CREATE
ASSEMBLY
INFOWORKER

FROM
‘C:\INFOWORKER\SQL\ASSEMBLIES\Infoworker.SaveLightDay.dll’

GO

CREATE
FUNCTION
dbo.TestaHorarioVerao
(
@data datetime

)

RETURNS
BIT

AS

EXTERNAL
NAME
[INFOWORKER].[InfoWorker.SaveLight.DateTimeZ].[isSaveLight]

GO

GRANT
EXECUTE
ON     dbo.TestaHorarioVerao
TO
PUBLIC

GO

–TESTANDO A FUNÇÃO

SELECT
dbo.TestaHorarioVerao
(
GETDATE()-10)

 

Passo 3 –Aplicar a Função na Consulta do Relatório

WITH
A
AS

(

SELECT
tp_id
AS
ID


,datetime1
AS
[Data e Hora do Registro SQL]

                ,dbo.TestaHorarioVerao
(datetime1)
as
‘Horario de Verao’

                ,CASE
dbo.TestaHorarioVerao
(datetime1)

                    when 0 then
dateadd(hh,-3,datetime1 )

                    when 1 then
dateadd(hh,-2,datetime1 )

                end
AS
[datetime1]


,float1
AS
[UG1 (MW)]


,float2
AS
[UG2 (MW)]

 

Resultado Final

Ao final podemos ver que as datas/hora dos registro estão corretas e consistentes com o registro no SharePoint.

 

Sobre a InfoWorker

A InfoWorker é uma empresa de consultoria especializada em SharePoint, SQL Server Business Intelligence e Dynamics CRM. Atendemos clientes de médio e grande porte com ênfase na utilização massiva de recursos nativos com o mínimo de customização. Nosso objetivo é o desenvolvimento de soluções de alto valor agregado mas com baixo custo de Manutenção.

Visite nosso website e veja nossa lista de Clientes e Projeto.

Publicado em Uncategorized | Deixe um comentário

SQL SERVER – JOB PARA TRUNCATE E SHRINK

Tá bom.. eu sei que você pode fazer algo parecido usando o Wizard de Manutenção.. mas neste caso o objetivo é um pouco diferente. Neste cenário eu tenho um servidor com diversas instâncias, algumas mais críticas do que outras.

Nas instâncias mais críticas, o backup de log de transação é fundamental e é gerenciado de acordo com as expectativas do negócio. Porém em outras instâncias são armazenados databases de menor relevância, muitas vezes criados dinamicamente e sem muita gestão. Nestes databases o backup de log de transação pode ser um problema, pois não é realizado com frequência e as vezes podem até encher todo o disco caso não haja um monitoramento.

Para evitar que databases de baixa prioridade possam lotar o disco, o script abaixo cria um JOB diário capaz de alterar o modo de recovery de cada database para ‘simple’ e também fazer o Shrink dos arquivos de LOG.

USE
[msdb]

GO

 

/****** Object: Job [SHRINK DBS] Script Date: 8/20/2013 3:04:49 PM ******/

BEGIN
TRANSACTION

DECLARE
@ReturnCode
INT

SELECT
@ReturnCode
= 0

/****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 8/20/2013 3:04:49 PM ******/

IF
NOT
EXISTS
(SELECT
name
FROM
msdb.dbo.syscategories
WHERE
name=N'[Uncategorized (Local)]’ AND category_class=1)

BEGIN

EXEC
@ReturnCode
=
msdb.dbo.sp_add_category
@class=N’JOB’,
@type=N’LOCAL’,
@name=N'[Uncategorized (Local)]’

IF (@@ERROR <> 0 OR
@ReturnCode
<> 0) GOTO

QuitWithRollback

 

END

 

DECLARE
@jobId
BINARY(16)

EXEC
@ReturnCode
=
msdb.dbo.sp_add_job
@job_name=N’SHRINK DBS’,

        @enabled=1,

        @notify_level_eventlog=0,

        @notify_level_email=0,

        @notify_level_netsend=0,

        @notify_level_page=0,

        @delete_level=0,

        @description=N’No description available.’,

        @category_name=N'[Uncategorized (Local)]’,

        @owner_login_name=N’DOBREVEENERGIA\vinicius.infoworker’,
@job_id
=
@jobId
OUTPUT

IF (@@ERROR <> 0 OR
@ReturnCode
<> 0) GOTO

QuitWithRollback

/****** Object: Step [SHRINK_DBS] Script Date: 8/20/2013 3:04:49 PM ******/

EXEC
@ReturnCode
=
msdb.dbo.sp_add_jobstep
@job_id=@jobId, @step_name=N’SHRINK_DBS’,

        @step_id=1,

        @cmdexec_success_code=0,

        @on_success_action=1,

        @on_success_step_id=0,

        @on_fail_action=2,

        @on_fail_step_id=0,

        @retry_attempts=0,

        @retry_interval=0,

        @os_run_priority=0, @subsystem=N’TSQL’,

        @command=N’DECLARE CDBCursor CURSOR

FOR

SELECT name FROM SYS.sysdatabases WHERE dbid > 4 ”

 

OPEN CDBCursor

DECLARE @DBNAME SYSNAME, @FILE SYSNAME, @FILEID INT

FETCH CDBCursor INTO @DBNAME

 

WHILE @@FETCH_STATUS = 0

BEGIN

    PRINT ”DATABASE:” + @DBNAME

    EXEC(”ALTER DATABASE [” + @DBNAME + ”] SET RECOVERY SIMPLE”)

    
 

    

    DECLARE CFILES CURSOR

    FOR

    SELECT name , fileid, DB_NAME(dbid) FROM SYS.sysaltfiles WHERE DBID = DB_ID(@DBNAME)

        AND groupid = 0

 

    OPEN CFILES

    FETCH CFILES INTO @FILE, @FILEID, @DBNAME

    WHILE @@FETCH_STATUS = 0

    BEGIN

        PRINT ”FILE :” + @FILE

        EXEC(”USE [” + @DBNAME + ”];” + ”DBCC SHRINKFILE ( “” + @FILE + ””, 0 ) ”)

        FETCH CFILES INTO @FILE, @FILEID, @DBNAME

    END

    

    CLOSE CFILES

    DEALLOCATE CFILES

    

    FETCH CDBCursor INTO @DBNAME

 

END

CLOSE CDBCursor

DEALLOCATE CDBCursor’,

        @database_name=N’master’,

        @flags=0

IF (@@ERROR <> 0 OR
@ReturnCode
<> 0) GOTO

QuitWithRollback

EXEC
@ReturnCode
=
msdb.dbo.sp_update_job
@job_id
=
@jobId, @start_step_id
= 1

IF (@@ERROR <> 0 OR
@ReturnCode
<> 0) GOTO

QuitWithRollback

EXEC
@ReturnCode
=
msdb.dbo.sp_add_jobschedule
@job_id=@jobId, @name=N’SHRINK_DBS’,

        @enabled=1,

        @freq_type=4,

        @freq_interval=1,

        @freq_subday_type=1,

        @freq_subday_interval=0,

        @freq_relative_interval=0,

        @freq_recurrence_factor=0,

        @active_start_date=20130820,

        @active_end_date=99991231,

        @active_start_time=210000,

        @active_end_time=235959,

        @schedule_uid=N’1021f0b5-05fb-4f55-81b7-aed874c39f76′

IF (@@ERROR <> 0 OR
@ReturnCode
<> 0) GOTO

QuitWithRollback

EXEC
@ReturnCode
=
msdb.dbo.sp_add_jobserver
@job_id
=
@jobId, @server_name
=
N'(local)’

IF (@@ERROR <> 0 OR
@ReturnCode
<> 0) GOTO

QuitWithRollback

COMMIT
TRANSACTION

GOTO
EndSave

QuitWithRollback:


IF (@@TRANCOUNT > 0) ROLLBACK
TRANSACTION

EndSave:

 

GO

 

 


 

 

DETALHE DO SCRIPT

DECLARE
CDBCursor
CURSOR

FOR

SELECT
name
FROM
SYS.sysdatabases
WHERE
dbid >
4

 

OPEN
CDBCursor

DECLARE
@DBNAME
SYSNAME,
@FILE SYSNAME,
@FILEID INT

FETCH
CDBCursor
INTO
@DBNAME

 

WHILE
@@FETCH_STATUS
= 0

BEGIN

    PRINT
‘DATABASE:’
+
@DBNAME

    EXEC(‘ALTER DATABASE [‘ +
@DBNAME
+
‘] SET RECOVERY SIMPLE’)

    
 

    

    DECLARE
CFILES
CURSOR

    FOR

    SELECT
name
,
fileid,
DB_NAME(dbid) FROM
SYS.sysaltfiles
WHERE
DBID =

DB_ID(@DBNAME)

        AND
groupid
= 0

 

    OPEN
CFILES

    FETCH
CFILES
INTO
@FILE, @FILEID, @DBNAME

    WHILE
@@FETCH_STATUS
= 0

    BEGIN

        PRINT
‘FILE :’
+
@FILE

        EXEC(‘USE [‘ +
@DBNAME
+
‘];’
+
‘DBCC SHRINKFILE ( “‘
+
@FILE
+
‘”, 0 ) ‘)

        FETCH
CFILES
INTO
@FILE, @FILEID, @DBNAME

    END

    

    CLOSE
CFILES

    DEALLOCATE
CFILES

    

    FETCH
CDBCursor
INTO
@DBNAME

 

END

CLOSE
CDBCursor

DEALLOCATE
CDBCursor


 

Publicado em SQL Server | Deixe um comentário

SHAREPOINT – AUTOMATIZANDO BACKUP DO FARM USANDO POWERSHELL

ENGLISH TITLE:
AUTOMATE SHAREPOINT FARM BACKUP USING POWERSHELL

Esta é uma dica rápida, segue abaixo um script para automatizar o backup diário do Farm SharePoint utilizando PowerShell e o agendador de tarefas do Windows Server.

 

clear-host

write-host
“Iniciando BACKUP do FARM”

 

#ADICIONA SUPORTE POWERSHELL AO SHAREPOINT

Add-PSSnapin
“Microsoft.SharePoint.PowerShell”

 

#LOCAL DO COMPARTILHAMENTO DE REDE ONDE SERÁ ARMAZENADO O BACKUP

$BkpShare
=
\\<nome_do_servidor>\<nome_do_share>

 

#LIMPA TODO O CONTEÚDO DO SHARE ANTES DE INICIAR O BAKCUP!!!! – CUIDADO !!!!

Remove-Item
-Recurse
-Force
$BkpShare
-ErrorAction
“Ignore”

 

#CRIA DIRETÓRIO COM DATA E HORA DO BACKUP

$BkpFolder
=
$BkpShare
+
“\bkp_SPfarm_D”
+ (GET-DATE).ToString(“yyyy-MM-dd”) +
“-H”
+ (get-date).ToString(“HH-mm”)

New-Item
$BkpFolder
-type
directory

 

#NOME DO ARQUIVO DE LOG

$LogFile
=
$BkpShare
+
“\BKP-D”
+ (GET-DATE).ToString(“yyyy-MM-dd”) +
“-H”
+ (get-date).ToString(“HH-mm”) +
“.LOG”

write-host
$LogFile

 

#REALIZA O BACKUP

Backup-SPFarm
-Directory
$BkpFolder
-BackupMethod
Full
-Verbose
|
out-file
$LogFile    

Publicado em SharePoint | Deixe um comentário

SHAREPOINT 2013 – SSL – HTTP REDIRECT – MULTIPLOS SITES – MULTIPLOS WFEs

ENGLISH TITLE: SHAREPOINT – SSL – HTTP REDIRECT – MULTIPLE SITES – MULTIPLE WFEs

Gostaria de compartilhar uma experiência que tive nos ultimos dias, a solicitação do meu cliente foi:

“Instalar o SharePoint em um farm com dois hosts, publicar duas web applications usando SSL e aplicar um redirecionamento de HTTP para HTTPS.”

Parece simples, mas deu um pouco de trabalho, vamos ao passo à passo.

SOLICITAR E INSTALAR OS CERTIFICADOS

Todos os certificados deve estar configurados e instalados no IIS, caso não saiba como realizar este procedimento siga estes dois tutoriais:

ATRIBUA UM ENDEREÇO IP para cada WEB APPLICATION

Esta dica é importante, atribua múltiplos IPs na sua placa de rede, de forma que cada WEBApplication possua seu próprio IP. Isso é fundamental se os seus certificados forem específicos para cada Site IIS.

SE VOCÊ UTILIZAR HOST HEADERS, ao aplicar o certificar para um SITE IIS com SSL, o mesmo certificado será aplicado para o outro site, um comportamento diferente do desejado.

INSTALAR O SHAREPOINT 2013

Realize a instalação do SharePoint em todas as máquinas do FARM, lembrando de aplicar language packs e updates mais recentes.

CRIAR WEB APPLICATIONS USANDO SSL

Este é primeiro item importante entre todo o procedimento, ao criar as WEB APPLICATIONS que irão horstear o site site, lembre-se de selecionar a opção SSL no momento da criação da WEB Application.

– Use HOST HEADER.

– Especifique a porta 443

– Especifique o uso de SSL

CRIAR SITE COLLECTIONS

Após criar a WEB Application, crie as site collections.

VERIFIQUE AS LIGAÇÕES (BINDINGS ) E OS CERTIFICADOS NOS IIS

Volte agora ao IIS, verifique os BINDINGS de cada site, você precisará selecionar o certificado correto para cada web application.

NOTA: UTILIZE MULTIPLOS IP’S e delegue um IP EXCLUSIVO para cada site IIS.

CRIE UM SITE PARA FAZER O REDIRECIONAMENTO

Crie um novo site que será utilizado para o redirecionamento.. preste atenção ao binding na porta 80.

Utilize o mesmo IP da etapa anterior.

 

FAÇA O REDIRECIONAMENTO

Utilize o IIS para criar o redirecionamento de http para https.

AJUSTE OS ENDEREÇOS ALTERNATIVOS DE ACESSO (AAM)

Acrescente o endereço HTTP como alternativa para INTRANET.

 

SE VOCÊ POSSUI FARM COM MULTIPLOS WFEs (WEB Front Ends)

Se este é o seu caso você têm duas alternativas

  1. Reproduzir todas as configurações de IIS acima nos demais servidores FrontEnd da FARM.
  2. Desabilitar o balanceamento de carga para as WebApplications de frontend.

 

Para a solução B, você precisará executar o seguinte comando em PowerShell. Ele irá instruir o Serviços de “Request Manager” para desabilitar o Roteamento entre da aplicação entre os WFEs.

 

Get-SPWebApplication | Set-SPRequestManagementSettings –RoutingEnabled $FALSE –ThrottlingEnabled $FALSE

 

 

CITAÇÕES

O Serviço “Request Manager” é novo no SharePoint 2013. Veja o blog do Harbar para entender melhor como ele funciona.

 

 

 

 

 

 

Publicado em Uncategorized | Deixe um comentário

SSAS – MDX – CAMPOS NUMÉRICOS “DUPLOS” E O PROBLEMA DE ARREDONDAMENTO

ENGLISH TITLE: SSAS – MDX – DOUBLE NUMERIC COLUMNS AND ROUDING PROBLEM

No exemplo abaixo, há uma regra simples…

– SE [ValorContabilizado] = 0
E [Valor Contabilizado Anterior (YTD)] É (null)

    ENTÃO = [% Dh] -> (NULL)

– SE [ValorContabilizado]
= 0 E [Valor Contabilizado Anterior (YTD)] = 0

    ENTÃO = [% Dh]
-> 0

– SE [ValorContabilizado]
<> 0 E
[Valor Contabilizado Anterior (YTD)] = 0

    ENTÃO = [% Dh]
-> 100%

DESCRIÇÃO DO PROBLEMA:

A cause deste problema reside no SQL Server (OLTP), as tabelas de origem são do tipo NUMERIC(28,12). Quando estes campos são consumidos pelo Analysis Services (SSAS), eles serão convertidos para DOUBLE que por consequência utilizam “ponto flutuante”.

SOLUÇÃO:

Demorei um pouco para encontrar a solução, mas ela existe, basta usar a função VBA ROUND. Ao usar ela valores que antes eram DIFERENTE de ZERO, passaram a ser IGUAL À ZERO.

MEMBER [Measures].[% Dh]

AS

         iif( isempty( [Measures].[Valor Contab Anterior (YTD)]) , (null),

                iif( ROUND([Measures].[Valor Contab Anterior (YTD)]) = 0 ,iif( round([Measures].[Valor Contabilizado])=0,0,[Measures].[Valor Contabilizado]/abs([Measures].[Valor Contabilizado]))

                    ,round([Measures].[Valor Contabilizado])/round([Measures].[Valor Contab Anterior (YTD)]))

        )

    ,FORMAT_STRING=“PERCENT”

 

RESULTADO:

CONCLUSÃO:

Quando a origem da informação utiliza campos de ponto flutuante, o valor armazenado pode PARECER ZERO, mas na prática o valor armazenado é 1,293338E-15, por isso quando a comparação “IIF([Measures].[Valor Contab Anterior (YTD)]=0…” é validada sem a função ROUND, o resultado da operação é FALSE. O valor correto para o campo é realmente ZERO, essa diferença de valores só pode ser atribuída a algum erro na gravação da informação e a volatilidade do campo de tipo NUMERIC no SQL Server OU ao tipo DOUBLE no SSAS.


 

Publicado em MDX, MULTIDIMENSIONAL, SSAS - SQL Server Analysis Services | Deixe um comentário

SSAS – MDX – CONTAS CONTÁBEIS E CALCULOS DE PERCENTUAL REPRESENTATIVO

ENGLISH TITLE: SSAS – MDX – CHART OF ACCOUNTS AND REPRESENTATIVE PERCENTUAL CALCULUS

Em uma estrutura de Contas contábeis, muitas vezes é necessário saber quanto representa o valor de uma determinada conta contra o valor total do seu grupo totalizador.

Veja os dados de Exemplo abaixo:

Neste exemplo vemos que a 2ª coluna apresenta um valor percentual, este valor é calculado em relação ao 1º Nível da estrutura de contas Contábeis.

Para criar a fórmula para esta coluna, precisamos em primeiro lugar compreender com está organizada nossa dimensão de contas contábeis.

Navegando pela estrutura da Dimensão

Identificando os níveis na Dimensão

WITH
MEMBER [Measures].[NIVEL]

AS

     [Contas Contábeis].[Estrutura de Contas Contábeis].LEVEL.NAME

SELECT {[Measures].[Valor Contabilizado] ,[Measures].[NIVEL] } ON 0,

HIERARCHIZE([Contas Contábeis].[Estrutura de Contas Contábeis].MEMBERS ) ON 1

FROM [Controladoria – Lançamentos Contábeis]

NOTA: Perceba que a conta contábil PAI , “1 – ATIVO” está na verdade no nível 02 da dimensão… Isso acontece porque o membro [ALL] ocupa o nível 01.

Com base nessa observação, podemos criar uma fórmula que obtenha o valor do nível pai (NÍVEL 02) e o utilize para o cálculo da representação de cada nível abaixo.

PASSO 1 – Obter o MEMBRO ANCESTRAL EM NIVEL 02 da conta contábil corrente.

    Para saber que é o pai em nível 02, usaremos a fórmula abaixo:

MEMBER [Measures].[ANCESTOR]

AS

     ANCESTOR([Contas Contábeis].[Estrutura de Contas Contábeis].CURRENTMEMBER, [Contas Contábeis].[Estrutura de Contas Contábeis].[Level 02] ).name


 

A função ANCESTOR, recebe CURRENTMEMBER como posição inicial, e o NOME do nível ancestral que desejamos chegar.. Esse nome pode ser obtido na estrutura da dimensão em uma query MDX usando o SSMS (SQL Server Management Studio).

PASSO 2 – Uma vez que temos o membro em nível 2, basta usá-lo numa TUPLA para obter o valor correspondente…

WITH
MEMBER [Measures].[% Valor Pai]

AS

     ( [Measures].[Valor Contabilizado] / ( ANCESTOR([Contas Contábeis].[Estrutura de Contas Contábeis].CURRENTMEMBER, [Contas Contábeis].[Estrutura de Contas Contábeis].[Level 02] ), [Measures].[Valor Contabilizado] ) ),

        FORMAT_STRING = “PERCENT”

 

PASSO 3 – Colocando tudo junto

WITH
MEMBER [Measures].[% Valor Pai]

AS

     ( [Measures].[Valor Contabilizado] / ( ANCESTOR([Contas Contábeis].[Estrutura de Contas Contábeis].CURRENTMEMBER, [Contas Contábeis].[Estrutura de Contas Contábeis].[Level 02] ), [Measures].[Valor Contabilizado] ) ),

        FORMAT_STRING = “PERCENT”

MEMBER [Measures].[NIVEL]

AS

     [Contas Contábeis].[Estrutura de Contas Contábeis].LEVEL.NAME

MEMBER [Measures].[ANCESTOR]

AS

     ANCESTOR([Contas Contábeis].[Estrutura de Contas Contábeis].CURRENTMEMBER, [Contas Contábeis].[Estrutura de Contas Contábeis].[Level 02] ).name

SELECT
non
empty {[Measures].[Valor Contabilizado] , [Measures].[% Valor Pai] }

    –, [Measures].[NIVEL], [Measures].[ANCESTOR]}

    ON 0,

HIERARCHIZE([Contas Contábeis].[Estrutura de Contas Contábeis].MEMBERS ) ON 1

FROM [Controladoria – Lançamentos Contábeis]

 

PASSO 4 – Criando o MEMBRO CALCULADO

 

Este é um exemplo de como podemos usar instruções MDX para calcular informações com base na estrutura hierárquica de uma dimensão.

Publicado em MDX, MULTIDIMENSIONAL, SSAS - SQL Server Analysis Services | Deixe um comentário

SSAS – MDX – Como limitar o acesso aos dados utilizando Roles

ENGLISH TITLE: SSAS – MDX – How to limit CUBE access by using Roles.

INFORMAÇÃO PRELIMINAR

O Analysis Services permite controlar a informação disponível ao usuário final através de ROLES. As roles são instruções MDX que podem limitar o escopo de visibilidade de dados de um CUBO.

No exemplo abaixo eu possuo duas ROLES que foram criadas para um CUBO com informações de Cartão Ponto e horas extras.

ROLES

    Acesso Total: permite aos usuários do RH acesso a todos os lançamentos de Banco de Horas.

    Usuários: permite aos usuários visualizar seus próprios lançamentos. Também permite que gestores possam ver os lançamentos de seus subordinados.

 

FILTROS

    Na role USUÁRIOS eu crie restrições para todas as dimensões que possam ser usadas para ver a lista de usuários:

Por exemplo, na Dimensão Centros de Custo, eu utilizei a seguinte instrução MDX para que apenas o gestor possa ver apenas os membros do centro de custo ao qual ele gerencia.

VISÃO DO GESTOR

No exemplo abaixo a consulta está sendo executada como um Gestor.

VISÃO DO FUNCIONÁRIO

Nesta segunda janela, a mesma consulta agora é executada por um usuário sem nível de gestão.

 

Personificando outro usuário para avaliar Roles.

Para testar suas Roles, você pode usar o SQL SERVER MANAGEMENT STUDIO , para executar consultas MDX e então trocar entre diversas contas. Veja este outro Post para ver como fazer isso.

https://viniciuspaluch.wordpress.com/2013/07/18/ssas-mdx-como-testar-roles-atraves-da-personificacao-de-outros-usuarios/

Publicado em Uncategorized | Deixe um comentário

SSAS – MDX – Como Testar ROLES através da Personificação de Outros Usuários

ENGLISH TITLE: How to test Roles by personificating another users

INFORMAÇÃO PRÉVIA:

Se você utiliza ROLES em seus CUBOS é importante testá-las para avaliar se estão corretas. A melhor forma de fazer isso é executar a mesma consulta usando diferentes perfis de usuários.

Fazer isso é Fácil, basta usar o SQL Server Management Studio para conectar ao Cubo e usar consultas MDX, veja abaixo:

  1. Conecte ao seu Servidor SSAS – OLAP utilizando SQL Management Studio

  2. Utilize o Botão “Nova Consulta MDX”

    NOTA: Não use o botão ‘NEW QUERY’, pois ele não irá permitir especificar as propriedades de conexão.

     

  3. Clique em OPTIONS

     

  4. Na ABA “Aditional Connection Parameters”, Especifique o login do usuário que deseja personificar

    UTILIZE A SEGUINTE SINTAXE:

    EffectiveUserName=DOMINIO\login_usuario

  5. Pronto !, Agora basta executar a sua consulta MDX, o resultado será apresentado com base nas permissões deste usuário.

    Você pode usar o script abaixo para Testar :

WITH
MEMBER [MEASURES].[USUARIO LOGADO]

    AS
USERNAME()

SELECT [MEASURES].[USUARIO LOGADO] ON 0

FROM [NOME_DO_CUBO]

 

 

Publicado em Uncategorized | 1 Comentário

SSAS – DEFININDO PORTUGUÊS COMO LINGUAGEM PADRÃO

English Title: SSAS – DEFINING PORTUGUESE AS DEFAULT LANGUAGE

Situação Problema:

Dimensão de Tempo apresenta nomes dos meses em Inglês quando a tabela de Tempo utiliza a função DATENAME( ) na origem em SQL Server OLTP.

Informação Prévia

Eu crio as minhas dimensões de Tempo utilizando Views construídas com base nas minhas Tabelas Fato (funciona apenas se a sua Fato é pequena). De qualquer forma utilizo a função DATENAME para trazer o nome do Mês, porém o resultado padrão é apresentado em Inglês.

CREATE
VIEW
DIM_TEMPO

AS

SELECT
DISTINCT
[Data]
AS
Data,

YEAR([Data])
AS Ano,

MONTH([Data])
AS MesNum,

CONVERT(CHAR(7),[Data],111)
AS AnoMes,

DATENAME(MONTH,[Data])
AS Mes,

UPPER(CAST(DATENAME(MONTH,[Data])
AS
CHAR(3))) AS MesAbr


FROM
[FATO]

 

O Resultado:

 

Se utilizar o comando “SET LANGUAGE” , podemos mudar a apresentação dos nomes dos meses parar Português no OLTP.

set
language
‘BRAZILIAN’

Porém a configuração SET LANGUAGE só é válida durante o tempo de vida da conexão, portanto é necessário especificar na sua conexão entre o projeto SSAS e o OLTP qual deve ser a linguagem a ser utilizada.

Definido a Linguagem na Conexão do projeto SSAS.

Edite a sua conexão no Projeto SSAS e defina o valor para o Atributo CURRENT LANGUAGE para BRAZILIAN.

Verifique o resultado, visualizando os dados da sua tabela de TEMPO.

Resultado em Português

 

 

Dúvidas e comentários? vinicius@infoworker.,com.br

 

 

Publicado em MULTIDIMENSIONAL, SQL Server, SSAS - SQL Server Analysis Services | Deixe um comentário