Acumulado com Expressão

Fala pessoal! Tudo beleza?
 
Certamente vocês já fizeram algum relatório de Contabilidade e foi solicitado um indicador que possui os valores acumulados mês a mês, seja de Saldo, Lucro, etc.
 
Sabemos que a maioria dos gráficos possuem a função de acumular na aba de expressões, mas nem sempre esse acumulado vai atender a nossa demanda.
  
Gráficos que possuem a função de acumular: Barra, Linha, Combinado, Radar, Mekko, Dispersão, Grade e Table Simples.
 
Gráficos que não possuem a função de acumular: Mostrador, Tabela Dinâmica, Pizza, Funil e Blocos.
   
Imagine um cenário em que temos: um gráfico de tabela simples com o valor de REALIZADO e o valor de META. Precisamos agora criar mais três colunas: Realizado Acumulado, Meta Acumulada e % de Realizado em relação a meta.
 
Tranquilo! Gráfico de tabela simples possui a função de acumular a expressão por padrão.
  
Primeira expressão: Realizado Acumulado!
 
SUM(VALOR)
 
Marco Acumular, já era uma. 😀
  
Segunda expressão: Meta Acumulada!
 
SUM(META)
 
Marco Acumular, já era duas!
  
Terceira expressão: %!
 
Vou apenas reaproveitar as expressões…
  
[Realizado Acum.]/[Meta Acum.]
 
Pronto! Terminei!
   
Apenas verifico os valores só para ter certeza que não fiz nada errado
   
Jan/2015
Realizado Acum = 100
Meta Acum =  110
Percentual = 100/110 = 90,91%
Qlikview = 90,91% BOA!

   
Fev/2015
Realizado Acum = 220
Meta Acum =  240
Percentual = 220/240= 91,66%
Qlikview = 92,31% UÉ!
  
Bom, acho que preciso marcar o acumulado na expressão do percentual também!
 
Qlikview = 183,22%
 
NÃO É POSSÍVEL!
  
Deve ser algum erro de casa decimal (RSRSRS Eu sempre penso isso kkk!!!)
 
Refaço as contas e realmente não é erro de casa decimal.
 
Removo o acumulado das expressões: Realizado Acum e Meta Acum, e refaço o cálculo do percentual
  
Fev/2015
Realizado Acum = 120
Meta Acum =  130
Percentual = 120/130= 92,31%
  
Não acredito, o qlikview não consegue reutilizar a expressão com o acumulado. Afff! E agora?
  
Bom! Teremos então que investigar algumas funções que possam obter o mesmo resultado do acumulado do QlikView.
   

Funções

Hoje trabalharemos com as funções Funções Inter-Registro de Gráficos, são elas:
 
Above() = Acima – Retorna o valor da expressão avaliada com os valores de dimensão do gráfico da forma como aparecem na linha acima da atual em um segmento de coluna de uma tabela.
 
Below()Abaixo – Retorna o valor da expressão avaliado com os valores de dimensão do gráfico que aparecem na linha abaixo da atual dentro de um segmento de coluna em uma tabela.
 
Before() = Antes – Retorna o valor da expressão avaliada com os valores de dimensão de uma tabela dinâmica como aparecerem na coluna antes da atual.
 
After() = Depois – Retorna o valor da expressão avaliada com os valores de dimensão de uma tabela dinâmica como aparecerem na coluna depois da atual.
   

Características das funções

  • Na primeira coluna de um segmento de linha, um valor NULL será retornado, já que não há uma coluna
    antes dela.
  • Se a tabela for unidimensional ou se a expressão for precedida pelo qualificador total, o segmento de linha
    atual será sempre igual à linha inteira.
  • Especificar um deslocamento maior que 1 permite que você transfira a avaliação da expressão para essa outra coluna, por exemplo: Se usar para a função Before, então estará avaliando colunas a esquerda em relação a atual coluna.
  • Um número de deslocamento negativo tornará a função o seu inverso, por exemplo a função before ficará equivalente a função after.
  • A especificação de um deslocamento igual a 0 avaliará a expressão da coluna atual.
  • Ao especificar um terceiro parâmetro n maior que 1, a função retornará não um, mas uma série de valores n,
    um para cada n colunas da tabela. Dessa forma, a função pode ser usada como um argumento para qualquer uma das Funções de Intervalo de Gráfico especiais.

  
