powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Удаление данных из экземпляра сводной таблицы
20 сообщений из 20, страница 1 из 1
Удаление данных из экземпляра сводной таблицы
    #37233906
DesertBrowser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Имеется сводная таблица, в объект Recordset объекта PivotCache которой записываются данные, полученные из хранимой процедуры.
В таблице есть поле "Подразделение". Отчёт сводной таблицы из программы, путём нажатия кнопки, формирует оператор сразу по всем подразделениям. Далее программа выполняет по полю "Подразделение" команду "Отобразить страницы", и каждую страницу с отдельным подразделением сохраняет в свой файл.
Но при рассылке файлов специалисты каждого из подразделений могут посмотреть данные другого подразделения, а этого допустить нельзя.
Пробовала применить к объекту Recordset команду Delete, чтобы удалить из него записи с чужими подразделениями, но получила ошибку - Набор записей не поддерживает обновление. Как можно обойти проблему?
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234122
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DesertBrowser,

снимите галку.
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234169
DesertBrowser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Это вариант, но пользователь после запрета сохранения данных вместе с таблицей не может изменять макет, а хотелось бы оставить эту возможность. Т.к. в конце концов можно после выбора подразделения скопировать данные на другой лист как значения, но тогда потеряем преимущества сводной...
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234183
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DesertBrowser,

тогда генерите для каждого подразделения свой набор данных ( добавьте параметр в хранимую процедуру, которая у вас тянет данные в Recordset).
Или внедряйте SSAS.
Или используйте PowerPivot ( если у вас Excel 2010, но набор данных все равно придется дробить по каждому подразделению).
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234199
DesertBrowser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Параметр с подразделением в процедуре есть, но по 1 подразделениб процедура отрабатывает за 30 сек, а по 20 сразу - за 60 сек. Поэтому запускать процедуру с параметром для этой цели нецелесообразно.
А что такое SSAS?
У нас Excel 2003
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234206
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DesertBrowser,

Ну поставьте генерацию по расписанию, создавайте файл ночью. Из PivotCache вы ничего не удалите.
SSAS - Microsoft SQL Server Analysis Services, входит в состав Microsoft SQL Server (2005... )
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234231
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DesertBrowserПараметр с подразделением в процедуре есть, но по 1 подразделениб процедура отрабатывает за 30 сек, а по 20 сразу - за 60 сек. Поэтому запускать процедуру с параметром для этой цели нецелесообразно.

Вопрос целесообразности - это всегда дилемма :) Что-то долгая процедура. Можно увидеть код? Наверняка дело в объеме данных, навороченности запроса или в доступе к данным, но может дело в коде.

DesertBrowserА что такое SSAS?
У нас Excel 2003

SQL Server Analysis Services
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234236
DesertBrowser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из вариантов также - создать фильтр на Recordset (в эксперименте привело к тому, что все данные из таблицы исчезли без возможности восстановления), либо скопировать нужные данные в новый Recordset и его передать в PivotCache, но опасаюсь, что будет долго.
По расписанию ночью отчёт запускать нельзя, он нужен в оперативном режиме.
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234246
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DesertBrowserИз вариантов также - создать фильтр на Recordset (в эксперименте привело к тому, что все данные из таблицы исчезли без возможности восстановления), либо скопировать нужные данные в новый Recordset и его передать в PivotCache, но опасаюсь, что будет долго.
По расписанию ночью отчёт запускать нельзя, он нужен в оперативном режиме.

Какое количество строк содержит рекордсет со всеми подразделениями?
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234260
DesertBrowser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KL (XL)
Да, алгоритм процедуры сложный плюс объём обрабатываемых записей большой - обработке подвергаются по нескольку сотен тысяч записей из десятка таблиц, на выходе 15-30 тыс записей. Время обработки так соотносится для частного и целого потому, что в этом случае строятся разные планы исполнения запроса. Возможно пути оптимизации и существуют, но предполагаю что сократить время выполнения можно максимум на 50%.
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234299
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DesertBrowserKL (XL)
Да, алгоритм процедуры сложный плюс объём обрабатываемых записей большой - обработке подвергаются по нескольку сотен тысяч записей из десятка таблиц, на выходе 15-30 тыс записей. Время обработки так соотносится для частного и целого потому, что в этом случае строятся разные планы исполнения запроса. Возможно пути оптимизации и существуют, но предполагаю что сократить время выполнения можно максимум на 50%.
При объеме выхода в 15-30 тыс записей можно сохранить 30 сек на запрос и добавить несколько жалких секунд на генерацию отдельных таблиц с отфильтрованными рекордсетами:

