Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
junior_ehlke
Creator III
Creator 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

Labels (4)
1 Solution

Accepted Solutions
afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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

furtado@farolbi.com.br

View solution in original post

15 Replies
feliciano_alan
Contributor II
Contributor II

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
Creator III
Creator III
Author

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
Contributor II
Contributor II

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.

afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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

furtado@farolbi.com.br
junior_ehlke
Creator III
Creator III
Author

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;

afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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>

furtado@farolbi.com.br
junior_ehlke
Creator III
Creator III
Author

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.

afurtado
Partner Ambassador/MVP
Partner Ambassador/MVP

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>

furtado@farolbi.com.br
junior_ehlke
Creator III
Creator III
Author

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?