A parte acima grifada é muito importante, pois como queremos trabalhar com valores acumulados, então teremos que pegar o valor da linha/coluna atual e somar com o de linha(s)/coluna(s) anterior(es) e isso nos obriga a utilizar essas funções de intervalo de gráfico especiais.
  
Essas funções são precedidas da palavra Range, então temos: RangeSum, RangeAvg, RangeCount, RangeMin, RangeMax…. por aí vai.
  
IMPORTANTE: Essas funções de Range servirão para somar os resultados das funções Inter-Registros. Lembre-se que essas funções Inter-Registros retornaram vários resultados e é por isso que teremos que utilizar as funções de Range. Se tentássemos utilizar somente um SUM, o Qlikview retornaria nulo.
   

Exemplo

No exemplo em que vou comentar, estarei utilizando um gráfico de tabela simples com a dimensão MêsAno e suas respectivas expressões.
 
Se estamos trabalhando com um gráfico de tabela simples, então utilizaremos a função Inter-Registro Above(), pois o resultado do mês anterior esta na linha acima, desde que o gráfico esteja ordenado de forma Crescente.
 
Lembrando: Queremos acumular desde o primeiro MêsAno disponível nos filtros.
  
Expressão de Realizado: RangeSum(Above(SUM(VALOR), 0, RowNo()))
 
Vamos entender os parâmetros do Above
 
Deslocamento é zero, ou seja, estou avaliando a expressão da linha atual
 
N = RowNo() [RowNo() retorna o número da linha do gráfico]
 
Se estamos na primeira linha do gráfico, então a expressão estará da seguinte forma: RangeSum(Above(SUM(VALOR), 0, 1)), ou seja, estamos analisando somente a linha atual. Para a expressão RangeSum estamos somando o intervalo da linha atual até a linha atual.
 
Se estamos na segunda linha do gráfico, então a expressão estará da seguinte forma: RangeSum(Above(SUM(VALOR), 0, 2)), ou seja, estamos analisando a linha atual  e a linha anterior. Para a expressão RangeSum estamos somando o intervalo da linha atual até a linha anterior.
 
Se estamos na terceira linha do gráfico, então a expressão estará da seguinte forma: RangeSum(Above(SUM(VALOR), 0, 3)), ou seja, estamos analisando a linha atual  e duas linhas anteriores. Para a expressão RangeSum estamos somando o intervalo da linha atual até duas linhas anteriores.
  
Expressão de Meta: RangeSum(Above(SUM(META), 0, RowNo()))
 
A regra se mantém a mesma para a meta.
 
Agora o percentual fica fácil:
 
RangeSum(Above(SUM(VALOR), 0, RowNo())) / RangeSum(Above(SUM(META), 0, RowNo()))
 
Agora teremos o seguinte resultado
  
Grafico01
  
Muito bom!
   

Fique Atento

Lembre-se de escolher corretamente a expressão Inter-Registro a ser utilizada, se estiver em uma tabela dinâmica, com o MêsAno pivoteado, então temos que pegar o resultado da COLUNA ANTERIOR, para isso devemos utilizar a função Before().
 
Abaixo disponibilizei uma aplicação com um exemplo na tabela dinâmica e como acumular somente alguns passos, por exemplo: Somente 1 mês anterior ou somente dois meses anteriores.
 
Para fazer download da aplicação de exemplo clique aqui!
   

Conclusão

Se o que você deseja fazer o QlikView oferece, então utilize! Sempre as funções prontas do QlikView oferecem melhor performance, mas nem tudo o QlikView nos oferece de “mão beijada”, desta forma é bom estarmos preparados para essas ocasiões.
 
Até a próxima semana!

Anúncios

Posicionamento de objetos na tela

Fala pessoal, tudo bom?
 
Hoje quero abordar sobre o tema de layout. Este é um tema muito importante pra mim, pois me considero uma pessoa muito fraca em layout. O estudo que realizei para esta semana vai ajudar muito a todos nos (principalmente eu rsrs).
 
Todas as citações e autores que pesquisei serão citados com direcionamentos para os seus materiais. Um outro material importante do post foi essa dissertação de mestrado: Aqui.
  
Famosas perguntas
 
Qual a melhor maneira de posicionar os objetos em um dashboard?

Qual a posição devo disponibilizar os filtros?
  
A maneira como os olhos das pessoas se movimentam ao longo de interfaces gráficas digitais. É de extrema importância o conhecimento dos padrões de visualização de dados em telas computadorizadas, pois esta é a única maneira de posicionar, com eficácia, títulos, barras de navegação, gráficos, filtros, entre outros elementos que formam a interface.
  
