Access 2007 спецификация текстового файла не существует

Обновлено: 07.07.2024

Описание: В статье описываются различные методы, поддерживаемые Access для работы с текстовыми файлами, некоторые тонкости и возникающие проблемы.
Основное внимание уделено использованию файла спецификации Schema.ini вместо спецификаций Access, а также - методам прямого доступа из VBA, позволяющим получить информацию из нестандартных файлов или "причесать" их для последующего импорта.

О бсуждение статьи:

Н есколько дополнений, плюс UTF-8

Хочу внести некоторые дополнения.
1. Драйвер при чтении из файла воспринимает как разделитель строк не только vbCrLf, но и vbCr, и vbLf. И это радует . Но при записи в файл всегда используется vbCrLf.

2. Драйвер умеет работать с файлами в кодировке Unicode. Эта кодировка имеет несколько форматов, в частности: UTF-16LE (основной), UTF-16BE (старший байт в паре стоит первым), UTF-8. Каждый из этих форматов может иметь свой признак (Byte Order Mark или BOM). Это 2-3 байта с определенными значениями в начале файла. Его наличие желательно, т.к. однозначно указывает на формат текста в Unicode.
Указав "Юникод" в спецификации Access или CharacterSet=Unicode в файле Schema.ini, можно работать с файлами в формате UTF-16LE. В спецификации Access можно указать и другой формат ("Юникод (Big-Endian)" и "Юникод (UTF-8)"). В Schema.ini это выглядит так:

CharacterSet=Unicode или 1200 - UTF-16LE

Но здесь есть несколько замечаний:
а) При чтении из UTF-16LE драйвер "культурно" анализирует BOM и не включает его возвращаемые данные. При создании файла BOM добавляется.
В других форматах при создании файла BOM не добавляется, а при чтении включается в имя или значение первого поля.
б) Если в читаемом файле BOM отсутствует, то драйвер "думает", что это UTF-16LE (Блокнот, кстати - тоже). Это противоречит правилу в стандарте Unicode, что файл без BOM должен быть в формате UTF-16BE.

3. В статье, в примерах прямого доступа к файлам, наличие BOM не учтено. При создании файла без BOM внешняя программа может и не прочитать его, поэтому пример записи в файл желательно изменить:

'СОЗДАНИЕ ФАЙЛА С UNICODE

f = FreeFile: Open "C:\Файл U.txt" For Binary As f

'Преобразование строки в массив и запись массива выполняется "как есть".

bytArr = "Строка1" & vbCrLf & "Строка2" & vbCrLf & "Строка3" & vbCrLf

Put f, , CByte(&HFF)

Put f, , CByte(&HFE)

Вместо функции ReadTextFile предлагаю функцию, которая умеет читать файлы UTF-16LE, UTF-16BE и UTF-8, с BOM и без него. Также предлагаю функцию создания файла в UTF-8.

Function ReadAnyTextFile(sFilePath$, Optional fGetRowsArray As Boolean ) As Variant

'Функция читает файлы в формате:

' Обычный (ANSI/OEM и т.п. с однобайтовой кодировкой)

' Unicode (UTF-16 LE, UTF-16 BE)

'Формат файла определяется по маркеру BOM (первые 2-3 байта в начале файла)

'Лишние завершающие символы vbCr и/или vbLf исключаются.

'Если fGetRowsArray=0, возвращает содержимое файла.

'Если fGetRowsArray=1, возвращает массив строк (разделитель vbCrLf, vbCr или vbLf).

On Error Resume Next

Dim i&, j&, k%, s$, arr() As Byte , iUtf8%, iUtf16%

i = FreeFile: Open sFilePath$ For Binary Access Read Shared As i

If Err.Number <> 0 Then Err.Clear: Exit Function

j = LOF(i): If j = 0 Then Close i: GoTo Finish

ReDim arr(1 To 4): Get i, , arr

'Проверяется наличие признака кодировки (первые 2-3 байта).

If arr(1) = &HFF And arr(2) = &HFE And arr(3) <> 0 Then

'Есть признак Unicode(UTF-16 LE). Читаем с 3-го байта.

