В этом задании Я продемонстрирую работу вывод данных из одного dbf файла в другой на VBScript с помощью ADOX. Также расскажу про еще способ создания dbf файла. Работа с полями. Данные можно добавлять в dbf файл и даже по определенным полям. Для просмотра файла Я предоставил приложение WDBFVIEW.EXE. Это приложение запускается командой WshShell.Run
Предоставляю файл Adox3A.vbs
По ходу приложу некоторые комментарии.
'*******************************************************************
' Имя: Adox3A.vbs
' Язык: VBScript
' Описание: Вывод данных из DBF файла в создаваемый DBF файл
' ADOX
'*******************************************************************
Set WshShell=WScript.CreateObject("WScript.Shell")
SDefaultDir=WshShell.CurrentDirectory
Set FSO = CreateObject("Scripting.FileSystemObject")
'===== Есть файл
FilDbfIst="_222.dbf"
PosS=InStr(1,FilDbfIst, UCase(".dbf"), 1)
ImFilFilDbf=Mid(FilDbfIst,1,PosS-1)
NameFilSozDBF=SDefaultDir & "\" & FilDbfIst 'Создается файл
'========== Проверка файла
If FSO.FileExists(NameFilSozDBF) Then
else
MsgBox "Нет файла "&NameFilSozDBF
WScript.Quit
end if
'========== Проверка файла
'==== Создаем файл
NewTableSoz="_333.dbf"
PosS=InStr(1,NewTableSoz, UCase(".dbf"), 1)
NewTablDbf=Mid(NewTableSoz,1,PosS-1)
NewTablelSozDBF=SDefaultDir & "\" & NewTableSoz 'Создается файл
'=========== Проверка файла
If FSO.FileExists(NewTablelSozDBF) Then
' MsgBox "Файл есть! Удаляем"
FSO.DeleteFile NewTablelSozDBF
End if
'========== Проверка файла
Set cat = Createobject("ADOX.Catalog")
'+++++++++++++++++++++++++++++++++++++++++
cat.ActiveConnection = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & SDefaultDir & ";" & _
"Extended Properties=dBase IV;"
Set oCon = cat.ActiveConnection
oCon.CursorLocation = 3
strSQLdbf="SELECT * FROM " & NameFilSozDBF & " "
Set RS = oCon.Execute(strSQLdbf)
KlFieldsN = RS.Fields.count
KlRecsN=RS.RecordCount
if KlRecsN<=0 then
WScript.Echo("В файле " & NameFilSozDBF & " нет записей")
WScript.Quit
end if
'=================== Максимальное значение поля в DBF ==========
ReDim MassDL(KlFieldsN-1),MassType(KlFieldsN-1)
for i=0 to KlFieldsN-1
st=RS.Fields(i).Name
MassType(i)=RS.Fields(i).Type
strSQLnn="SELECT Max(Len(" & st & ")) FROM " & NameFilSozDBF & " "
set RSQQ = oCon.Execute(strSQLnn)
v=RSQQ.Fields (0).Value
if IsEmpty(v) then
v=9
end if
if IsNull(v) then
v=9
end if
if v="" then
v=254
end if
if v=0 then
v=9
end if
MassDL(i)=v
v=""
next
v=0
RSQQ.Close
Set RSQQ = Nothing
'=================== Максимальное значение поля в DBF ==========
Вот здесь указан другой способ создания файла. Создается файл _333.dbf
Set NewTable= Createobject("ADOX.Table")
NewTable.name=NewTablDbf
cat.Tables.Append NewTable
for i=0 to KlFieldsN-1
Set col = Createobject("ADOX.Column")
col.Name="st"&i
stDL=MassDL(i)
stType=MassType(i)
col.DefinedSize=stDL
col.Type=stType 'Можете указывать, а можете нет
cat.Tables(NewTable.name).Columns.Append col
next
Можете добавить Erase MassDL и Erase MassType
При таком способе создается файл с одним полем M_s_o_f_t
Его нельзя сразу удалить, но можно переименовать. Это поле можно удалить, когда добавили поле или набор полей.
' Удаляем m_s_o_f_t
' cat.Tables(NewTable.name).Columns.Delete "m_s_o_f_t" 'Работает
' или так
Set MyColumn = Cat.Tables(NewTable.name).Columns(0) 'работает
ImColStl=MyColumn.Name
cat.Tables(NewTable.name).Columns.Delete MyColumn.Name
' или переименовываем
'MyColumn.Name="str5" 'Работает
'Вводим новое поле
oCon.Execute("ALTER TABLE " & NewTable.name & " ADD COLUMN str10 CHAR(15)")
' или
'Добавление нового поля 1
Set col = Createobject("ADOX.Column")
col.Name="str6"
col.DefinedSize="30" 'Правильно
col.Type="202" 'Правильно текстовое пространство
cat.Tables(NewTable.name).Columns.Append col
'Добавление нового поля 2
Set col = Createobject("ADOX.Column")
col.Name="str7"
col.DefinedSize="30" 'Можно для текста
'---------Допустимые типы полей
'col.Type="128" 'Текст
'col.Type="11" 'Логическое True или False (по умолчанию)
'col.Type="6" 'Целое 20 и 5
'col.Type="7" 'Дата
'col.Type="72" 'Текст
'col.Type="3" 'Целое 20 и 5
'col.Type="205" 'MEMO поле
'col.Type="2" 'Целое 20 и 5
'col.Type="17" 'Целое 20 и 5
'col.Type="130" 'Текст
'col.Type="4" 'Целое 20 и 5 после запятой
'col.Type="203" 'MEMO поле
'col.Type="3" 'Целое 20 и 5
'col.Type="5" 'Целое 20 и 5
'col.Type="204" 'Текст
col.Type="202" 'Текстовое пространство
cat.Tables(NewTable.name).Columns.Append col
'Тут же удаляем
cat.Tables(NewTable.name).Columns.Delete col.name
Set RSN=WScript.CreateObject("ADODB.Recordset")
‘strSQLnewDbf=" " & NewTable.name & " "
или
strSQLnewDbf="SELECT * FROM " & NewTable.name & " "
RSN.open strSQLnewDbf,oCon,2,2
RSN.Requery
А вот здесь самое интересное. Нам необходимо добавить данные только из тех полей, которые присутствуют в dbf файле, и из которых мы добавляем данные. Конечно, можно посчитать порядок этих полей или ввести их имена. Это не так удобно. Вот здесь и приходит помощь ADOX. Применяем понятие Cat.Tables(NewTablDbf).Columns(j).Name
Хотите, подумайте, как это сделать вот в таком фрагменте
for i=1 to KlRecsN
vvv="'"
for j=0 to KlFieldsN-1
st=RS.Fields(j)
if j=KlFieldsN-1 then
vvv=vvv & st & "'"
else
vvv=vvv & st & "'" & "," & "'"
end if
next
SQL="insert into " & NewTableSoz & " values(" & vvv & ")"
oCon.Execute(SQL)
RS.MoveNext
next
Это также можно сделать, но что быстрее и эффективнее зависит от многих факторов работы.
RS.MoveFirst
for i=1 to KlRecsN
RSN.AddNew
for j=0 to KlFieldsN-1
st=RS.Fields(j)
stName=RS.Fields(j).Name
stTbl=Cat.Tables(NewTablDbf).Columns(j).Name
if stName=Ucase(stTbl) then
RSN.Fields(j).value=st
end if
next
RS.MoveNext
next
WshShell.Run SDefaultDir & "\WDBFVIEW.exe " & SDefaultDir & "\" & NewTableSoz & " ",1,True
Здесь после просмотра также можно удалить dbf файл, как и вначале. Если это необходимо.
'strSQlDelNlist="DROP TABLE " & NewTable.name & " " ' Удаляем файл
'oCon.Execute(strSQlDelNlist)
Set col = Nothing
Set cat = Nothing
Set oCon = Nothing
RS.close
Set RS = Nothing
WScript.Quit
'Можно просматривать dbf файл с помощью программы WDBFVIEW.exe
'Просмотр в программе
WshShell.Run SDefaultDir & "\WDBFVIEW.exe " & SDefaultDir & "\" & NewTableSoz & " ",1,True
end if
Остальное как обычно.
Потом можете перевести в текстовый файл или в EXCEL.
Перед запуском скриптов файл _222.dbf сохраните в другом каталоге для повторного применения, если случайно испортите или удалите. Файл _333.dbf создается во время работы. Файл WDBFVIEW.exe Я еще раньше сохранял, но для удобства добавлю в эту подборку. Процесс ввода данных в dbf файлов требует времени и зависит от объема файла и мощности компьютера.
Файлы сохранил в архив Занятие3.rar
Пробуйте.
Ссылка на файл https://disk.yandex.ru/d/UGBTVX79VwbwHg
Подписывайтесь на мой канал и ставьте лайки.