Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Скорость загрузки данных из другой базы / 25 сообщений из 25, страница 1 из 1
29.08.2016, 20:44
    #39299848
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
Вот кусочек кода, где в определённой папке просматриваются файлы, находится mdb файл,
и из него перебрасываются данные в нашу базу.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  For Each f1 In fc
        If InStr(1, f1.Name, "OTCHET_OT", vbTextCompare) <> 0 And InStr(1, Nz(f1.Name), "mdb", vbTextCompare) <> 0 Then  ' имя файла "OTCHET_OT"

            Set DB_OTCHETOV = OpenDatabase(FOLDER_OTCHETOV & "\" & f1.Name)
            FILE_OTCHETOV = f1.Name
            ' Цикл по всем таблицам в базе данных
            For Each TDF_OTCHETOV In DB_OTCHETOV.TableDefs
                If TDF_OTCHETOV.Name = "TRANZAKTION_V_OFIS_TBL" Then  ' таблица имеется
                    'перебросим данные
                    DoCmd.SetWarnings False
                    DoCmd.RunSQL "INSERT INTO TRANZAKTION_VSE_V_OFISE_TBL " _
                                 & " SELECT TRANZAKTION_V_OFIS_TBL.* " _
                                 & " FROM TRANZAKTION_V_OFIS_TBL IN '" & FOLDER_OTCHETOV & "\" & FILE_OTCHETOV & "' " _
                                 & " WHERE (((Year([PAY_DATA]))>=FUN_GOD_MINIMUM()));"
                    DoCmd.SetWarnings True
                End If                                               ' таблица имеется
            Next TDF_OTCHETOV
        End If
    Next



Код работает оч быстро, всё нормально.
Вопрос в другом...
--------------------------------------------------------------------------
СПС
...
Рейтинг: 0 / 0
29.08.2016, 20:48
    #39299849
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
Я решил оптимизировать процедуру и убрал, на мой взгляд лишний цикл - проверки наличия таблицы.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    For Each f1 In fc
        If InStr(1, f1.Name, "OTCHET_OT", vbTextCompare) <> 0 And InStr(1, Nz(f1.Name), "mdb", vbTextCompare) <> 0 Then  ' имя файла "OTCHET_OT"

            Set DB_OTCHETOV = OpenDatabase(FOLDER_OTCHETOV & "\" & f1.Name)
            FILE_OTCHETOV = f1.Name
            ' Цикл по всем таблицам в базе данных
            For Each TDF_OTCHETOV In DB_OTCHETOV.TableDefs
           '      If TDF_OTCHETOV.Name = "TRANZAKTION_V_OFIS_TBL" Then  ' таблица имеется
                    'перебросим данные
                    DoCmd.SetWarnings False
                    DoCmd.RunSQL "INSERT INTO TRANZAKTION_VSE_V_OFISE_TBL " _
                                 & " SELECT TRANZAKTION_V_OFIS_TBL.* " _
                                 & " FROM TRANZAKTION_V_OFIS_TBL IN '" & FOLDER_OTCHETOV & "\" & FILE_OTCHETOV & "' " _
                                 & " WHERE (((Year([PAY_DATA]))>=FUN_GOD_MINIMUM()));"
                    DoCmd.SetWarnings True
          '      End If                                               ' таблица имеется
            Next TDF_OTCHETOV
        End If
    Next



И процедура стала очень долго работать буквально в десятки раз(на глаз).
В чём подвох?
Зачем этот цикл? И разве без него не должно работать быстрее?
...
Рейтинг: 0 / 0
29.08.2016, 20:50
    #39299850
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
Может убрать цикл по таблицам?
...
Рейтинг: 0 / 0
29.08.2016, 20:59
    #39299851
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
час58Может убрать цикл по таблицам?Разумеется.
Ведь очевидно, что во втором случае вот эта чсть
Код: vbnet
1.
2.
3.
4.
5.
6.
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO TRANZAKTION_VSE_V_OFISE_TBL " & _
             " SELECT TRANZAKTION_V_OFIS_TBL.* " & _
             " FROM TRANZAKTION_V_OFIS_TBL IN '" & FOLDER_OTCHETOV & "\" & FILE_OTCHETOV & "' " & _
             " WHERE (((Year([PAY_DATA]))>=FUN_GOD_MINIMUM()));"
DoCmd.SetWarnings True

выполняется столько раз, сколько всего таблиц в DB_OTCHETOV.

Может, условие WHERE (((Year([PAY_DATA]))>=FUN_GOD_MINIMUM())) не дает
вставлять записи многократно, иначе бы увидели, что стало бы с TRANZAKTION_VSE_V_OFISE_TBL.
...
Рейтинг: 0 / 0
29.08.2016, 20:59
    #39299853
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    For Each f1 In fc
        If InStr(1, f1.Name, "OTCHET_OT", vbTextCompare) <> 0 And InStr(1, Nz(f1.Name), "mdb", vbTextCompare) <> 0 Then  ' имя файла "OTCHET_OT"

            Set DB_OTCHETOV = OpenDatabase(FOLDER_OTCHETOV & "\" & f1.Name)
            FILE_OTCHETOV = f1.Name

                    'перебросим данные
                    DoCmd.SetWarnings False
                    DoCmd.RunSQL "INSERT INTO TRANZAKTION_VSE_V_OFISE_TBL " _
                                 & " SELECT TRANZAKTION_V_OFIS_TBL.* " _
                                 & " FROM TRANZAKTION_V_OFIS_TBL IN '" & FOLDER_OTCHETOV & "\" & FILE_OTCHETOV & "' " _
                                 & " WHERE (((Year([PAY_DATA]))>=FUN_GOD_MINIMUM()));"
                    DoCmd.SetWarnings True

        End If
    Next




Вот так оптимальнее будет?
=====================
Но что произойдет при отсутствии нужной таблицы в принимаемом файле?
...
Рейтинг: 0 / 0
29.08.2016, 21:02
    #39299854
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
__Michelle,
не даёт вставлять уникальность ключа.
То есть второй раз одна и таже запись не влезет.
===============
Вот я болван....
точно.....
...
Рейтинг: 0 / 0
29.08.2016, 21:04
    #39299855
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
Проверка на наличие таблицы нужна.
Но после ее нахождения и переноса записей в TRANZAKTION_VSE_V_OFISE_TBL
необходим выход из цикла.
Ведь дальнейший анализ DB_OTCHETOV.TableDefs смысла не имеет -
таблица уже найдена и обработана, зачем ее дальше искать?
...
Рейтинг: 0 / 0
29.08.2016, 21:05
    #39299856
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
__Michelle,
да.
но в следующем файле - опять нужно проверить наличие таблицы....
...
Рейтинг: 0 / 0
29.08.2016, 21:07
    #39299857
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
час58__Michelle,
да.
но в следующем файле - опять нужно проверить наличие таблицы....Ну да.
Но это произойдет в рамках следующего прохода For Each f1 In fc
при новом For Each TDF_OTCHETOV In DB_OTCHETOV.TableDefs.
...
Рейтинг: 0 / 0
29.08.2016, 21:09
    #39299860
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
час58,

Это ведь не Ваш код?
...
Рейтинг: 0 / 0
29.08.2016, 21:12
    #39299862
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
__Michelle,

тада, получается, код сокращать, или что-то менять не имеет смысла...
и так всё оптимально.
спасибо.
понял.
...
Рейтинг: 0 / 0
29.08.2016, 21:14
    #39299863
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
__Michelle,
код мой, но написан более года назад.
а сейчас появилось время для оптимизации длительных процессов и прочего...
я его перетряхиваю, а тут что-то затупил...
...
Рейтинг: 0 / 0
29.08.2016, 21:18
    #39299866
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
час58,

Нужен выход из For Each TDF_OTCHETOV In DB_OTCHETOV.TableDefs после
обнаружения искомой таблицы и переноса записей.
Иначе идет ненужный поиск среди оставшихся таблиц данной (очередной) базы.
Нужен выход.
Зря думаете, что "и так все оптимально".
...
Рейтинг: 0 / 0
29.08.2016, 21:19
    #39299867
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
__Michelle,
аааа.....
точно.
после переброса данных нужен выход из цикла поиска таблиц.
Спасибо, верно.
...
Рейтинг: 0 / 0
29.08.2016, 21:22
    #39299868
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
видимо так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
                    DoCmd.RunSQL "INSERT INTO TRANZAKTION_VSE_V_OFISE_TBL " _
                                 & " SELECT TRANZAKTION_V_OFIS_TBL.* " _
                                 & " FROM TRANZAKTION_V_OFIS_TBL IN '" & FOLDER_OTCHETOV & "\" & FILE_OTCHETOV & "' " _
                                 & " WHERE (((Year([PAY_DATA]))>=FUN_GOD_MINIMUM()));"
                    DoCmd.SetWarnings True
                    GoTo dalee
                End If                                               ' &#242;&#224;&#225;&#235;&#232;&#246;&#224; &#232;&#236;&#229;&#229;&#242;&#241;&#255;
            Next TDF_OTCHETOV
dalee:
        End If
    Next
...
Рейтинг: 0 / 0
29.08.2016, 21:28
    #39299870
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
Нет, конечно.
Код: vbnet
1.
Exit For

И никаких меток.
...
Рейтинг: 0 / 0
29.08.2016, 21:31
    #39299871
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
__Michelle,
Верно!
----------------
Отдыхать бывает полезно.
(это я себе.)
=======================
спасибо.
...
Рейтинг: 0 / 0
30.08.2016, 10:18
    #39300001
Скорость загрузки данных из другой базы
1. Проверить наличие таблицы проще так:
Код: vbnet
1.
2.
3.
4.
sSQL = "SELECT [Type] FROM MSysObjects WHERE ((([Name])='TRANZAKTION_V_OFIS_TBL') AND (([Type])=1));"
If CurrentDB.OpenRecordset(sSQL).BOF Then 
'Таблицы нет
End If

Причем лучше сделать это один раз перед циклом поиска файла.

2. Set DB_OTCHETOV = OpenDatabase(FOLDER_OTCHETOV & "\" & f1.Name)
Зачем вы открываете БД, если DB_OTCHETOV нигде не используете?

3. WHERE (((Year([PAY_DATA]))>=FUN_GOD_MINIMUM()))
Если поле [PAY_DATA] индексировано, то лучше так:
Код: sql
1.
WHERE [PAY_DATA] >= DateSerial(FUN_GOD_MINIMUM(),1,1)

Запрос будет работать быстрее

4. Не лучшее решение:
DoCmd.SetWarnings False
DoCmd.RunSQL "..."
DoCmd.SetWarnings True

Лучше CurrentDB.Execute "..." или CurrentProject.Connection.Execute "..."

5. Ну и напоследок...
Код: vbnet
1.
2.
3.
4.
5.
  For Each f1 In fc
        If InStr(1, f1.Name, "OTCHET_OT", vbTextCompare) <> 0 And InStr(1, Nz(f1.Name), 
...
        End If
   Next

Судя по всему используется объект FSO. Проще и с меньшим кол-вом букв эта задача решается родной функцией Dir.
Код: vbnet
1.
2.
3.
4.
5.
  FILE_OTCHETOV = Dir("*OTCHET_OT*.mdb")
Do While Len(FILE_OTCHETOV) > 0
     ...
  FILE_OTCHETOV = Dir()
Loop
...
Рейтинг: 0 / 0
30.08.2016, 15:54
    #39300393
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
Анатолий ( Киев ),

Не совсем всё так.
DB_OTCHETOV - это внешние базы данных, из которых принимаем данные.
Код: vbnet
1.
Set DB_OTCHETOV = OpenDatabase(FOLDER_OTCHETOV & "\" & f1.Name)


============
Названия отчётов длинные, но во всех названиях имеется кусочек "OTCHET_OT",
поэтому проверка названия файла именно такая:
Код: vbnet
1.
InStr(1, f1.Name, "OTCHET_OT", vbTextCompare) <> 0


===============
Наличие таблицы "TRANZAKTION_V_OFIS_TBL" проверяем в файле, из которого принимаем данные, поэтому в каждом файле проверяем наличие таблицы.
Код: vbnet
1.
2.
            ' Цикл по всем таблицам в базе данных DB_OTCHETOV
            For Each TDF_OTCHETOV In DB_OTCHETOV.TableDefs


============
Dir - много раз подводил и от него пришлось отказаться в работе.
...
Рейтинг: 0 / 0
30.08.2016, 16:13
    #39300406
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
час58Dir - много раз подводил и от него пришлось отказаться в работе
А можно поподробнее, в чем подводил? Постоянно использую, пока не подводил.
...
Рейтинг: 0 / 0
30.08.2016, 16:23
    #39300418
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
MrShin,
Поподробнее нельзя.
Это было в прошлом веке и я уже не помню.
С тех пор не использую.
...
Рейтинг: 0 / 0
30.08.2016, 16:25
    #39300421
Скорость загрузки данных из другой базы
час58Наличие таблицы "TRANZAKTION_V_OFIS_TBL" проверяем в файле, из которого принимаем данные, поэтому в каждом файле проверяем наличие таблицы.
Код: vbnet
1.
2.
            ' Цикл по всем таблицам в базе данных DB_OTCHETOV
            For Each TDF_OTCHETOV In DB_OTCHETOV.TableDefs

Да, не досмотрел.
Но тогда так:
Код: vbnet
1.
2.
3.
4.
sSQL = "SELECT [Type] FROM MSysObjects WHERE ((([Name])='TRANZAKTION_V_OFIS_TBL') AND (([Type])=1));"
If DB_OTCHETOV.OpenRecordset(sSQL).BOF Then 
'Таблицы нет
End If

А можно и вовсе не проверять - просто выполнять запрос с перехватчиком ошибки.
...
Рейтинг: 0 / 0
30.08.2016, 17:29
    #39300478
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
Анатолий ( Киев ),
Можно с перехватчиком ошибки.
Но тогда как понять какая именно ошибка произошла :-(
Может случиться всякое...
...
Рейтинг: 0 / 0
31.08.2016, 07:05
    #39300763
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
час58Но тогда как понять какая именно ошибка произошла
По номеру ошибки.
Можно перед выполнением запроса направить ошибки на отдельный обработчик ошибок, чтобы точно знать, что ошибка была в конкретном запросе, но и там номер ошибки понадобится для точной идентификации проблемы.
...
Рейтинг: 0 / 0
31.08.2016, 10:25
    #39300857
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скорость загрузки данных из другой базы
MrShin,
можно, конечно...
но,
Код: vbnet
1.
процедурка того не стоит.


проверяем файл, проверяем есть ли там интересующая нас табличка, перебрасываем из неё данные.
они или перебросились
или нет.
сообщаем пользователю
всё норм
или не норм.
А всё остальное -- это уже моя забота. И юзеру пофигу номера ошибок и что там где там отвалилось.
Код: vbnet
1.
процедурка того не стоит.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Скорость загрузки данных из другой базы / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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