ElseIf arr(1) = &HFE And arr(2) = &HFF And arr(4) <> 0 Then

'Есть признак Unicode(UTF-16 BE). Читаем с 3-го байта.

ElseIf arr(1) = &HEF And arr(2) = &HBB And arr(3) = &HBF Then

'Есть признак UTF-8. Читаем с 4-го байта.

j = j - k: ReDim arr(1 To j): Get i, 1 + k, arr

If iUtf16 = 0 And iUtf8 = 0 And (UBound(arr) Mod 2) = 0 Then

'Проверка Unicode. Контролируется значение старшего байта в первом и последнем символе.

'Этого достаточно, если эти символы не "№" и не специальные знаки

' (например - математические или химические).

If arr(2) <= 5 And arr(UBound(arr)) <= 5 Then

ElseIf arr(1) <= 5 And arr(UBound(arr) - 1) <= 5 Then

If iUtf16 = 2 Then

'Для UTF-16 BE в цикле меняем местами парные байты.

For i = 1 To j - 1 Step 2

k = arr(i): arr(i) = arr(i + 1): arr(i + 1) = k

If iUtf16 > 0 Then s = arr: GoTo Finish

For i = 1 To j - 1

Select Case arr(i)

Case &HC2 To &HDF

'В UTF-8 после байта с таким кодом должен стоять байт с кодом &H80-&HBF

If arr(i + 1) < &H80 Or arr(i + 1) > &HBF Then iUtf8 = 0: Exit For

iUtf8 = 3: i = i + 1

Case &HE0 To &HFF

'В UTF-8 после байта с таким кодом должны стоять 2 байта с кодом &H80-&HBF

If i = j - 1 Then iUtf8 = False : Exit For

If arr(i + 1) < &H80 Or arr(i + 1) > &HBF Then iUtf8 = 0: Exit For

If arr(i + 2) < &H80 Or arr(i + 2) > &HBF Then iUtf8 = 0: Exit For

iUtf8 = 3: i = i + 2

iUtf8 = 0: Exit For

'Если в массиве найдены недопустимые для UTF-8 коды или все коды <=127

If iUtf8 < 3 Then s = StrConv(arr, vbUnicode): GoTo Finish

'Преобразование UTF-8 -> Unicode

'Переменная "k" (код символа) - Integer (2 байта или 16 битов с весом 0-15)

Select Case arr(i)

Case &HC2 To &HDF

'6 младших битов 2-го байта переносятся в код с тем же весом (0-5)

k = (arr(i + 1) And &H3F)

'5 младших битов 1-го байта переносятся в код с весом 6-10

k = k + (arr(i) And &H1F) * &H40 'Биты смещаются на 6 позиций влево.

Case &HE0 To &HFF

'6 младших битов 3-го байта переносятся в код с тем же весом (0-5)

k = (arr(i + 2) And &H3F)

'6 младших битов 2-го байта переносятся в код с весом 6-11

k = k + (arr(i + 1) And &H1F) * &H40 'Биты смещаются на 6 позиций влево.

'4 младших бита 1-го байта переносятся в код с весом 12-15

k = k + (arr(i) And &HF) * &H1000 'Биты смещаются на 12 позиций влево.

If k <= 127 Then s = s & Chr (k) Else s = s & ChrW(k)

'Исключаются лишние завершающие символы vbCr и/или vbLf

j = Len(s): Erase arr

For i = j To 1 Step -1

k = Asc ( Mid $(s, i, 1))

If k <> 13 And k <> 10 Then Exit For

If i < j Then s = Left (s, i)

If Not fGetRowsArray Then ReadAnyTextFile = s: Exit Function

If i <= 1 Then ReadAnyTextFile = Split(s): Exit Function

'Преобразование текста в массив строк.

If InStr (s, vbCrLf) > 0 Then

ReadAnyTextFile = Split(s, vbCrLf)

ElseIf InStr (s, vbLf) > 0 Then

ReadAnyTextFile = Split(s, vbLf)

ReadAnyTextFile = Split(s, vbCr)

Optional fAppend As Boolean ) As Boolean

'Функция создает или дополняет (fAppend=True) файл в формате UTF-8.

'При успешном завершении возвращает True.

'Внимание! Функция не добавляет символ(ы) перевода строки. При необходимости

' они должны быть включены в передаваемый текст.

Dim i&, j&, k&, arr() As Byte

On Error GoTo Func_err

If Len(strText) = 0 Or Len(Trim$(strFilePath)) = 0 Then Exit Function

'Если fAppend=False и файл существует - удаляем.

If Not fAppend Then If Len(Dir$(strFilePath)) Then Kill strFilePath

'Создается массив с запасом 5% от длины текста

ReDim arr(1 To LenB(strText) * 1.05): i = 1

For j = 1 To Len(strText)

'Читаем код символа (Unicode).

k = AscW( Mid $(strText, j, 1))

'При необходимости увеличиваем размер массива

If (UBound(arr) - i) < 3 Then ReDim Preserve arr(1 To UBound(arr) * 1.05 + 3)

arr(i) = k: i = i + 1

ElseIf k > &H7FF Then

'Формируем значения трех байтов в UTF-8

arr(i) = (k And &HF000) / &H1000 'Биты 12-15 переносятся в биты 0-3 первого байта.

arr(i) = arr(i) Or &HE0 'Добавляется признак 1-го байта (биты 5-7)

arr(i + 1) = (k And &HFC0) / &H40 'Биты 6-11 -> биты 0-5 2-го байта

arr(i + 1) = arr(i + 1) Or &H80 'Добавляется признак 2-го байта (биты 6-7)

arr(i + 2) = (k And &H3F) 'Биты 0-5 -> биты 0-5 3-го байта

arr(i + 2) = arr(i + 2) Or &H80 'Добавляется признак 3-го байта (биты 6-7)

'Формируем значения двух байтов в UTF-8

arr(i) = arr(i) + (k And &HC0) / &H40 'Биты 6-7 -> биты 0-1 1-го байта

arr(i) = arr(i) Or &HC0 'Добавляется признак 1-го байта (биты 6-7)

arr(i + 1) = (k And &H3F) 'Биты 0-5 -> биты 0-5 2-го байта

arr(i + 1) = arr(i + 1) Or &H80 'Добавляется признак 2-го байта (биты 6-7)

'Убираем лишние элементы из массива

If i <= UBound(arr) Then ReDim Preserve arr(1 To i - 1)

'Открываем файл, вычисляем его размер

k = FreeFile: Open strFilePath For Binary As k: j = LOF(k)

If fAppend And j > 0 Then

'Если режим "Добавление" и файл не пустой - добавляем массив в конец файла

'При создании нового файла добавляем массив, начиная с 4-й позиции

'В первые 3 байта пишем признак UTF-8 (BOM)

ReDim arr(1 To 3): arr(1) = &HEF: arr(2) = &HBB: arr(3) = &HBF

Close k: CreateFileUTF8 = True

MsgBox Err.Description, vbCritical, "Создание файла"

Resume Func_ exit


Е ще несколько дополнений.



На основании проведенных экспериментов хочу добавить следующее:
1. Утверждение, что спецификацию Access можно создать/редактировать/удалить только интерактивно - не совсем верно.
Да, системные таблицы MSysIMEXSpecs (общие параметры спецификаций) и MSysIMEXColumns (параметры полей) - только для чтения, но если в этой же БД создать связанные таблицы к этим системным таблицам, то редактировать спецификации можно! Но самую первую спецификацию надо создать "ручками", т.к. до этого указанные системные таблицы отсутствуют.

2. Серьезным недостатком спецификации в Schema.ini считается отсутствие параметра, указывающего символ - ограничитель текста или его отсутствие.
Из-за этого в экспортированном файле текстовые поля обрамляются кавычками, а кавычки внутри текста дублируются (это правило по умолчанию), а импорт файлов с текстовыми полями, не обрамленными кавычками, но имеющими кавычки в тексте приводит к искажению результата (потеря всего текста или части в таких полях и т.п.), а то и к ошибке импорта.
В официальной документации такой параметр не описывается, но на самом деле он есть и называется TextDelimiter . Если указать TextDelimiter=None, то файл будет создан или прочитан правильно.
Вроде бы в Jet3.x значение None не работает, но для импорта можно указать любой символ, отсутствующий в тексте - эффект тот же.

