Страницы: 1
RSS
Перемещение людей по штату по "цепочке"
 
Привет всем, часто приходится перемещать людей по штату.
Важно чтобы порядок перемещения соблюдался, один за другим перемещались люди, по цепочке, надеюсь в примере все понятно.

Заранее спасибо за помощь.
 
Код
=ЕСЛИ(
      ПОИСКПОЗ([@ПЕРЕМЕЩ];$G$13:$G$16;0)=СЧЁТЗ($G$13:$G$16);
      "за ним никого нет";
      ЕСЛИОШИБКА(
         ИНДЕКС($G$13:$G$16;ПОИСКПОЗ([@ПЕРЕМЕЩ];$G$13:$G$16;0)+1);
         "такого нет в списке"
                )
     )

Коллеги, почему в моем варианте ЕСЛИОШИБКА все равно выдает ошибку? Если вот так в отдельном столбце делаю ЕСЛИОШИБКА(ИНДЕКС($G$13:$G$16;ПОИСКПОЗ([@ПЕРЕМЕЩ];$G$13:$G$16;0)+1);"такого нет в списке"), то все работает, а если в качетсве третьего аругемента ЕСЛИ работать не хочет.
Изменено: whateverlover - 02.10.2022 17:39:35
 
whateverlover, спасибо за внимание к моей проблеме, мне бы какую то возможность сортировки этих перемещений, может нумерация, чтобы по порядку перевода их расположить в списке.
 
fullmetallemo, не понимаю, отсортировать нужно таблицу просто?
=ИНДЕКС($F$13:$F$16;ПОИСКПОЗ([@ПЕРЕМЕЩ];$G$13:$G$16;0)) вот это даст порядковый номер, по нему и сортируйте
ну и следите, чтобы двух Ивановых не было  :)
 
whateverlover, так ВПРом и я могу подтянуть  :D , как такой порядок создать автоматически?
 
Ах ну раз впром подтянуть можете, создавайте список с должности и впрте
 
Цитата
whateverlover написал:
почему в моем варианте ЕСЛИОШИБКА все равно выдает ошибку?
Выдает ошибку не ЕСЛИОШИБКА, а ЕСЛИ. Причина: ЕСЛИ ждет  выполнение условия или не выполнения условия. А ПОИСКПОЗ([@ПЕРЕМЕЩ];$G$13:$G$16;0)=СЧЁТЗ($G$13:$G$16);0) в некоторых случаях возвращает ошибку.
Можно так обыграть)

Код
=ЕСЛИ(
            ЕСЛИОШИБКА( ПОИСКПОЗ([@ПЕРЕМЕЩ];$G$13:$G$16;0)=СЧЁТЗ($G$13:$G$16);0);
             "за ним никого нет";
             ЕСЛИОШИБКА(
                       ИНДЕКС($G$13:$G$16;ПОИСКПОЗ([@ПЕРЕМЕЩ];$G$13:$G$16;0)+1);
                       "такого нет в списке"
                                        )
            )
 
whateverlover, список перемещений есть, а порядок как правильный сделать подскажите
 
Моя последняя попытка угадать что надо  :)
Не понял почему именно с Иванова начинается, у меня список будет начинаться с Директора  :sceptic:

Михаил Л, спасибо
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    ChangeType = Table.TransformColumnTypes(Источник,{{"№", Int64.Type}, {"Долж", type text}, {"ФИО", type text}, {"ПЕРЕМЕЩ", type text}, {"РАПОРТ", type text}}),
    Director = ChangeType{[Долж="Директор"]}[ФИО],
    Index = Table.AddIndexColumn(ChangeType, "Индекс", 0, 1, Int64.Type),
    ПЕРЕМЕЩ = {Director}&List.RemoveItems( List.RemoveNulls(Index[ПЕРЕМЕЩ]), {Director}),
    LA = List.Accumulate(
        {1..List.Count(ПЕРЕМЕЩ)-1},
        {Director},
        (s,c)=> [a = Index{[ПЕРЕМЕЩ=List.LastN(s, 1){0}]}[Индекс],
                 b = Index{a}[ФИО],
                 d = s&{b}
                ][d]   
    ),
    toTable = Table.ReorderColumns(Table.AddIndexColumn(Table.FromList(LA,null,{"ФИО"}),"№",1,1), {"№","ФИО"})
in
    toTable
Изменено: whateverlover - 02.10.2022 20:52:10
 
whateverlover, получается цикл, можно начать с пупкина (т.е. директора) и законить ивановым.  
 
whateverlover, и можно разъяснение куда код, в модуль или куда?
 
fullmetallemo, я файл приложил, там все есть уже.
Это запрос Power Query, в интернете можно почитать подробнее.
 
whateverlover, Добрый вечер, у меня офис 2010, поставил повер квери. При обновлении выдает ошибку Expression.error Аргументы 5 были переданы функции, которая ожидает значения между 2 и 4.
 
fullmetallemo,  приложите файл, в котором у вас такая ошибка. Как я должен угадать о какой функции речь.
Цитата
fullmetallemo написал:
так ВПРом и я могу подтянуть  :D  
на ВПРах во вложении
Изменено: whateverlover - 03.10.2022 23:42:36
 
Цитата
fullmetallemo написал:
Аргументы 5 были переданы функции, которая ожидает значения между 2 и 4
попробуйте удалить эту часть -  , Int64.Type   в Table.AddIndexColumn(ChangeType, "Индекс", 0, 1, Int64.Type)
 
