Страницы: 1
RSS
Нумерация строк в умной таблице с фиксацией
 
Здравствуйте. Пытаюсь решить следующую задачу: есть умная таблица, и нужно каждой строке добавлять индексы. Значение индекса должно сохраняться для строки, то есть, если мы сортируем, фильтруем или удаляем строки из таблицы - индекс должен иметь тоже значение, что и раньше. Соответственно, если добавилась новая строка в таблице, то поставиться индекс, больший на 1, чем уже есть в этой колонке.
Хотелось бы решить эту задачу пока без VBA. Подскажите такое возможно, или лучше сразу на VBA решать задачу?
 
Может и возможно, но нужен ваш файл-пример
 
Вот мой пример
 
Machestro, формула всегда привязывается к значению, позиции, последовательности …. При изменении их, автоматом произойдет пересчет. Кроме как фиксированного значения - ничего не подойдет для ваших целей, а раз так, то только макрос.
По вопросам из тем форума, личку не читаю.
 
Задача решаема макросом или PQ (в данном случае макрос явно лучше), Но она совсем не тривиальная.

Вижу два способа:
1. Сохранять старую таблицу с индексами и при добавлении новых элементов присваивать им индексы, используя в качестве словаря старую таблицу.
2. Вычислять хэш ключевого поля, но индексы там будут аццкие (например, 8743b52063cd84097a65d1633f5c74f5). И это лишено смысла.

А вообще зачем это нужно если у вас ключ и так есть?
Предлагаю вам пересмотреть необходимость задачи в таком виде.
Изменено: Alexey_Spb - 13.03.2019 09:56:34
 
В моем примере ключ не показателен, значения могут повторяться. Индекс и планировался как ключ
Изменено: Machestro - 13.03.2019 09:18:39
 
Цитата
Machestro написал: В моем примере ключ не показателен, значения могут повторяться. Индекс и планировался как ключ
Тогда задача в том виде, как вы ее пишите, нерешаема. Как алгоритм отличит среди двух одинаковых значений какое добавилось, а какое было раньше чтобы присвоить им разные ключи?

Допустим, была запись А, ей присвоен ключ 100.
Добавилась такая же запись.. Нет однозначного способа понять какой из двух А присваивать 100 - номер попадания не показатель так как новая запись могла появиться перед старой или после нее.

Рекомендую вам полностью пересмотреть подход.
Изменено: Alexey_Spb - 13.03.2019 09:56:53
 
Доброе время суток
Цитата
Machestro написал:
моем примере ключ не показателен, значения могут повторяться.
Тогда должно существовать ещё одно поле, сочетание с которым и даёт уникальный ключ. Просто нумерация, на мой взгляд, не имеет смысла. Вот для составного первичного ключа и имеет смысл делать индекс.
 
Alexey_Spb, вы точно не усложняете? Может проще использовать self-referencing tables?
Machestro, вам принципиально чтобы индексы присваивались на лету? сразу при добавлении новой строки? Или есть вариант добавить некоторую часть строк и потом нажав на таблице кнопку "Обновить" присвоить индексы всем новым строкам?
Вот горшок пустой, он предмет простой...
 
Machestro, Например в access есть понятие AutoNumber. каждая запись получает следующий индекс , но это не реализовано в умной таблице excel. Вам поможет только крохотный макрос, который будет вставлять новый "индекс" как значение.
По вопросам из тем форума, личку не читаю.
 
Нужно просмотреть все индексы в колонке, найти максимальный и прибавить единицу. У каждой строки должен быть свой уникальный индекс, и не важно, что значения у строк одинаковые
 
Цитата
PooHkrd написал:  Alexey_Spb , вы точно не усложняете?
Считаю что нет. В указанной вами ссылке уже был ключ - ID. А у автора задача сгенерировать этто самый ID..
Тут или использовать составной ключ как сказал Андрей VG, либо задача нерешаема (у автора в примере был один столбец, на основании этого я и сделал вывод что задача нерешаема в данных условиях).

Цитата
БМВ написал: Вам поможет только крохотный макрос, который будет вставлять новый "индекс" как значение.
Порследовательная нумерация элементарно делается на PQ, но ведь у автора другая задача, как я понял, при изменении порядка строк их индекс должен сохраняться, а еще должна быть обеспечена уникальность ключа для повторяющихся значений.

Имхо, это перебор :-)
Изменено: Alexey_Spb - 13.03.2019 09:59:32
 
Короче такой вариант:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    С_Индексом = Table.SelectRows(Источник, each ([Индекс] <> null)),
    БезИндекса = Table.SelectRows(Источник, each ([Индекс] = null)),
    Итог = С_Индексом & Table.AddIndexColumn( Table.RemoveColumns( БезИндекса, {"Индекс"} ), "Индекс", List.Max(С_Индексом[Индекс]) + 1, 1)
in
    Итог

Вносите одну или более записей в таблицу, потом жмете по ней ПКМ и выбираете "обновить" он заполняет поле индексами и при сортировках все остается на своих местах.
Изменено: PooHkrd - 13.03.2019 09:44:48
Вот горшок пустой, он предмет простой...
 
PooHkrd, Здорово, работает. Но теперь возник другой вопрос, а как вы заставили PQ, чтобы он изменил сам источник, а не вставил новую таблицу?
 
Machestro, смотрите статью по ссылке выше в моем ответе Alexey_Spb. И обратите внимание, что если изначально в поле "индекс" не будет заполненных значений, то нумерацию строк он начнет с нуля.
Изменено: PooHkrd - 13.03.2019 10:04:43
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх