powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Скорость загрузки данных из другой базы
25 сообщений из 25, страница 1 из 1
Скорость загрузки данных из другой базы
    #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
Скорость загрузки данных из другой базы
    #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
Скорость загрузки данных из другой базы
    #39299850
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может убрать цикл по таблицам?
...
Рейтинг: 0 / 0
Скорость загрузки данных из другой базы
    #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
Скорость загрузки данных из другой базы
    #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
Скорость загрузки данных из другой базы
    #39299854
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Michelle,
не даёт вставлять уникальность ключа.
То есть второй раз одна и таже запись не влезет.
===============
Вот я болван....
точно.....
...
Рейтинг: 0 / 0
Скорость загрузки данных из другой базы
    #39299855
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверка на наличие таблицы нужна.
Но после ее нахождения и переноса записей в TRANZAKTION_VSE_V_OFISE_TBL
необходим выход из цикла.
Ведь дальнейший анализ DB_OTCHETOV.TableDefs смысла не имеет -
таблица уже найдена и обработана, зачем ее дальше искать?
...
Рейтинг: 0 / 0
Скорость загрузки данных из другой базы
    #39299856
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Michelle,
да.
но в следующем файле - опять нужно проверить наличие таблицы....
...
Рейтинг: 0 / 0
Скорость загрузки данных из другой базы
    #39299857
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
час58__Michelle,
да.
но в следующем файле - опять нужно проверить наличие таблицы....Ну да.
Но это произойдет в рамках следующего прохода For Each f1 In fc
при новом For Each TDF_OTCHETOV In DB_OTCHETOV.TableDefs.
...
Рейтинг: 0 / 0
Скорость загрузки данных из другой базы
    #39299860
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
час58,

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

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

Нужен выход из For Each TDF_OTCHETOV In DB_OTCHETOV.TableDefs после
обнаружения искомой таблицы и переноса записей.
Иначе идет ненужный поиск среди оставшихся таблиц данной (очередной) базы.
Нужен выход.
Зря думаете, что "и так все оптимально".
...
Рейтинг: 0 / 0
Скорость загрузки данных из другой базы
    #39299867
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Michelle,
аааа.....
точно.
после переброса данных нужен выход из цикла поиска таблиц.
Спасибо, верно.
...
Рейтинг: 0 / 0
Скорость загрузки данных из другой базы
    #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
Скорость загрузки данных из другой базы
    #39299870
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, конечно.
Код: vbnet
1.
Exit For

И никаких меток.
...
Рейтинг: 0 / 0
Скорость загрузки данных из другой базы
    #39299871
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Michelle,
Верно!
----------------
Отдыхать бывает полезно.
(это я себе.)
=======================
спасибо.
...
Рейтинг: 0 / 0
Скорость загрузки данных из другой базы
    #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
Скорость загрузки данных из другой базы
    #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
Скорость загрузки данных из другой базы
    #39300406
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
час58Dir - много раз подводил и от него пришлось отказаться в работе
А можно поподробнее, в чем подводил? Постоянно использую, пока не подводил.
...
Рейтинг: 0 / 0
Скорость загрузки данных из другой базы
    #39300418
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin,
Поподробнее нельзя.
Это было в прошлом веке и я уже не помню.
С тех пор не использую.
...
Рейтинг: 0 / 0
Скорость загрузки данных из другой базы
    #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
Скорость загрузки данных из другой базы
    #39300478
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ( Киев ),
Можно с перехватчиком ошибки.
Но тогда как понять какая именно ошибка произошла :-(
Может случиться всякое...
...
Рейтинг: 0 / 0
Скорость загрузки данных из другой базы
    #39300763
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
час58Но тогда как понять какая именно ошибка произошла
По номеру ошибки.
Можно перед выполнением запроса направить ошибки на отдельный обработчик ошибок, чтобы точно знать, что ошибка была в конкретном запросе, но и там номер ошибки понадобится для точной идентификации проблемы.
...
Рейтинг: 0 / 0
Скорость загрузки данных из другой базы
    #39300857
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin,
можно, конечно...
но,
Код: vbnet
1.
процедурка того не стоит.


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


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