powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ускорение формирования экселовского отчета
11 сообщений из 36, страница 2 из 2
Ускорение формирования экселовского отчета
    #32737579
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Виктоша
автор
по рекордсету сотрудников
по месяцам полугодия
дням рекодсета месяца текущего сотрудника


все гораздо более сложно чем может показаться на первый взгляд.

1 Учитываются выходные дни и праздники и переносы праздников по компании
2 учитывается прием на работу сотрудника его увольнение и периоды когда он был уволен а потом принят снова
3 учитывается занятость сотрудника в раздичных проектах

вычисление каждого из этих факторов заложено в соответствующую хранимую процедуру - алгоритм расчета может меняться со временем а весь остальной код также базируется на этих процедурах.

дабы дать понятие о составе процедурки
вот пример сбора данных о занятости сотрудника в проекте по конкретному дню :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
ALTER PROCEDURE sotr_project_statusInfo (@Start_date datetime ='20050301'  , @id_p_f_p	int =  11  , 	@id_sotr	int =  551 )
AS

 -- Процедура выдает название проекта в котором занят данный сотрудник в запрашиваем месяце, кроме обозначенного проекта 
 -- Впоследствии возможно будет необходимо выдавать список нескольких проектов на один день 

SET NOCOUNT ON 

declare @SRC table ( info varchar ( 100 ), 	d1 int , d2 int , d3 int , d4 int , d5 int , d6 int , d7 int , d8 int , d9 int , d10 int , 
			d11 int , d12 int , d13 int , d14 int , d15 int , d16 int , d17 int , d18 int , d19 int , d20 int , 
			d21 int , d22 int , d23 int , d24 int , d25 int , d26 int , d27 int , d28 int , d29 int , d30 int , 
			d31 int )

insert into @src 
select  saved_clientname collate SQL_Latin1_General_CP1251_CI_AS + char( 13 ) + char( 10 )  + prj  as info,
			d1  , d2  , d3  , d4  , d5  , d6  , d7  , d8  , d9  , d10  , 
			d11  , d12  , d13  , d14  , d15  , d16  , d17  , d18  , d19  , d20  , 
			d21  , d22  , d23  , d24  , d25  , d26  , d27  , d28  , d29  , d30  , 
			d31
from dbo.pltime pt inner join dbo.partners_fplan_prop fp on id_p_f_p = idpartners_fplan_prop   where  pt.sumh <>  0   AND pt.id_sotr = @id_sotr and pt.start_date = @start_date  and id_p_f_p <> @id_p_f_p





select
(select top  1  info as sd1 from @SRC pt   where D1 <>  0   ) as d1 , 
(select top  1  info as sd1 from @SRC pt   where D2 <>  0   ) as d2 ,  
(select top  1  info as sd1 from @SRC pt   where D3 <>  0   ) as d3 , 
(select top  1  info as sd1 from @SRC pt   where D4 <>  0   ) as d4 , 
(select top  1  info as sd1 from @SRC pt   where D5 <>  0   ) as d5 , 
(select top  1  info as sd1 from @SRC pt   where D6 <>  0   ) as d6 , 
(select top  1  info as sd1 from @SRC pt   where D7 <>  0   ) as d7 , 
(select top  1  info as sd1 from @SRC pt   where D8 <>  0   ) as d8 , 
(select top  1  info as sd1 from @SRC pt   where D9 <>  0   ) as d9 , 
(select top  1  info as sd1 from @SRC pt   where D10 <>  0  ) as d10 , 
(select top  1  info as sd1 from @SRC pt   where D11 <>  0  ) as d11 , 
(select top  1  info as sd1 from @SRC pt   where D12 <>  0  ) as d12 , 
(select top  1  info as sd1 from @SRC pt   where D13 <>  0  ) as d13 , 
(select top  1  info as sd1 from @SRC pt   where D14 <>  0  ) as d14 , 
(select top  1  info as sd1 from @SRC pt   where D15 <>  0  ) as d15 , 
(select top  1  info as sd1 from @SRC pt   where D16 <>  0  ) as d16 , 
(select top  1  info as sd1 from @SRC pt   where D17 <>  0  ) as d17 , 
(select top  1  info as sd1 from @SRC pt   where D18 <>  0  ) as d18 ,  
(select top  1  info as sd1 from @SRC pt   where D19 <>  0  ) as d19 , 
(select top  1  info as sd1 from @SRC pt   where D20 <>  0  ) as d20 ,  
(select top  1  info as sd1 from @SRC pt   where D21 <>  0  ) as d21, 
(select top  1  info as sd1 from @SRC pt   where D22 <>  0  ) as d22 , 
(select top  1  info as sd1 from @SRC pt   where D23 <>  0  ) as d23 ,  
(select top  1  info as sd1 from @SRC pt   where D24 <>  0  ) as d24 , 
(select top  1  info as sd1 from @SRC pt   where D25 <>  0  ) as d25 ,  
(select top  1  info as sd1 from @SRC pt   where D26 <>  0  ) as d26 , 
(select top  1  info as sd1 from @SRC pt   where D27 <>  0  ) as d27 , 
(select top  1  info as sd1 from @SRC pt   where D28 <>  0  ) as d28 ,  
(select top  1  info as sd1 from @SRC pt   where D29 <>  0  ) as d29 , 
(select top  1  info as sd1 from @SRC pt   where D30 <>  0  ) as d30 , 
(select top  1  info as sd1 from @SRC pt   where D31 <>  0  ) as d31




