Страницы: 1
RSS
Создать график погашения кредита в PQ
 
Здравствуйте уважаемые форумчаны. есть 10 000 строк с кредитами. Есть начальный месяц оформления кредита + месяцы погашение кредита. надо в PQ сделать диаграмму график погашение кредита (день месяц год). на пример клиент взял кредит 01,01,2022 на 3 месяца то график 01,02,2022+01,03,2022+01,04,2022 примерно так. Сумма погашение есть думаю объяснил всё правильно. если есть возможность то сместить дни погашение если попали в воскресение (выходной) то есть если 02,02,2022 воскресение то оплату принимаем в 03,02,2022 след месяц обычно 02,03,2022. За помощь заранее спасибо
 
Sherzod Zukurov,  
пользуйтесь
Код
let
    f=(t)=>[    b = List.Transform({1..t{3}},(x)=>Date.AddMonths(t{1},x)),
    c = List.Transform(b,(x)=>Date.AddDays(x, if Date.DayOfWeek(x)=6 or Date.DayOfWeek(x)=5 then 7-Date.DayOfWeek(x) else 0)),
    d = t&{c}][d],
    from = Excel.Workbook(File.Contents("Путь ваш к файлу"), null, true){[Item="Лист1",Kind="Sheet"]}[Data],
    head = Table.PromoteHeaders(from, [PromoteAllScalars=true]),
    lst = Table.ToRows(head),
    fl = Table.FromList(lst,f,{"Клиент","Дата","оплата в месяц","Месяцы","Дата погашения"}),
    exp = Table.ExpandListColumn(fl, "Дата погашения")
in
    exp
 
Спасибо огромное вам всё работает только убрал or Date.DayOfWeek(x)=5 так как в субботу тоже принимаем оплаты. Только 1 вопрос если в исходной таблице будут другие название столбцов то как вытягивать оттуда данных? fl = Table.FromList(lst,f,{"Клиент","Дата","оплата в месяц","Месяцы","Дата погашения"}), вместо это писать название столбцов исходного файла?
 
У вас там какой порядок столбцов
 
1.OrderId 2.Дата создания 3.Дата доставки 4.Product 5.Category 6.Имейка 7.Amount 8.Сумма закупа ($) 9.Сумма закупа сум 10.Price 11.Расход 12.Разница 13.First payment 14.Цена за наличку 15.Цена в рассрочку 16.Доход 17.Delivery 18.Payment of commission 19.Discount 20.Status 21.Payment 22.Рассрочка 23.Регион
ну и потом с другого файла сюда вытащу
24. Клиент
25. Дата
26. Оплата в месяц
27. Месяцы
28. Дата погашения

Не обращайте внимание на название строк (анг + русский) данные идут из разных источников

Если сложно реализовать ничего страшного. открою 2 лист и туда соберу отдельно инфо кредиторов.

+1 Вопрос можно ли исключить праздничные дни из погашения? если праздник то оплату принимаем на след день  
Изменено: Sherzod Zukurov - 23.06.2022 14:51:23
 
Ребята кто знает помогите пож.
Верхний код работает идеально, но как данные взять из текущей книги? то чтобы и запрос и данные были в одной книге
Сам пробовал выходит вот так

DataFormat.Error: Результат содержит больше столбцов, чем ожидалось.
Сведения:
   Count=5

let
   f=(t)=>[    b = List.Transform({1..t{3}},(x)=>Date.AddMonths(t{1},x)),
   c = List.Transform(b,(x)=>Date.AddDays(x, if Date.DayOfWeek(x)=6 or Date.DayOfWeek(x)=5 then 7-Date.DayOfWeek(x) else 0)),
   d = t&{c}][d],
   from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
   head = Table.PromoteHeaders(from, [PromoteAllScalars=true]),
   lst = Table.ToRows(head),
   fl = Table.FromList(lst,f,{"Клиент","Дата","оплата в месяц","Месяцы","Дата погашения"}),
   exp = Table.ExpandListColumn(fl, "Дата погашения")
in
   exp
Изменено: Sherzod Zukurov - 19.08.2022 14:50:29
 
Вариант макросом.
Код
Sub GetPayDates()
    Dim rr As Range
    With ActiveSheet
        Set rr = .Range(.Cells(1, 1), .Cells(.Rows.Count, 4).End(xlUp))
    End With
    Dim arr As Variant
    arr = JobRange(rr)
    With Workbooks.Add(1)
        With .Sheets(1)
            With .Cells(1, 1)
                With .Resize(UBound(arr(0), 1), UBound(arr(0), 2))
                    .Value = arr(0)
                    .EntireColumn.AutoFit
                End With
                With .Cells(1, 1 + UBound(arr(0), 2)).Resize(UBound(arr(1), 1), UBound(arr(1), 2))
                    .Value = arr(1)
                    .EntireColumn.AutoFit
                End With
            End With
        End With
        .Saved = True
    End With
End Sub
Private Function JobRange(rr As Range) As Variant
    Dim yy As Long
    Dim xx As Long
    Dim arr As Variant
    Dim brr As Variant
    Dim dd As Byte
    Dim mm As Byte
    Dim ye As Long
    Dim dt As Date
    yy = WorksheetFunction.Max(rr.Columns(4))
    arr = rr
    ReDim brr(1 To UBound(arr, 1), 1 To yy)
    For yy = 2 To UBound(arr, 1)
        dd = Day(arr(yy, 2))
        mm = Month(arr(yy, 2))
        ye = Year(arr(yy, 2))
        For xx = 1 To arr(yy, 4)
            dt = DateSerial(ye, mm + xx, dd)
            If Month(dt) = 1 Then
                If Day(dt) < 10 Then dt = DateSerial(ye, 1, 10)
            End If
            If Weekday(dt, vbMonday) = 6 Then dt = dt + 2
            If Weekday(dt, vbMonday) = 7 Then dt = dt + 1
            
            brr(yy, xx) = dt
        Next
    Next
    JobRange = Array(arr, brr)
End Function
 
Спасибо за ответ но хотелось чтобы было через PQ для дальнейшей обновлении  
Страницы: 1
Наверх