В модуле Excel выполняем код, который читает оба файла и выкладывает на лист:

Set cnn = CreateObject(‘ADODB.Connection”)

Set rs = CreateObject(‘ADODB.Recordset”)

cnn.Properties( "Data Source" ) = "D:\Temp"

cnn.Properties( "Extended Properties" ) = "Text;DSN=TempSpec"

Set rs = cnn.Execute( "SELECT * FROM [Temp1.txt];" )

ActiveSheet.Range( "A1" ).CopyFromRecordset rs

Set rs = cnn.Execute( "SELECT * FROM [Temp2.txt];" )

ActiveSheet.Range( "A10" ).CopyFromRecordset rs

В модуле Excel выполняем код, который в D:\MyDB\db1.mdb импортирует файл Temp1.txt (создает таблицу Temp) и экспортирует в файл Temp3.txt имеющуюся таблицу:

Set cnn = CreateObject(‘ADODB.Connection”)

cnn.Properties( "Data Source" ) = "D:\MyDB\db1.mdb"

s = "SELECT * INTO Temp FROM [Temp1.txt] IN 'D:\Temp' [Text;DSN=TempSpec];"

s = "SELECT * INTO [Temp3.txt] IN ' D:\Temp' [Text; DSN=TempSpec] FROM Table1;"

кто-нибудь знает, как изменить существующую спецификацию импорта в Microsoft Access 2007 или 2010? В более старых версиях в Мастере импорта была кнопка Дополнительно, которая позволяла выбрать и изменить существующую спецификацию. Я больше не вижу эту функцию, но надеюсь, что она все еще существует и только что была перемещена куда-то еще.

Я могу использовать эту функцию на своей машине с помощью MS Access 2007.

  • на ленте выберите внешние данные
  • выберите опцию "текстовый файл"
  • отображается мастер получения внешних данных
  • укажите местоположение файла, который вы хотите импортировать
  • нажмите OK. Отобразится "мастер импорта текста"
  • в нижней части этого диалогового окна находится кнопка Дополнительно, на которую вы ссылались
  • нажатие на эту кнопку должно отображать экран спецификации импорта и позволяет выбрать и изменить существующую спецификацию импорта.

для чего это стоит, я использую Access 2007 SP1

Я не верю, что есть прямой способ. Тем не менее, если вы desparate, то в разделе параметры навигации выберите, чтобы показать системные объекты. Затем в списке таблиц появятся системные таблицы. Здесь представляют интерес две таблицы: MSysIMEXspecs и MSysIMEXColumns. Вы сможете редактировать информацию об импорте и экспорте. Удачи!

ответ Тима Лентайна кажется верным даже в полной версии. Есть только одна вещь, которую я хотел бы упомянуть.

Если вы завершите импорт, не входя в "дополнительно". "и сохранение спецификации, но вы сохраняете импорт для повторного использования в конце мастера (новая функция AFAIK), вы не сможете вернуться и отредактировать эту спецификацию. Он встроен в"сохраненный импорт". Возможно, именно это имел в виду Нокс.

вы можете, однако, сделать частично обойти:

  1. импортируйте новый файл (или тот же самый), но,
  2. на этот раз выберите Добавить, вместо того, чтобы сделать новый
  3. нажмите OK.
  4. перейдите в "дополнительно", все ваши заголовки столбцов и типы данных будут там.
  5. теперь вы можете внести необходимые изменения и сохранить спецификацию в этом диалоговом окне. Затем отмените этот импорт (это не то, что вы хотели в любом случае, верно?)
  6. вы можете использовать это спецификации для любого дальнейшего импорта. Это не полное решение, но экономит часть работы.

