Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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
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
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
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?
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.
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.
Vou Montar um Exemplo ja coloco aqui
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
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
];
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?
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.