Найти в Дзене
Некто

Занятие 3. Вывод данных из DBF в создаваемый DBF на VBScript с использованием ADOX. Другой способ создания DBF.

В этом задании Я продемонстрирую работу вывод данных из одного 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 'Создается файл '========== Проверка фай

В этом задании Я продемонстрирую работу вывод данных из одного 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

Подписывайтесь на мой канал и ставьте лайки.