Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
5 years ago
Solved

Adicionar linhas entre data inicio e data fim (loop while)

Bom dia,

Hoje me deparei com um problema que eu sabia que chegaria algum dia... Preciso almentar o número de registros na minha tabela baseado em uma regra. Eu resolvia esse tipo de problema com "while" em outra ferramenta, mas em linguagem M não consegui encontrar uma solução.
A baixo segue um exemplo simplório.

CONTAEMPRESADATA INICIODATA FIM
000000emp 101/11/202001/02/2021
111111emp 101/05/202101/06/2021
222222emp 201/04/202101/06/2021


Baseado na tabela a cima, eu preciso criar todos os meses entre o inicio e o fim. O resultado esperado é:

CONTAEMPRESAMES ANO
000000emp 101/11/2020
000000emp 101/12/2020
000000emp 101/01/2021
000000emp 101/02/2021
111111emp 101/05/2021
111111emp 101/06/2021
222222emp 201/04/2021
222222emp 201/05/2021
222222emp 201/06/2021


Obs. a solução precisa ser em M, não pode ser SQL.
Agradeço desde já pela ajuda.

  • Anonymous's avatar
    Anonymous
    5 years ago

    Hi v-stephen-msft ,
    thanks for your suggestion, but it's not like what I expected.

     

    Deixo meu agradecimento também ao Gil Raviv, do datachant   que compartilhou comigo algumas possibilidades que certamente usarei no futuro.


    Bom, eu cheguei a solução que esperava no dia que postei a pergunta, só não havia conseguido passar para compartilhar a solução. De forma resumida, fiz um loop com list.generate() onde incrementava dois valores dependendo da condição, algo mais parecido com um loop aninhado. Hora incrementava a data (loop interno) hora incrementava a linha (loop externo).

    Desta forma a iteração funciona corretamente, mas é indispensável a utilização da tabela em buffer para conjuntos grandes.

     

    Última observação, a função list.generate() possúi um terceiro argumento opcional que permite especificar o que será retornado, podemdo assim omitir a coluna i (identificador da linha) e a coluna fim que não possuem mais utilidade.

5 Replies

  • Anonymous's avatar
    Anonymous
    Not applicable

    Hi Anonymous ,

     

    First create a custom column, get the next day, separate the four date columns to get four tables.

     

    And then keep the column names of the date columns consistent, and then merge. About append queries.

     

    After removing duplicates, the result is this.

     

     

    Best Regards,

    Stephen Tao

     

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

  • Anonymous's avatar
    Anonymous
    Not applicable

    Hi v-stephen-msft ,
    thanks for your suggestion, but it's not like what I expected.

     

    Deixo meu agradecimento também ao Gil Raviv, do datachant   que compartilhou comigo algumas possibilidades que certamente usarei no futuro.


    Bom, eu cheguei a solução que esperava no dia que postei a pergunta, só não havia conseguido passar para compartilhar a solução. De forma resumida, fiz um loop com list.generate() onde incrementava dois valores dependendo da condição, algo mais parecido com um loop aninhado. Hora incrementava a data (loop interno) hora incrementava a linha (loop externo).

    Desta forma a iteração funciona corretamente, mas é indispensável a utilização da tabela em buffer para conjuntos grandes.

     

    Última observação, a função list.generate() possúi um terceiro argumento opcional que permite especificar o que será retornado, podemdo assim omitir a coluna i (identificador da linha) e a coluna fim que não possuem mais utilidade.

    • Michel_Soares's avatar
      Michel_Soares
      Frequent Visitor

      Bom dia, eu tentei essa solução que você sugeriu, porém não tive sucesso.

       

      let
      Fonte = Python.Execute("import pandas as pd#(lf)#(lf)#(lf)lista = { ""Id"":[1,2,2,3],#(lf) ""Colaborador"":[""João"",""José"",""Mario"",""Vicente""],#(lf) ""Data Inicio"":[""20/03/2023"",""29/03/2023"",""01/04/2023"",""15/04/2023""],#(lf) ""Data Fim"":[""10/04/2023"", ""15/04/2023"",""15/04/2023"",""15/05/2023""]#(lf)#(lf)}#(lf)#(lf)df = pd.DataFrame(lista)#(lf)#(lf)print(df)"),
      df1 = Fonte{[Name="df"]}[Value],
      #"Tipo Alterado" = Table.TransformColumnTypes(df1,{{"Data Inicio", type date}, {"Data Fim", type date}}),
      Tab = Table.Buffer(#"Tipo Alterado"),
      #"Numero Linhas" = Table.RowCount(tab),
      #"Adição Datas" =
      List.Generate(
      ()=> [i=0,Id = tab{i}[Id], Colaborador = tab{i}[Colaboador], dtini=tab{i}[Data Inicio],dtfim=tab{i}[Data Fim]],
      each i < #"Numero Linhas",
      each
      if [Data Inicio] < [Data Fim]
      then [i=[i], Id = [Id], Colaborador = [Colaboador], dtini=Date.AddDays([Data Inicio],1),dtfim=[Data Fim]]
      else [i=[i]+1,Id = tab{i}[Id], Colaborador = tab{i}[Colaboador], dtini=tab{i}[Data Inicio],dtfim=tab{i}[Data Fim]]
      )
      in
      #"Adição Datas"

       

      tentei fazer desta forma, porém recebo um erro 

       

       

    • Augusto23's avatar
      Augusto23
      New Member

      Tua solução salvou meu projeto.
      Muito obrigado!!!