Exploração visual e áreas de maior visibilidade da tela
De acordo com LYNCH e HORTON, ao visualizarem uma interface gráfica digital, primeiro os usuários vêem as telas como grandes massas de formatos e cores, com os elementos do primeiro plano contrastando com a área de
fundo. Em seguida, os usuários começam a identificar informações específicas, inicialmente através dos gráficos (quando presentes), e somente então eles começam a analisar gramaticalmente o texto e a ler as palavras e frases que o compõem.
 
Os 10 ou 12 centímetros superiores são a parte que estará mais visível. Logo, a posição dos elementos faz toda a diferença. Em interfaces projetadas para oferecer uma navegação eficiente.
 
A exploração da interface gráfica digital divide-se em 7 zonas de visualização.

  1. O olhar direciona-se para o lado superior esquerdo da tela.
  2. Depois, movimenta-se da esquerda para a direita.
  3. Em seguida, o olhar desce para a parte inferior esquerda e a partir deste ponto, passa a explorar as extremidades da tela.
  4. Explora a extremidade superior esquerda,
  5. Depois explora a extremidade superior direita.
  6. Então, o olhar dirige-se para a extremidade inferior esquerda,
  7. Finalizando com um movimento na direção da extremidade inferior direita.

 
Abaixo a representação a seguir, é possível observar a trajetória de exploração visual de uma interface.
  
Layout_01
 
Em culturas diferentes da ocidental, onde o sentido da leitura é realizado da direita para a esquerda, estes processos de exploração visual da interface gráfica digital talvez sejam inválidos.
 
Ainda de acordo com STEVE OUTING e LAURA RUEL, o instinto das pessoas faz com que elas olhem para a área localizada no canto superior esquerdo da tela, conforme é possível observar na representação de áreas de prioridade a seguir.
Sendo assim, ao desenvolver uma interface gráfica digital, deve-se dar grande importância para as informações que estarão contidas nestas áreas de prioridade.
 
Layout_02
  
Esses autores também descrevem que as pessoas costumam olhar para os elementos textuais da interface antes dos seus olhos se fixarem em fotos ou gráficos. Em páginas com muita informação textual captam a atenção do olhar, especialmente quando estão localizados na parte superior esquerda da tela. Fontes menores encorajam o comportamento de leitura das palavras, enquanto fontes maiores promovem a varredura da página (pessoas lêem apenas as primeiras palavras e só dão continuidade ao processo caso a sua atenção seja despertada por estas palavras).
 
Pessoas não estão acostumadas a observar menus de navegação no lado direito das interfaces.
 
Ao tratar de gráficos, os autores afirmam que tanto para imagens quanto para textos prevaleceu a regra básica: o tamanho do gráfico importa. Quanto maior a imagem, ou o banner, maior o tempo que as pessoas permaneceram olhando para a mesma.
 
 
Conclusão
 
Uma peculiaridade da mente humana é que nossa memória visual é muito mais duradoura que a memória textual. É por isso que temos muito mais facilidade de esquecer um nome que um rosto. Desta forma, a construção da interface gráfica digital deve ser simples, pois quanto mais simples, mais cognitivo. Sendo mais cognitivo, atingirá a compreensão do usuário.
 
Pense em sua interface como uma embalagem. Ela deve conter certas características como: facilidade de aprendizagem, simplicidade de uso e emitir clareza.
 
Em anexo, também disponibilizo uma material referente ao posicionamento de navegação e exibição do QlikView. Clique aqui para fazer o download.

Como recuperar uma licença de um QVW deletado

Uma antiga aplicação, que não esta mais sendo utilizada, esta prestes a ser removida da pasta de acesso do QlikView Server. Sabendo que este QVW não é utilizado a décadas, logo optamos por remover essa aplicação da face de nosso ambiente. Lembro-me de remover as tasks de recarga e depois vou até o diretório onde o arquivo se encontra e SHIFT + DELL!
Pronto! Arquivo removido, uma aplicação a menos para dar manutenção 😀

Um tempo se passa e chegam novas requisições de acessos para determinadas aplicações. Sem nenhuma dúvida acessamos ao nosso querido QMC, encontramos o QVW no qual solicitaram acesso e vou adicionar as licenças solicitadas, só que não… nenhuma licença disponível para alocar a novos usuários.

