Найти тему
Некто

Занятие 4. Поиск и замена данных в DBF на VBScript с использованием ADO и ADOX.

В этом задании Я покажу, как сделать поиск в dbf файле и заменить данные согласно этому поиску. Для этого будут применены InputBox и Popup. Все это будет делаться через ADOX, хотя это можно сделать и через ADO. Что удобней это приоритет, который выбираете сами. Строку подключения также можете выбирать, которая удобна.

Здесь, по сути, происходит заданный поиск последовательного доступа. Причем, поиск чем-то немного напоминает поиск данных как в EXCEL, но нет выбора из найденных строк. Просто происходит последовательный выбор найденных данных и замена их данными, которые будут указаны для этого. Также применяется фильтр в определении количества заменяемых данных. Запись можно пропустить и в режиме поиска перейти к другой записи. Можно остановить поиск. Данные для замены могут быть разными и задачи поиска могут быть тоже разными. Этот скрипт - демонстрация поиска и замены данных в dbf файле с использованием приглашений и подачи. Поиск происходит в столбце-колонки st2 и там же происходит замена. Для просмотра файла Я предоставил приложение WDBFVIEW.EXE

Предоставляю файл Adox4A.vbs

По ходу приложу некоторые комментарии.

'*******************************************************************

' Имя: Adox4A.vbs

' Язык: VBScript

' Описание: Поиск и замена в DBF файле

' ADO,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

'========== Проверка файла

Set cat = Createobject("ADOX.Catalog")

'+++++++++++++++++++++++++++++++++++++++++

cat.ActiveConnection = _

"Provider=Microsoft.Jet.OLEDB.4.0;" & _

"Data Source=" & SDefaultDir & ";" & _

"Extended Properties=dBase IV;"

'+++++

'Можно подключить строку Driver

' cat.ActiveConnection="Driver={Microsoft dBase Driver (*.dbf)};DBQ=" & SDefaultDir & ";Deleted=0;ReadOnly=0;Exclusive=1;"

'+++++

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

'======================================== Поиск всех данных по выборке

Set RSN=WScript.CreateObject("ADODB.Recordset")

strSQLDbf="SELECT * FROM " & NameFilSozDBF & " "

RSN.open strSQLDbf,oCon,2,2

RSN.Requery

'On Error Resume Next 'Проверка ошибок

NomPozRSN=0 'Начальный номер позиции

RSN.MoveFirst

Do until Trim(st2)<>""

'Применяем InputBox

' Вводим число 45 для поиска и последующей замены

TITLE ="Поиск в поле ST2"

StDn = InputBox("Файл" & vbCrLf & NameFilSozDBF & vbCrLf & "Записей " & KlRecsN & vbCrLf & vbCrLf & "Введите данные для поиска" , TITLE)

if IsEmpty(StDn) then

MsgBox "Вы нажали Отмена!"

' WshShell.Run SDefaultDir & "\WDBFVIEW.exe " & SDefaultDir & "\" & FilDbfIst & " ",1,True

WScript.Quit

end if

'================ Фильтр =========

RSN.filter="[st2]='" & StDn &"'" 'Если поле имеет целое значение то опострофы можно убрать

Kzap=RSN.RecordCount ' кол. отобранных записей

RSN.filter=0 ' Отменяет фильтр

'================ Фильтр =========

if trim(StDn)="" Then

WScript.Echo("Вы не сделали ввод. Продолжение - любая клавиша.")

else

'777777777777777777777777777777777777777777777777777777777

kFn=0 'Количество найденых строк

for i=1 to KlRecsN

if trim(Kzap)=0 then

wscript.echo("Нет таких данных!")

exit for

end if

RSN.Find "[st2] = '" & Trim(StDn) & "'",NomPozRSN, 1, 1

NomPozRSN=RSN.AbsolutePosition

'kkkkkkkkkkkkkkkkkkkkkkkkkkkk

if RSN.fields("st2")=StDn then

