Страницы: 1
RSS
Из фактов вычесть поступления, начиная от ранней даты, Power Query List.Generate или формулы Excel
 
Здравствуйте
Как вычесть поступления из фактов, начиная от самой ранней даты. В файле есть еще две колонки - желаемый результат. По итогу надо таблица Факт с измененными значениями в Оплачено и Долг.
Розовым просто выделил больше трех с/ф по инн.
 
Михаил Л, вариант:
Код
let
  payments = Excel.CurrentWorkbook(){[ Name = "Поступило" ]}[Content],
  paymentsGroup = Table.Group ( payments, { "ИНН" }, { { "Поступило", each List.Sum ( [Поступило] ), type number } } ),
  paymentsRec = Record.FromList ( paymentsGroup[Поступило], List.Transform ( paymentsGroup[ИНН], Text.From ) ),
  fact = Excel.CurrentWorkbook(){[ Name = "Факт" ]}[Content],
  typed = Table.TransformColumnTypes (
    fact,
    {
      { "Дата", type date },
      { "№ СФ", Int64.Type },
      { "ИНН", Int64.Type },
      { "Сумма СФ", type number },
      { "Оплачено", type number },
      { "Долг", type number }
    }
  ),
  sort = Table.Sort ( typed, { { "ИНН", Order.Ascending }, { "Дата", Order.Ascending }, { "№ СФ", Order.Ascending } } ),
  group = Table.Group (
    sort,
    { "ИНН" },
    {
      {
        "recs",
        ( t ) =>
          [
            recs = List.Buffer ( Table.ToRecords ( t ) ),
            iMax = List.Count ( recs ) - 1,
            generate = List.Generate (
              () =>  [
                i = 0,
                p = Record.FieldOrDefault ( paymentsRec, Text.From ( recs{0}[ИНН] ), 0 ),
                s = if i = iMax then p else List.Min ( { recs{i}[Долг], p } ),
                result = Record.TransformFields (
                  recs{i},
                  { { "Оплачено", ( x ) => List.Sum ( { x, s } ) }, { "Долг", ( x ) => List.Sum ( { x, - s } ) } }
                )
              ],
              each [i] <= iMax,
              each [
                i = [i] + 1,
                p = [p] - [s],
                s = if i = iMax then p else List.Min ( { recs{i}[Долг], p } ),
                result = Record.TransformFields (
                  recs{i},
                  { { "Оплачено", ( x ) => List.Sum ( { x, s } ) }, { "Долг", ( x ) => List.Sum ( { x, - s } ) } }
                )
              ],
              each [result]
            )
          ][generate],
        type {record}
      }
    },
    GroupKind.Local
  ),
  toTable = Table.FromRecords ( List.Combine ( group[recs] ), Value.Type ( typed ) )
in
  toTable
Изменено: surkenny - 13.06.2022 22:46:37
 
surkenny, спасибо!
Попробую разобраться)
 
А формулами такое можно решить?
Сколько угодно допстолбцов допускается)
Изменено: Михаил Л - 14.06.2022 00:59:52
Страницы: 1
Наверх