13 Replies Latest reply: Feb 12, 2014 5:49 AM by Ignez Mello RSS

    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

        • Re: Exibir imagem baseado em seleção
          Thiago das Chagas cunha

          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

          • Re: Exibir imagem baseado em seleção
            Aderlan Rodrigues

            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

            ];

              • 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?

                  • Re: Exibir imagem baseado em seleção
                    Aderlan Rodrigues

                    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.

                    • Re: Exibir imagem baseado em seleção
                      Aderlan Rodrigues

                      Esqueci de falar dos ancestrais.


                      Isto é uma característica da tabela que tem os animais, ou seja, os 80.000 registros, deve ser tratado antes de criar a chave com a tabela das imagens, tente com o comando:


                      Hierachy (Mais informações no F1 - Ajuda do QlikView)

                      O prefixo hierarchy é usado para transformar uma tabela de hierarquia em uma tabela útil em um modelo de dados do QlikView.

                      Ele pode ser colocado na frente de um comando Load ou Select e usará o resultado do comando de carregamento como entrada para uma transformação de tabela...

                       

                      Como no posto anterior, anexe um exemplo, assim facilita a tentativa de ajuda na comunidade.

                       

                      Abraço.

                  • 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