2016-03-16 6 views
1

Я использовал ответ с этого поста, чтобы экспортировать свои запросы в текстовый файл, так что я мог бы сделать находку/заменить упражнение:Импорт ранее вывезенные Access запросов SQL из текстовых файлов

Using VBA to export all ms access sql queries to text files

Я унаследовал базу данных который имеет имена объектов, banker1, banker2 и т. д., жестко закодированные, и мне приходилось создавать дополнительные приложения. Я экспортировал все свои запросы и заменил banker1 новыми именами. Все идет нормально.

Возможно ли отменить этот процесс из одного текстового файла и загрузить запросы в Access?

Мой предыдущий метод включал экспорт запросов в отдельные текстовые файлы с использованием Application.SaveAsText, а затем цикл и выполнение поиска/замены. Проблема, с которой я столкнулся с использованием этого метода, заключается в том, что файл «отформатирован», возможно, фиксированная ширина, но не уверен, так что некоторые имена были разделены по строкам и поэтому не были обнаружены функцией find/replace. Загрузка их обратно с использованием Application.LoadFromText работала отлично, за исключением того, что мне все равно пришлось искать по запросам, чтобы найти имена, которые не изменились.

Редактировать: Образец запрошенных запросов.

BNK30-AddChargebacks INSERT INTO BNK30EntryTable (запись) ВЫБОР BNK30SelectChargebacks.Entry ОТ BNK30SelectChargebacks ГДЕ (((BNK30SelectChargebacks.Amount) <> 0));

BNK30-AddCredit INSERT INTO BNK30EntryTable (запись) ВЫБОР BNK30EntryQuery.Credit ОТ BNK30EntryQuery ГДЕ (((BNK30EntryQuery.Amt) <> 0));

В выше, я бы делать поиска/замены в BNK30 с BNK31 и т.д.

Edit 2:

Operation =3 
Name ="BNK01SavedReserves" 
Option =0 
Where ="(((BNK01Select.Reference) Is Null Or (BNK01Select.Reference)=[forms]![BNK01Nav]!" 
    "[txtReference]) AND ((BNK01Select.Date) Is Null Or (BNK01Select.Date)=[forms]![B" 
    "NK01Form]![StartedTime]))" 
Begin InputTables 
    Name ="BNK01Select" 
End 
Begin OutputColumns 
    Name ="AssignedTo" 

выше от моего оригинального метода, который работает за исключением того, где в BNK01 разделяется; чуть выше Начало входных таблиц. Следовательно, попытка переключиться на экспорт SQL как одного большого файла.

+0

@ HansUp да, это правильно. Я сначала заменяю banker1 11 и 12. Возможно добавить несколько позже. Например, у меня есть запрос под названием Banker1SavedEntry, который относится к элементам управления в форме Banker1Statement. Мне нужно это, чтобы стать Banker12SavedEntry и т. Д. Существует приблизительно 60 объектов, связанных с каждым банкиром, не включая VBA. – nathanjw

+0

@HansUp извините, да мне также нужно изменить имя запроса. Это не было проблемой в моем исходном методе, потому что, когда я зацикливался на запросах, ищущих те, которые сопоставлялись с banker1, я каждый раз сохранял их как новое имя. Цикл find/replace, который я создал в Word, чтобы открыть каждый файл в папке, выполните поиск/замену, а затем закройте файл. – nathanjw

+0

@HansUp Я добавил образец запросов из файла, созданного путем экспорта querydef.SQL. Единственное, что может измениться, - это BNK30 станет BNK31. – nathanjw

ответ

2

Вы можете использовать процедуру VBA для изменения как ваших имен запросов, так и их SQL по мере необходимости. Этот подход должен быть намного проще, чем сбросить определения запросов в текстовый файл, выполнить поиск и заменить в текстовом файле, а затем (каким-то образом?) Изменить ваши запросы на основе изменений текстового файла.

Например, с помощью описанной ниже процедуры, вы можете сделать «найти/заменить в BNK30 с BNK31» как это ...

ModifyQueries "BNK30", "BNK31" 

Однако, как написано, процедура не изменяется запросы. Он показывает только те изменения, которые он внес бы, если вы включите линии .Name = strNewName и .SQL = strNewSql. Перед включением этих строк просмотрите вывод в окне Immediate.

Public Sub ModifyQueries(ByVal pFind As String, ByVal pReplace As String) 
    Dim db As DAO.Database 
    Dim qdf As DAO.QueryDef 
    Dim strNewSql As String 
    Dim varNewName As Variant 

    Set db = CurrentDb 
    For Each qdf In db.QueryDefs 
     With qdf 
      varNewName = Null 
      strNewSql = vbNullString 
      If .Name Like "*" & pFind & "*" Then 
       varNewName = Replace(.Name, pFind, pReplace) 
       Debug.Print "change " & .Name & " to " & varNewName 
       '.Name = strNewName 
      End If 

      If .SQL Like "*" & pFind & "*" Then 
       strNewSql = Replace(.SQL, pFind, pReplace) 
       Debug.Print Nz(varNewName, .Name) & " SQL: " 
       Debug.Print strNewSql 
       '.SQL = strNewSql 
      End If 
     End With 
    Next 
End Sub 

Опасайтесь, что код не был тщательно протестирован. Он предназначен только в качестве отправной точки; вы должны проверить и усовершенствовать его.

Необходимо добавить обработку ошибок. Процедура выдает ошибку, если/когда она пытается назвать запрос с именем, которое соответствует существующему запросу или таблице.

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

db.CreateQueryDef varNewName, strNewSql 

Наконец убедитесь, что для резервного копирования базы данных перед запуском «включено» версии этого кода. Я сомневаюсь, что вам нужно это предупреждение, Натан, но я сжимаюсь при мысли о том, что кто-то еще случайно не выполняет свои запросы.

+1

спасибо за это. Я пробовал это сегодня утром, и это работает как шарм. Очень признателен :) – nathanjw

Смежные вопросы