Moving Average Cognos 8 4

Moving Average Cognos 8 4O site nao esta disponivel no momento O site que voce deseja visitar nao esta disponivel no momento. Isso pode ser devido a que o site esta sendo desenvolvido, que a manutencao esta em andamento ou que o site esta fechado devido a alguma outra razao. Proprietario do dominio, consulte seu endereco de contato (e-mail) ou entre em contato com supportloopia para obter mais informacoes. Webbplatsen gr ej att n fr tillfllet Webbplatsen du village beska r tillfllet inte tillgnglig. Detta kan bero p att sidan r em utveckling, att underhll grs eller at sidan av annan anledning r stngd. Domngare, se din kontaktadress (correio eletronico) eller kontakta supportloopia. se fr mer informacao. Nettsiden kan ikke ns para yeblikket Nettsiden du vil beske er para yeblikket ikke tilgjengelig. Dette kan komme av em siden er under utvikling, vedlikehold utfres eller em siden av en anledning er stengt. Domeneier, se din kontaktadresse (correio electronico) eller kontakt supportloopia. no for mer informasjon. Esta mensagem tambem esta disponivel em. Uma parte de Visma middot Tel: 46 21-12 82 22 middot Fax: 46 21-12 82 33 middot E-mail: infoloopia Telefone: 021-12 82 22 middot Fax: 021-12 82 33 middot E-post: infoloopia. seSaiba mais sobre gt como calcular o periodo ate a data sum in cognos 10 Titulo do resultado da pesquisa: Cognos: Cognos BI 10: calculo entre 2 consultas diferentes. Descricao do resultado da pesquisa: 2 de outubro de 2013. Tenho Q1 com CT1 tabela para obter o periodo atual reveue1 (sum up). O periodo baseia-se no valor da data de 2 solicitacoes selecionadas (mes), por exemplo: start. Titulo do resultado da pesquisa: Cognos: Cognos BI 10: Rolando 12 meses total para cada mes de. Descricao do resultado da pesquisa: Jul 24, 2014. Exibicao: Conversas por data. Eu preciso calcular Rolling contagem de 12 meses para cada mes listado. Primeiro, seria util saber qual a versao do Cognos 10 que voce esta usando, quais os dados quotdimensionais exatos. Isso e conhecido como uma medida Time-State - nao pode ser adicionada em varios periodos de tempo. Titulo do resultado da pesquisa: Usando a funcao periodsToDate no relatorio do IBM Cognos 10 Descricao do resultado da pesquisa: 13 de maio de 2011. Uma descricao de como a funcao dimensional daysToDate pode ser usada fora de uma dimensao de tempo para calcular um total rodando contra on. Titulo do resultado da pesquisa: Cognos: Cognos BI 10: Variancia de taxa nao agregada corretamente dentro Descricao do resultado da pesquisa: 27 de agosto de 2013. Exibicao: Conversas por data. 1-6 de 6. Estou tentando calcular variancia de preco, volume e mix entre 2 periodos. No entanto, a soma dos niveis inferiores nao e igual ao nivel uppper. Minha pergunta e como eu calculo somente os niveis de folha e tenho Cognos BI 10.1 agregam os niveis superiores Titulo de resultado de pesquisa: Cognos: Cognos 8: Relatorios de Vendas para Dia Anterior, Ultimos 5 Dias e. Descricao do resultado da pesquisa: 18 de marco de 2011. 10 respostas Ultimo Post - 18 de dezembro de 2013 por Arhan. Em seguida, voce criaria calculos individuais para cada valor de medida de periodo. Eu acho que pode haver um firstlast de mes de calculo de data no lado Cognos que. Gostaria de comentar sobre Phil39s resposta que, uma vez que voce ira somar estas quantidade de vendas, nao use. Titulo do resultado da pesquisa: Cognos: Cognos 8: Mover-total de funcoes de media movel dando. Descricao do resultado da pesquisa: Jan 7, 2009. Exibicao: Conversas por data. Veja como o arquivo de ajuda descreve a funcao de movimento total. Atualizado em Jan 7, 2009 em 1: 10 PM por SystemAdmin. Eu segui a formula que voce compartilhou para mover-total, mas o que e estranho e. Titulo do resultado da pesquisa: Cognos: Cognos BI 10: Para obter dinamicamente meses no encerramento de trimestre. Descricao do resultado da pesquisa: 20 de dezembro de 2012. O ambiente e o estudio de relatorio do Cognos 8.4.1 contra o cubo MSAS. Determinados meses (3,6,9 amp 12) apenas a partir do nivel do mes dentro da dimensao Data. Como posso automatizar criar um calculo que automaticamente. Re: Para obter dinamicamente meses no trimestre encerramento periodo. Total (currentMeasure no conjunto generate (.)). Titulo do resultado da pesquisa: Cognos: Cognos 8: como agrupar o campo da data por 1 semana ou 2 semanas etc. Descricao do resultado da pesquisa: 11 de maio de 2011. Mas o que eu quero e agrupar a data de inspecao por semana e somar o qty como abaixo. Data de inspecao Qt 2011-01-03 4 (semana 1) 2011-01- 10 3 (semana 2). Tentando calcular todos os periodos necessarios com base nas datas em seu. Titulo do resultado da pesquisa: Cognos: Cognos Express: Reporter. Como fazer a soma cumulativa. Descricao do resultado da pesquisa: Jun 6, 2012. Cognos Express. Exibicao: Conversas por data. Ele funciona bem para mostrar a receita por empresa e por mes, mas eu quero uma soma culative. Titulo do resultado da pesquisa: Praticas comprovadas do IBM Cognos: Usando categorias de tempo relativas. Descricao do resultado da pesquisa: 30 de agosto de 2011. Aplicabilidade. O guia e aplicavel as versoes 8.4 e anteriores do IBM Cognos Report Studio. Figura 10. Editor de expressao membro Slicer com a expressao. Figura 10. Membro Slicer. Por que isso e Para calcular o 39PreviousMonth39 a funcao PrevMember e usada. Publish - date 08302011. Titulo do resultado da pesquisa: Cognos: Cognos BI 10: Inserindo um total de uma consulta diferente. Descricao do resultado da pesquisa: 21 de janeiro de 2013. Cognos BI 10. E perda de produto quando comparado a uma dimensao de data de rolagem 12. Um exemplo seria calcular todos os produtos que tiveram um crescimento entre o anterior ultimo. Eu olho para cada produto, se ele tem crescimento entre os dois periodos. Adicione-o. Como faco para obter o total geral desta consulta em uma referencia cruzada Titulo do resultado da pesquisa: Cognos: Cognos 8: Recuperando dados entre duas datas no relatorio. Descricao do resultado da pesquisa: 5 de janeiro de 2011. Eu tenho um prompt de Periodo (caixa de lista) que ira conter a data no formato janeiro-10. Um item de dados para calcular a data de inicio do exercicio (abril-YY). Titulo do resultado da pesquisa: Cognos: Cognos 8: CY e PY medidas nao estao funcionando corretamente. Descricao do resultado da pesquisa: 2 de agosto de 2011. Cognos 8. 10 10.1.1 10.2 10.2.1 8 8.3 8.4 8.4.1 a e. O CY vs PY Medida acrescenta os anos juntos em vez de subtrair o PY de. Periodo ate a data total (agrupado) ou N o periodo total em execucao (agrupado). Titulo do resultado da pesquisa: IBM Business Analytics Praticas comprovadas: configuracao da data dinamica. Descricao do resultado da pesquisa: 14 de novembro de 2012. Configurando valores de solicitacao de data dinamica no IBM Cognos 10.2 Report Studio. Produto (s): IBM Cognos 10 Area de interesse: Relatorios. Adicionando o JavaScript para definir os valores de prompt dinamico. Cognos 8 Dimensional Functions - IBM Descricao do resultado da pesquisa: Produtos de software Cognos e servicos relacionados que voce licenciou ou adquiriu a partir de Cognos BOTTOMSUM. Funcoes Dimensionais. 10. Informacoes proprietarias da Cognos. A medida Receita e o padrao da medida Medidas. Retorna um membro de um periodo diferente no mesmo parente. O livro de receitas TM1 Este e um esforco colaborativo de escrita: os usuarios podem colaborar escrevendo os artigos do livro, posicionando os artigos na ordem correta e revisando ou modificando artigos previamente escritos. Entao, quando voce tem alguma informacao para compartilhar ou quando voce le um artigo do livro e voce nao gostou, ou se voce acha que um determinado artigo poderia ter sido escrito melhor, voce pode fazer algo sobre isso. Os artigos sao divididos nas seguintes secoes: perspectivas servidor explorador cubo visualizador tm1web planejamento gestor cubo visualizador dicas colunas largura quando voce tem uma visao com um monte de dimensoes visiveis, acontece que a maioria das propriedades da tela e consumida pelas colunas de dimensoes e voce Encontrar-se deslocando muito a esquerda e a direita para ler os pontos de dados. Para facilitar esse problema:. Escolha os aliases mais curtos para todas as dimensoes do editor de subconjuntos. Escolha os subconjuntos de nomes tao curtos quanto possivel. Desmarque as Opcoes-gtExpand Linha Cabecalho ExcelPerspectives Dicas para reduzir a probabilidade de falhar o Excel, desativar o Calculo Automatico. Va para Ferramentas-gtOpcoes-gt Guia Calculo e clique no botao Manual Voce pode usar: F9 para atualizar manualmente todas as pastas de trabalho abertas Shift F9 para atualizar apenas a planilha atual F2 entrar (editar celula) para atualizar apenas 1 celula Em TM1 9.4. 1, as planilhas recalcularao automaticamente ao abrir uma pasta de trabalho, ou alterar um SUBNM apesar da calc automatica estar desativada. No menu superior do Excel, clique em Insert-Name-Define. Na caixa de dialogo Define Name, insira TM1REBUILDOPTION. Defina o valor na caixa Refers to para 0 e clique em OK. . Evitar varias fatias dinamicas em varias folhas em uma pasta de trabalho, se voce pode, caso contrario, o Excel torna-se bastante instavel e algumas referencias podem ficar confuso. Se voce estiver recebendo o e10) diretorio de dados nao encontrado erro ao carregar Perspectivas, voce precisa definir o diretorio de dados do seu servidor local, mesmo se voce nao pode executar um. Va para Files-gtOptions e digite uma pasta valida na caixa Data Directory. Se essa caixa estiver cinza, entao voce precisa editar manualmente a variavel em seu tm1p. ini armazenado em seu PC. Alternativamente, voce pode modificar a configuracao diretamente do Excel com o seguinte codigo do VBA: Application. Run (OPTSET, DatabaseDirectory, C: somepath) Qual versao TM1 voce esta em exibicoes de publicacao A exibicao dos usuarios ainda esta longe de ser um processo rapido e simples no TM1. Primeiro, o administrador nao pode ver outras visualizacoes de usuarios. Em segundo lugar, os usuarios nao podem publicar seus proprios pontos de vista. Portanto, publicar visualizacoes sempre exigem uma intervencao direta do administrador, e nao mais :) if ((ViewExists (Cube, View) 0) ((ViewExists (Cube, View) 1) amp (Overwrite Y))) get UserName If (SubsetExists (Clientes, WhoAmI) 0) SubsetDestroy (Clientes, WhoAmI) Endif StringMDX Clientes), USERNAME) SubsetCreatebyMDX (WhoAmI, StringMDX) UserSubsetGetElementName (Clients, WhoAmI, 1) SubsetDestroy (Clients, WhoAmI) Copiar vista para o espaco publico TM1PathE: TM1DataTM1Server Query cmd C mkdir TM1PathCube vistas ExecuteCommand (Query, 0) Consultar cmd c copiar TM1PathUser Cube vistas Visualizar. vue TM1PathCube vistas Exibir. vue ExecuteCommand (Query, 0) descarregar cubo primeiro para recarregar vistas CubeUnload (Cube) Else ItemReject Existe) Endif 2. altere o TM1Path e salve 3. no Server Explorer, Atribuicao de Processo-gtSecurity, defina esse processo como Read para todos os grupos que devem ser autorizados a publicar Agora, seus usuarios podem publicar suas visualizacoes por conta propria executando esse processo, Eles so precisam digitar o nome o F o cubo ea vista para publicar. O codigo na guia Prolog acima pode ser substituido por essas 5 linhas: if ((ViewExists (Cube, View) 0) (ViewExists (Cube, View) 1) amp (Overwrite Y))) PublishView (Cube, View, 1 , 1) Else ItemReject (Ver view in Cube Cube ja existe) Endif Thats it :) Gracas ao leitor anonimo (por favor registre se voce quer ser creditado) para a sugestao. Exibir dicas para o editor de subconjuntos para exibir elementos consolidados abaixo de seus filhos: View - gt Expandir Acima para obter uma resposta mais rapida do editor de subconjuntos, desabilite a Janela de Propriedades da Janela Propriedades da janela ou clique na Janela de Propriedades de Exibicao na barra de ferramentas para adicionar Um ou mais elementos de um subconjunto existente sem recria-lo: a partir do editor de subconjuntos - Editar-gtInsert Subconjunto - Selecionar os elementos - Clique em OK para Salvar como privado Subconjunto1 agora Subconjunto1 e adicionado ao seu subconjunto existente - Expandir Subconjunto1 - Clique na consolidacao Subconjunto1 Elemento entao excluir agora voce pode salvar seu subconjunto com os novos elementos para obter exibicoes de cubo para exibir muito mais rapido em tm1web: subconjuntos das dimensoes na parte superior deve conter apenas 1 elemento cada clicando nos icones no menu suspenso Exportar nao tera nenhum efeito , Basta clicar no texto associado no direito slicesnapshotpdf ira iniciar um rastreio de exportacao Referencias TM1 Relatorios caseiros TM1 pode ficar bastante complicado e os usuarios podem obter um Dificuldade em atualiza-los, pois e dificil dizer aonde algumas formulas TM1 estao apontando. A barra de ferramentas de auditoria de formula do Excel pode ser util nessas situacoes. Clique com o botao direito ao lado da barra superior para abrir o menu barras. select barra de auditoria Muito util para obter o escopo de uma referencia de cubo ou dimensao em um relatorio ou para ver quais elementos uma formula DBRW e feita. Desenvolvedores turbo integrador regras VBA codigo um olhar mais atento dinamico fatias Dynamic fatias pode ser bastante util quando os elementos que voce exibe em seus relatorios evoluir ao longo do tempo, eles automaticamente atualizar com os novos elementos. O artigo a seguir tentara pesquisar os parametros que definem essas fatias e mostrar algumas das possibilidades de interagir com elas. A ideia foi originalmente apresentada por Philip Bichard. Os parametros dinamicos da fatia armazenados na lista de nomes da planilha para exibi-los no Excel: inserir - gt nome - gt colar - gt colar lista a maioria dos parametros sao definidos como SL xx C yy xx e a referencia de fatia 01, 02, 03 Para quantas fatias existem no relatorio yy e a referencia de dimensao empilhada ex: SL01 C 01 refere-se a primeira dimensao empilhada sobre as colunas SL01C02 diz respeito a 2? dimensao empilhada a partir do topo SL02R01 refere-se a primeira dimensao empilhada para Linhas na parte superior esquerda da 2? fatia CUBE01RNG localizacao da celula que hospeda o nome do cubo referenciado SL01C01DIMNM subconjunto usado ou nome da dimensao se nao estiver usando um subconjunto salvo SL01C01ELEMS01 lista de elementos a serem exibidos SL01C01EXPANDUP 1 0 desencadeia consolidacoes como recolhidas ou expandidas SL01C01FMTNM nome Do formato de elementos a usar SL01C01HND. SL01C01IDXS01. SL01C01RNG para a dimensao empilhada SL01CPRX01. SL01DATARNG gama para celulas DBRW SL01FILT definicoes do filtro SL01R01ALIAS nome do alias utilizado SL01R01DIMNM SL01R01ELEMS01 lista de elementos a apresentar SL01R01ELEMSxx. SL01R01EXPANDUP SL01R01HND SL01R01IDXS01 SL01R01NM nome do subconjunto SL01R01RNG intervalo de limite de secao SL01RPRX01 SL01TIDXS01. SL01TPRX01. SL01VIEWHND. SL01VIEWIDX. SL01ZEROSUPCOL de zero suprimir em colunas desencadear SL01ZEROSUPROW de zero suprimir em linhas desencadear SX01C01ENABLE gatilho SX01C01IDX SX01C01WD SX01R01ENABLE gatilho SX01R01HT SX01R01IDX gatilho SX01RNG seccao limite gama SXBNDDSP seccao limite formula visor gatilho TITLE1 subnm para primeira dimensao TITLE1NM subconjunto localizacao celular TITLE1RNG TITLE2 TITLE2NM TITLE2RNG TITLE3 alias TITLE3ALIAS para exibir para A dimensao TITLE3RNG redefinindo o seguinte nome SL01FILT de SL01FILT FUNCTIONPARAM0.000000SORTORDERdescTUPLESTRSales Measures. Sales Units para SL01FILT FUNCTIONPARAM0.000000SORTORDERascTUPLESTRSales Measures. Sales Custo alteraria a coluna na qual a classificacao e feita de unidades de vendas para custo de vendas e tambem a ordem de decrescente para Ascendente. Tambem se pode obter um resultado semelhante com uma expressao MDX. O codigo a seguir alterara o subconjunto da cota na pilha de linhas para o subconjunto dinamico Nivel Zero predefinido para que todos os elementos sejam exibidos. Observacao, voce precisara usar TM1REFRESH ou Alt-F9 para obter a fatia para reconstruir-se, TM1RECALC (F9) so atualizar as formulas DBRW. Fatias dinamicas irao quebrar com o seguinte pop-up Nenhum valor disponivel por causa de algum elemento nao existe mais ou nao ter quaisquer valores para essa fatia especifica. Uma correcao facil e desconectar do servidor TM1, carregar o relatorio, remover o elemento causando problemas da fatia e tabela de nomes e, em seguida, reconectar ao servidor TM1, a fatia dinamica sera atualizada sobre reconectar muito bem. trabalho em progresso. Atributos Editar atributos. Se voce receber a seguinte mensagem Essa operacao acessa uma dimensao que contem um grande numero de elementos. O carregamento desses elementos do servidor pode demorar alguns minutos. Continue editando diretamente o cubo de atributos em vez disso, ele e muito mais rapido: - Exibir - gt Display Control Objects - Abra a dimensao cube ElementAttributes - entao modifique os campos necessarios como em qualquer cubo Add New Attribute para grandes dimensoes, e mais rapido criar um TI temporario processo com o seguinte codigo no Prolog ATTRINSERT (Model. InteriorColor, S) Este exemplo cria o atributo de cor InteriorColor para a dimensao modelo. Verificando se um attributealias ja existe permite dizer que queremos criar um codigo de alias para a dimensao Cliente. Na guia Avancado-gtProlog: Se (DIMIX (ElementAttributesCustomer, Codigo) 0) AttrInsert (Cliente ,, Codigo, A) Endif Assim, voce nao precisa se preocupar com o AttrInsert gerando um erro se voce ja tiver que executar o processo novamente. Se voce atualizar aliases em TM1, voce precisara limpar o cache do Excel para ver as alteracoes executando a macro mclear ou apenas reiniciar o Excel. Relatorios em massa A funcao TM1-gtPrint Report do Perspectives e util para gerar relatorios estaticos em massa para um dado conjunto de elementos. O codigo a seguir esta imitando e estendendo essa funcionalidade para obter relatorios em massa para um relatorio TM1 de uma forma mais flexivel. Por exemplo, voce pode obter um relatorio com base nas filiais de uma empresa para ser salvo em cada pasta sucursal documentos em vez de recebe-los todos despejados em uma unica pasta ou voce tambem pode obter cada sucursal relatorio enviado por e-mail para seu proprio gerente de filial. Comentando porcoes de codigo em TI Voce gostaria de comentar porcoes de codigo para uso legado ou futuro em vez de remove-lo. Anexando na frente de cada linha e feio e messes ate o recuo. Aqui esta uma correcao rapida, simples e simples. E isso ai. Ele tambem pode ser util para desativar o codigo gerado automaticamente no DECLARACAO DE DECLARACOES GERENCIADAS. Eu recomendo fortemente que voce adicione marcadores claros em torno do codigo comentado em contrario, pode ser muito facil ignorar a declaracao curta e se passar um tempo se perguntando por que o processo nao esta fazendo nada. Obrigado Paul Simon para a ponta. Criando exibicoes (temporarias) ao criar visualizacoes a partir do visualizador de cubos, ha um limite rigido para o tamanho da exibicao exibida. E 100MB (32bit) ou 500MB (64bit) por padrao, ele pode ser alterado com o parametro MaximumViewSize no tm1s. cfg Mas nao e pratico para gerar tais grandes vistas manualmente. Uma alternativa e faze-lo a partir do Turbo Integrator: criar um novo processo de TI selecionar TM1 Cubo ver importacao clique procurar selecionar o cubo clique criar vista de la voce pode criar qualquer viewhowever ele pode ser mais vantajoso para criar e excluir vistas on-the - Voar para que seu servidor e mais limpo e os usuarios serao menos confusos. O codigo a seguir gera uma exibicao do cubo MyCube incluindo todos os elementos do cubo. Voce precisa adicionar algum SubsetCreateSubsetElementInsert para limitar a exibicao remover todas as consolidacoes. Na maioria dos casos eles interferem com a importacao e voce tera apenas uma importacao parcial ou nada. -------- prolog CubeName MyCube ViewName TIImport SubsetName TIImport i 1 loop atraves de todas as dimensoes do cubo enquanto (tabdim (CubeName, i) ltgt) ThisDim tabdim (CubeName, i) If (SubSetExists (ThisDim, SubsetName) 0 StringMDX, 0) criar um subconjunto filtrando todas as hierarquias SubsetCreatebyMDX (SubsetName, StringMDX) EndIf ii 1 end If (ViewExists (CubeName, ViewName) 0) ViewCreate (CubeName, ViewName) Endif i 1 loop atraves de todas as dimensoes do cubo while ( (CubeName, ViewName, 1) ViewExtractSkipZeroesSet (CubeName, ViewName, 1) ------------------------------------------------------------------------------------------------------------------------------------------------------------- ------ epilog cleanup ver ViewDestroy (CubeName, ViewName) i 1 loop atraves de todas as dimensoes do cubo while (tabdim (CubeName, i) ltgt) SubsetDestroy (tabdim (CubeName, i), SubsetName) Subconjuntos em Applix TM1 com MDX - A Primer Acerca deste Documento Este Primer MDX destina-se a servir como um simp Introducao a criacao de subconjuntos de dimensao dinamica usando MDX em TM1. Ele se concentra em dar exemplos de trabalho em vez de tentar explicar a teoria completa de MDX e garante cobrir os recursos mais uteis para os usuarios TM1. TM1 atualmente (a partir do 9.0 SP3) so permite que os usuarios usem o MDX para criar subconjuntos de dimensao e nao para definir visualizacoes de cubo. Isso significa que o uso do MDX na TM1 e muitas vezes bastante diferente em termos de sintaxe e intencao de exemplos encontrados em livros e na internet. Como MDX (Multi-Dimensional eXpressions) e uma linguagem de consulta padrao da industria para bancos de dados OLAP da Microsoft, ha muitas referencias e exemplos a serem encontrados na Internet, embora tenha em mente que TM1 nao suporta todos os aspectos da linguagem e acrescenta alguns Caracteristicas unicas de seu proprio. Isso pode dificultar o uso de exemplos encontrados na web, enquanto que todos os exemplos neste documento podem ser simplesmente copiados e colados na TM1 e executados sem modificacao, assumindo que voce tem o mini-modelo de exemplo criado como documentado posteriormente. Documento completo como apenas uma pagina HTML aqui. O que e um subconjunto dinamico baseado em MDX em TM1 Um subconjunto dinamico e aquele que nao e uma lista fixa, estatica, mas em vez disso e baseado em uma consulta que e reavaliada toda vez que o subconjunto e usado. De fato, o MDX pode ser usado para criar um subconjunto estatico e um exemplo e mostrado abaixo, mas isso provavelmente nao sera util ou comum. Alguns exemplos de subconjuntos dinamicos uteis podem ser uma lista de todos os produtos base-level uma lista de nossos 10 clientes superiores pela margem bruta uma lista de carregamentos de provisao atrasados ??todos os centros de custo que nao submeteram ainda seu orcamento. O ponto e, essas listas (subconjuntos) podem variar de segundo para segundo com base na estrutura ou dados em TM1. Por exemplo, assim que um novo ramo for adicionado a Europa, o subconjunto de Ramos Europeiros contera imediatamente este novo ramo, sem qualquer intervencao manual necessaria. MDX e a linguagem de consulta usada para definir esses subconjuntos. MDX e uma linguagem de consulta padrao do setor para bancos de dados multidimensionais como TM1, embora TM1 so suporta um determinado subconjunto (desculpa o trocadilho) de todo o idioma e adiciona em algumas caracteristicas unicas de sua propria tambem. Quando voce define um subconjunto usando MDX em vez de um subconjunto padrao, TM1 armazena essa definicao ao inves do conjunto resultante. Isso significa que a definicao ou consulta e re-executar cada vez que voce olha para ele sem o usuario ou administrador precisando fazer nada. Se o banco de dados foi alterado de alguma forma, entao voce pode obter resultados diferentes da ultima vez que voce usou. Por exemplo, se um subconjunto e definido como sendo os filhos de West Coast Branches e isso inicialmente retorna Oakland, San Francisco, San Diego, quando e definido pela primeira vez, pode mais tarde retornar Oakland, San Francisco, San Diego, Foi adicionado a dimensao como um filho de West Coast Branches. Isto e o que queremos dizer por dinamico o resultado muda. Outra razao que pode causar o subconjunto alterar e quando ele e baseado nos valores dentro de um cubo ou atributo. Todos os dias no jornal os maiores motores de mercado de acoes estao listadas, como um top 10 em termos de aumento do preco da acao. Em um modelo TM1 este seria um subconjunto que olha uma medida da mudanca do preco da parte e claramente seria provavel retornar um grupo diferente de 10 membros diarios. A melhor parte e que o subconjunto atualizara seus resultados automaticamente sem qualquer trabalho necessario por parte de um usuario. Como criar um subconjunto baseado em MDX no TM1 Os mesmos passos basicos podem ser seguidos com todos os exemplos neste documento. Geralmente, os exemplos podem ser copiados e colados na janela de expressoes do editor de subconjuntos da dimensao em questao, muitas vezes produto. Observe que e irrelevante qual cubo a dimensao esta sendo usada por voce obtera os mesmos resultados se voce abrir o Editor de subconjuntos de dimensao de dentro de uma visualizacao de cubo, a arvore de cubo no Server Explorer ou a arvore de dimensao no Server Explorer. Para visualizar e editar uma consulta MDX, voce deve ser capaz de ver a janela de expressao no editor de subconjuntos. Para ativar ou desativar essa janela, selecione Exibir janela de expressoes. Agora voce pode simplesmente digitar (ou colar) sua consulta neste Expression Windows e pressionar o botao Atualizar para ver os resultados. Como criar um subconjunto estatico com MDX Um subconjunto estatico e aquele que nunca varia em seu conteudo. Esta consulta retornara os mesmos 3 membros (Emprestimo de desconto, Emprestimo de prazo e Varejo) de cada vez. Nao se preocupe, fica mais emocionante a partir daqui. Como criar um subconjunto dinamico com MDX TM1 so suporta um certo numero de funcoes a partir da especificacao MDX completa. Diferentes versoes do TM1 suportam diferentes funcoes (e potencialmente suportam o de diferentes maneiras). O conjunto valido de funcoes para a versao do TM1 que voce esta usando pode ser encontrado no arquivo de Ajuda principal, em Material de Referencia Suporte a Funcao MDX. Antes de tentar escrever uma nova consulta, verifique se ela e suportada e, embora algumas funcoes nao listadas certamente funcionem, elas devem ser usadas por sua propria conta e risco. A mensagem de erro padrao que significa que a funcao e genuinamente nao suportada pela sua versao do TM1 e, Falha ao compilar expressao. Uma palavra de advertencia: por sua propria natureza, os resultados de um subconjunto dinamico podem mudar. Ao incluir subconjuntos dinamicos em modos de exibicao, processos, funcoes SUBNM e assim por diante, considere cuidadosamente quais seriam os possiveis resultados futuros, especialmente se o subconjunto puder um dia ficar vazio. Os dois metodos mais comuns para ir sobre realmente criar um subconjunto dinamico sao cria-los a mao ou usando TurboIntegrator. A mao . Voce pode digitar (ou colar) uma consulta na janela de expressoes, conforme explicado anteriormente, ou pode escolher Tools Record Expression (e entao Stop Recording quando terminar) para ativar um tipo de gravador de video. Voce pode entao usar os recursos normais do editor de subconjuntos (por exemplo, selecionar por nivel, classificar descendente, etc.) e este gravador transformara suas acoes em uma expressao valida de MDX. Esta e uma otima maneira de ver alguns exemplos de sintaxe valida, especialmente para consultas mais complexas. Quando voce gravar uma expressao e escolher Parar Gravacao TM1 pedira para confirmar se deseja anexar a expressao com o subconjunto - certifique-se de dizer Sim e marque a caixa de selecao Salvar Expressao ao salvar o subconjunto resultante, caso contrario, apenas uma lista estatica Do resultado e salvo, nao a propria consulta dinamica. Usando TurboIntegrator. Apenas uma linha, usando SubsetCreateByMDX, e necessaria para criar e definir o subconjunto. Voce precisara saber qual consulta voce deseja como a definicao ja. Observe que a consulta pode ser construida no script TI usando concatenacao de texto para que possa incorporar variaveis ??de seu script e permitir que consultas longas sejam construidas em estagios que sao mais faceis de ler e manter. SubsetCreatebyMDX (Base Products,, 0)) Todos os subconjuntos MDX criados por TI sao salvos como consultas MDX dinamicas automaticamente e nao como uma lista estatica. Observe que, pelo menos ate TM1 v9.0 SP3, os subconjuntos baseados em MDX nao podem ser destruidos (SubsetDestroy) se estiverem sendo usados ??por uma visualizacao publica e nao podem ser recriados usando um segundo comando SubsetCreateByMDX. Portanto, e dificil alterar subconjuntos baseados em MDX usando TI. Embora a natureza dinamica da definicao do subconjunto pode torna-lo um pouco improvavel que voce vai realmente querer fazer isso, e importante ter em mente. Se voce precisar alterar algum aspecto da consulta (por exemplo, um TM1FilterByPattern de 2006-12 a 2007-01, talvez seja necessario definir a consulta para usar parametros externos, como documentado neste documento. Isso tera um pequeno impacto de desempenho sobre o mais simples Tambem pode filtrar os valores de um cubo com SubsetCreateByMDX na aba Epilog, por exemplo, 0), Test. (Postando Measures. Amount) gt 0) nao funcionara se os valores tiverem sido carregados na guia Dados. Voce precisa executar o comando SubsetCreateByMDX em um processo de TI subsequente. Observe que TI tem um limite de 256 caracteres para definir subconjuntos MDX, pelo menos ate v9.1 SP3, o que pode ser bastante limitante. Sintaxe e Layout Uma consulta pode ser quebrada em varias linhas para torna-la mais legivel. Por exemplo: FILTER (, 0), Test2. (Rate Measures. Rate) 19) e mais legivel do que ter a consulta inteira em uma linha. A secao de filtro real e mais facilmente lida e modificada agora por te-lo em uma linha por si so. Observe que as referencias aos membros geralmente tem o nome da dimensao como um prefixo. Por exemplo, na verdade, o nome da dimensao e opcional, mas somente se o nome do membro (varejo neste caso) for completamente exclusivo dentro do servidor inteiro - ou seja, nao ha cubos, dimensoes ou membros com esse nome exato. Por exemplo, esta e a mesma consulta com o nome da dimensao omitido: O que funcionaria no contexto do aplicativo de exemplo usado por este documento, mas seria arriscado em um aplicativo do mundo real. A mensagem de erro recebida ao esquecer de especificar o prefixo seria algo como, Nivel ou nome de membro Varejo ambiguo: encontrado em dimensoes e, em seguida, ele vai para listar as varias dimensoes em que o nome de membro nao-unico pode ser encontrado, o que e muito util. Portanto, e certamente mais seguro e mais eficiente usar sempre o prefixo de dimensao. O uso de colchetes pode as vezes parecer um pouco arbitrario ao ler exemplos de consultas MDX. O fato e que um nome de objeto OLAP (por exemplo, nome do cubo, nome da dimensao, nome do membro) deve ser colocado entre colchetes somente se ele contem um espaco, comeca com um numero ou e uma palavra reservada do MDX (por exemplo, Selecionar). No entanto, as vezes pode ser mais simples decidir sempre usar colchetes para consultas semelhantes podem ser comparadas lado a lado com mais facilidade. A definicao exata de um membro em TM1 e quase sempre expressa como Dimension Name. Member Name e nao mais. Em outros produtos que tambem usam o MDX como uma linguagem de consulta (como o Microsoft Analysis Services), voce pode perceber que as consultas especificam o caminho completo do nome da dimensao ate a hierarquia ate o nome do membro, por exemplo: Date.2009.Q1.Feb. Week 06 Isso tambem pode ser escrito como Date.2009Q1FebWeek 06 A razao para isso e que outros produtos nao podem exigir que cada nome de membro seja unico, pois cada membro tem um contexto (sua familia) para permitir que ele seja identificado de forma exclusiva, razao pela qual Eles precisam saber exatamente qual Semana 06 e necessaria, pois pode haver outros (em 2008, por exemplo, no exemplo acima). TM1 requer todos os nomes de membros, em qualquer nivel (e dentro de Aliases) para ser completamente exclusivo dentro dessa dimensao. TM1 precisaria que voce fizesse Q1, Feb e Week 06 mais explicitos em primeiro lugar (ou seja, Q1 2009, Feb 2009, Semana 06 2009), mas voce pode apenas referir-se a Date. Week 06 2009. Finalmente, o caso (ou seja, letras maiusculas Versus minusculas) nao e importante com comandos MDX (por exemplo, Filtro ou FILTER, TOPCOUNT ou TopCount estao todos bem), mas novamente voce pode preferir adotar apenas um estilo como padrao para torna-lo mais facil de ler. O modelo de exemplo usado Neste documento, muitos exemplos de consultas dinamicas serao fornecidos. Todos eles funcionam (exatamente como escrito, basta copia-los e cola-los na janela de expressao no editor de subconjuntos da dimensao apropriada para usa-los) no conjunto simples de cubos e dimensoes mostrados abaixo. O modelo e deliberadamente simples, sem caracteristicas especiais, pelo que deve ser facil transferir o trabalho para o seu proprio modelo. O modelo utilizado incluiu 1 dimensao principal, Produto, em que a grande maioria das consultas trabalha mais 3 cubos: Test, Test2 e Test3. Os valores de dados nos cubos variam durante o teste (voce quer ajustar os valores e executar novamente a consulta para certificar-se de que os resultados mudam e estao corretos), mas as screenshots abaixo mostram as estruturas de cubo e dimensao suficientemente bem para que voce recrie rapidamente Eles ou como usar seu proprio modelo em vez disso. Para simplificar a distribuicao deste documento nao ha intencao de tambem distribuir os arquivos reais do modelo TM1. Observe que a principal dimensao utilizada, Produto, apresentava ragged, e multiplas, hierarquias. TM1SubsetAll, Membros, intervalo de membros A base para muitas consultas, isso retorna (quase, veja abaixo) a dimensao inteira, que e o equivalente a clicar no botao Tudo no Editor de Subconjuntos. TM1SUBSETALL (Product) Observe que somente a instancia final na primeira hierarquia de membros que sao consolidadas varias vezes e retornada. A funcao Membros, por outro lado, fornece a dimensao completa, incluindo duplicados: Product. Members Um intervalo de membros contiguos do mesmo nivel pode ser selecionado especificando o primeiro e ultimo membro do conjunto que voce precisa com um dois-pontos entre eles. This example returns Jan 1st through to Jan 12th 1972. Select by Level, Regular Expression (Pattern) and Ordinal Selecting members based on their level in the dimension hierarchy (TM1FilterByLevel) or by a pattern of strings in their name (TM1FilterByPattern) can be seen easily by using the Record Expression feature in the subset editor. The classic all leaf members query using TM1s level filtering command TM1FilterByLevel: , 0) Select all the leaf members which match the wildcard HC i. e. that have H and C as the third and fourth characters from the end of their name. , 0), HC) The reason that these functions start with TM1 is that they are not standard MDX commands and are unique to TM1. There are two main reasons why Applix will implement such unique functions: to add a feature that is present in standard TM1 and users will miss if it is not there or because standard TM1 has the same feature as MDX but has historically implemented it slightly differently to MDX and therefore would, again, cause users problems if it was only implemented in the standard MDX way. In these two cases, TM1FilterByPattern brings in a function commonly used by TM1 users that is lacking in MDX, while TM1FilterByLevel exists because TM1 has, since its launch in 1984, numbered consolidation levels starting at zero for the leaf level rising up the levels to the total members, while Microsoft decided to do it the exact opposite way. In certain situations it is useful to use the standard MDX levels method and this is also available with the Levels function. It allows you return the members of a dimension that reside at the same level as a named member, just bear in mind that standard MDX orders the levels in terms of their distance from the top of the hierarchy and not the bottom as TM1. This example returns all the members at the same level as the Retail member: Which, although Retail is a high level consolidation, returns an N: item (Product Not Applicable) in the dimension because this rolls straight up into All Products as does Retail so they are considered to be at the same level. To filter the dimension based on a level number you need to use the. Ordinal function. This is not documented as being supported in the Help file, and did not work in 8.2.7, but appears to work in 9.0 SP3 and 9.1.1.36 at least. This example returns all the members at Level 1: , Product. CurrentMember. Level. Ordinal 1) This example would return all members not at the same level as Discount Loan. , Product. CurrentMember. Level. Ordinal TM1Sort, TM1SortByIndex and Order TM1Sort is the equivalent of pressing one of the two Sort Ascending or Sort Descending buttons in the subset editor i. e. sort alphabetically. TM1SortIndex is the equivalent of pressing one of the two Sort by index, ascending or Sort by index, descending buttons in the subset editor i. e. sort by the dimension index (dimix). Order is a standard MDX function that uses a data value from a cube to perform the sort. For example, sort the list of customers according to the sales, or a list of employees according to their length of service. Sort the whole Product dimension in alphabetically ascending order. , ASC) Sort the leaf members of the dimension according to their Amount values in the Test cube from highest downwards. ORDER( ,0) . Test.(Posting Measures. Amount), BDESC) Note that using BDESC instead of DESC gives radically different results. This is because BDESC treats all the members across the set used (in this case the whole dimension) as being equal siblings and ranks them accordingly, while DESC treats the members as still being in their family groups and ranks them only against their own direct siblings. If youre not sure what this means and cant see the difference when you try it out, then just use BDESC Order can also use an attribute instead of a cube value. In this example the AlternateSort attribute of Product is used to sort the children of Demand Loan in descending order. It is a numeric attribute containing integers (i. e. 1, 2, 3, 4, etc) to allow a completely dynamic sort order to be defined: , Product. AlternateSort, DESC) TopCount and BottomCount A classic Top 10 command: , 0), 10, Test.(Posting Measures. Amount) ) By omitting a sort order it sorts in the default order (which has the values descending in value and breaks any hierarchies present). A Top 10 query with an explicit sort order for the results. ,0), 10, test.(Posting Measures. Amount)), test.(Posting Measures. Amount), BDESC) BDESC means to break the hierarchy. Note how the chosen measure is repeated for the sort order. Although the same measure is used in the sample above you could actually find the top 10 products by sales but then display them in the order of, say, units sold or a Strategic Importance attribute. This is the top 10 products based on Test2s Rate values, not ordered so will be sorted according to the values in Test2. ,0), 10, Test2.(Rate Measures. Rate)) This is the top 10 products based on test2s data in the Rate measure, ordered from 10 through 1. ,0), 10, test2.(Rate Measures. Rate)), test2.(Rate Measures. Rate), ASC) TopCount automatically does a descending sort by value to get the TOP members. If this is not desired, you might want to use the Head function (detailed below) instead. BottomCount is the opposite of TopCount and so is used to find the members with the lowest values in a cube. Beware that the lowest value is often zero and if that value needs to be excluded from the query you will need to refer to the section on the Filter function later in this document. A Bottom 10 query with an explicit sort order for the results. ,0), 10, test.(Posting Measures. Amount)), test.(Posting Measures. Amount), BASC) Further reading: TopSum, TopPercent and their Bottom equivalents are useful related functions. Filter, by values, strings and attributes The FILTER function is used to filter the dimension based on some kind of data values rather than just the members and their hierarchy on their own. This data might be cube data (numeric or string) or attribute data. This requires a change of thinking from straightforward single dimensions (lists with a hierarchy and occasionally some attributes) to a multi-dimensional space, where every dimension in these cubes must be considered and dealt with. This example returns the leaf members of Product that have an Amount value in the Test cube above zero. , 0), Test.(Posting Measures. Amount) gt 0 ) Since the Test cube only has 2 dimensions Product and Posting Measures this is a simplistic example. Most cubes will have more than just the dimension being filtered and the dimension with the filter value in. However, it is simple to extend the first example to work in a larger cube. This example returns the leaf members of Product that have an Amount value for All Entities in the Test3 cube above zero. , 0), Test3.(Entity. All Entities, Posting Measures. Amount) gt 0 ) As you can see from the above, simply include all the requisite dimension references inside the round brackets. Usually you will just need a specific named member (e. g. All Entities). If the dimension is omitted then the CurrentMember is used instead which is similar to using dimension (i. e. for each) in a TM1 rule, and could return different results at a different speed. Instead of just using a hardcoded value to filter against (zeroes in the examples above), this example returns all products with an amount in the Test cube greater than or equal to the value in the cell MidasJCFI, Amount. , 0), Test.(Posting Measures. Amount) gt Test.(Product. MidasJCFI, Posting Measures. Amount) ) This query returns the products that have a Rate value in Test2 greater than MidasJXCOs Rate in Test2. Now, this query just returns a set of products its up to you which cube you display these products in i. e. you can run this while browsing Test and therefore return what looks like an almost random set of products but the fact is that the query is filtering the list of products based on data held in Test2. This may not immediately appear to be useful but actually it is, and can be extremely useful for example display the current years sales for products that were last years worst performers. If the data for two years was held in different cubes then this would be exact same situation as this example. There are often many potential uses for displaying a filteredfocused set of data in Cube B that is actually filtered based on data in Cube A. , 0), Test.(Posting Measures. Amount) gt Test2.(Product. MidasJXCO, Rate Measures. Rate) ) As detailed elsewhere, Tail returns the final member(s) of a set. An example of when it is handy when used with Filter would be for finding the last day in a month where a certain product was sold. The simple example below initially filters Product to return only those with an All Entity Amount gt 0, and then uses tail to return the final Product in that list. , 0), Test3.( Entity. All Entities, Posting Measures. Amount) gt 0 )) Note: with the other cubes having more dimensions than does Test the current member is used (each), not All so whether you want each or All you should write this explicitly to be clearer. You can even filter a list in Cube1 where the filter is a value in one measure compared to another measure in Cube1. This example returns the Products with an amount in the Test cube above zero where this Amount is less than the value in Count. , 0), (Test. Posting Measures. Amount 0 ) This example returns all the leaf products that have an Amount in Entity Not Applicable 10 greater than the Amount in Entity Not Found, in the Test3 cube. Not very useful but this was the only example cube we had to work with, but it would be very useful when comparing, say, Actual Q1 Sales with Budget, or finding out which cost centres Q2 Costs were 10 higher than Q1. Later in this document we will see how to take that 10 bit and make it a value from another cube, thus allowing administrators, or even end users, to set their own thresholds. , 0), test3.(Entity. Entity Not Applicable, Posting Measures. Amount) 1.1 gt test3.(Entity. Entity Not Found, Posting Measures. Amount)) Filtering for strings uses the same method but you need to use double quotes to surround the string. For example, this query returns products that have a value of bob in the Test2 cube against the String1 member from the StringTest dimension. Note that TM1 is case-insensitive. , 0), Test2.(StringTest. String1) bob ) Filter functions can be nested if required, although the AND or INTERSECT functions may be useful alternatives. The limit to the number of characters that an MDX subset definition can sometimes be, 256, is too restricting for many data-based queries. When trying to shoehorn a longer query into less characters there are a few emergency techniques that might help: consider whether you need things like TM1FILTERBYLEVEL, 0 (it might well be that the filter would only return members at the leaf level by definition anyway) whether the dimension name prefix can be removed if the member is guaranteed to be unique remove all spaces lookup cubes are not for end users so maybe you could shorten some names (cubes, dimension, members) drastically whether there are alternative functions with shorter syntaxes that return the same result - e. g. an INTERSECT or AND versus a triple FILTER. Finally, if it really is vital to get a long query working then you can build up the final result in stages i. e. put some of the filtering into Subset1, then use Subset1 as the subject of Subset2 which continues the filtering, etc. Parent, Children, FirstChild, LastChild, Ancestors, Descendants, DrillDownLevel and TM1DrilldownMember Children returns the set of members one level below a named parent. FirstChild returns the first child one level below a named parent. Returns Call Participation Purchased. LastChild returns the last child one level below a named parent. This is excellent for finding the last day in a month, since they can vary from 28 to 31. Another example is when a consolidation is set up to track a changing set of members (e. g. Easter, or Strategic Customers). Returns Term Participation Purchased. Parent returns the first parent of a given member. If a member has more than one parent, and the full unique path to the member is not specified then the first parent according to the dimension order is returned. Returns Bonds. Would force TM1 to return the second parent, External Bonds. Descendants returns the named parent and all of its descendant children i. e. the hierarchy down to the leaf level: TM1DrilldownMember returns the same thing as descendants: , ALL, RECURSIVE ) DrillDownLevel just returns the parent and its immediate children: ) DrillDownLevel can be extended with a parameter to say which level to return the members from, rather than the level immediately below, but this doesnt appear to work in TM1 v9.0 SP2 through to 9.1.1.36. The common requirement to return a list of just leaf-level descendants of a given consolidated member just needs a level filter applied to the TM1DrillDownMember example above:,ALL, RECURSIVE), 0) Or: , 0) Ancestors is like a more powerful version of Parent it returns a set of all the parents of a member, recursively up though the hierarchy including any multiple parents, grandparents, etc. Returns 2006 October, 2006 Q4, 2006 H2, 2006, All Dates. Lag, Lead, NextMember, PrevMember, FirstSibling, LastSibling, Siblings and LastPeriods Lags and Leads are the equivalent of DnextDprev. will return 2006-10-04. Lead(n) is the same as Lag(-n) so either function can be used in place of the other by using a negative value, but if only one direction will ever be needed in a given situation then you should use the correct one for understandabilitys sake. Note that they only return a single member so to return the set of members between two members you can use the lastperiods function. Equally you can use NextMember and PrevMember when you only need to move along by 1 element. Or: To return the 6 months preceding, and including, a specific date: Or: LastPeriods(6, Date.2006-10-03) Both of which work because LastPeriods is a function that returns a set, and TM1 always requires a set. Curly braces convert a result into a set which is why many TM1 subset definitions are wrapped in a pair of curly braces, but in this case they are not required. This will return the rest (or the ones before) of a dimensions members at the same level, from a specified member. Despite its name LastPeriods works on any kind of dimension: Siblings are members who share a common parent. For example, a date of 14th March 2008 will have siblings of all the other dates in March the first of which is the 1st March and the last of which is 31st March. A cost centre under West Coast Branches would have a set of siblings of the other west coast branches. The FirstSibling function returns the first member that shares a parent with the named member. For example: Returns MidasHCBK. While: Returns MidasHSFI. The siblings function should return the whole set of siblings for a given member. TM1 9.0 SP2 through to 9.1.2.49 appear to give you the entire set of members at the same level (counting from the top down) rather than the set of siblings from FirstSibling through to LastSibling only. Filtering by CurrentMember, NextMember, PrevMember, Ancestor and FirstSibling This example returns the members that have an Amount value in the Test cube above 18. The Product. CurrentMember part is optional here but it makes the next example clearer. , 0), Test.(Product. CurrentMember, Posting Measures. Amount) gt 18 ) This query then modifies the previous query slightly to return members where the NEXT member in the dimension has a value above 18. In practice this is probably more useful in time dimensions. , 0), Test.(Product. CurrentMember. NextMember, Posting Measures. Amount) gt 18 ) This can then be improved to returning members where the next member is greater than their amount. , 0), Test.(Product. CurrentMember. NextMember, Posting Measures. Amount) gt Test.(Product. CurrentMember, Posting Measures. Amount) ) In addition to NextMember, PrevMember can also be used as could lags and leads. The simple, but unsupported as of 9.1.1.89, Name function allows you to filter according to the name of the member. As well as exact matches you could find exceptions, less-thans and greater-thans, bearing in mind these are alphanumeric comparisons not data values. This example returns all base members before and including the last day in January 1972. ,0), Date. CurrentMember. Name For example, this could be a useful query even a dimension not as obviously sorted as dates are: ,0), Product. CurrentMember. Name which returns all base members before MidasJ in terms of their name rather than their dimension index. Parent returns the first parent of a given member: Used with Filter you can come up with another way of doing a children of query: ,0), Date. CurrentMember. Parent. Name 1972 - January) Ancestor() can be used instead of Parent if desired. This example returns base-level product members whose first parents have a value above zero, in other words a kind of family-based suppress zeroes: a particular product might have a value of zero but if one if its siblings has a value then it will still be returned. , 0), Test.(Ancestor(Product. CurrentMember,0), Posting Measures. Amount) gt 0 ) This example filters the products based on whether they match the Amount value of MidasHCBK. , Test.(Ancestor(Product. CurrentMember,0), Posting Measures. Amount) Test.(Product. MidasHCBK, Posting Measures. Amount) ) This example uses FirstSibling to filter the list based on whether a products value does not match that products First Sibling (useful for reporting changing stock levels or employee counts over time, for example, things that are usually consistent). , 0), Test.(Ancestor(Product. CurrentMember,0), Posting Measures. Amount) Filtering by Attributes and logical operators This returns members that match a certain attribute value using the Filter function. , Product. Category Customer Lending) This example looks at multiple attribute values to return a filtered list: FILTER( , ( (Product. CategoryCustomer Lending OR Product. TypeDebit) AND (Product. Internal Deal Filtering by level, attribute and pattern are combined in the following example: ,0), Product. Internal Deal Yes), ID) Head, Tail and Subset Where TopCount and BottomCount sort the values automatically and chop the list to leave only the most extreme values, Head combined with Filter works in a similar manner but Head then returns the FIRST members of the filtered set in their original dimension order. These queries simply return the first and last members of the Product dimension as listed when you hit the All button: This returns the actual last member of the whole Product dimension according to its dimix: , ALL, RECURSIVE ), ASC)) An example of Tail returning the last member of the Customer Lending hierarchy: , ALL, RECURSIVE )) An example of Head returning the first 10 members (according to the dimension order) in the product dimension that have an Amount in the Test cube above zero. , 0), Test.(Posting Measures. Amount) gt 0 ), 10) With both Head and Tail the ,10 part can actually be omitted (or just use ,0) which will then return the first or last member. This returns the last (in terms of dimension order, not sorted values) product that had an amount gt 0 in the Test cube. , 0), Test.(Posting Measures. Amount) gt 0 )) One example of when this is useful over TopCount or BottomCount i. e. when sorting the results would be detrimental - would be to return the last day the year when a certain product was sold. Subset is closely related to Head and Tail, and can actually replicate their results, but is additionally capable of specifying a start point and a range, similar in concept to substring functions (e. g. SUBST) found in other languages, though working on a tuple of objects not strings. The equivalent of Head, 10 would be: , 1, 10) But Subset would also allow us to start partitioning the list at a point other than the start. So for example to bring in the 11th 20th member: , 11, 10) Note that asking for more members than exist in the original set will just return as many members as it can rather than an error message. Union joins two sets together, returning the members of each set, optionally retaining or dropping duplicates (default is to drop). To create a list of products that sold something both in this cube and in another (e. g. last year and this): FILTER( , 0), Test.(Posting Measures. Amount) gt 0 ) , FILTER( , 0), Test3.(Posting Measures. Amount, Entity. All Entities) gt 0 ) ) Intersect returns only members that appear in both of two sets. One example might be to show products that performed well both last year and this year, or customers that are both high volume and high margin. The default is to drop duplicates although , ALL can be added if these are required. This example returns leaf Product members that have an Amount gt 5 as well as a Count gt 5. INTERSECT( FILTER( , 0), Test.(Posting Measures. Amount) gt 5 ) , FILTER( , 0), Test.(Posting Measures. Count) gt 5 ) ) Except and Validating Dimension Hierarchies The function takes two sets as its mandatory parameters and removes those members in the first set that also exist in the second . In other words it returns only those members that are not in common between the two sets, but note that members that are unique to the second set are not included in the result set. Except is a useful function in a variety of situations, for example when selecting all the top selling products except for 1 or 2 you already know are uninteresting or irrelevant, or selecting all the cost centres with high IT costs except for the IT department. The simplest example is to have a first set of 2 members and a second set of 1 of those members: EXCEPT ( , ) Which returns MidasJCFI, the only member not in common between the two sets. For the purposes of maximum clarity in the rest of this section only, we will drop the Product reference and trust that these product names are uniquely in the Product dimension on our server. The optional extra ALL parameter allows duplicates to remain prior to the determination of the difference i. e. matching duplicates within the first set are discarded, while non-matching duplicates are retained. A simple example where there are duplicate members in the first set: EXCEPT ( , ) Returns MidasJCCO (because duplicates are discarded without ALL), while: EXCEPT ( , . ALL) Returns MidasJCCO, MidasJCCO (as ALL allows the duplicate MidasJCCO members to be retained). Note that ALL has no effect on the following query as MidasJCFI is the only member not in common between the two sets and so this is the only result either way: EXCEPT ( , ) Returns MidasJCFI. Remember, the members in the first set that also exist in the second are eliminated, hence (both instances of) MidasJCCO is eliminated So if you were to ask for EXCEPT( , ) then the final set would be without ALL and with ALL. Because matching duplicates in the first set are eliminated first (that is, duplicates in the first set that match a member in the second set), Apples (the only member in the second set that matches a pair of duplicates in the first set, is eliminated. To put the fruit down and return to our demo model we can write the equivalent query against products: EXCEPT ( , ) Returns just one MidasJCFI (the equivalent of Oranges above) while: EXCEPT ( , . ALL) Returns two instances of MidasJCFI. These results are due to the fact that, in the example with ALL, MidasJCCO is eliminated due to a matching member in set 2, while MidasJCFI is reduced to 1 instance due to the lack of ALL. MidasHDBK has no impact because it could not be subtracted from set 1 as it was not in set 1. When ALL was used in the second example, the two MidasJCCO members were still eliminated due to a match in set 2, and MidasHDBK was still irrelevant, but this time the two MidasJCFI members were left alone due to the ALL allow ing duplicates. Note: the following section does not work in v9.1 SP2, but does work in v9.0. Sua milhagem pode variar. A particularly clever use of Except is to check a TM1 dimension for a valid structure. A simple query can return a list of members that do not eventually roll up into a particular consolidated member. This could be included in a TI process to automate the consistency checking of dimensions after an update. This example returns all the members in the dimension that do not roll up into All Products: EXCEPT ( TM1SUBSETALL( Product ), TM1DRILLDOWNMEMBER( , ALL, RECURSIVE )) Modifying this slightly makes it return base-level members that do not roll up into All Products: EXCEPT ( TM1FILTERBYLEVEL(TM1SUBSETALL( Product ), 0), TM1FILTERBYLEVEL(TM1DRILLDOWNMEMBER( , ALL, RECURSIVE ), 0)) This query returns members that have been consolidated twice or more at some point under the given consolidated member this will often mean there has been an accidental double-count. EXCEPT ( TM1DRILLDOWNMEMBER( , ALL, RECURSIVE ), TM1SUBSETALL( Product ), ALL) It will return one instance of the multi-consolidated member for each time it is consolidated greater than once i. e. if it has been consolidated 4 times then it will return 3 instances. This is due to the fact that TM1SUBSETALL( Product ) will only return one instance of a member that has been consolidated multiple times while the TM1DrilldownMember function will return all the instances. You are reminded that Dimension. Member is actually a shortcut that usually works in TM1 but because the MDX specification allows for member names to be non-unique within a dimension the full address of a member is actually Dimension. Parent1.Parent2Member. Therefore more specific references to duplicate members may be needed, for example Product. Demand Loan. MidasHCBK will address a different instance of MidasHCBK than would Product. Discount Loan. MidasHCBK. In this case, with the Except function, they are treated as if they are different member names altogether. ToggleDrillState ToggleDrillState changes the default drill state from a returned set so if the first query returns a member in a hierarchy rolled up then it will drill it down, or vice versa. Using TM1 Subsets, TM1Member and TM1SubsetToSet One of the special features of using MDX with TM1 dimensions is that existing subsets can be used within the query for defining a new subset. This can be useful in allowing a simpler building block approach and for not having to repeat the same code over and over again and having to maintain it. Used throughout this section, Report Date is an existing subset in the Date dimension containing one leaf date member and test2 is an existing 20-member subset. Note that private subsets are used in preference to public subsets when there is one of each with the same name. This can allow a public subset to return different results based on the contents of different users private subsets, though inevitably with some issues with reliability of results. To simply return the member(s) of pre-existing Date subsets: Date. Report Date Or TM1SubsetToSet(Date, Report Date) The first syntax may be shorter and more convenient but bear in mind, as per the TM1 help file, Since the same syntax (.IDENTIFIER ) is used for members and levels, a subset with the same name of a member or a level will never be instantiated. The second syntax on the other hand will happily work with any subset names even if they are named the same as a cube or dimension. To return the first member of the test2 subset: To return a valid cube reference within a more complex query: TM1Member(Date. Current Date. Item(0), 0) For example: , 1), Reconciliation.(Entity. All Entities, TM1Member(Date. Current Date. Item(0),0),Reconciliation Measures. Transaction Balance) To start with the fourth item (.Item counts from zero) in the test2 subset and then return the preceding 14 members from the whole dimension, including the fourth item: This example returns the one date in Report Date and the next 13 periods, sorted with the earliest date first a moving 2-week reporting window which just needs the Report Date subset to be maintained. This query uses another subset, Strategic Products, as a building block and finds the Top 5 members within it, even though this ranking may well have been based on different values than the original subset was built on. For example, a subset that is already defined may list the 10 highest spending customer segments in terms of year to date actuals, and you then build a new subset that works with these 10 only to find the top 5 in terms of planned marketing spend next quarter. , 5, Test.(Posting Measures. Count)), Test.(Posting Measures. Count), BDESC) Heres a bigger example using TM1member and TM1SubsetToSet functions, in addition to various others. It takes the single period in the Current Date subset and returns the last day of the two preceding months. There would be several different ways of achieving the same result. union( tm1member(tm1subsettoset(Date, Current Date).item(0),0),1) )))), tm1member(tm1subsettoset(Date, Current Date).item(0),0),1) )))) ) Username and StrToMember It returns the TM1 username (or Windows domain username depending on the security system being used for example, GERJEREMY) of the user who runs the query. Note that you may need to give all users Read access to the Clients dimension and all its elements. It is not documented in the help file as being officially supported by TM1 but it is a standard MDX feature that appears to work in v8.3. However, since 8.4.3 until 9.1.2.49 it is reported as failing to automatically update when a new user uses the subset. This can be circumvented by running a frequent TI process that uses the subset as its datasource and the following line in Prolog (Workaround reported by Steve Vincent on the Applix Forum, 2nd August 2006): DIMENSIONSORTORDER(CLIENTS, BYNAME, ASCENDING,,) With this micro-process workaround set to run every few minutes a pseudo-dynamic result is possible. An actual solution to the problem should be tested for in your version if it is 9.1 or later. To save a dynamic subset it needs to be set up on the Clients dimension choose View Control Objects in Server Explorer to see this dimension. Once you have saved the public subset (e. g. as Current User) you can turn this option off again. Clients ), USERNAME ) As an alternative to the above method, and as a way of including the current username directly in queries use the StrToMember function which converts a plain string into a valid MDX member reference. Clients. USERNAME) Either way the subset can th