Ниже приведены три функции, которые можно использовать для изменения и использования спецификации импорта MS Access 2010. Третий подраздел изменяет имя существующей спецификации импорта. Второй подраздел позволяет изменять любой xml-текст в спецификации импорта. Это полезно, если вам нужно изменить имена столбцов,типы данных, добавить столбцы, изменить расположение файла импорта и т. д.. По сути все, что вы хотите изменить в существующей спецификации. Первый Sub-это процедура, которая позволяет вызвать существующую спецификацию импорта, измените его для определенного файла, который вы пытаетесь импортировать, импортируйте этот файл, а затем удалите измененную спецификацию, сохраняя "шаблон" спецификации импорта неизменным и неповрежденным. Наслаждаться.

когда я хочу изучить или изменить спецификацию импорта / экспорта, я запрашиваю таблицы в MS Access, где определена спецификация.

можно также использовать инструкцию UPDATE или INSERT для изменения существующих столбцов или вставки и добавления новых столбцов к существующей спецификации. С помощью этой методологии можно создать совершенно новые спецификации.

Почему так сложно?

просто проверьте системные объекты в Access-Options / текущая база данных / параметры навигации / показать системные объекты

откройте таблицу "MSysIMEXSpecs" и изменить в соответствии с вашими потребностями - его легко читать.

еще один отличный вариант-это бесплатные V-Tools addin для Microsoft Access. Среди других полезных инструментов он имеет форму для редактирования и сохранения спецификаций импорта/экспорта.

enter image description here

enter image description here

Примечание: начиная с версии 1.83, существует ошибка в перечислении кодовых страниц в Windows 10. (По-видимому, из-за отсутствующей/измененной функции API в Windows 10) инструменты по-прежнему отлично работают, вам просто нужно прокомментируйте несколько строк кода или пройдите мимо него в окне отладки.

Это была реальная жизнь-saver для меня в редактировании сложной спецификации импорта для наших онлайн-заказов.

Тим Lentine работает, если у вас есть ваши характеристики сохранены. В вашем вопросе это не указано, в нем указано только, что вы импортировали данные. Его метод не спасет ваши спецификации таким образом.

способ сохранить спецификацию этого текущего импорта-повторно открыть импорт, нажать "apend", и это позволит вам использовать ваши текущие настройки импорта, которые MS Access подобрал. (это полезно, если вы хотите сохранить спецификации импорта из формата Excel, над которым вы работали до импорта в MS ACCESS.)

Как только вы находитесь в опции apend, используйте инструкции Тима, который использует расширенную опцию и "сохранить как."Оттуда просто нажмите "Отмена", и теперь вы можете импортировать любые другие подобные данные в различные таблицы и т. д.

Я только что обнаружил очевидную ошибку во всей сохраненной настройке импорта / XML в Access. Также разочарованный жесткостью сохраненной системы импорта, я создал формы и написал код, чтобы выделить XML, в котором хранятся сохраненные спецификации импорта, до такой степени, что я мог бы использовать этот инструмент для создания сохраненного импорта с нуля с помощью кодированного изучения исходной книги Excel.

Что я узнал, что, хотя доступ к корректно импортирует листа в модификации по умолчанию настройки пользователем (например, он любит взять любой столбец с заголовком названия, заканчивающиеся на "ID" и сделать его индексированного поля в результирующей таблице, но вы не можете отменить во время процесса импорта), а также правильно формирует XML в соответствии для пользователя изменения, если вы затем удалить таблицу и использовать сохраненный импорт, чтобы импортировать таблицу, он игнорирует XML импорт спецификации и возвращается обратно, используя свои придуманные значения по умолчанию, по крайней мере, в случае с "ИД" столбцы.

вы можете попробовать это самостоятельно: импортируйте лист Excel с хотя бы одним именем заголовка столбца, заканчивающимся на "ID" ("OrderID", "User ID" или просто "ID"). Во время процесса обязательно установите для этих столбцов значение "Indexed" в значение "No". Выполните импорт и установите флажок "сохранить шаги импорта" в последнем диалоговом окне. Если вы проверите результирующий дизайн таблицы, вы увидите, что в рассматриваемом поле(полях) нет индекса. Затем удалите таблицу, найдите сохраненный импорт и выполните его снова. На этот раз эти поля будут установлены как индексированные в дизайне таблицы, хотя XML по-прежнему не говорит об индексе.

