powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Переброс данных из другой базы
25 сообщений из 28, страница 1 из 2
Переброс данных из другой базы
    #39315478
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется две базы
условно старая и новая
в новой базе в таблицы добавились некоторые поля.
Нужно из старой базы перенести все данные в новую в поля, которые есть в обоих базах.
Делаю так:
но не получается присвоить значение поля.
Код: vbnet
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.
Private Sub ZAGRUZKA_SPRAVOCHNIKOV_BTN_Click()
' из другой азы зарузка данных CLN_TBL.mdb
 Dim tdf As DAO.TableDef
 Dim BD_1 As DAO.Database ' текущая база
 Dim BD_2 As DAO.Database ' другая база
 Dim Table_Name '
 Dim Pole_Name  '
 
 
If VOPROS("Удалить все имеющиеся данные?") = False Then Exit Sub
If VOPROS("Заменить все данные справочников?") = False Then Exit Sub
MESS "Укажите путь к файлу таблиц для загрузки данных"
    STR_FILTER = "Выберите файл" & Chr$(0) & "*.mdb" & Chr$(0)
    TEMP_PATCH_TO_BASE = FileOpenSave(OFN_OVERWRITEPROMPT, CurrentProject.Path, STR_FILTER, , ".mdb", , "Выбор CLN_TBL.mdb", -1, True)

    If Nz(TEMP_PATCH_TO_BASE) <> "" Then
        If InStr(1, TEMP_PATCH_TO_BASE, "CLN_TBL", vbTextCompare) <> 0 Then
            Set BD_1 = CurrentDb   '
            Set BD_2 = OpenDatabase(TEMP_PATCH_TO_BASE)    ' путь к базе указанный пользователем
            For Each tdf In BD_2.TableDefs
                If Mid(tdf.Name, 1, 4) <> "Msys" Then   'если  не системная таблица тогда смотрим
        For Each objField In BD_2.TableDefs(tdf.Name).Fields
        Table_Name = tdf.Name
        Pole_Name = objField.Name
' вот тут начинается затык. Как правильно написать строку передачи знаяений поля?
         MsgBox CurrentDb.TableDefs(Table_Name).Fields(Pole_Name).Value
            BD_1.TableDefs(Table_Name).Fields(Pole_Name)=BD_2.TableDefs(tdf.Name).Fields(objField.Name)           
        Next                                      
                End If
            Next tdf
            BD_1.Close
            Set BD_1 = Nothing
            BD_2.Close
            Set BD_2 = Nothing
        Else
            MESS "Не верно указан файл."
            Exit Sub
        End If
    Else
        MESS "Не указан файл."
        Exit Sub
    End If
End Sub



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

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

Операция не разовая.
Нужно создать функцию переноса данных.
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315526
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
час58
Код: vbnet
1.
' вот тут начинается затык. Как правильно написать строку передачи знаяений поля?

Тяжело в деревне без нагана... ©
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315533
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
час58Нужно создать функцию переноса данных.
Кто мешает один раз написать запросы типа
Код: sql
1.
2.
3.
INSERT INTO [new_table] (fieldset)
SELECT (fieldset)
FROM [old_table] IN [old_database]


и тупо выполнять их (хоть через DoCMD.RunSQL)? Ну предварительно можно попросить тыкнуть пальцем в старую БД и подкорректировать путь в тексте запроса...

А Ваш "бешеный код" вообще заставляет предположить, что Вам неизвестны структуры ни исходных, ни конечных таблиц...
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315534
час58
Код: vbnet
1.
BD_1.TableDefs(Table_Name).Fields(Pole_Name)=BD_2.TableDefs(tdf.Name).Fields(objField.Name)

Так не взлетит. Данные нужно переносить либо запросом на добавление, либо с помощью двух Recordset-ов.
Имейте ввиду, что заполнять таблицы надо в определенной последовательности согласно подчиненности. К тому же, если есть ключевые поля-счетчики, надо хорошо подумать, что с ними делать при переносе данных.
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315544
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ( Киев ),

