Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1 / 1 / 2
Регистрация: 18.12.2013
Сообщений: 239
1

Оптимизация кода

19.03.2014, 07:58. Показов 1794. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые специалисты, ниже я привел код, который работает, но отрабатывает очень длительное время.
Возможно ли как то его оптимизировать, что бы код отрабатывался быстрее.
Пояснения к коду:
- Обработка ошибки в коде необходима, если один или несколько файлов "Фирма.." открыт в данный момент в монопольном режиме другим сотрудником.
- Приведение к правильному ЦФО необходимо, так как в каждом файле наименование магазина указывается по разному, а мне необходимо в сводной таблице единые наименования (Повлиять на правила заполнения исходных файлов нет возможности)

Скрин справочника для примера во вложении

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

Есть желание рассмотреть предложения и развиваться в правильную сторону, заранее спасибо.

Visual Basic
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
Private Sub ДалееПриказы_Click()
Dim sql As DAO.Recordset
Dim n As Integer
Dim pat(1 To 15) As String
Dim tbl(1 To 15) As String
Dim a, cfo, patch, tblFirma, sqp, sqldell, sqlins, depust1, depust2 As String
' Путь к файлам данных
pat(1) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд\" _
    & "Регистрация приказов- КАДРЫ\Регистрация приказов Фирма1.xls"
pat(2) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\Регистрация приказов Фирма2.xls"
pat(3) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\ Регистрация приказов Фирма3.xls"
pat(4) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\Регистрация приказов Фирма4.xls"
pat(5) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\Регистрация приказов Фирма5.xls"
pat(6) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\Регистрация приказов Фирма6.xls"
pat(7) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\Регистрация приказов Фирма7.xls"
pat(8) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\Регистрация приказов Фирма8.xls"
pat(9) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\Регистрация приказов Фирма9.xls"
pat(10) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\Регистрация приказов Фирма10.xls"
pat(11) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\Регистрация приказов Фирма11.xls"
pat(12) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\Регистрация приказов Фирма12.xls"
pat(13) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\ Регистрация приказов Фирма13.xls"
pat(14) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\Регистрация приказов Фирма14.xls"
pat(15) = "\\a\administration$\Административная дирекция\Отдел персонала\Приказы Бренд \" _
    & "Регистрация приказов- КАДРЫ\Регистрация приказов Фирма15.xls"
'Юридические лица
tbl(1) = "tblFirma1"
tbl(2) = "tblFirma2"
tbl(3) = "tblFirma3"
tbl(4) = "tblFirma4"
tbl(5) = "tblFirma5"
tbl(6) = "tblFirma6"
tbl(7) = "tblFirma7"
tbl(8) = "tblFirma8"
tbl(9) = "tblFirma9"
tbl(10) = "tblFirma10"
tbl(11) = "tblFirma11"
tbl(12) = "tblFirma12"
tbl(13) = "tblFirma13"
tbl(14) = "tblFirma14"
tbl(15) = "tblFirma15"
'Очищаем сводную таблицу
sqldell = "delete * from tblAllFirma"
CurrentDb.Execute sqldell
'Метка цикла добавления данных
Perebor:
n = n + 1
If n = 16 Then
'Удаляем сообщения связанные с некорректным заполнением файлов сотрудниками отдела кадров
DoCmd.DeleteObject acTable, "увольнение$D:G_ОшибкиИмпорта"
DoCmd.DeleteObject acTable, "увольнение$D:G_ОшибкиИмпорта1"
DoCmd.DeleteObject acTable, "увольнение$D:G_ОшибкиИмпорта2"
'depust1 = "DELETE FROM tblAllFirma WHERE [Дата увольнения]Is Null"
depust2 = "DELETE FROM tblAllFirma WHERE [Дата увольнения]< #01/01/13# "
'CurrentDb.Execute depust1
CurrentDb.Execute depust2
'Приводим разрозненные наименования подразделений к правильному ЦФО
Set sql = CurrentDb.OpenRecordset("SELECT tblCfoSpravka.Подразделение, tblCfoSpravka.ЦФО FROM tblCfoSpravka")
Do Until sql.EOF
a = "Неизвестно"
cfo = "UPDATE tblAllFirma SET tblAllFirma.[ЦФО] = '" & sql!ЦФО & "' WHERE '" & sql!Подразделение & "' = tblAllFirma.[Подразделение]"
pusto = "UPDATE tblAllFirma SET tblAllFirma.[ЦФО] = '" & a & "' WHERE tblAllFirma.[ЦФО]Is Null"
CurrentDb.Execute cfo
CurrentDb.Execute pusto
sql.MoveNext
Loop
sql.Close
   Set sql = Nothing
DoCmd.Close acForm, "фрмЗаставка"
DoCmd.OpenForm "фрмКадрыПриказы", acNormal
Exit Sub
Else
patch = pat(n)
tblFirma = tbl(n)
'Запрос на очистку всех рабочих таблиц с приказами по фирмам
sqp = "delete * from " & tbl(n) & ""
CurrentDb.Execute sqp
'запрос на добавление данных в сводную таблицу с приказами всех фирм
sqlins = "INSERT INTO tblAllFirma ( ФИО, Должность, Подразделение, [Дата увольнения] )" _
    & " SELECT ФИО, Должность, Подразделение, [Дата увольнения]FROM " & tbl(n) & "" _
    & " WHERE (ФИО) Is Not Null AND [Дата увольнения] Is Not Null"
    On Error GoTo errend 'При возникновении ошибки преход на метку errEnd
'Импортируем новые данные
DoCmd.TransferSpreadsheet acImport, , tblFirma, patch, True, "увольнение!D:G"
'добавляем в общую таблицу данные всех файлов
CurrentDb.Execute sqlins
NoErr:
GoTo Perebor
errend:
Select Case Err.Number
     Case 3078 'Нет такой таблицы
        Resume Next
     Case 3044
        Resume Next
     Case 3051
        Dim XL As Object
        Set XL = CreateObject("Excel.Application")
        XL.Visible = False
        XL.Workbooks.Open FileName:=patch, UpdateLinks:=0, ReadOnly:=True
        DoCmd.TransferSpreadsheet acImport, , tblFirma, patch, True, "увольнение!D:G"
        'добавляем в общую таблицу данные всех файлов
CurrentDb.Execute sqlins
        XL.Quit
        GoTo Perebor
     Case Else
        MsgBox "Ошибка " & Err.Number & " " & "Нет источника данных обратитесь к администратору"
        Exit Sub
  End Select
  End If
End Sub
Миниатюры
Оптимизация кода  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.03.2014, 07:58
Ответы с готовыми решениями:

Оптимизация кода
Доброго времени суток. Необходима небольшая консультация с подсказкой. У меня есть код:...

Оптимизация громоздкого кода
Уважаемые проффесионалы, нужна ваша помощь по оптимизации большого кода. Писал я его сам, пользуясь...

Упрощение и оптимизация кода
Добрый день. Вопрос такой нужно ли и стоит ли как то упрощать или усложнять ниже написанный код. И...

Оптимизация кода запроса в Access 2010
Есть база данных с таблицей и запросом, запрос вычисляет столбец Difference, но работает очень...

24
4064 / 1445 / 399
Регистрация: 07.08.2013
Сообщений: 3,617
20.03.2014, 05:24 21
Лучший ответ Сообщение было отмечено mserg1972 как решение

Решение

Author24 — интернет-сервис помощи студентам
зачем вам 2 переменных цикла i и n - достаточно одной

Добавлено через 9 минут
Ubound () удобно применять когда неизвестна размерность массива
У вас в данном случае массив имеет конкретную размерность
теперь смотрите что вы делаете
вы 15 раз удаляете информацию из таблиц
вы 15 раз тащите инфу из сети и загружаете в таблицы
вы 15 раз подгружате инфу в общую таблицу

мне как-то такой подход не нравится
я бы сделал так
у себя на компе выделил папку куда бы сложил копии файлов xls (15 шт)
в базе данных создал бы 15 связанных таблиц с этими копиями файлов
далее 1 командой скопировал с заменой файлов - файлы из рабочей папки в свою папку
одним запросом загрузил инфу из 15 связанных таблиц в таблу базы данных
и по логике это должно отработать быстрее
1
163 / 27 / 1
Регистрация: 09.06.2008
Сообщений: 50
20.03.2014, 08:30 22
Цитата Сообщение от snipe Посмотреть сообщение
далее 1 командой скопировал с заменой файлов - файлы из рабочей папки в свою папку
одним запросом загрузил инфу из 15 связанных таблиц в таблу базы данных
и по логике это должно отработать быстрее
Однозначно!
Именно такой подход и предлагался.
А еще, нужно менять логику работы кадровиков через эксель. И переводить их на аксесс хотя бы.
Не представляю себе ничего такого в экселе, чего нельзя было бы в 10 раз удобнее реализовать на аксессе. К тому же, Вы всё равно не получаете информацию от кадровиков:
а) если они не сохранили свой файл
б) если они не закрыли свой файл
Если нужна какая-то аналитика в экселе, так и выгрузить отчет в него особых проблем не представляет.
1
1 / 1 / 2
Регистрация: 18.12.2013
Сообщений: 239
20.03.2014, 09:43  [ТС] 23
Все отлично, решение через копирование и дальнейшее удаление файлов.
У каждого пользователя есть стандартная папка в которую копируем и потом удаляем файл.
Я привел немного другой пример в котором использовал тот же прием.
Всем спасибо.
Visual Basic
1
2
3
4
5
6
7
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile patinvserv, patchinvme
DoCmd.TransferSpreadsheet acImport, , "Инвентаризации", patchinvme, True, "Таблица учета ревизий!A:S"
DoCmd.DeleteObject acTable, "Таблица учета ревизий$A:S_ОшибкиИмпорта"
'Удаляем таблицу
fso.DeleteFile patchinvme
Set fso = Nothing
0
4064 / 1445 / 399
Регистрация: 07.08.2013
Сообщений: 3,617
20.03.2014, 10:18 24
зачем удалять-то
связать надо
блин ща сделаю
1
4064 / 1445 / 399
Регистрация: 07.08.2013
Сообщений: 3,617
20.03.2014, 12:58 25
держи
Вложения
Тип файла: rar Новая папка (13).rar (124.3 Кб, 5 просмотров)
1
20.03.2014, 12:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2014, 12:58
Помогаю со студенческими работами здесь

Оптимизация SQL кода
Необходимо улучшить SQL код, если это возможно. Нет необходимости разбирать саму базу данных с...

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода
MATLAB только начал осваивать. Попытался реализовать нахождение точки минимума методом Ньютона...

Оптимизация кода. Замер времени выполнения части кода.
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение какого-то блока...

Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация
Много много лет назад, на заре становления профессии &quot;оптимизатора&quot; в какой то умной книжке был...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru