Преобразование файла Foxpro .dbf в Excel через доступ к MS

Итак, в настоящее время я пытаюсь преобразовать таблицу foxpro .dbf из системы mrp, которую использует моя компания (PCMRP), в электронную таблицу Excel через мое приложение Access, используя ADO и соединение ODBC. Я получаю следующую ошибку: Не удалось найти файл «C:\users\temp\PartMast.mdb». См. код ниже. Я никоим образом не ссылаюсь на PartMast.mdb в своем коде. При отладке сбивается строка docmd.transferspreadsheet. Я думаю, это связано с tempQueryforExport, потому что, когда код останавливается на строке docmd.transferspreadsheet, запрос отображается в объектах доступа на левой панели. Когда я пытаюсь запустить этот запрос, он выдает ту же ошибку. Есть идеи, почему это происходит/как это исправить?

Private Sub Command1_Click()
Dim strconnect As String
Dim cn As ADODB.Connection
Dim dbfFolder As String
Dim rs As ADODB.Recordset
Dim SQL As String
Set cn = New ADODB.Connection
Dim tempqueryname As String
Dim db As Database
Dim qdf As QueryDef
tempqueryname = "tmpQueryforExport"
dbfFolder = "C:\Users\temp\PC MRP"
strconnect = "DSN=pcMRPVFP;SourceDB=u:\PC MRP;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;"

filename = "PARTMAST.dbf"
Set cn = New ADODB.Connection
cn.Open strconnect
cn.Execute "SET REPROCESS TO 10 SECONDS"
Set rs = New ADODB.Recordset
SQL = "SELECT * from PartMast.dbf order by partno;"
rs.Open SQL, cn
Set db = CurrentDb
Set qdf = db.CreateQueryDef(tempqueryname)
qdf.SQL = SQL
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, tempqueryname, dbfFolder & "\" & Left(filename, 8) & ".xls", 1

rs.Close
Set rs = Nothing
Set cn = Nothing
db.QueryDefs.Delete tempqueryname
Set qdf = Nothing
Set db = Nothing




End Sub

Я бы попытался создать связанную таблицу из Access. Как только это сработает, код Access и VBA просто увидит таблицу как стандартную таблицу Access. Access по-прежнему поддерживает таблицы базы данных, и если вы можете связать таблицу, то перенос в таблицу Access или даже перенос в Excel становится довольно простым.

Albert D. Kallal 26.06.2024 19:49

@Альберт Д. Каллал Я единственный, у кого установлен драйвер odbc VFP9, необходимый для создания связанной таблицы. Идея заключалась в том, чтобы запускать это ежедневно утром (со своего компьютера) и хранить файлы Excel в общем месте, чтобы все остальные в компании могли получить доступ к данным без драйвера odbc. Я согласен, что связанная таблица — это лучший вариант, но по какой-то причине мне не удалось убедить власть имущих установить драйверы на все устройства, которым это понадобится. Похоже, что для ИТ-специалистов будет простой задачей удаленно подключиться и настроить драйверы. Это мой способ обхода

Tbure90 26.06.2024 20:19

Очень хорошо. Без сомнения, Excel — это настоящий швейцарский армейский нож, который может читать xml, json, dBase и практически все, что есть на планете Земля. Я бы попробовал выполнить связывание с помощью встроенного драйвера Access dBase — если он работает, то вы можете отказаться от использования Excel в этом процессе. Если требуется драйвер VFP, вы все равно можете использовать команду переноса базы данных из связанной таблицы в реальные таблицы в Access. С этого момента вы работаете с таблицами Access. Однако, если вас устраивают полученные данные Excel, то это тоже нормально. Я бы протестировал/попробовал встроенный драйвер dBase/Access.

Albert D. Kallal 26.06.2024 21:25

@AlbertD.Kallal собственный драйвер Dbase для доступа не работает для этих таблиц, для доступа к таблицам .dbf необходимо установить драйвер odbc fox pro. Я мог бы попробовать вашу идею с базой данных переноса, я уверен, что она сработает. Но я все еще хочу выяснить, почему мой код не работает, если по какой-либо причине мне придется экспортировать его, чтобы преуспеть в будущем. Я знаю, что строка подключения работает, потому что я проверил первую запись в наборе записей через msgbox(), и она показала правильное значение. Просто не знаю, почему он ищет PartMast.mdb, хотя моя исходная таблица — PartMast.dbf (см. имя файла в коде)

Tbure90 26.06.2024 22:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, я понял, где я ошибся... полностью забудьте набор записей ADO. Я не передавал строку подключения ODBC в свой запрос.....

См. рабочий код ниже:

Private Sub Command1_Click()

Dim dbfFolder As String
Dim SQL As String
Dim tempqueryname As String
Dim db As Database
Dim qdf As QueryDef

tempqueryname = "tmpQueryforExport"
dbfFolder = "C:\Users\tburell\temp\PC MRP"
SQL = "SELECT * from PartMast.dbf order by partno;"

Set db = CurrentDb
On Error Resume Next
    db.QueryDefs.Delete tempqueryname
On Error GoTo 0

Set qdf = db.CreateQueryDef(tempqueryname)
qdf.Connect = "ODBC;DSN=pcMRPVFP;SourceDB=u:\PC MRP;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;"
qdf.SQL = SQL 

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, tempqueryname, dbfFolder & "\" & Left(filename, 8) & ".xls", 1

db.QueryDefs.Delete tempqueryname
Set qdf = Nothing
Set db = Nothing
end sub

Для людей, которые борются со строкой ODBC, я связал таблицу вручную для доступа, открыл таблицу в режиме конструктора, скопировал строку из поля «описание» на листе свойств таблицы, а затем вставил ее в свой код.

Если вы получили строку, используя метод, который я только что описал, и хотите создать соединение с каталогом таблицы, а не с конкретной таблицей, просто удалите все после «Deleted = Yes;». См. ниже:

ниже создаёт подключение только к таблице «партмаст»

"ODBC;DSN=pcMRPVFP;SourceDB=u:\PC MRP;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;;TABLE=partmast"

ниже создается соединение с U:\PCMRP, который представляет собой каталог, содержащий все мои файлы .dbf.

"ODBC;DSN=pcMRPVFP;SourceDB=u:\PC MRP;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;"

последняя строка подключения позволяет вам использовать одну и ту же строку подключения для разных таблиц в этом каталоге (в моем случае «U:/pcmrp»), просто измените строку SQL, используемую для определения вашего запроса, для выбора разных таблиц из этого каталога.

Другие вопросы по теме