Да, я уже понял.
пишу рекордсетами...
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315550
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
Не получится потому, что действительно не известны структуры таблиц.
надо "наощуп" перенести данные из одноимённых полей.
каждый раз в новой базе может прибавится количество полей в таблицах.
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315558
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
час58,
Получается вот так.

Код: vbnet
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.
Private Sub ZAGRUZKA_SPRAVOCHNIKOV_BTN_Click()
' из другой азы зарузка данных CLN_TBL.mdb
 Dim tdf As DAO.TableDef
 Dim BD_1 As DAO.Database ' текущая база
 Dim BD_2 As DAO.Database ' другая база
 Dim Table_Name '
 Dim Pole_Name  '
 Dim RST_1 As DAO.Recordset
 Dim RST_2 As DAO.Recordset
 
 
If VOPROS("Удалить все имеющиеся данные?") = False Then Exit Sub
If VOPROS("Заменить все данные справочников?") = False Then Exit Sub
MESS "Укажите путь к файлу таблиц для загрузки данных"
    STR_FILTER = "Выберите файл" & Chr$(0) & "*.mdb" & Chr$(0)
    TEMP_PATCH_TO_BASE = FileOpenSave(OFN_OVERWRITEPROMPT, CurrentProject.Path, STR_FILTER, , ".mdb", , "Выбор CLN_TBL.mdb", -1, True)

    If Nz(TEMP_PATCH_TO_BASE) <> "" Then
        If InStr(1, TEMP_PATCH_TO_BASE, "CLN_TBL", vbTextCompare) <> 0 Then
            Set BD_1 = CurrentDb   '
            Set BD_2 = OpenDatabase(TEMP_PATCH_TO_BASE)    ' путь к базе указанный пользователем
            For Each tdf In BD_2.TableDefs
                If Mid(tdf.Name, 1, 4) <> "Msys" Then   'если  не системная таблица тогда смотрим

        Table_Name = tdf.Name
        ' очистка таблицы
        CurrentDb.Execute "DELETE FROM " & Table_Name
        
        Set RST_1 = BD_1.OpenRecordset(Table_Name, dbOpenDynaset)
        Set RST_2 = BD_2.OpenRecordset(Table_Name, dbOpenDynaset)
    If RST_2.RecordCount <> 0 Then
        RST_2.MoveLast
        RST_2.MoveFirst
                
        Do Until RST_2.EOF
             For Each objField In BD_2.TableDefs(tdf.Name).Fields
                Pole_Name = objField.Name
                Debug.Print Nz(RST_2(Pole_Name))
                RST_1.Edit
                 RST_1(Pole_Name) = Nz(RST_2(Pole_Name))
                RST_1.Update
             Next
        RST_2.MoveNext
        Loop
        
    End If
                End If
            Next tdf
            BD_1.Close
            Set BD_1 = Nothing
            BD_2.Close
            Set BD_2 = Nothing
        Else
            MESS "Не верно указан файл."
            Exit Sub
        End If
    Else
        MESS "Не указан файл."
        Exit Sub
    End If


End Sub



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

:-))))
Не нуна во мну стрелять ....ать ять
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315569
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
час58,
ИЗМЕНИ ЦИКЛ
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        Do Until RST_2.EOF
             For Each objField In BD_2.TableDefs(tdf.Name).Fields
            Pole_Name = objField.Name
                RST_1.AddNew
                 RST_1(Pole_Name) = Nz(RST_2(Pole_Name))
                RST_1.Update
             Next
             
        RST_2.MoveNext
        Loop
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315573
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
час58действительно не известны структуры таблиц.
надо "наощуп" перенести данные из одноимённых полей.
каждый раз в новой базе может прибавится количество полей в таблицах.
А "старые" версии что, сами ниоткуда возникают, что ли? Впрочем, какая в пень разница... структуры ты запросил, теперь собери список одноимённых полей и построй в тексте запроса правильный fieldset.

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

Счётчики - заразы....
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315586
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
час58Счётчики - заразы....
Рекордсеты - не очень эффективное решение, лучше запросы формировать и выполнять, работает быстрее. Запросам счетчики по барабану.

