Qlik Community

Qlik Brasil

Group community for Brazil users. discussion only in Portuguese.

Highlighted
Not applicable

Exibir imagem baseado em seleção

Colegas, boa tarde.

Estou desenvolvendo um QVW para Agronegócios, e em um pasta vou exibir o cadastro e a foto dos animais com sua árvore genealógica.

Já consegui fazer toda a carga das imagens, usando o script:

//
// Carregar todos os nomes de arquivos de fotos dos animais. Se surgir fotos novas, a próxima carga do QVW atualiza a lista

//

For Each File In FileList ('C:\BI\QVW\Fotos\*.jpg' )
   IMAGENS_AGRONEGOCIOS:
  
Load *, Replace(SubField(ARQUIVO_IMAGEM,'\',5),'.jpg','') as IMAGEM;
  
Load '$(File)' as ARQUIVO_IMAGEM
  
Autogenerate 1;
Next File

//
// Mapeamento das imagens, para verificar quais animais não tem foto e aplicar a foto genérica
//
MAPA_IMAGEM_AGRONEGOCIOS:
MAPPING LOAD IMAGEM AS CODIGO_IMAGEM_ANIMAL,
            
ARQUIVO_IMAGEM AS IMAGEM_ANIMAL
Resident IMAGENS_AGRONEGOCIOS; 
DROP TABLE IMAGENS_AGRONEGOCIOS;

//
// Verificação de quais animais tem foto. Para aqueles que não tiverem, usar a imagem "FotoNaoDisponível".

// A tabela AGRONEGOCIOS é previamente carregada do cadastro de animais

//
IMAGENS_AGRONEGOCIOS:
INFO LOAD DISTINCT
CODIGO_ANIMAL AS Imagem,
IF(ApplyMap('MAPA_IMAGEM_AGRONEGOCIOS',CODIGO_ANIMAL,'XXX')='XXX',
// Animal não tem foto
'Imagem\FotoNaoDisponivel.jpg',
// Animal tem foto
'Fotos\'&CODIGO_ANIMAL&'.jpg') AS Arquivo_Imagem
Resident AGRONEGOCIOS;

Todo o processo acima está funcionando corretamente. Todas as imagens são carregadas e exibidas. A última parte do script associa o código do animal à imagem "FotoNaoDisponivel.jpg", quando a imagem do animal não é encontrada.

O problema é que apenas 15% dos animais tem imagem, e eu estou subindo a imagem genérica para todo o restante do cadastro. Gostaria de subir a imagem genérica apenas uma vez, e no objeto que exibe a imagem fazer a verificação. Se a imagem existe, então exibe. Se não, exibir a imagem genérica. Só que não estou conseguindo montar essa condição.

Alguém pode me ajudar a montar esse IF?

Obrigada,

Ignez

1 Solution

Accepted Solutions
Not applicable

Re: Exibir imagem baseado em seleção

Pessoal, tudo bem?

Mudei o foco desta atividade. Eu faço a carga de todas as imagens que eu tenho, sem a necessidade de criar uma "imagem não disponível" para os animais que não tem foto. No QVW, na área onde exibo a imagem, eu criei um fundo com a "imagem não disponível", e só exibo esse objeto quando um animal é selecionado. Assim, se eu tenho a foto, ela é exibida. Senão, o fundo padrão é exibido. Isso resolveu meu problema.

Agradeço a todos pelas dicas. Foram muito úteis nesta situação e em outras.

Ignez

14 Replies
srchagas
Contributor III

Re: Exibir imagem baseado em seleção

Aconselho  fazer uma "tabela de imagens" e uma tabela de código de animais separado uma da outra. não tudo em uma como está e depois você Join Cod_foto = Cod_animal

Ai no Qlikview você faz esse Lógica que se Animal selecionado não tem imagem usa foto não disponível

Not applicable

Re: Exibir imagem baseado em seleção

Thiago, tudo bem?

Vou tentar fazer a alteração no script e aplicar o JOIN. Porém, como eu faço a validação no objeto texto, para exibir a imagem "FotoNaoEncontrada.jpg" se não tiver a foto?

srchagas
Contributor III

Re: Exibir imagem baseado em seleção

Acredito que sejam dois documentos: UM com Extração e outro o Documento do usuário certo?

No do usuário você faz isso na hora de criar amarração Animal -> Foto:

Coloca por exemplo o valor da Foto Nao Encontrada em uma Variável

Animal_Foto:
Cod_animal,

If(IMAGEM_ANIMAL = Cod_animal,IMAGEM_ANIMAL,VFotoNaoDisponivel)

Ou Carrega essa foto Sozinha  a "Nao Disponivel" e no If troca por ela.

Not applicable

Re: Re: Exibir imagem baseado em seleção

Thiago,

Não entendi porque você imaginou dois documentos. Pode detalhar? Algo me diz que será útil pra mim.

Eu fiz algo muito próximo à sua tabela Animal_Foto. É exatamente isso que eu quero mudar. Meu cadastro conta com mais de 80.000 animais. E menos de 6.000 possuem imagem. Eu não quero carregar a imagem genérica para todos os outros 74.000. Minha dúvida é como fazer esse IF no objeto que exibe a imagem. Hoje, a definição do objeto texto é:

='qmem://Foto/'&CODIGO_ANIMAL

O que eu quero é colocar um IF nesse ponto.

srchagas
Contributor III

Re: Exibir imagem baseado em seleção

Vou Montar um Exemplo ja coloco aqui

srchagas
Contributor III

Re: Exibir imagem baseado em seleção

Desculpe estou enrolado aqui mas acho que isso deve resolver seu problema

é uma Macro para verificar se exsite

if isnull(filetime('Caminho\Foto\'&CODIGO_ANIMAL')) then

     Arquivo não existe usa FotoNaoDisponivel

else

     Usa foto

end if

aderlanrm
Valued Contributor

Re: Exibir imagem baseado em seleção

Olá Ignez, tudo bem?

Não entendi muito bem o código que você postou, então, anexei um exemplo com código um pouco menor e mais simples.

Você só precisa carregar as imagens, carregar os animais e criar uma chave entre as duas informações, o QlikView faz o resto.

Espero que seja útil, abraço.


Para quem não conseguir ver o anexo, segue o script:

FOR Each imagem in FileList('Imagens\*.jpg');

    LET chave= SubField(SubField(imagem,'\',-1),'.',1);

   

    Imagens:

    LOAD * Inline [

        Chave, Imagem

        $(chave), $(imagem)

    ];   

       

NEXT imagem;

Bundle LOAD * Resident Imagens;

Animais:

LOAD * INLINE [

    Código, Animal, Nascimento, Chave

    1000, Mimosa, 01/01/2012, NENHUMA

    1001, Porquinho, 01/02/2012, 1001

    1002, Tourinho, 01/03/2012, 1002

    1003, Béééé, 01/04/2012, 1003

    1004, Mimosa 2, 01/05/2012, NENHUMA

    1005, Porquinho 2, 01/06/2012, NENHUMA

    1006, Tourinho 2, 01/07/2012, NENHUMA

    1007, Béééé 2, 01/05/2012, NENHUMA

];

Not applicable

Re: Exibir imagem baseado em seleção


Aderlan, tudo bem?

Desculpe pela demora na resposta.

Comparando seu código com o meu, a primeira parte bate, que é o levantamento dos arquivos de imagem que existem na pasta. A segunda parte, que você fez como um load inline é inviável para mim pois, como eu mencionei acima, eu tenho mais de 80.000 animais cadastrados e quase 6.000 imagens. Não dá para controlar essa associação manualmente, por isso eu criei a carga MAPPING e depois a associação entre o código do animal e a imagem dele (se tiver) ou a imagem genérica (se não tiver).

Hoje, meu objeto texto apresenta o código "='qmem://Imagem/'&LEFT(Especie,1)&CODIGO_ANIMAL", que mostra a imagem do animal previamente associada na tabela IMAGENS_AGRONEGOCIOS. E tenho também outros objetos texto mostrando a imagem dos ancestrais do animal, inclusive a imagem genérica, porque ela está associada a um código que não tem imagem. E tudo está funcionando Ok.

O que eu queria era não precisar associar a mesma imagem genérica em 74.000 códigos de animais, pois eu me preocupo que essa imagem seja carregada para dentro do QVW também 74.000 vezes. Me corrijam por favor, se eu estiver errada, mas o arquivo da imagem genérica é carregado cada vez que é associado a um código de animal, ou sobe apenas na primeira menção? Essa é a minha preocupação básica, e que me levou a questionar a comunidade.

Resumindo, o que eu quero fazer é a carga das imagens na tabela IMAGENS_AGRONEGOCIOS só com os códigos de animais que tenham imagem e, no objeto texto ter alguma condição do tipo IF EXISTS mostra_imagem_animal ELSE mostra_imagem_generica - hihihi.

Idéias?

aderlanrm
Valued Contributor

Re: Exibir imagem baseado em seleção

Boa noite Ignez.

Eu acredito que você não entendeu o meu código, pois não bate em nada com o seu, nem o começo.

No seu código, você faz dois LOAD e usa autogenerete, no meu, faço um LOAD Inline, gerando auto concatenação e depois aloco as imagens na memória.

A segunda parte, que tem um LOAD Inline que você diz ser inviável para fazer na mão, não é para ser feita mesmo, é para você excluir e colocar o código que carrega os 80.000 registros dos animais, com uma coluna chamada "chave", ou qualquer outro nome que você queira usar.

É impossível eu te passar o código pronto, não sei nem qual o tipo de fonte de dados que está usando, passei apenas a lógica, que vou tentar explicar melhor:

Primeiro é carregada as imagens na memória, as 6.000, em uma tabela com um campo "código", que chamei de "chave", poderia ter qualquer outro nome, depois eu carrego mais uma única imagem, de nome e código "nenhuma", total de 6.001 imagens.

Depois é carregada a tabela com 80.000 registros (ou as tabelas) com os dados dos animais (LOAD Inline só de exemplo), nessa hora é criada uma coluna "chave", "código" ou qualquer outro nome, desde que seja uma "chave" de ligação com a tabela das imagens.

Pronto! O QlikView vais fazer a associação, através do campo "chave" da duas tabelas, ficando somente 6.001 imagens carregadas e os 80.000 registros dos animais na memória.

Na tala, não precisa usar nada, nenhum código especial, somente atribuir campo em qualquer objeto. Ganha tanto na performance da carga dos dados, como na visualização de tudo na tela.

Faça os ajuste no arquivo que mandei, só para testar e veja o desempenho na carga dos dados, no uso da memória e no uso dos processadores do servidor, tenho certeza que irá se surpreender.

Se quiser me enviar um ZIP com um exemplo mais próximo da sua realidade, posso tentar ajudar mais, porém, acredito que está bem tranquilo, desde que entenda bem como tudo funciona.

Espero que seja útil.

Grande abraço.