kFn=kFn+1

'Применяем InputBox Сделаем замену числа 45 числом 34

-2

TITLE ="Замена в поле ST2 величины " & StDn

StZam = InputBox("Всего данных " & Kzap & vbCrLf& "Строка " & NomPozRSN & vbCrLf& "По счету " & kFn & vbCrLf& "st2=" & StDn & vbCrLf & vbCrLf& "Введите новые данные для замены" , TITLE)

if IsEmpty(StZam) then

MsgBox "Вы нажали отмена поиска!"

exit for

end if

if trim(StZam)="" Then

WScript.Echo("Вы не сделали ввод. Продолжение - любая клавиша.")

exit for

else

St1Dem=RSN.Fields("st1").value

'Применяем Popup. Можно установить время, в течение которого будет отображаться всплывающее окно сообщения. Я не вводил время и если необходимо можете ввести.

-3

'По ходу показываем сопутствующие данные поиска. Делаем свой выбор.

BtnCode = WshShell.Popup("Всего данных " & Kzap & vbCrLf& "Замена " & StDn & " на " & StZam& vbCrLf & "Позиция строки " & NomPozRSN& vbCrLf & "По счету " & kFn& vbCrLf &_

"st2=" & StDn & vbCrLf & St1Dem & vbCrLf & vbCrLf & "Продолжить - повторить?",, "Ваш выбор:", 2 + 32)

'if BtnCode=-1 then 'Прервать по времени максимальной продолжительности отображения окна. Указывается в секундах.

' exit for

'end if

if BtnCode=3 then 'Прервать

exit for

end if

if BtnCode=4 then 'Продолжить

'++++++++++++++++++++++++++++++++++++++ Можно и так

'ImColSt=Cat.Tables(ImFilFilDbf).Columns.Item(2) 'работает

'ImColSt=Cat.Tables(ImFilFilDbf).Columns.Item("ST2") 'работает

'ImColSt=Cat.Tables(ImFilFilDbf).Columns(2).Name 'работает

'ImColSt=Cat.Tables(ImFilFilDbf).Columns(2) 'работает

'for jk=1 to Cat.Tables(ImFilFilDbf).Columns.Count

' if Cat.Tables(ImFilFilDbf).Columns(jk)="ST2" then

' ImColStr=jk

' exit for

' end if

' next

' jk=0

'RSN.Fields(ImColStr).value=StZam

'++++++++++++++++++++++++++++++++++++++

' RSN.Fields(2).value=StZam 'Можно и так

RSN.Fields("st2").value=StZam

RSN.Update

RSN.Requery

WshShell.Run SDefaultDir & "\WDBFVIEW.exe " & SDefaultDir & "\" & FilDbfIst & " ",1,True

end if

if BtnCode=5 then 'Игнорировать

' WScript.Echo("Пропустить")

end if

if Kzap=kFn then

wscript.echo("Поиск и замена закончена!")

exit for

end if

end if

end if

'kkkkkkkkkkkkkkkkkkkkkkkkkkkk

RSN.AbsolutePosition=NomPozRSN

NomPozRSN=RSN.AbsolutePosition

RSN.MoveNext

next

RSN.MoveFirst

NomPozRSN=RSN.AbsolutePosition

RSN.AbsolutePosition=NomPozRSN

'777777777777777777777777777777777777777777777777777777777

end if

Loop

'On Error goto 0

Set RSN = Nothing

RSN.close

Set RS = Nothing

RS.close

WScript.Quit

Остальное как обычно.

Перед запуском скрипта файл _222.dbf сохраните в другом каталоге для повторного применения, если случайно испортите или удалите. Файл WDBFVIEW.exe Я добавлю в эту подборку. Процесс поиска и замены данных в dbf файлов требует времени и зависит от объема файла и мощности компьютера.

Файлы сохранил в архив Занятие4.rar

Пробуйте.

Ссылка на файл https://disk.yandex.ru/d/i4FQljIyl47ASA

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