whateverlover, Михаил Л, Доброе утро попробовал убрать int64, запрос заработал. Добавил несколько перемещений и запрос выдал дублирующиеся фамилии. По идее привязки к "директору" делать нельзя, потому что мы не знаем кто в следующий раз будет в начале цепочки перемещения.
 
fullmetallemo, тогда 1) укажите принцип, по которому определяется с кого начинается цепочка (первое не пустое значение в столбце ПЕРЕМЕЩ? или первое непустое значение в столбце ФИО? или еще как то?)
2) приложите желаемый результат, сделанный руками, чтобы по нему можно было проверять правильность запроса, тут вроде недолго накидать
 
whateverlover, так попробую описать алгоритм:
1 цепочка перемещений
1. идем по порядку по столбцу ПЕРЕМЕЩЕНИЕ, как только попадается не пустое значение и нет порядкового номера в доп. столбце нумерации, проверяем последний порядковый номер в служ. столбце нумерации, если в столбе вообще пусто, это будет 1 по списку. В примере: Пупкин перемещается на место директора
2. проверяем фамилию в столбце ФИО на позиции "Директор" и ищем ее в столбце ПЕРЕМЕЩЕНИЕ, это будет 2 по списку. В примере: Иванов перемещается на место помощника
3. проверяем фамилию в столбце ФИО на позции "Помощник" и ищем ее в столбце ПЕРЕМЕЩЕНИЕ, это будет 3 по списку. В примере: Сидоров перемещает на место зама.
4. проверяем фамилию в столбце ФИО на позции "Зам" и ищем ее в столбце ПЕРЕМЕЩЕНИЕ, это будет 4 по списку. В примере: Петров перемещает на место раба.

Цепочка закрылась, по доп. столбцу, где мы проставим порядковый номер, проверить, что у пупкина есть номер (№ 1) и значит не нужно дублировать перемещение.
Цикл запускается снова с начала списка и продолжает нумеровать список далее по порядку, пока напротив всех фамилий в столбце перемещение не будет номера по порядку в служебном столбце.
Если попадается пустое значение в столбце перемещение, пропускаем.

2 цепочка перемещений
5. идем по порядку по столбцу ПЕРЕМЕЩЕНИЕ, как только попадается не пустое значение и нет порядкового номера в доп. столбце нумерации, проверяем последний порядковый номер в служ. столбце нумерации, последний был № 4, значит это будет 5 по списку. В примере:Карпов перемещает на место Дворника.
6. проверяем фамилию в столбце ФИО на позиции "Пёсель" и ищем ее в столбце ПЕРЕМЕЩЕНИЕ, это будет 6 по списку. В примере: Гавкин перемещается на место Пёселя
 
1) я так и не понял, почему у вас в примере идет Гавкин-Карпов, у меня получился Карпов-Гавкин
2) получилось какое-то месиво  :D хорошо, если не поломается от малейших перестановок данных...да и ответ с вашим не совпадает, но кто знает...
Код
let
    f=(Источник as table, lst as list) =>
    let
        //Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
        ИзмененныйТип = Table.TransformColumnTypes(Источник,{{"№", Int64.Type}, {"Долж", type text}, {"ФИО", type text}, {"ПЕРЕМЕЩЕНИЕ", type text}, {"РАПОРТ", type text}, {"Служ столбец", Int64.Type}}),
        ПервыйВСпискеПеремещения =  List.RemoveItems(     List.RemoveNulls(ИзмененныйТип[ПЕРЕМЕЩЕНИЕ])   , lst  )  {0},
        СтолбецИндекса = Table.AddIndexColumn(ИзмененныйТип,"Индекс",1,1),
        СписокСПервымЧеловекомВНачале = {ПервыйВСпискеПеремещения}&List.RemoveItems(List.RemoveNulls(ИзмененныйТип[ПЕРЕМЕЩЕНИЕ]),{ПервыйВСпискеПеремещения}),
      ЦиклПоЦепочке = List.Generate(
          ()=> [Список = {ПервыйВСпискеПеремещения}, БывшийНаЭтойДолжности = null, i = 1],
          each [БывшийНаЭтойДолжности] <> ПервыйВСпискеПеремещения,
          each [Список = List.Combine({[Список],{БывшийНаЭтойДолжности}}),                                           
                БывшийНаЭтойДолжности = 
                  [a = СтолбецИндекса{[ПЕРЕМЕЩЕНИЕ=List.LastN([Список], 1){0}]}[Индекс],
                  b = СтолбецИндекса{[Индекс=a]}[ФИО]
                  ][b], 
                i = [i] +1],
          each List.Last([Список])
      )
    in
        ЦиклПоЦепочке,

    Источник =  Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content] ,
    Перемещ = List.RemoveNulls(Источник[ПЕРЕМЕЩЕНИЕ]),
    LG = List.Last(
            List.Generate(
                ()=> [x = {}, y={}, z=Перемещ, i = 1],
                each not List.IsEmpty([z]),
                each [y = [y]&f(Источник,[x]) , x=y, z=List.RemoveItems([z],[x]), i = [i]+1],
                each [y]          
          )
    )
in
    LG
 
whateverlover, Спасибо большое за помощь, чтобы заработало на 2010 экселе заменил int64.type на type number. Добавил пару перемещений, проверил, вроде правильно. Протестирую на реальном примере и отпишусь о результатах.
Страницы: 1
Наверх