|
|
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
Добрый день! Имеется сводная таблица, в объект Recordset объекта PivotCache которой записываются данные, полученные из хранимой процедуры. В таблице есть поле "Подразделение". Отчёт сводной таблицы из программы, путём нажатия кнопки, формирует оператор сразу по всем подразделениям. Далее программа выполняет по полю "Подразделение" команду "Отобразить страницы", и каждую страницу с отдельным подразделением сохраняет в свой файл. Но при рассылке файлов специалисты каждого из подразделений могут посмотреть данные другого подразделения, а этого допустить нельзя. Пробовала применить к объекту Recordset команду Delete, чтобы удалить из него записи с чужими подразделениями, но получила ошибку - Набор записей не поддерживает обновление. Как можно обойти проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 15:04 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
DesertBrowser, снимите галку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 16:14 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
Спасибо. Это вариант, но пользователь после запрета сохранения данных вместе с таблицей не может изменять макет, а хотелось бы оставить эту возможность. Т.к. в конце концов можно после выбора подразделения скопировать данные на другой лист как значения, но тогда потеряем преимущества сводной... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 16:29 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
DesertBrowser, тогда генерите для каждого подразделения свой набор данных ( добавьте параметр в хранимую процедуру, которая у вас тянет данные в Recordset). Или внедряйте SSAS. Или используйте PowerPivot ( если у вас Excel 2010, но набор данных все равно придется дробить по каждому подразделению). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 16:35 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
Параметр с подразделением в процедуре есть, но по 1 подразделениб процедура отрабатывает за 30 сек, а по 20 сразу - за 60 сек. Поэтому запускать процедуру с параметром для этой цели нецелесообразно. А что такое SSAS? У нас Excel 2003 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 16:38 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
DesertBrowser, Ну поставьте генерацию по расписанию, создавайте файл ночью. Из PivotCache вы ничего не удалите. SSAS - Microsoft SQL Server Analysis Services, входит в состав Microsoft SQL Server (2005... ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 16:40 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
DesertBrowserПараметр с подразделением в процедуре есть, но по 1 подразделениб процедура отрабатывает за 30 сек, а по 20 сразу - за 60 сек. Поэтому запускать процедуру с параметром для этой цели нецелесообразно. Вопрос целесообразности - это всегда дилемма :) Что-то долгая процедура. Можно увидеть код? Наверняка дело в объеме данных, навороченности запроса или в доступе к данным, но может дело в коде. DesertBrowserА что такое SSAS? У нас Excel 2003 SQL Server Analysis Services ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 16:46 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
Из вариантов также - создать фильтр на Recordset (в эксперименте привело к тому, что все данные из таблицы исчезли без возможности восстановления), либо скопировать нужные данные в новый Recordset и его передать в PivotCache, но опасаюсь, что будет долго. По расписанию ночью отчёт запускать нельзя, он нужен в оперативном режиме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 16:46 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
DesertBrowserИз вариантов также - создать фильтр на Recordset (в эксперименте привело к тому, что все данные из таблицы исчезли без возможности восстановления), либо скопировать нужные данные в новый Recordset и его передать в PivotCache, но опасаюсь, что будет долго. По расписанию ночью отчёт запускать нельзя, он нужен в оперативном режиме. Какое количество строк содержит рекордсет со всеми подразделениями? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 16:49 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
KL (XL) Да, алгоритм процедуры сложный плюс объём обрабатываемых записей большой - обработке подвергаются по нескольку сотен тысяч записей из десятка таблиц, на выходе 15-30 тыс записей. Время обработки так соотносится для частного и целого потому, что в этом случае строятся разные планы исполнения запроса. Возможно пути оптимизации и существуют, но предполагаю что сократить время выполнения можно максимум на 50%. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 16:52 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
DesertBrowserKL (XL) Да, алгоритм процедуры сложный плюс объём обрабатываемых записей большой - обработке подвергаются по нескольку сотен тысяч записей из десятка таблиц, на выходе 15-30 тыс записей. Время обработки так соотносится для частного и целого потому, что в этом случае строятся разные планы исполнения запроса. Возможно пути оптимизации и существуют, но предполагаю что сократить время выполнения можно максимум на 50%. При объеме выхода в 15-30 тыс записей можно сохранить 30 сек на запрос и добавить несколько жалких секунд на генерацию отдельных таблиц с отфильтрованными рекордсетами: Алгоритм 1) получаете общий рекордсет за свои 30 сек 2) копируете его на лист Excel Код: plaintext 4) из исходной таблицы запускаете цикл с "Расширенным фильтром" с критерием подразделение и с копированием данных на лист новой книги 5) в новой книге кодом строите Сводную таблицу с источником данных на соседнем листе. 6) при желании скрываете лист с данными Sheet1.Visible=xlVeryHidden 7) сохраняете и закрываете файл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 17:04 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
При желании можно заменить Расширенный фильтр ADO-запросами к листу со скопированным рекордсетом. Время, думаю, будет то же - считанные секунды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 17:13 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
Итого получается 1. Один запрос в БД на все подразделения с сохранением результата в Recordset. 2. Фильтрация на клиенте и CopyFromRecordset на отдельный лист для каждого подразделения 3. Генерация сводной таблицы для каждого подразделения. 4. Разбить файл на пары листов : исходные данные + сводная таблица для каждого подразделения. 4.1 Каждую пару в отдельный файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 17:28 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 17:46 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
Пардон, запрос для всех сразу - 60 сек, а не 30, т.е.: авторИ того, если предположить, что подразделений штук 30, то: 60+1+1+3+30+3+30=128 что совсем не 50% в сравнении с 30*30=900 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 17:50 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
Кстати, весьма вероятно, что процесс еще больше ускорится при таком варианте: 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 но думаю, будет еще быстрее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 18:01 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
KL (XL), п.3 строится по рекордсету ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 18:02 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
big-dukeKL (XL), п.3 строится по рекордсету ? По его копии на листе, что, думаю, несколько быстрее в считывании в переменную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 18:09 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 18:32 |
|
||
|
Удаление данных из экземпляра сводной таблицы
|
|||
|---|---|---|---|
|
#18+
В итоге реализовала следующий алгоритм: 1. На отдельном листе создаётся копия сводной таблицы, у которой поле Подразделение перемещено в область страниц. 2. По этому полю выполняется команда Отобразить страницы, после чего копия таблицы удаляется. 3. Рекордсет сводной таблицы копируется на лист в отдельный файл, файл закрывается (если рекордсет считывать с листа открытого файла, появляется сообщение о совместном доступе к файлу при работе через COM). 4. Каждую сводную таблицу копирую в отдельный файл. 5. По полю Подразделение файла текущей сводной таблицы делаю выборку с листа рекордсета, результат записываю в рекордсет сводной по подразделению. 6. Листы со сводными таблицами из основного файла удаляются. 7. Файл с рекордсетом удаляется. KL (XL), отдельное спасибо за идею построения рекордсета по набору данных на листе. Ранее приходилось строить сводные таблицы не по рекордсету, а указывая в источнике данных лист рабочей книги. При этом объём обрабатываемых сводной таблицей данных (и строк, и столбцов) меньше по сравнению с источником данных-рекордсетом, что в моём случае критично. Однако построение рекордсета по данным с листа и указание полученного рекордсета в качестве источника данных решает проблему. Кстати, т.к. работаю через COM, построение и форматирование сводной таблицы при количестве записей более 2-3 тысяч сильно замедляктся, поэтому вместо построения сводных таблиц по каждому подразделению и был применён способ с отображением страниц и подменой рекордсета. В целом процедура формирования исходной сводной таблицы занимает 30-50 сек и примерно столько же - весь процесс формирования экземпляров по подразделениям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2011, 09:14 |
|
||
|
|

start [/forum/topic.php?fid=61&fpage=131&tid=2176912]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 201ms |
| total: | 335ms |

| 0 / 0 |
