Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Переброс данных из другой базы / 25 сообщений из 28, страница 1 из 2
26.09.2016, 12:03
    #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
26.09.2016, 12:16
    #39315498
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переброс данных из другой базы
час58,

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

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

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


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

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

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

Да, я уже понял.
пишу рекордсетами...
...
Рейтинг: 0 / 0
26.09.2016, 12:59
    #39315550
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переброс данных из другой базы
Akina,
Не получится потому, что действительно не известны структуры таблиц.
надо "наощуп" перенести данные из одноимённых полей.
каждый раз в новой базе может прибавится количество полей в таблицах.
...
Рейтинг: 0 / 0
26.09.2016, 13:10
    #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
26.09.2016, 13:11
    #39315559
час58
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переброс данных из другой базы
Панург,

:-))))
Не нуна во мну стрелять ....ать ять
...
Рейтинг: 0 / 0
26.09.2016, 13:21
    #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
26.09.2016, 13:24
    #39315573
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переброс данных из другой базы
час58действительно не известны структуры таблиц.
надо "наощуп" перенести данные из одноимённых полей.
каждый раз в новой базе может прибавится количество полей в таблицах.
А "старые" версии что, сами ниоткуда возникают, что ли? Впрочем, какая в пень разница... структуры ты запросил, теперь собери список одноимённых полей и построй в тексте запроса правильный fieldset.

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

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

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

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

Да, это быстрее.
Надо подумать как это сделать.
Правда не будет контроля за процессом....
но может он и не нужен
...
Рейтинг: 0 / 0
26.09.2016, 14:54
    #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
26.09.2016, 14:58
    #39315648
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переброс данных из другой базы
час58Akina,
старые версии у всех точек разнятся (не моя вина). :-((
потому надо собирать данные со старых версий в новые.
вот и прошу помощи.А все остальные данные к которым привязаны эти справочники потом что будут показывать?
Был кефир в бутылках, стал носками в бочках?
Нормально! Зато весело!
...
Рейтинг: 0 / 0
26.09.2016, 15:03
    #39315651
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переброс данных из другой базы
час58старые версии у всех точек разнятся (не моя вина)
Не понял... различаются версии одного и того же (вашего?) приложения, или сами приложения разные?

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



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

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


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

где собака зарылась?
...
Рейтинг: 0 / 0
26.09.2016, 15:29
    #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
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Переброс данных из другой базы / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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