Кстати, если все же через рекордсеты делать будете, то рекомендую цикл записи поместить в транзакцию, работает намного быстрее, т.к. не пишется на диск после каждой операции.
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315588
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
старые версии у всех точек разнятся (не моя вина). :-((
потому надо собирать данные со старых версий в новые.
вот и прошу помощи.
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315592
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin,

то есть формировать строку запроса из наименований полей и их значений и выполнять запрос на добавление?
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315603
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
час58,
Да, я бы так сделал.
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315606
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и вставлять не по одной строке по возможности, а сразу весь набор строк из таблицы вставлять.
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315611
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin,

Да, это быстрее.
Надо подумать как это сделать.
Правда не будет контроля за процессом....
но может он и не нужен
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315644
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка синтаксиса...
Помогите найти ощибку в запросе

Код: vbnet
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.
Private Sub ZAGRUZKA_SPRAVOCHNIKOV_BTN_Click()
' &#232;&#231; &#228;&#240;&#243;&#227;&#238;&#233; &#224;&#231;&#251; &#231;&#224;&#240;&#243;&#231;&#234;&#224; &#228;&#224;&#237;&#237;&#251;&#245; CLN_TBL.mdb
 Dim tdf As DAO.TableDef
' Dim BD_1 As DAO.Database ' &#242;&#229;&#234;&#243;&#249;&#224;&#255; &#225;&#224;&#231;&#224;
 Dim BD_2 As DAO.Database ' &#228;&#240;&#243;&#227;&#224;&#255; &#225;&#224;&#231;&#224;
 Dim Table_Name As String '
 Dim Pole_Name As String  '
 Dim RST_1 As DAO.Recordset
 Dim RST_2 As DAO.Recordset
 Dim Stroka_Pole_Name As String
 
If VOPROS("&#211;&#228;&#224;&#235;&#232;&#242;&#252; &#226;&#241;&#229; &#232;&#236;&#229;&#254;&#249;&#232;&#229;&#241;&#255; &#228;&#224;&#237;&#237;&#251;&#229;?") = False Then Exit Sub
If VOPROS("&#199;&#224;&#236;&#229;&#237;&#232;&#242;&#252; &#226;&#241;&#229; &#228;&#224;&#237;&#237;&#251;&#229; &#241;&#239;&#240;&#224;&#226;&#238;&#247;&#237;&#232;&#234;&#238;&#226;?") = False Then Exit Sub
MESS "&#211;&#234;&#224;&#230;&#232;&#242;&#229; &#239;&#243;&#242;&#252; &#234; &#244;&#224;&#233;&#235;&#243; &#242;&#224;&#225;&#235;&#232;&#246; &#228;&#235;&#255; &#231;&#224;&#227;&#240;&#243;&#231;&#234;&#232; &#228;&#224;&#237;&#237;&#251;&#245;"
    STR_FILTER = "&#194;&#251;&#225;&#229;&#240;&#232;&#242;&#229; &#244;&#224;&#233;&#235;" & Chr$(0) & "*.mdb" & Chr$(0)
    TEMP_PATCH_TO_BASE = FileOpenSave(OFN_OVERWRITEPROMPT, CurrentProject.Path, STR_FILTER, , ".mdb", , "&#194;&#251;&#225;&#238;&#240; CLN_TBL.mdb", -1, True)

    If Nz(TEMP_PATCH_TO_BASE) <> "" Then
        If InStr(1, TEMP_PATCH_TO_BASE, "CLN_TBL", vbTextCompare) <> 0 Then
'            Set BD_1 = CurrentDb   '
            Set BD_2 = OpenDatabase(TEMP_PATCH_TO_BASE)    ' &#239;&#243;&#242;&#252; &#234; &#225;&#224;&#231;&#229; &#243;&#234;&#224;&#231;&#224;&#237;&#237;&#251;&#233; &#239;&#238;&#235;&#252;&#231;&#238;&#226;&#224;&#242;&#229;&#235;&#229;&#236;
            For Each tdf In BD_2.TableDefs
If Mid(tdf.Name, 1, 4) <> "Msys" Then   '&#229;&#241;&#235;&#232;  &#237;&#229; &#241;&#232;&#241;&#242;&#229;&#236;&#237;&#224;&#255; &#242;&#224;&#225;&#235;&#232;&#246;&#224; &#242;&#238;&#227;&#228;&#224; &#241;&#236;&#238;&#242;&#240;&#232;&#236;

        Table_Name = tdf.Name
        If Table_Name = "LANGUAGE_TBL" Then GoTo DALEE
        If Table_Name = "SPR_MONTH_TBL" Then GoTo DALEE
        ' &#238;&#247;&#232;&#241;&#242;&#234;&#224; &#242;&#224;&#225;&#235;&#232;&#246;&#251;
        CurrentDb.Execute "DELETE FROM " & Table_Name
        Set RST_2 = BD_2.OpenRecordset(Table_Name, dbOpenDynaset)
    If RST_2.RecordCount <> 0 Then
        RST_2.MoveLast
        RST_2.MoveFirst
        Stroka_Pole_Name = ""
        
            For Each objField In BD_2.TableDefs(tdf.Name).Fields
                Pole_Name = objField.Name
                If Nz(Pole_Name) = "&#202;&#238;&#228;" Then GoTo dalee_1
                If Stroka_Pole_Name = "" Then
                  Stroka_Pole_Name = Stroka_Pole_Name & Pole_Name
                Else
                  Stroka_Pole_Name = Stroka_Pole_Name & ", " & Pole_Name
                End If
dalee_1:
            Next
    End If
    
    If Stroka_Pole_Name <> "" Then
       DoCmd.SetWarnings False
       DoCmd.RunSQL "INSERT INTO " & Table_Name & " (" & Stroka_Pole_Name & ") SELECT (" & Stroka_Pole_Name & ") FROM  " & Table_Name & " IN '" & TEMP_PATCH_TO_BASE & "'"
       DoCmd.SetWarnings True
    End If
    
End If
                     
DALEE:
            Next tdf

            BD_2.Close
            Set BD_2 = Nothing
        Else
            MESS "&#205;&#229; &#226;&#229;&#240;&#237;&#238; &#243;&#234;&#224;&#231;&#224;&#237; &#244;&#224;&#233;&#235;."
            Exit Sub
        End If
    Else
        MESS "&#205;&#229; &#243;&#234;&#224;&#231;&#224;&#237; &#244;&#224;&#233;&#235;."
        Exit Sub
    End If


End Sub
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315648
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
час58Akina,
старые версии у всех точек разнятся (не моя вина). :-((
потому надо собирать данные со старых версий в новые.
вот и прошу помощи.А все остальные данные к которым привязаны эти справочники потом что будут показывать?
Был кефир в бутылках, стал носками в бочках?
Нормально! Зато весело!
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315651
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
час58старые версии у всех точек разнятся (не моя вина)
Не понял... различаются версии одного и того же (вашего?) приложения, или сами приложения разные?

Если первое, то у вас должна быть история изменения структур, и ничто не мешает сперва выяснить версию, а потом использовать построенный именно для неё комплект запросов.
Возможная трабла - в БД не хранится номер её версии, но опять же несложно написать код, который, зная все структуры, по текущей структуре определяет версию. А потом - см. выше.
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315657
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
Структуры таблиц немного отличаются.
Появляются новые поля.
Старые поля остаются.
И вот нужно данные из старых полей (старых таблиц)
перенести в новые таблицы.
...
Рейтинг: 0 / 0
Переброс данных из другой базы
    #39315663
Фотография час58
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
Интересное дело.
Если в таблице одно поле (справочник)
Переносятся данные, а если два поля и более - фиг вам
Код: vbnet
1.
ID_SOTRUDNIKA, INN, SOTRUDNIK_SURNAME, SOTRUDNIK_NAME



Ругается на наличие запятой в запросе

Поставил -
Код: vbnet
1.
 ;


ругается на синтаксис.

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

скобки лишние убери
Код: vbnet
1.
 Stroka_SQL = "INSERT INTO " & Table_Name & " (" & Stroka_Pole_Name & ") SELECT " & Stroka_Pole_Name & " FROM  " & Table_Name & " IN '" & TEMP_PATCH_TO_BASE & "'"
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Переброс данных из другой базы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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