Indignado! Pois tempos atrás foi removido um QVW e liberada algumas Calls para utilização.
Agora verifico a parte de licenciamento em meu QMC e, novamente, vejo a informação de que todas as licenças estão alocadas.

Inicio uma varredura, QVW a QVW (ninguém merece —– PS: no futuro disponibilizo uma app para facilitar nossa vida nesse processo!) para entender e identificar com quem esta as licenças que deveriam estar disponíveis para utilização.
QVW a QVW vou anotando a quantidade de licença e para quem foi disponibilizado.

Passado um tempo, mapeada todas as aplicações e seus respectivos usuários, identifico que alguma coisa “Pode” estar errada, o número de licenças alocadas em cada QVW não bate com o número total de licenças em que meu ambiente deveria possuir.

E agora?


Aff! Esqueci de remover as licenças daquele painel em que deletei! Porém essa aplicação não esta mais aparecendo em meu QMC. Como vou remover essas licenças e recupera-las para utilização?

Angustiado tento reiniciar todos os serviços do QlikView Server….. NADA!
Aflito tento remover o .SHARED daquela aplicação….. NADA!
Desesperado tento remover o .pgo do root folder…. NADA!!

E agora? Perdi a licença?

rsrsrs
Calma!

Existe uma luz!

Vamos lá

Solução 1

  1. Pare o serviço “QlikView Server”.
  2. Adicione uma linha com a informação “PgoAsXmlAlso=1” logo abaixo da linha que contém a informação [Settings 7] no arquivo Settings.ini que fica no diretório “C:\ProgramData\QlikTech\QlikViewServer”.
  3. Inicie o serviço “QlikView Server”
  4. Crie um documento, em branco, com o exato nome do documento que foi removido e ficou com as licenças presas.
    1. Caso não se recorde do nome do documento, encontre o arquivo CalData.pgo.xml que se encontra dentro do diretório Root
  5. Abra o QMC. Agora o documento deve reaparecer e assim será possível remover as licenças alocadas para ele.

Solução 2

Pare os serviços “QlikView Server” e “QlikView Management Service” e depois remova o arquivo “caldata.pgo” do diretório Root (diretório em que esta mapeado o QVS) e também do diretório “C:\ProgramData\QlikTech\QlikViewServer”.

OBS: Esse método é aconselhável somente se a primeira solução não tenha dado certo.

Solução 3

Remova a licença de seu QlikView Server e aplique-a novamente.

OBS: Esse método é aconselhável somente para ambientes pequenos e caso nenhuma das outras alternativas funcione.

Pessoal, nunca se esqueçam de fazer backup dos arquivos antes de remove-los. Existe um risco grande de parar o seu ambiente.

IntervalMatch Estendido na Prática

Fala pessoal, tudo bom?
 
Semana passada abordamos o tema de intervalos e descobrimos que o QlikView possui uma função própria para se tratar desses casos. Não viu? Clique aqui!

   

Definições do IntervalMatch

Também quero aproveitar para relembrar algumas definições do IntervalMatch:

  • Antes do comando intervalmatch, o campo que contém os pontos de dados discretos (“Nota” no exemplo do post anterior) já deve ter sido lido no QlikView. O próprio comando intervalmatch não lê esse campo a partir da tabela da base de dados.
  • A tabela lida no comando intervalmatch deve sempre conter exatamente dois campos (“Min” e “Max” no exemplo do post anterior). Para estabelecer um link com outros campos, é necessário ler os campos de intervalo com campos adicionais em um comando load ou select separado.
  • Os intervalos estão sempre fechados, isto é, sempre contêm pontos de extremidade.
  • Os limites não numéricos fazem com que o intervalo seja desconsiderado (indefinido)
  • Os limites nulos (NULL) estendem o intervalo indefinidamente (ilimitado).
  • Os intervalos podem estar sobrepostos, ou seja, posso ter dois intervalos que contenham valores repetidos, esses valores estarão vinculados a todos os intervalos correspondentes.

   

Caso a utilizar IntervalMatch Estendido

Essa semana iremos tratar de um intervalo que não depende simplesmente do intervalo de valores, mas também depende de um segundo campo que define a qual intervalo estamos tratando. Podemos chamar esse segundo intervalo de campo chave.

  

Resgatando o exemplo da semana passada em que tínhamos uma tabela com a classificação das notas e outra com as notas recebidas por cada aluno, vamos adicionar uma nova coluna com o nome da escola. Imagine que o nosso professor ministre aulas em duas escolas diferentes e cada uma dessas escolas possuem a sua própria classificação das notas.

  