можно конечно сделать процедуру
собирающую данные из других процедур, но часть логики пока на
клиенте (не всегда нужен отчет по всем сотрудникам и иногда вообще ой алгоритм ...)
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32737825
Proga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот это
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
select
(select top  1  info as sd1 from @SRC pt   where D1 <>  0   ) as d1 , 
(select top  1  info as sd1 from @SRC pt   where D2 <>  0   ) as d2 ,  
(select top  1  info as sd1 from @SRC pt   where D3 <>  0   ) as d3 , 
(select top  1  info as sd1 from @SRC pt   where D4 <>  0   ) as d4 , 
(select top  1  info as sd1 from @SRC pt   where D5 <>  0   ) as d5 , 
(select top  1  info as sd1 from @SRC pt   where D6 <>  0   ) as d6 , 
(select top  1  info as sd1 from @SRC pt   where D7 <>  0   ) as d7 , 
(select top  1  info as sd1 from @SRC pt   where D8 <>  0   ) as d8 , 
(select top  1  info as sd1 from @SRC pt   where D9 <>  0   ) as d9 , 
(select top  1  info as sd1 from @SRC pt   where D10 <>  0  ) as d10 , 
(select top  1  info as sd1 from @SRC pt   where D11 <>  0  ) as d11 , 
(select top  1  info as sd1 from @SRC pt   where D12 <>  0  ) as d12 , 
(select top  1  info as sd1 from @SRC pt   where D13 <>  0  ) as d13 , 
(select top  1  info as sd1 from @SRC pt   where D14 <>  0  ) as d14 , 
(select top  1  info as sd1 from @SRC pt   where D15 <>  0  ) as d15 , 
(select top  1  info as sd1 from @SRC pt   where D16 <>  0  ) as d16 , 
(select top  1  info as sd1 from @SRC pt   where D17 <>  0  ) as d17 , 
(select top  1  info as sd1 from @SRC pt   where D18 <>  0  ) as d18 ,  
(select top  1  info as sd1 from @SRC pt   where D19 <>  0  ) as d19 , 
(select top  1  info as sd1 from @SRC pt   where D20 <>  0  ) as d20 ,  
(select top  1  info as sd1 from @SRC pt   where D21 <>  0  ) as d21, 
(select top  1  info as sd1 from @SRC pt   where D22 <>  0  ) as d22 , 
(select top  1  info as sd1 from @SRC pt   where D23 <>  0  ) as d23 ,  
(select top  1  info as sd1 from @SRC pt   where D24 <>  0  ) as d24 , 
(select top  1  info as sd1 from @SRC pt   where D25 <>  0  ) as d25 ,  
(select top  1  info as sd1 from @SRC pt   where D26 <>  0  ) as d26 , 
(select top  1  info as sd1 from @SRC pt   where D27 <>  0  ) as d27 , 
(select top  1  info as sd1 from @SRC pt   where D28 <>  0  ) as d28 ,  
(select top  1  info as sd1 from @SRC pt   where D29 <>  0  ) as d29 , 
(select top  1  info as sd1 from @SRC pt   where D30 <>  0  ) as d30 , 
(select top  1  info as sd1 from @SRC pt   where D31 <>  0  ) as d31
можно и покороче, попробуй динамически+зациклить
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32738053
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если динамически и зациклить - код красивее
если статически - работает быстрее

мне нужна в данном случае скорость
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32740383
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 АлексейК
про перенос массива напрямую - это я просто глупость написал, в
предположении, что дни занятости расположены по строкам.


в целом твой вариант именно заполнения выглядит как оптимальный
в своей идее. Cильно он мине приглянулся…
Вот только с перечислением рядом сидящих диапазонов захотелось всё-таки
разобраться.

Вот сваял набросок класса для формирования адресной строки.
Назвал его clsAddressFormatter
метод Function AddCellToAdrRow(tRow As Long, tCol As Long) As Boolean
'tRow - номер строки
'tCol - номер столбца
Предназначен для добавления клетки с указанным номером строки и столбца к
текущему набору адресов.
возвращает логическое значение. Если ложь, значит, класс не сумел
добавить переданные координаты клетки по причине того, что итоговая длина
строки адреса оказывается больше 255 символов. (Я просто поверил, что 255 – граница)

Метод getWorkSheetRange возвращает диапазон Ексель, применив адресную
строку к полученной в качестве параметра объектную переменную рабочего
листа Ексель.

Метод getAddrString возвращает строку адреса для внешнего пользователя,
чтобы он сам с ней обошелся по своему усмотрению

Метод ClearAddress очищает внутренние структуры, подготавливая объект для
формирования новой адресной строки


У меня просьба большая к тебе, - если не сильно затруднит –
опробовать его на своей задаче. И как-то сообщить – насколько что
ухудшилось по времени, иполучилось ли в обмен хоть какое-нибудь удобство
.

Как мне понялось, клетки ты набираешь поштучно, поэтому вставил только
метод добавления одной клетки по номеру строки и столбца.
Хотя для добавления диапазона все готово.


Чистую работу твоего алгоритма он замедлит, возможно, наполовину, но
позволит не заботиться по крайней мере о сплошном диапазоне в строке или
столбце.

Он может и прямоугольные диапазоны формировать, но делает это весьма
неэффективно (мне любопытно было идею увидеть в действии)


Вот на таком скрипте время работы меньше 3 сек
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
Sub testMyClass()
  Dim tObj As clsAddressFormatter
  Set tObj = New clsAddressFormatter
  Dim tt As Double
  Dim inDex As Long, jIndex As Long
  Dim wR As Worksheet
  Dim tR  As Excel.Range
  Set wR = Application.ActiveSheet
  
  tt = Timer
  
  With tObj
    .AddCellToAdrRow  5 ,  1 
    .AddCellToAdrRow  6 ,  1 
    .AddCellToAdrRow  1 ,  3 
    .AddCellToAdrRow  1 ,  4 
    .AddCellToAdrRow  1 ,  6 
    .AddCellToAdrRow  2 ,  3 
    .AddCellToAdrRow  2 ,  4 
    .AddCellToAdrRow  2 ,  6 
    
  End With
  
  
  Application.ScreenUpdating = False
  For inDex =  10  To  610 
    For jIndex =  5  To  55   '205 
      tObj.AddCellToAdrRow inDex, jIndex
    Next
    Set tR = tObj.getWorkSheetRange(wR)
    tR.Value = inDex
    tObj.ClearAddress
  Next
  For inDex =  10  To  610 
    For jIndex =  65  To  215 
      tObj.AddCellToAdrRow inDex, jIndex
    Next
    Set tR = tObj.getWorkSheetRange(wR)
    tR.Value = inDex
    tObj.ClearAddress
  Next
  Application.ScreenUpdating = True
  MsgBox Timer - tt
  
End Sub

Извинения за некоторое количество (закладочной) грязи
Все сильно наспех.
Класс требует объявления структуры
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Type tSubArea
  aStartRow As Long
  aStartCol As Long
  bLastRow As Long
  bLastCol As Long
  subAdrLen As Long
  strSubAddress As String *  20 
End Type
Это объявление должно быть размещено в отдельном модуле.
(на всякий случай – в 97 «это» работать не будет)
Текст класса прикладывается
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32740439
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пока не пробовал
пара вопосов :

нужно чтоб класс запоминал различные типы форматов цвет, значение, примечание

то есть добавить ячейку с цветом зеленый
или значением 8
или с комментарием "qwer"

чтоб класс группировал эти диапазоны по видам формата
может я просто не могу усмотреть где это делается?

а проблему с длинной в 255 можно наверное
решить автовыводом результата когда накапливается скажем больше 200
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32740470
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейКпока не пробовал
пара вопосов :

нужно чтоб класс запоминал различные типы форматов цвет, значение, примечание

то есть добавить ячейку с цветом зеленый
или значением 8
или с комментарием "qwer"

чтоб класс группировал эти диапазоны по видам формата
может я просто не могу усмотреть где это делается?

а проблему с длинной в 255 можно наверное
решить автовыводом результата когда накапливается скажем больше 200
класс предназначен ТОЛЬКО для того, чтобы сформировать набор (строго юнион) адресных диапазанов В ВИДЕ СТРОК из тех номеров клеток, которые были отданы ему в виде номера строки и номера столбца.
Он может отдать адресную строку или сформировать диапазон на отданной ему как параметр странице.
Все остальное - значение (или массив значений) для этого диапазона - внешнее по отношению к классу знание.
Ты можешь накапливать по каким-то критериям набор диапазонов
(или коллекцию таких классов, или пользоваться одним экземпляром последовательно) , которому соответствуют те или иные значения и цвета.
Ты можешь при помощи этого класса сформировать объект диапазона.
НО ПРИСВОИТЬ ЗНАЧЕНИЯ И ОТФОРМАТИРОВАТЬ должен сам/
:)


НО
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32740474
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
без НО
;))

(с выражением лица)
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32740914
авторнужно чтоб класс запоминал различные типы форматов цвет, значение, примечание

я так понимяу, надо открывать по экземпляру класса на каждый тип обработки диапазона. А с возвращаемыми диапазонами делать, что хотелось.


2виктоша
что именно не влезет в 97?
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32740933
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
буду посмотреть
<...>
2виктоша
что именно не влезет в 97?

млжет и будет - плохо помню уже как он там обходился с приемом/возвратом пользовательских типов.
остальное влезет.
если с типами проблема, то поменять на вариант и влезет.
....эх, вот только медленный он получился. за ускорением в апи лезть придется, или ваять библиотеку типов. Второе лучше первого но тоже не без проблем...
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32741120
CtrlAlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А диапазон возвращается в виде строки?
Т.е. потом нужно что-то вроде Range(RetAddress).Font.Bold=true?

Просто дело в том что у Ёкселя есть ограничение на количество Area в диапазоне. Поэтому даже выделить(просто тыкая мышкой и держа ctrl, без vba) некое количество несвязанных ячеек не выйдет. А выдать строку с неким набором ячеек можно в принципе проще, самим Ёкселём. Только если она достигнет некоего предела, обработать ее будет нельзя. Единственный выход - разбивать лист на поддиапазоны и их обрабатывать отдельно, но мне кажется это уже криво как-то.

Правда если предположить, что количество несвязанных областей невелико (а судя по примеру так и есть), то может и прокатит.
...
Рейтинг: 0 / 0
Ускорение формирования экселовского отчета
    #32741180
Dim P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Много написали, возможно я повторюсь (побежал по диагонали). Позвольте мои 2 копейки. Я в своих программах делаю следующее: в Excel-шаблоне - набор стандартных функций (их 3: для регистрации, для заполнения, для закачки в БД из книги). В приложении соответственные вызовы.
Вызываем регистрацию - Excel возвращает массив заначений, повествующий о том что этому шаблону нужно для настройки. Сохраняем в базе и даем юзеру возможность настроить (минус - юзер настраивает, плюс - однотипные решения накрываются одним шаблоном).
Заполнение - вызываем Excel, создаем документ на основании шаблона, вызываем функцию заполнения - туда в качестве входных параметров, где зарегистрирован (соответственно как настроен), с какой базой работаем, ну и что вам там нужно. Весь код сидит в самом Excele - соответственно количество межпроцессовых взаимодействий минимально (в пределе только вызов функции заполнения). С базами связываться - баз проблем через ADO. Да, если тормозит сильно, еще дополнительно отключаем обновление экрана.
Закачка в БД из отработанного документа (к сожалению бывает и такое) - опасно делать сразу, поэтому делаю в 2 прохода - при первом вызове - есть ли лист ПРОВЕРКИ, если нет - создаем и пишем в него все несуразности, которые обнаружили в процессе эмуляции закачки. Что-то увидели, кроме технологических сообщений - в проверку отдельную книгу, лист удаляем и шлем пользователю - будте добры разбираться, почему такое наваяли. Все нормально - повторный проход с реальной закачкой.
На мой взгляд такой подход позволяет максимально отвязать отчеты от базы и приложения, не загромождая ни то ни другое.
Если немного не в тему, прошу извинить
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Ускорение формирования экселовского отчета
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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