я вытаскивал волосы, пока не обнаружил, что происходит, сравнивая XML, который я создал с нуля, с примерами, созданными с помощью инструмента доступа.

Кто-нибудь знает, как изменить существующую спецификацию импорта в Microsoft Access 2007 или 2010? В более старых версиях в мастере импорта была кнопка «Дополнительно», позволяющая выбирать и редактировать существующую спецификацию. Я больше не вижу эту функцию, но надеюсь, что она все еще существует и только что была перенесена в другое место.

Я могу использовать эту функцию на своем компьютере с помощью MS Access 2007.

  • На ленте выберите Внешние данные.
  • Выберите опцию «Текстовый файл»
  • Это отобразит Получить внешние данные Wizard
  • Укажите местоположение файла, который вы хотите импортировать
  • Нажмите ОК. Это отображает «Мастер импорта текста»
  • В нижней части этого диалогового окна находится кнопка «Дополнительно», на которую вы ссылались
  • Нажатие на эту кнопку должно отобразить экран «Спецификация импорта» и позволить выбрать и изменить существующую спецификацию импорта.

Для чего это стоит, я использую Access 2007 SP1

Я не верю, что есть прямой поддерживаемый путь. Однако, если вы отстранены, то в разделе параметров навигации выберите, чтобы показать системные объекты. Тогда в вашем списке таблиц появятся системные таблицы. Здесь представляют интерес две таблицы: MSysIMEXspecs и MSysIMEXColumns. Вы сможете редактировать информацию об импорте и экспорте. Удачи!

ответ Тима Лентина кажется правдой даже в полной версии. Есть еще одна вещь, которую я хотел бы упомянуть.

Если вы завершите импорт, не заходя в «Advanced . » и сохранив спецификацию, но сохраните импорт для повторного использования в конце работы мастера (новая функция AFAIK), вы не сможете вернуться и отредактировать спекуляция Он встроен в «Сохраненный импорт». Это может быть то, что имел в виду Нокс.

Вы можете, однако, сделать частичную работу вокруг:

  1. Импортировать новый файл (или тот же самый заново), но,
  2. На этот раз, чтобы добавить, а не делать новый
  3. Нажмите ОК.
  4. Перейдите в «расширенный» Все заголовки столбцов и типы данных будут там.
  5. Теперь вы можете внести необходимые изменения и сохранить спецификацию в этом диалоговом окне. Затем отмените импорт (это не то, что вы хотели в любом случае, верно?)
  6. Затем вы можете использовать эту спецификацию для дальнейшего импорта. Это не полное решение, но экономит часть работы.

Ниже приведены три функции, которые можно использовать для изменения и использования спецификации импорта MS Access 2010. Третья подпрограмма изменяет имя существующей спецификации импорта. Второй подпункт позволяет вам изменить любой текст XML в спецификации импорта. Это полезно, если вам нужно изменить имена столбцов, типы данных, добавить столбцы, изменить расположение файла импорта и т.д. По сути, все, что вы хотите изменить для существующей спецификации. Первый Sub - это подпрограмма, которая позволяет вам вызывать существующую спецификацию импорта, изменять ее для конкретного файла, который вы пытаетесь импортировать, импортируете этот файл, а затем удаляете измененную спецификацию, сохраняя «шаблон» спецификации импорта неизменным и неизменным. Наслаждаться.

Когда я хочу проверить или изменить спецификацию импорта/экспорта, я запрашиваю таблицы в MS Access, где спецификация определена.

Вы также можете использовать оператор UPDATE или INSERT, чтобы изменить существующие столбцы или вставить и добавить новые столбцы в существующую спецификацию. Используя эту методологию, вы можете создавать совершенно новые спецификации.

Еще одним отличным вариантом является бесплатный V-Tools надстройка для Microsoft Access. Среди других полезных инструментов есть форма для редактирования и сохранения спецификаций импорта/экспорта.

enter image description here

enter image description here

Примечание: Начиная с версии 1.83, существует ошибка при перечислении кодовых страниц в Windows 10. (Очевидно, из-за отсутствующей/измененной функции API в Windows 10) Инструменты по-прежнему работают отлично, вам просто нужно закомментировать строки кода или шаг за ним в окне отладки.

