Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Fala pessoal, tudo bom?
Quero continuar comentando sobre melhores práticas para QlikView e neste capítulo vou falar um pouco sobre a função Applymap.
A função Applymap é nada mais, nada menos do que um De-Para, ou seja, substitui um valor por outro através de uma tabela de mapeamento.
Por que um de-para pode ser considerado uma melhor prática de desenvolvimento? Pois essa função, na maioria dos casos, pode ser utilizada para substituir a função JOIN com uma performance MUITO MAIOR. Lembrando que estamos falando no desempenho da execução de carga.
A função ApplyMap possui três parâmetros, sendo:
//Criando a tabela de mapeamento
MapaEstado:
Mapping LOAD
UF,
DESC_UF
From Estado.qvd (qvd);
//Utilizando a função
ApplyMap('MapaEstado', UF, 'Não Encontrei') as DESCRICAO_ESTADO
É muito importante utilizarmos o terceiro parâmetro da função com uma string que identifique que nenhum valor foi encontrado, pois dessa forma é possível identificar casos em que a regra utilizada não obteve valor.
Sempre utilize o terceiro parâmetro da função, para retornar algum valor nos casos em que não foi encontrado nenhum mapeamento.
O principal benefício da função é o desempenho na realização do De/Para. É sempre recomendado a utilização do ApplyMap ao invés de JOIN quando se trata da ligação entre duas tabelas grandes. Não acredita? Existem diversos cenários testados que comprovam, procure na comunidade :D!
Outro benefício é que, como dito anteriormente, o ApplyMap funciona apenas em casos de 1:1 (um para um), ou seja, um determinado registro possui apenas um valor a ser mapeado. Caso a função seja utilizada em casos N:1, então será retornado o primeiro registro (De N) do mapeamento para aquele caso e não será gerado nenhum produto cartesiano dos dados.
No exemplo abaixo, o vendedor Yuri possui dois apelidos, 'Nicolett' e 'Yure'. Se fosse realizado um JOIN para interligar essas tabelas, os valores de vendas do vendedor Yuri seria duplicado devido as duas possibilidades de apelido, porém com ApplyMap, somente o primeiro valor encontrado no mapeamento seria retornado ('Nicolett') e os valores de vendas permaneceriam inalterados.
MapaApelido:
Mapping LOAD * INLINE [
NOME, APELIDO
Yuri, Nicolett
Yuri, Yure
Paula, Paulinha
];
Fato:
LOAD
ID,
NOME_VEND,
VALOR,
ApplyMap('MapaApelido', NOME_VEND, 'Achei não!') as APELIDO
INLINE [
ID, NOME_VEND, VALOR
1, Yuri, 2
2, Yuri, 4
3, Paula, 5
];
Por último, e não menos importante, é possível se utilizar desse mapeamento para outra tratativa sem a necessidade de um pré-load ou resident, pois ao fazer o mapeamento o novo valor fica disponível para utilização naquele momento.
No exemplo abaixo é calculada o valor de comissão do vendedor em apenas 1 passo:
MapaComissao:
Mapping LOAD
VENDEDOR,
PERC_COMISSAO
FROM Comissao.qvd (qvd);
Fato:
LOAD
QTD_VENDA * ApplyMap('MapaComissao', VEND, 0) as VALOR_COMISSAO
RESIDENT ....
Mas Yuri, e se precisar recuperar 4 campos de outra tabela? Valeria a pena criar 4 mapeamentos ou fazer um único join?
Para identificar qual a melhor opção nessa caso eu precisaria de mais um detalhe: O volume de registros das duas tabelas é grande? Passa de 1 milhão de linhas? Vai variar muito daqui N tempo? Se o volume de dados é grande, então não tenho receio algum de te recomentar a utilização de 4 tabelas de mapeamentos e 4 applymaps, caso contrário utilize JOIN.
Com o ApplyMap
O terceiro parâmetro da função ApplyMap é muito poderoso, pois você pode utilizar funções ou combinações de campos, por exemplo:
1) Retorne um conjunto de campos
ApplyMap('Mapeamento', CAMPO, CAMPO2& '-' &CAMPO3)
2) Caso um mapeamento não funcione, tente outro.
ApplyMap('Mapeamento', CAMPO, ApplyMap('MapeamentoDois', CAMPO2))
/* Sinceramente esse caso é muito interessante, já presenciaram modelagens que a ligação entre duas tabelas pode ser realizada através de duas chaves diferentes? Dependendo da situação através de uma chave ou através de outra? Esse caso pode salvar sua vida rsrs */
3) Funções - Verifico condição
ApplyMap('Mapeamento', CAMPO, if( CAMPO2 > CAMPO3, 'É Maior', 'É Menor'))
É sempre bom se utilizarmos desse manual das melhores práticas e o ApplyMap é uma das principais funções para conseguirmos obter o melhor desempenho (de carga) dentro do script das nossas aplicações. Sempre analise seu atual ambiente e em caso de dúvidas faça o teste entre JOIN e ApplyMap.
Até a próxima semana!
Muito boa explicação.
Boa Yuri.
É sempre bom saber oque cada função do QlikView faz, e não somente aplicá-la pois viu em exemplos.
Abraço.
Muito obrigado Paulo!
Realmente precisamos entender a fundo cada função e não utiliza-la somente porque todos estão usando
Obrigado Luciano!
Estou tentando melhorar meus textos, algum dia conseguirei chegar na clareza que preciso rsrs!!
Imagina, já está muito bom.
Show de Bola !
Obrigado Maicon!
Muito bom!
Parabéns Yuri pela iniciativa, e que outras tantas dicas de melhores práticas venham!
Obrigado Marcelo!
Com certeza