Na escola Puríssimo a classificação é:

  • de 0 até 34 é Nota “E”
  • de 35 até 40 é Nota “D”
  • de 41 até 60 é Nota “C”
  • de 61 até 80 é Nota “B”
  • de 81 até 100 é Nota “A”

  

Na escola Sesi a classificação é:

  • de 0 até 15 é Nota “E”
  • de 16 até 40 é Nota “D”
  • de 41 até 60 é Nota “C”
  • de 61 até 70 é Nota “B”
  • de 71 até 100 é Nota “A”

  

Como temos classificações diferentes em duas escolas (CHAVE) diferente, então a nossa tabela de notas deve possuir a qual escola (CHAVE) aquela nota (do aluno) pertence.

   

Prática

Em primeiro lugar crie a nossa tabela com os intervalos.

  

Grade:
LOAD * INLINE [
Escola, Min, Max, Grade
Escola Puríssimo, 0, 34, E
Escola Puríssimo, 35, 40, D
Escola Puríssimo, 41, 60, C
Escola Puríssimo, 61, 80, B
Escola Puríssimo, 81, 100, A
Escola Sesi, 0, 15, E
Escola Sesi, 16, 40, D
Escola Sesi, 41, 60, C
Escola Sesi, 61, 70, B
Escola Sesi, 71, 100, A
];

  

Agora vamos criar a nossa tabela das notas por escola e aluno.

Notas:
LOAD * INLINE [
Escola, Nota, Aluno
Escola Puríssimo, 30, Yuri
Escola Puríssimo, 50, Edson
Escola Puríssimo, 99, Alan
Escola Puríssimo, 10, Geraldo
Escola Puríssimo, 93, Henrique
Escola Sesi, 27, Christian
Escola Sesi, 44, Michele
Escola Sesi, 80, Roberto
Escola Sesi, 76, Ivanir
Escola Sesi, 98, Zé
];

  

Note: A coluna “Escola” é a chave que define a nota e a classificação, sem ela não saberíamos informar a classificação da nota desse aluno, pois agora temos dois intervalos diferentes na mesma tabela.

  

Agora vamos para a utilização do IntervalMatch Estendido

A utilização do IntervalMatch Estendido deve-se partir da leitura da tabela de intervalos e o comando IntervalMatch deve-se relacionar com a coluna que deve ser checada dentro do intervalo e a coluna de chave:

Usando_IntervalMatch_Estendido:
IntervalMatch(Nota,Escola) //Comando IntervalMatch chamando a coluna a ser checada dentro do Intervalo e a chave para definir a qual intervalo o valor se refere.

Usando_IntervalMatch_Estendido:
IntervalMatch(Nota,Escola)  //Comando IntervalMatch chamando a coluna a ser checada dentro do Intervalo e a coluna de //chave das classificações
LOAD
Min, //Primeiro o menor valor do intervalo
Max, //depois o maior valor do intervalo
Escola //Por último a coluna chave.
RESIDENT Grade; //Tabela de Intervalos

  

Com o resultado agora teremos a tabela “Usando_IntervalMatch_Estendido” que possui as colunas: Min, Max, Nota e Escola. Essa tabela já fez a ligação entre as tabelas Nota e Grade, veja:

  

IntervalMatch Estendido 01

  

Agora é só fazer o JOIN necessário para remover essa chave sintética. Remova a parte do IntervalMatch e faça a alteração abaixo:

  

LEFT JOIN (Notas)

IntervalMatch(Nota,Escola) //Comando IntervalMatch chamando a coluna a ser checada dentro do Intervalo e a coluna de chave das classificações
LOAD
Min, //Primeiro o menor valor do intervalo
Max, //depois o maior valor do intervalo
Escola //Por último a coluna chave.
RESIDENT Grade; //Tabela de Intervalos

LEFT JOIN (Notas)

LOAD
*
RESIDENT Grade;

DROP TABLE Grade;
DROP Fields Min, Max;

   

Resultado final

IntervalMatch Estendido 02
Download da aplicação de exemplo!

   

Conclusão

Esse é um caso que mais ocorre em nosso dia a dia em relação ao caso do post anterior, pois dificilmente teremos apenas um intervalo de dados para checar.

E reforço o texto utilizado no post anterior: É uma boa prática conhecermos muitas das funções que o QlikView nos oferece, pois estas funções sempre irão nos poupar linhas e linhas de código.

  

Até a próxima semana pessoal!