Это помогло мне спасти сложную спецификацию импорта для наших онлайн-заказов.

Почему так сложно?

Просто проверьте Системные объекты в Параметры доступа/Текущая база данных/Параметры навигации/Показать системные объекты

Откройте таблицу "MSysIMEXSpecs" и измените ее в соответствии с вашими потребностями - ее легко читать .

Я только что обнаружил явную ошибку во всей настройке Сохраненный импорт/XML в Access. Также разочарованный жесткостью системы сохраненного импорта, я создал формы и написал код для разделения XML, в котором хранятся спецификации сохраненного импорта, до такой степени, что я мог бы использовать этот инструмент для фактического создания сохраненного импорта с нуля с помощью кодированных экспертиза исходной книги Excel.

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

Вы можете попробовать это по своему усмотрению: импортировать электронную таблицу Excel с хотя бы одним именем заголовка столбца, заканчивающимся на «ID» («OrderID», «User ID» или просто «ID»). Во время процесса обязательно установите «Indexed» на «No» для этих столбцов. Выполните импорт и отметьте «Сохранить шаги импорта» в последнем диалоговом окне. Если вы просмотрите итоговый дизайн таблицы, то увидите, что в рассматриваемых полях нет индекса. Затем удалите таблицу, найдите сохраненный импорт и выполните его снова. На этот раз эти поля будут заданы как проиндексированные в дизайне таблицы, хотя XML все еще не указывает индекс.

Я дергал себя за волосы, пока не узнал, что происходит, сравнивая созданный с нуля XML-файл с примерами, созданными с помощью инструмента Access.

Ответ Тима Лентина сработает, если у вас сохранены ваши спецификации. В вашем вопросе это не указывалось, а только указывалось, что вы импортировали данные. Его метод не спасет ваши спецификации таким образом.

Чтобы сохранить спецификацию текущего импорта, нужно повторно открыть импорт, нажать «apend», и это позволит вам использовать текущие настройки импорта, которые выбрал MS Access. ( Это полезно, если вы хотите сохранить спецификации импорта в формате Excel, с которым вы работали до импорта в MS Access. )

Как только вы попали в опцию apend, используйте инструкции Тима, который использует расширенную опцию и «Сохранить как». Оттуда просто нажмите «Отмена», и теперь вы можете импортировать любые другие подобные данные в различные таблицы и т.д.

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this . Возьмем этот пример:

И в другом месте вашего кода:

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

3 ответа

Я в состоянии использовать эту функцию на своей машине с помощью Доступа MS 2007.

  • На Ленте, выберите Внешние Данные
  • Выбор опция
  • "Text File", которую Это отображает, Получать Внешний Мастер Данных
  • Определяют местоположение файла, который Вы хотите импортировать
  • , Нажимают "OK". Это отображается, "текстовый Мастер Импорта"
  • В нижней части этого диалогового экрана является кнопкой Advanced, на которую Вы сослались
  • , Нажатие на эту кнопку должно отобразить экран Import Specification и позволить Вам выбирать и изменять существующую спецификацию импорта.

Для того, что его ценность, я использую Доступ 2 007 SP1

Я не полагаю, что существует прямой поддерживаемый путь. Однако, если Вы являетесь разрозненными, затем под параметрами навигации, выберите для показа системных объектов. Тогда в Вашем списке таблицы, системные таблицы появятся. Две таблицы представляют интерес здесь: MSysIMEXspecs и MSysIMEXColumns. Вы будете в состоянии импорт редактирования и экспортируете информацию.Удачи!

Ответ Тима Лентина кажется верным даже в полной версии. Я хотел бы упомянуть еще одну вещь.

Если вы завершите импорт, не заходя в «Дополнительно . » и не сохраняя спецификацию, но сохраните импорт для повторного использования в конце мастера (новый особенность AFAIK), вы не сможете вернуться и отредактировать эту спецификацию. Он встроен в «Сохраненный импорт». Возможно, именно это имел в виду Нокс.

