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

Anúncios
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