Алгоритм
1) получаете общий рекордсет за свои 30 сек
2) копируете его на лист Excel
Код: plaintext
Cell.CopyFromRecordset rs 
3) создаете новую книгу
4) из исходной таблицы запускаете цикл с "Расширенным фильтром" с критерием подразделение и с копированием данных на лист новой книги
5) в новой книге кодом строите Сводную таблицу с источником данных на соседнем листе.
6) при желании скрываете лист с данными Sheet1.Visible=xlVeryHidden
7) сохраняете и закрываете файл
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234327
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При желании можно заменить Расширенный фильтр ADO-запросами к листу со скопированным рекордсетом. Время, думаю, будет то же - считанные секунды.
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234378
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итого получается
1. Один запрос в БД на все подразделения с сохранением результата в Recordset.
2. Фильтрация на клиенте и CopyFromRecordset на отдельный лист для каждого подразделения
3. Генерация сводной таблицы для каждого подразделения.
4. Разбить файл на пары листов : исходные данные + сводная таблица для каждого подразделения.
4.1 Каждую пару в отдельный файл.
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234425
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-dukeИтого получается
1. Один запрос в БД на все подразделения с сохранением результата в Recordset.
2. Фильтрация на клиенте и CopyFromRecordset на отдельный лист для каждого подразделения
3. Генерация сводной таблицы для каждого подразделения.
4. Разбить файл на пары листов : исходные данные + сводная таблица для каждого подразделения.
4.1 Каждую пару в отдельный файл.

Не совсем... Скорее так (на всякий случай с большим запасом):
1. Один запрос в БД на все подразделения с сохранением результата в Recordset. (30 сек)
2. Одно копирование CopyFromRecordset на отдельный лист (<1 сек)
3. Создание массива с уникальным списком подразделений (~1 сек)
4. n созданий новых файлов (n * ~100 мсек)
5. n фильтраций на клиенте с копированием (n * ~1 сек)
6. n генераций сводной таблицы с подсоединением (n * ~100 мсек)
7. n сохранений файлов с закрытием (n * ~1 сек)

И того, если предположить, что подразделений штук 30, то:

30+1+1+3+30+3+30=98

что совсем не 50% в сравнении с

30*30=900
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234432
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, запрос для всех сразу - 60 сек, а не 30, т.е.:

авторИ того, если предположить, что подразделений штук 30, то:

60+1+1+3+30+3+30=128

что совсем не 50% в сравнении с

30*30=900
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234449
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, весьма вероятно, что процесс еще больше ускорится при таком варианте:

1. Один запрос в БД на все подразделения с сохранением результата в Recordset. (60 сек)
2. Одно копирование CopyFromRecordset на отдельный лист (<1 сек)
3. Создание массива с уникальным списком подразделений (~1 сек)
4. Подключение ADO на клиенте (~1 сек)
5. n созданий новых файлов (n * ~100 мсек)
6. n запросов ADO на клиенте (n * ~300 мсек)
7. n генераций сводной таблицы с рекордсетом как источником (n * ~100 мсек)
8. n сохранений файлов с закрытием (n * ~1 сек)

И того, если предположить, что подразделений штук 30, то:

60+1+1+1+3+9+3+30=108

но думаю, будет еще быстрее
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234453
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL),

п.3 строится по рекордсету ?
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234465
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-dukeKL (XL),

п.3 строится по рекордсету ?

По его копии на листе, что, думаю, несколько быстрее в считывании в переменную.
...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37234512
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL),


Глянь плиз мой вопрос про диаграммы

...
Рейтинг: 0 / 0
Удаление данных из экземпляра сводной таблицы
    #37244725
DesertBrowser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В итоге реализовала следующий алгоритм:
1. На отдельном листе создаётся копия сводной таблицы, у которой поле Подразделение перемещено в область страниц.
2. По этому полю выполняется команда Отобразить страницы, после чего копия таблицы удаляется.
3. Рекордсет сводной таблицы копируется на лист в отдельный файл, файл закрывается (если рекордсет считывать с листа открытого файла, появляется сообщение о совместном доступе к файлу при работе через COM).
4. Каждую сводную таблицу копирую в отдельный файл.
5. По полю Подразделение файла текущей сводной таблицы делаю выборку с листа рекордсета, результат записываю в рекордсет сводной по подразделению.
6. Листы со сводными таблицами из основного файла удаляются.
7. Файл с рекордсетом удаляется.
KL (XL),
отдельное спасибо за идею построения рекордсета по набору данных на листе. Ранее приходилось строить сводные таблицы не по рекордсету, а указывая в источнике данных лист рабочей книги. При этом объём обрабатываемых сводной таблицей данных (и строк, и столбцов) меньше по сравнению с источником данных-рекордсетом, что в моём случае критично. Однако построение рекордсета по данным с листа и указание полученного рекордсета в качестве источника данных решает проблему.
Кстати, т.к. работаю через COM, построение и форматирование сводной таблицы при количестве записей более 2-3 тысяч сильно замедляктся, поэтому вместо построения сводных таблиц по каждому подразделению и был применён способ с отображением страниц и подменой рекордсета.
В целом процедура формирования исходной сводной таблицы занимает 30-50 сек и примерно столько же - весь процесс формирования экземпляров по подразделениям.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Удаление данных из экземпляра сводной таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]