Qlik Community

Qlik Brasil

Group community for Brazil users. discussion only in Portuguese.

Highlighted
junior_ehlke
Contributor III

Seleção da ultima data com Valor

Bom dia,

estou desenvolvendo um projeto para o RH onde o banco de dados é baseado em históricos,

imaginem que eu tenho um histórico de salário,

Mes 07 Salario 1500

Mes 09 Salario 2000

Neste exemplo eu tenho duas movimentações, em minha seleção, selecionando o mes 11 o salario vai trazer zerado, mas eu preciso que me traga o ultimo valor (2000), tentei fazer =Bottom(sum(Valor_Salario)) porém ele me retorna zero.

Antes de tudo, Feliz Natal

Tags (1)
1 Solution

Accepted Solutions
MVP
MVP

Re: Seleção da ultima data com Valor

Boa noite.

A solução do Alan muito boa. Usa intervalmatch.  Uma outra solução seria usar o iterno().

//==================================================================

Salario:

load * inline

[

Funcionario,Data        ,Salario

A          ,"01/01/2014" , 1000

A          ,"01/03/2014" , 1100

A          ,"01/06/2014" , 1500

B          ,"01/01/2014" , 700

C          ,"01/01/2014" , 800

C          ,"01/03/2014" , 900

];

//==================================================================

Tmp:

LOAD

    Funcionario,

    Salario,

    Date#(Data)                                                                    as Data_Ini,

    if(Previous(Funcionario) = Funcionario,date#(Previous(Data)),date(Today()))    as Data_Fim

Resident Salario Order by Funcionario,Data desc;

//

SalarioFinal:

NoConcatenate

LOAD

  *

  ,MonthStart(addmonths(Data_Ini, IterNo()-1))                                    as Data_Salario

Resident Tmp

WHILE MonthStart(addmonths(Data_Ini, IterNo()-1)) < Data_Fim;

//

DROP Tables Salario,Tmp;

EXIT Script;

2014-12-25 22_32_15-QlikView x64 - [C__Furtado_Qlik_Bilden_Curso_Datas_Datas.qvw_].png

Att,

Alessandro Furtado

15 Replies
feliciano_alan
New Contributor II

Re: Seleção da ultima data com Valor

Olá Hamilton,

Você pode resolver este problema no script desta forma:

Salario_TMP:

LOAD *

INLINE [

    DataTMP, SalarioTMP

    01/01/2014, 1000

    01/05/2014, 1500

    01/10/2014, 3000

];

Salario:

load

  DataTMP as DataIni,

  date(if (RowNo() = 1, MonthStart(Today()), Previous(DataTMP)-1))

  as DataFim,

  SalarioTMP as Salario

Resident Salario_TMP

order by DataTMP desc;


drop Table Salario_TMP;

LOAD MakeDate(2014, RowNo(), 01) as Data

AutoGenerate(12);


join (Salario)

IntervalMatch (Data)

LOAD

  DataIni,

  DataFim

Resident Salario;

DROP Fields DataIni, DataFim;

O resultado fica assim:

Envio o QVW em anexo para lhe apoiar no entendimento.

junior_ehlke
Contributor III

Re: Seleção da ultima data com Valor

Boa Alan Feliciano Foi muito útil, porém quando eu tenho mais campos na tabela Salarios, por exemplo, Id_Funcionarios, como posso faer isso? Na forma deste exemplo ele só calcula a data para os primeiros registros.

feliciano_alan
New Contributor II

Re: Seleção da ultima data com Valor

Neste caso, temos que fazer o uso do Plano Cartesiano entre duas tabelas. Vamos criar um intervalo de datas para cada funcionário, assim teremos todos os funcionários preenchidos em todos os meses.

O script fica assim:

Salario_TMP:

LOAD *

INLINE [

    FuncIdTMP, DataTMP, SalarioTMP

    1, 01/01/2014, 1000

    1, 01/05/2014, 1500

    1, 01/10/2014, 3000

    2, 01/01/2014, 1000

    2, 01/05/2014, 1900

    2, 01/10/2014, 3600

    3, 01/04/2014, 5000

    3, 01/09/2014, 8600

];

Salario:

load

  DataTMP as DataIni,

  if (Previous(FuncIdTMP) <> FuncIdTMP, MonthStart(Today()), Previous(DataTMP)-1)

  as DataFim,

  SalarioTMP as Salario,

  FuncIdTMP as FuncId

Resident Salario_TMP

order by FuncIdTMP, DataTMP desc;

drop Table Salario_TMP;

Datas:

LOAD MakeDate(2014, RowNo(), 01) as Data

AutoGenerate(12);

Join (Datas)

load

  Distinct FuncId

Resident Salario;

join (Salario)

IntervalMatch (Data)

LOAD

  DataIni,

  DataFim

Resident Salario;

DROP Fields DataIni, DataFim;

O resultado na tela fica assim:

Fazendo desta forma, você consegue atender sua necessidade.

Abraço.

MVP
MVP

Re: Seleção da ultima data com Valor

Boa noite.

A solução do Alan muito boa. Usa intervalmatch.  Uma outra solução seria usar o iterno().

//==================================================================

Salario:

load * inline

[

Funcionario,Data        ,Salario

A          ,"01/01/2014" , 1000

A          ,"01/03/2014" , 1100

A          ,"01/06/2014" , 1500

B          ,"01/01/2014" , 700

C          ,"01/01/2014" , 800

C          ,"01/03/2014" , 900

];

//==================================================================

Tmp:

LOAD

    Funcionario,

    Salario,

    Date#(Data)                                                                    as Data_Ini,

    if(Previous(Funcionario) = Funcionario,date#(Previous(Data)),date(Today()))    as Data_Fim

Resident Salario Order by Funcionario,Data desc;

//

SalarioFinal:

NoConcatenate

LOAD

  *

  ,MonthStart(addmonths(Data_Ini, IterNo()-1))                                    as Data_Salario

Resident Tmp

WHILE MonthStart(addmonths(Data_Ini, IterNo()-1)) < Data_Fim;

//

DROP Tables Salario,Tmp;

EXIT Script;

2014-12-25 22_32_15-QlikView x64 - [C__Furtado_Qlik_Bilden_Curso_Datas_Datas.qvw_].png

Att,

Alessandro Furtado

junior_ehlke
Contributor III

Re: Seleção da ultima data com Valor

Bom dia,

os dois exemplos funcionaram perfeitamente,

apenas mais uma dúvida, utilizando o modelo do Alessandro Furtado,

Caso minha tabela de Salários tenha mais informações ou eu queira utilizar este mesmo recurso para outras tabelas, posso colocar todos os campos necessários dentro no IF correto?

Tmp:

LOAD

    funcionario,

    SalarioTMP,

    id_numemp,

    id_tipcol,

    R038HSA_SEQALT,

    Date#(DataTMP)                                                                    as Data_Ini,

    if(Previous(funcionario) = funcionario

    or Previous(id_numemp)=id_numemp

    or Previous(id_tipcol)=id_tipcol

    or Previous(SEQALT)=SEQALT

    ,date#(Previous(DataTMP)),date(Today()))    as Data_Fim

Resident SALARIO Order by funcionario,DataTMP desc;

MVP
MVP

Re: Seleção da ultima data com Valor

Bom dia. Sim daria, mas tem que cuidar pois se um campo não for igual ele vai usar a data de hoje o que pode te gerar mais dados para o mesmo funcionário do que você precisa.

AMF

De: Hamilton Junior

Enviada em: segunda-feira, 29 de dezembro de 2014 09:20

Para: ALESSANDRO FURTADO

Assunto: Re: - Seleção da ultima data com Valor

<http://community.qlik.com/resources/images/palette-1004/headerLogo-1391206184624-QlikCommunity_logo.gif>

junior_ehlke
Contributor III

Re: Seleção da ultima data com Valor

Voce tem alguma solução para quando eu tenho vários campos na tabela? ao contrario do que eu coloquei na resposta acima, eu coloco o AND no IF e não o OR

if(Previous(funcionario) = funcionario

    and Previous(id_numemp)=id_numemp

    and Previous(id_tipcol)=id_tipcol

    andPrevious(SEQALT)=SEQALT

O problema é que tenho muitos dados, esta difícil validar isto.

MVP
MVP

Re: Seleção da ultima data com Valor

Eu fiz um modelo de RH mas sempre usava a comparação do funcionário e não ele + outros campos. Voce precisa validar todos se são iguais?

AMF

De: Hamilton Junior

Enviada em: terça-feira, 30 de dezembro de 2014 17:51

Para: ALESSANDRO FURTADO

Assunto: Re: - Seleção da ultima data com Valor

<http://community.qlik.com/resources/images/palette-1004/headerLogo-1391206184624-QlikCommunity_logo.gif>

junior_ehlke
Contributor III

Re: Seleção da ultima data com Valor

Isso mesmo Alessandro, eu tenho várias tabelas que trabalham com históricos, mesma ideia do salario,

exemplo, histórico de empresa, nela mostra todas as transferencias de filial que o funcionário teve, alguns campos que tenho nessa tabela é o codigo do funcionario, empresa, unidade, data, motivo, cargo, etc. Acredito que os campos sejam todos iguais para as linhas. Acha que eu posso usar a mesma logica?