Итак, в настоящее время я пытаюсь преобразовать таблицу 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
@Альберт Д. Каллал Я единственный, у кого установлен драйвер odbc VFP9, необходимый для создания связанной таблицы. Идея заключалась в том, чтобы запускать это ежедневно утром (со своего компьютера) и хранить файлы Excel в общем месте, чтобы все остальные в компании могли получить доступ к данным без драйвера odbc. Я согласен, что связанная таблица — это лучший вариант, но по какой-то причине мне не удалось убедить власть имущих установить драйверы на все устройства, которым это понадобится. Похоже, что для ИТ-специалистов будет простой задачей удаленно подключиться и настроить драйверы. Это мой способ обхода
Очень хорошо. Без сомнения, Excel — это настоящий швейцарский армейский нож, который может читать xml, json, dBase и практически все, что есть на планете Земля. Я бы попробовал выполнить связывание с помощью встроенного драйвера Access dBase — если он работает, то вы можете отказаться от использования Excel в этом процессе. Если требуется драйвер VFP, вы все равно можете использовать команду переноса базы данных из связанной таблицы в реальные таблицы в Access. С этого момента вы работаете с таблицами Access. Однако, если вас устраивают полученные данные Excel, то это тоже нормально. Я бы протестировал/попробовал встроенный драйвер dBase/Access.
@AlbertD.Kallal собственный драйвер Dbase для доступа не работает для этих таблиц, для доступа к таблицам .dbf необходимо установить драйвер odbc fox pro. Я мог бы попробовать вашу идею с базой данных переноса, я уверен, что она сработает. Но я все еще хочу выяснить, почему мой код не работает, если по какой-либо причине мне придется экспортировать его, чтобы преуспеть в будущем. Я знаю, что строка подключения работает, потому что я проверил первую запись в наборе записей через msgbox(), и она показала правильное значение. Просто не знаю, почему он ищет PartMast.mdb, хотя моя исходная таблица — PartMast.dbf (см. имя файла в коде)
Итак, я понял, где я ошибся... полностью забудьте набор записей 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, используемую для определения вашего запроса, для выбора разных таблиц из этого каталога.
Я бы попытался создать связанную таблицу из Access. Как только это сработает, код Access и VBA просто увидит таблицу как стандартную таблицу Access. Access по-прежнему поддерживает таблицы базы данных, и если вы можете связать таблицу, то перенос в таблицу Access или даже перенос в Excel становится довольно простым.