|
|
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
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. можно конечно сделать процедуру собирающую данные из других процедур, но часть логики пока на клиенте (не всегда нужен отчет по всем сотрудникам и иногда вообще ой алгоритм ...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2004, 09:57:03 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
А вот это Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2004, 11:26:48 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
если динамически и зациклить - код красивее если статически - работает быстрее мне нужна в данном случае скорость ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2004, 12:29:41 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
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. Извинения за некоторое количество (закладочной) грязи Все сильно наспех. Класс требует объявления структуры Код: plaintext 1. 2. 3. 4. 5. 6. 7. (на всякий случай – в 97 «это» работать не будет) Текст класса прикладывается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2004, 13:34:46 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
пока не пробовал пара вопосов : нужно чтоб класс запоминал различные типы форматов цвет, значение, примечание то есть добавить ячейку с цветом зеленый или значением 8 или с комментарием "qwer" чтоб класс группировал эти диапазоны по видам формата может я просто не могу усмотреть где это делается? а проблему с длинной в 255 можно наверное решить автовыводом результата когда накапливается скажем больше 200 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2004, 13:54:44 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
АлексейКпока не пробовал пара вопосов : нужно чтоб класс запоминал различные типы форматов цвет, значение, примечание то есть добавить ячейку с цветом зеленый или значением 8 или с комментарием "qwer" чтоб класс группировал эти диапазоны по видам формата может я просто не могу усмотреть где это делается? а проблему с длинной в 255 можно наверное решить автовыводом результата когда накапливается скажем больше 200 класс предназначен ТОЛЬКО для того, чтобы сформировать набор (строго юнион) адресных диапазанов В ВИДЕ СТРОК из тех номеров клеток, которые были отданы ему в виде номера строки и номера столбца. Он может отдать адресную строку или сформировать диапазон на отданной ему как параметр странице. Все остальное - значение (или массив значений) для этого диапазона - внешнее по отношению к классу знание. Ты можешь накапливать по каким-то критериям набор диапазонов (или коллекцию таких классов, или пользоваться одним экземпляром последовательно) , которому соответствуют те или иные значения и цвета. Ты можешь при помощи этого класса сформировать объект диапазона. НО ПРИСВОИТЬ ЗНАЧЕНИЯ И ОТФОРМАТИРОВАТЬ должен сам/ :) НО ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2004, 14:07:32 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
без НО ;)) (с выражением лица) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2004, 14:08:47 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
авторнужно чтоб класс запоминал различные типы форматов цвет, значение, примечание я так понимяу, надо открывать по экземпляру класса на каждый тип обработки диапазона. А с возвращаемыми диапазонами делать, что хотелось. 2виктоша что именно не влезет в 97? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2004, 16:43:28 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
буду посмотреть <...> 2виктоша что именно не влезет в 97? млжет и будет - плохо помню уже как он там обходился с приемом/возвратом пользовательских типов. остальное влезет. если с типами проблема, то поменять на вариант и влезет. ....эх, вот только медленный он получился. за ускорением в апи лезть придется, или ваять библиотеку типов. Второе лучше первого но тоже не без проблем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2004, 16:52:22 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
А диапазон возвращается в виде строки? Т.е. потом нужно что-то вроде Range(RetAddress).Font.Bold=true? Просто дело в том что у Ёкселя есть ограничение на количество Area в диапазоне. Поэтому даже выделить(просто тыкая мышкой и держа ctrl, без vba) некое количество несвязанных ячеек не выйдет. А выдать строку с неким набором ячеек можно в принципе проще, самим Ёкселём. Только если она достигнет некоего предела, обработать ее будет нельзя. Единственный выход - разбивать лист на поддиапазоны и их обрабатывать отдельно, но мне кажется это уже криво как-то. Правда если предположить, что количество несвязанных областей невелико (а судя по примеру так и есть), то может и прокатит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2004, 18:18:41 |
|
||
|
Ускорение формирования экселовского отчета
|
|||
|---|---|---|---|
|
#18+
Много написали, возможно я повторюсь (побежал по диагонали). Позвольте мои 2 копейки. Я в своих программах делаю следующее: в Excel-шаблоне - набор стандартных функций (их 3: для регистрации, для заполнения, для закачки в БД из книги). В приложении соответственные вызовы. Вызываем регистрацию - Excel возвращает массив заначений, повествующий о том что этому шаблону нужно для настройки. Сохраняем в базе и даем юзеру возможность настроить (минус - юзер настраивает, плюс - однотипные решения накрываются одним шаблоном). Заполнение - вызываем Excel, создаем документ на основании шаблона, вызываем функцию заполнения - туда в качестве входных параметров, где зарегистрирован (соответственно как настроен), с какой базой работаем, ну и что вам там нужно. Весь код сидит в самом Excele - соответственно количество межпроцессовых взаимодействий минимально (в пределе только вызов функции заполнения). С базами связываться - баз проблем через ADO. Да, если тормозит сильно, еще дополнительно отключаем обновление экрана. Закачка в БД из отработанного документа (к сожалению бывает и такое) - опасно делать сразу, поэтому делаю в 2 прохода - при первом вызове - есть ли лист ПРОВЕРКИ, если нет - создаем и пишем в него все несуразности, которые обнаружили в процессе эмуляции закачки. Что-то увидели, кроме технологических сообщений - в проверку отдельную книгу, лист удаляем и шлем пользователю - будте добры разбираться, почему такое наваяли. Все нормально - повторный проход с реальной закачкой. На мой взгляд такой подход позволяет максимально отвязать отчеты от базы и приложения, не загромождая ни то ни другое. Если немного не в тему, прошу извинить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2004, 18:56:30 |
|
||
|
|

start [/forum/topic.php?fid=45&startmsg=32737579&tid=1671055]: |
0ms |
get settings: |
6ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
52ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
26ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 323ms |

| 0 / 0 |
