Skip to main content
Announcements
Qlik Announces Qlik Talend Cloud and Qlik Answers: LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
RafaMartins
Creator II
Creator II

Campo não encontrado durante carregamento de dados

Bom dia, estou tendo um erro ao carregar o script com campos calculados.

Tenho uma tabela carregada por script onde preciso inserir dois campos calculados: 

if("Custo Real"<"Custo Orig.",1,0) as promo, este que funciona corretamente

if(sum(promo)>0,[Dt.Emissão]),([Preço Unit.]),0 as flag e este que utiliza o campo anterior  para calcular

porem neste segundo campo me retorna a mensagem de erro que o campo 'promo' não foi encontrado

alguém poderia me esclarecer por que isso está ocorrendo? 

segue o modelo do script 

LOAD
Dt.Emissão,
Filial,
Cód.For.,
Fornecedor,
Grupo,
Qtde,
"Custo Real",
"Preço Unit.",
"Custo Orig.",
if("Custo Real"<"Custo Orig.",1,0) as promo,
if(sum(promo)>0,[Dt.Emissão]),([Preço Unit.]),0 as flag

FROM [lib://teste/teste promoção.xlsx]
(ooxml, embedded labels, table is Plan1);

2 Solutions

Accepted Solutions
marco_almeida
Creator II
Creator II

Eai jovem. Blz?

Realmente não vai funcionar, você está criando o campo "promo" no mesmo escopo em que precisa usá-lo. O campo será criado efetivamente após a execução daquele bloco.

Nesse caso você possui duas alternativas:

Alternativa 1: Criar o campo usando uma tabela resident. Nesse caso você criaria o campo "promo" do jeito que está fazendo, porém criaria o próxima numa outra tabela. Outro ponto que você precisa observar é que como está fazendo uma agregação de soma, precisa utilizar o commando GROUP BY e usar todos os campos nesse.

TABELA2:
LOAD
    *,
    if(sum(promo)>0,[Dt.Emissão]),([Preço Unit.]),0 as flag
RESIDENT TABELA1
GROUP BY
    Dt.Emissão,
    Filial,
    Cód.For.,
    Fornecedor,
    Grupo,
    Qtde,
    "Custo Real",
    "Preço Unit.",
    "Custo Orig.",
    promo
;

DROP TABLE TABELA1;

Alternativa 2: Nessa alternativa você pode usar o recurso de LOAD Precedente. Isso que dizer que "acima" do LOAD que você acabou de executar pode cascatear outros sem "mudar" o escopo. Por exemplo:

TABELA:
LOAD
    *
    , NUMERO3 + 1 AS NUMERO4
;
LOAD
    *
    , NUMERO2 + 1 AS NUMERO3
;
LOAD
    *
    , NUMERO1 + 1 AS NUMERO2
;
LOAD * INLINE [
    NUMERO1
    1
];

A execução acima não gerará erro e você terá campos 4 diferentes. O LOAD precedente faz uma leitura Bottom-Up, ou seja, de baixo para cima.

 

Então no seu caso seria perfeitamente possível fazer a seguinte execução:

TABELA:
LOAD
    *
    , if(sum(promo)>0[Dt.Emissão])([Preço Unit.])0 as flag
GROUP BY
    Dt.Emissão,
    Filial,
    Cód.For.,
    Fornecedor,
    Grupo,
    Qtde,
    "Custo Real",
    "Preço Unit.",
    "Custo Orig.",
    promo
;
LOAD
    *
    , if("Custo Real"<"Custo Orig."10) as promo
FROM [lib://teste/teste promoção.xlsx]
(ooxml embedded labels table is Plan1);

Ressalvo apenas que essa é a estrutura para atendimento da sua dúvida. Erros de lógica podem estar associados ao seu modelo.

 

 

Grupo Telegram Qlik Brasil: https://t.me/joinchat/AeRmnUmcxQ02L00g3x-HtQ

View solution in original post

RafaMartins
Creator II
Creator II
Author

Obrigado pela ajuda amigos,

consegui resolver o problema que mesmo conseguindo criar o campo calculado não estava trazendo o resultado esperado.

Após criar criar o campo calculado para marcar as datas onde tenho promoção com a ajuda do amigo @marco_almeida .

percebi que para fazer o calculo que necessitava precisaria criar outros dois campos 

if([promoção]=0,[Dt.Emissão]) as "sem promo"

if([promoção]>0, [Dt.Emissão]) as "com promo"

desta forma quando tenho promoção o campo me retorna a data e quando não tenho outro campo me retorna a data

assim só precisei criar uma expressão que quando meu campo de data for igual o campo de "sem promo" ele me retorne valor.

sum(if([Dt.Emissão]=[com promo], ([Preço Unit.])))

desta forma obtive o resultado que precisava!

Capturar.PNG

View solution in original post

12 Replies
marco_almeida
Creator II
Creator II

Eai jovem. Blz?

Realmente não vai funcionar, você está criando o campo "promo" no mesmo escopo em que precisa usá-lo. O campo será criado efetivamente após a execução daquele bloco.

Nesse caso você possui duas alternativas:

Alternativa 1: Criar o campo usando uma tabela resident. Nesse caso você criaria o campo "promo" do jeito que está fazendo, porém criaria o próxima numa outra tabela. Outro ponto que você precisa observar é que como está fazendo uma agregação de soma, precisa utilizar o commando GROUP BY e usar todos os campos nesse.

TABELA2:
LOAD
    *,
    if(sum(promo)>0,[Dt.Emissão]),([Preço Unit.]),0 as flag
RESIDENT TABELA1
GROUP BY
    Dt.Emissão,
    Filial,
    Cód.For.,
    Fornecedor,
    Grupo,
    Qtde,
    "Custo Real",
    "Preço Unit.",
    "Custo Orig.",
    promo
;

DROP TABLE TABELA1;

Alternativa 2: Nessa alternativa você pode usar o recurso de LOAD Precedente. Isso que dizer que "acima" do LOAD que você acabou de executar pode cascatear outros sem "mudar" o escopo. Por exemplo:

TABELA:
LOAD
    *
    , NUMERO3 + 1 AS NUMERO4
;
LOAD
    *
    , NUMERO2 + 1 AS NUMERO3
;
LOAD
    *
    , NUMERO1 + 1 AS NUMERO2
;
LOAD * INLINE [
    NUMERO1
    1
];

A execução acima não gerará erro e você terá campos 4 diferentes. O LOAD precedente faz uma leitura Bottom-Up, ou seja, de baixo para cima.

 

Então no seu caso seria perfeitamente possível fazer a seguinte execução:

TABELA:
LOAD
    *
    , if(sum(promo)>0[Dt.Emissão])([Preço Unit.])0 as flag
GROUP BY
    Dt.Emissão,
    Filial,
    Cód.For.,
    Fornecedor,
    Grupo,
    Qtde,
    "Custo Real",
    "Preço Unit.",
    "Custo Orig.",
    promo
;
LOAD
    *
    , if("Custo Real"<"Custo Orig."10) as promo
FROM [lib://teste/teste promoção.xlsx]
(ooxml embedded labels table is Plan1);

Ressalvo apenas que essa é a estrutura para atendimento da sua dúvida. Erros de lógica podem estar associados ao seu modelo.

 

 

Grupo Telegram Qlik Brasil: https://t.me/joinchat/AeRmnUmcxQ02L00g3x-HtQ
RafaMartins
Creator II
Creator II
Author

Unica questão agora é que as duas soluções me retornam o erro "o nome do campo deve ser único dentro da tabela"

marco_almeida
Creator II
Creator II

Algum campo seu está com nome duplicado. Talvez seja pela inferência do *. 

Grupo Telegram Qlik Brasil: https://t.me/joinchat/AeRmnUmcxQ02L00g3x-HtQ
RobertoObelar
Contributor
Contributor

O erro ocorre pq vc usa um Alias criado no mesmo paragrafo, se vc fizer um resident e depois inserir a expressao do Flag, o campo promo funciona.

tentei escrever os codigos mas ficaram algumas duvidas:

na sua segunda condicional vc diz que se a soma de promo for maior que zero tras a data de emissão, em seguida traz preço unitario e um 0 para flag?

nao entendi ao certo o que queria que retornasse.

 nao entendi o if nem o sum usado nele (em se falando de flag, acredito que queira marcar algo), é isto? escrevi algo que nao entendi muito bem, mas espero ajudar.

 

TEMP:

LOAD
Dt.Emissão,
Filial,
Cód.For.,
Fornecedor,
Grupo,
Qtde,
"Custo Real",
"Preço Unit.",
"Custo Orig.",
if("Custo Real"<"Custo Orig.",1,0) as promo

FROM [lib://teste/teste promoção.xlsx]
(ooxml, embedded labels, table is Plan1);

 

TABELAFINAL:

load *, if(promo >0,Preço Unit.) as ValorPromo

resident TEMP;

 

 

RafaMartins
Creator II
Creator II
Author

Seguinte o campo flag do segundo if é para criar algo como essa tabela

Capturar.PNG

que eu consigo pela expressão: if(Aggr(sum([promoção])>0,[Dt.Emissão]),sum([Preço Unit.]),0)

tentei usar algo parecido no script para criar uma flag, explicando melhor preciso de uma flag que me diga em que datas eu tive promoção está funciona corretamente criada no campo "promo" porem como possuo datas repetidas dentro de minha base preciso que alem de saber os dias que tive promoção caso essa data tenha preditos sem promoção que ela aparece zerada, como acontece na tabela da imagem.

consegui fazer o script gerar a segunda tabela retirando o *, assim não está mais repetindo os campos, só que provavelmente há algum erro no meu if pois ele está me retornando 3 campo data, preço unitário e flag.  

RafaMartins
Creator II
Creator II
Author

de fato sem *, funcionou,

Porem algo no meu if não está retornando o valor esperado

RobertoObelar
Contributor
Contributor

man, que expressão é esta?

 

 if(Aggr(sum([promoção])>0,[Dt.Emissão]),sum([Preço Unit.]),0)

 

vc ta dizendo se a soma agregada de promoção for maior que zero tras data de emissão se nao soma Preço unitario....o ,0 entao bagunçou tudo...rsrs

 

entendo que dt emissão e sua dimensão e o valor a ser exibido é o valorpromo, conforme mandei no script acima, o que faltou ali é o drop table TEMP, mantendo o * no segundo load.

 

Não vejo necessidade do segundo if, ja que o primeiro diz o que esta em promoção ou não.

o que eu faria na metrica seria sum({$< promo ={1}>} [Preço Unit.]) .

quanto aos valores zerados acredito que se vc somar com 0 , as datas que vc nao tras valor vai trazer zero.

 

RafaMartins
Creator II
Creator II
Author

também queria que fosse simples assim kkkk, porem não funciona pois como disse tem datas repetidas com valor do campo promo variados.

data,promo

12/03/2019,1

12/03/2019,0

por isso preciso dessa expressão ois quando tiver uma data assim preciso que retorne o valor de 0 para todas.

a parte do preço unitário estava sendo utilizada em expressão de gráfico, no script poderia ser substituído por 1  

RobertoObelar
Contributor
Contributor

entendi man,

 

o que vejo é que para que consiga visualizar as datas onde promo é 0 e é 1, igual seu exemplo, vc teria que usar uma dimensão como por exemplo o campo promo.

 

e na metrica, de acordo com o script que te passei, vc faria o sum no ValorPromo, terminando o if apos o preco Unit. colocar o ,0.

 

se vc deixar apenas a data como dimensão, tudo que for zera sera omitido mesmo e concatenado ao atributo que tem valor, no caso da data mencionada por ultimo, so apareceria uma vez, enquanto se colocar o campo promo tmb como dimensão, ela aparece duas vezes usando o sum(ValorPromo).