За время работы разработчиком Access набралась куча полезностей, которую считаю своим долгом выложить на Хабр. Многие из этих сниппетов находятся в сети, а некоторые находятся с трудом или безнадежно затеряны.




Указав в виде параметра 0 для отключения и 1 для включения.

2. Для того, чтобы защитить базу данных от посторонних глаз и разграничить права доступа используется файл рабочей группы ( формата .MDW ). Путь к файлу рабочей группы можно указать вручную, но если в сети много пользователей, то гораздо удобнее иметь файлик Access с кнопкой, по нажатию которой отрабатывает одна строка кода, задающая путь к MDW:

3. Не знаю, как бы я работал (наверное, работал бы так же, но гораздо медленнее), если бы не создал себе форму с поиском текста в содержимом запросов или форм. Очень часто необходимо производить какой-то рефакторинг или определять область применения таблицы или поля.

Для поиска по запросам поможет форма с кодом, который выполняет поиск в тексте запросов:


Для поиска по формам код немного объемнее:

4. Для того, чтобы сделать нашу работу чуть более солидной с точки зрения программирования и для возможности поиска ошибок при работе в режиме production на рабочей базе данных очень желательно добавить модуль VBA (tracing модуль) для записи происходящих событий в текстовый файл лога. Простая функция записи в текстовый файл будет очень полезна при отладке.

5. Этот код (из пункта 4) вполне можно вынести в отдельный файл базы данных Access и добавить во все существующие базы данных через References/Ссылки редактора VBA.

Если у вас имеется несколько файлов баз данных Access, то любой повторяющийся код можно вынести в отдельный файл. Единственное изменение, которое может быть необходимо сделать — в случае если в коде используется объект CurrentDb, то заменить его на CodeDb, дабы обращение шло к объектам той базы, которая используется в качестве хранителя общего кода.

image

6. Зачастую в запросах указывают в качестве параметра значение какого-либо поля открытой формы. Например, таким образом:


Но иногда необходимо указать параметр непосредственно в самом запросе. Сделать это можно так:


И далее из кода Access задать эти параметры и выполнить запрос:


Альтернативой может быть создание модуля VBA и добавление в него глобальной переменной, а также функции, возвращающей эту переменную.


Перед запуском запроса необходимо задать значение глобальной переменной (можно задать при открытии основной формы):


И в самом запросе указать параметром название возвращающей значение функции:

6.1 Этот способ получения параметра запроса можно использовать для частичного ограничения доступа к информации таблицы (в случае использования рабочей группы). При загрузке формы в зависимости от текущего пользователя установим значение глобальной переменной:


Далее установим запрет на просмотр и изменение таблицы demotable, а на запрос установим разрешение. Но так как запрос у нас использует таблицу, на которую нет прав, то данных он нам не вернет. Для того, чтобы он вернул данные необходимо к sql запроса добавить в конце
В результате пользователь Buh сможет иметь доступ ко всем строкам таблицы, а все остальные пользователи ко всем строкам за исключением первой 1000.

7. Для того, чтобы открыть форму из кода используется код:


В качестве «WhereCondition» можно указать условие, на какой записи формы необходимо её открыть (в случае, если форма привязана к данным). Указав, например, «ZakazID=56325», можно открыть форму именно со значением данных ZakazID равным 56325.

В качестве значения «OpenArgs» можно указать какие-либо параметры, которые на открываемой форме можно будет считать
в Private Sub Form_Load() с помощью Me.OpenArgs. Если необходимо передать несколько параметров, то можно передать их в виде текстовой строки, разделив символом. И далее в Private Sub Form_Load() разбить на части:

8. Многие забывают, что Access работает не только таблицами из файлов mdb/accdb, но и с таблицами других баз данных. Для экспорта уже существующих таблиц есть бесплатная утилита SQL Server Migration Assistant, хотя можно воспользоваться и встроенным функционалом или найти стороннее решение.

И напоследок небольшой хинт из разряда «Это знает каждый ребенок, но я вот этого не знал…»:

Знаете ли вы, что для того, чтобы при открытии файла Access не срабатывали макросы и не открывалась форма по умолчанию, необходимо держать нажатой клавишу Shift?

Читайте также: