Индексирование dbf файлов для Exselя
вопрос.
Нельзя ли как нибуть индексировать базу данных что бы выстраивались по номеру попорядку (табельный номер) или скажем по алфавиту фамилий?
Помогите кто может.
Ведь в focspro или clipere или fox короче в DOSе там программеры ведь делают индексные файлы *.inx или *.ntx. Но как они их создают и как они с ними работаю я не знаю.
Поэтому обращаюсь за помощью.
Может нет так скажите что нету.
Ну что неужели никто не знает?
Может нет так скажите что нету.
Попробуй скинуть пост на:
http://forum.codenet.ru/forumdisplay.php?daysprune=30&forumid=52 (базы данных)
http://forum.codenet.ru/forumdisplay.php?daysprune=30&forumid=45 (Pascal - паскальщики частенько в dbf работают)
http://forum.codenet.ru/forumdisplay.php?daysprune=30&forumid=44 (Borland C Bilder - они тоже частенько с dbf работают)
'выгрузка в dbf
Dim wb As Workbook
Dim wsh As Worksheet
Dim i As Integer
Dim j, N, M As Integer
Dim str1, str2, str3 As String
Dim num As Double
Dim int1 As Long
Dim rst As Recordset 'набор данных
Dim cnt As Connection 'соединение
'dim tbl as ADODB.
Set wb = ActiveWorkbook
Set wsh = wb.Worksheets(1)
Set cnt = New Connection
'поле datasource - директория с dbf
cnt.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + _
"Data Source=d:\;Extended Properties=dBASE IV;Persist Security Info=False"
cnt.Open
'создание новой таблицы
'(при повторном запуске следующие две строки надо закомментить)
On Error GoTo a
cnt.Execute ("create table tbl1 (s1 varchar(30), s2 varchar(30))")
cnt.Execute ("create index tbl_s2 on tbl1 (s2)")
a:
Set rst = New Recordset
rst.Index = "tbl_s2"
rst.Open "tbl1", cnt, adOpenKeyset, adLockOptimistic, adCmdTableDirect
' If rst.Supports(adIndex) Then
' str1 = "supports"
' Else
' str1 = "does not supports"
' End If
'rst.Index
'цикл по строкам в excel'е
For i = 1 To 10
str1 = wsh.Cells(i, 1).Value
str2 = wsh.Cells(i, 2).Value
rst.AddNew
rst.Fields("s1").Value = str1
rst.Fields("s2").Value = str2
rst.Update 'сохранение изменений в dbf
Next i
rst.Close
cnt.Close
End Sub
Sub read_from_index_file()
Dim wb As Workbook
Dim wsh As Worksheet
Dim i As Integer
Dim j, N, M As Integer
Dim str1, str2, str3 As String
Dim num As Double
Dim int1 As Long
Dim rst As Recordset 'набор данных
Dim cnt As Connection 'соединение
'dim tbl as ADODB.
Set wb = ActiveWorkbook
Set wsh = wb.Worksheets(1)
Set cnt = New Connection
'поле datasource - директория с dbf
cnt.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + _
"Data Source=d:\;Extended Properties=dBASE IV;Persist Security Info=False"
cnt.Open
'создание новой таблицы
' cnt.Execute ("create table tbl1 (s1 varchar(30), s2 varchar(30))")
' cnt.Execute ("drop index tbl_s2 on tbl1")
' cnt.Execute ("create index tbl_s2 on tbl1 (s2)")
Set rst = New Recordset
rst.Index = "tbl_s2"
rst.CursorLocation = adUseServer
rst.Open "tbl1", cnt, adOpenKeyset, adLockOptimistic ', adCmdTableDirect
'цикл по строкам в excel'е
i = 1
rst.MoveFirst
While Not rst.EOF
str1 = rst.Fields("s1").Value
str2 = rst.Fields("s2").Value
wsh.Cells(i, 4).Value = str1
wsh.Cells(i, 5).Value = str2
rst.MoveNext
i = i + 1
Wend
rst.Close
cnt.Close
End Sub
можно, я делал индексы. ты, надеюсь, соединяешься с dbf-файлом через ado? то есть, создаёшь connection, затем получаешь recordset?.. так? какое значение поля "Extended Properties" в строке подключения?
Спасибо что ответили, вот только я подключаюсь к dbf файлом через DAO, через ADO я не знаю как, хотя книга есть по VB6 и там все подключения идут через ADO но что то я ни как не понял. Хотя в книге написано что ADO проще, легче, надежнее, удобнее чем DAO но что то ни как. Сейчас гляну пример что ты мне тут выложил и может быть разберусь. Ну все равно спасибо.
Спасибо.
cnt.Execute ("create index tbl_s2 on tbl1 (s2)")
(удобно смотреть синтаксис запросов в справке по access'у, напр. поищи CREATE INDEX) - тут можно указать рядом с полем, кот. в скобках, ASC или DESC - и будет сортировка по возрастанию или по убыванию соответственно.
как мне показалось, DAO позволяет работать только с ODBC-соединениями? или я не прав? чё-то у меня не получилось создать подключение к dbf-файлу без создание ODBC-записи (через панель управления). но в любом случае, смотри справку по DAO - там тоже должна быть процедура execute у объекта connection, а так же для выбора ранее созданого индекса присвой название индекса свойству index объекта connection
кстати, nice, покажи, как ты используя DAO соединяешься с таблицей dbf, пожалуста.
Зовут Иван лови не жалко. И тебе еще раз спосибо.
Да и еще надо библиотечку Microsoft DAO 6.0 Object Librari надо подключить.
Sub Conect()
Dim db As DAO.database 'база
Dim tbl As DAO.tabledef 'таблица
Dim fld As DAO.Field ' поле
Dim Rst As DAO.Recordset 'Набор записей для таблицы
Dim ws As Excel.Worksheet 'ссылка на рабочий лист
Dim Doctor As String
Dim x As Byte
' связываем объектные переменные
'Set ws = ThisWorkbook.Worksheets(1)
Set db = DBEngine.OpenDatabase("c:\stomat\", True, False, "DBASE IV;")
'формируем набор записей с листа
Set Rst = db.OpenRecordset("doctor.DBF", dbOpenTable)
With Rst
.MoveFirst
Do While .EOF = False
Doctor = .Fields(1) & " " & .Fields(2) & " " & .Fields(3) & " " & .Fields(4)
UserForm1.ListBox1.AddItem Doctor
.MoveNext
Loop
End With
'чистим память за собой
Set ws = Nothing
Set Rst = Nothing
db.Close
Set db = Nothing
End Sub
если чё, пиши на мне icq (155318453). я сам с этими VBA всего несколько месяцев вожусь..
А адрес дай.
привет! пиши на [email]savosin_sergey@oviont.mai.ru[/email] сделал индексы-то в DAO?
Что ты имел в виду DAO. Что можно и в DAO индексы сделать.
В твоем примере файл с индексом ты создавал кодом паралельно с основной базой. я же делал через дельфи 5 database destop создавал dbf. Подскажи как теперь к готовым базам создать индексы.
я думал, ты с базой общаешься из VBA... а в дельфи ты как базу используешь? через компоненты ado db? там тоже есть какие-то специальные функции создания индексов..
Я в дельфе только создаю базы данных (*.dbf) в Database Desktop и все я его там не использую.
Просто в Database Desktop очень удобная среда для создания баз данных.
ну чё, выполни комманду "create index <имя_идекса> on <имя_таблицы> (определение индекса..)" -- смотри справку по sql-ю (например, в помощи к access'у). а выполнить можешь, наприме, так: db.execute "create index...", где db - объект database из твоего примера.
Нет ни сделал. В ADO переделывать, слишком много уже сделано а для DAO я что то не нашел в Accese ничего и решил что обойдусь без сортировки. А потом буду версии долбить одну за одной. Сейчас попробую db.execute "create index..." а что значат точки
create index <имя_индекса> on <имя_таблицы> (<поле> [asc|desc])[, <поле> [asc|desc][,...]])
где
asc или desc - сортировать по возрастанию или по убыванию (по умолчанию - asc);
многоточие указывает на то, что полей в определении индеска может быть несколько.
Пример:
CREATE INDEX newIndex ON people (pname, phone DESC)
(размер букв без разницы здесь)
удалить имеющийся индекс можно коммандой drop index (например, запустить через execute(..)), пример:
DROP INDEX newIndex ON people
воооооот.
хы-хы,
Спасибо