Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Индексирование dbf файлов для Exselя

438
14 апреля 2004 года
nice
103 / / 13.10.2003
В Exsel-е я сделал формы в которые вводятся данные, потом я кодом сохраняю в dbf файлы, а теперь оказалось что как я сохраняю (добавил пустую строку, потом в вел данные, а потом сделал update базы данных) так и выглядит на самом деле.
вопрос.
Нельзя ли как нибуть индексировать базу данных что бы выстраивались по номеру попорядку (табельный номер) или скажем по алфавиту фамилий?
Помогите кто может.
Ведь в focspro или clipere или fox короче в DOSе там программеры ведь делают индексные файлы *.inx или *.ntx. Но как они их создают и как они с ними работаю я не знаю.
Поэтому обращаюсь за помощью.
438
15 апреля 2004 года
nice
103 / / 13.10.2003
Ну что неужели никто не знает?
Может нет так скажите что нету.
266
15 апреля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by nice
Ну что неужели никто не знает?
Может нет так скажите что нету.


Попробуй скинуть пост на:
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 работают)

6.2K
15 апреля 2004 года
savosin_sergey
28 / / 08.04.2004
можно, я делал индексы. ты, надеюсь, соединяешься с dbf-файлом через ado? то есть, создаёшь connection, затем получаешь recordset?.. так? какое значение поля "Extended Properties" в строке подключения?
6.2K
15 апреля 2004 года
savosin_sergey
28 / / 08.04.2004
посмотри прикреплённый файл. там две функции (и две кнопки) - одна создаёт и заполняет файл данными со страницы, вторая извлекает данные из dbf с использованием индекса и запихивает их обратно на лист (чуть правее исходный данных)
6.2K
15 апреля 2004 года
savosin_sergey
28 / / 08.04.2004
Sub save_to_file_with_index()
'выгрузка в 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
438
16 апреля 2004 года
nice
103 / / 13.10.2003
Цитата:
Originally posted by savosin_sergey
можно, я делал индексы. ты, надеюсь, соединяешься с dbf-файлом через ado? то есть, создаёшь connection, затем получаешь recordset?.. так? какое значение поля "Extended Properties" в строке подключения?


Спасибо что ответили, вот только я подключаюсь к dbf файлом через DAO, через ADO я не знаю как, хотя книга есть по VB6 и там все подключения идут через ADO но что то я ни как не понял. Хотя в книге написано что ADO проще, легче, надежнее, удобнее чем DAO но что то ни как. Сейчас гляну пример что ты мне тут выложил и может быть разберусь. Ну все равно спасибо.

438
16 апреля 2004 года
nice
103 / / 13.10.2003
Все очень красиво, но покажи где ты задаешь индекс по второму полю, и как отличить по алфавиту, по возрастанию цифр, или по убыванию.
Спасибо.
6.2K
16 апреля 2004 года
savosin_sergey
28 / / 08.04.2004
индекс я создаю запуском соответствующего SQL-запроса с помощью комманды execute объекта connection:
cnt.Execute ("create index tbl_s2 on tbl1 (s2)")
(удобно смотреть синтаксис запросов в справке по access'у, напр. поищи CREATE INDEX) - тут можно указать рядом с полем, кот. в скобках, ASC или DESC - и будет сортировка по возрастанию или по убыванию соответственно.
как мне показалось, DAO позволяет работать только с ODBC-соединениями? или я не прав? чё-то у меня не получилось создать подключение к dbf-файлу без создание ODBC-записи (через панель управления). но в любом случае, смотри справку по DAO - там тоже должна быть процедура execute у объекта connection, а так же для выбора ранее созданого индекса присвой название индекса свойству index объекта connection
6.2K
16 апреля 2004 года
savosin_sergey
28 / / 08.04.2004
кстати, nice, покажи, как ты используя DAO соединяешься с таблицей dbf, пожалуста.
438
16 апреля 2004 года
nice
103 / / 13.10.2003
Цитата:
Originally posted by savosin_sergey
кстати, 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

6.2K
16 апреля 2004 года
savosin_sergey
28 / / 08.04.2004
если чё, пиши на мне icq (155318453). я сам с этими VBA всего несколько месяцев вожусь..
438
16 апреля 2004 года
nice
103 / / 13.10.2003
Цитата:
Originally posted by savosin_sergey
если чё, пиши на мне icq (155318453). я сам с этими VBA всего несколько месяцев вожусь..


А адрес дай.

6.2K
19 апреля 2004 года
savosin_sergey
28 / / 08.04.2004
привет! пиши на [email]savosin_sergey@oviont.mai.ru[/email] сделал индексы-то в DAO?
438
19 апреля 2004 года
nice
103 / / 13.10.2003
Цитата:
Originally posted by savosin_sergey
привет! пиши на [email]savosin_sergey@oviont.mai.ru[/email] сделал индексы-то в DAO?


Что ты имел в виду DAO. Что можно и в DAO индексы сделать.
В твоем примере файл с индексом ты создавал кодом паралельно с основной базой. я же делал через дельфи 5 database destop создавал dbf. Подскажи как теперь к готовым базам создать индексы.

6.2K
19 апреля 2004 года
savosin_sergey
28 / / 08.04.2004
для создания индекса надо (можно) каким-то макаром выполнить комманду "create index..." в текущей области/соединении, не важно откуда - из ADO или DAO. странно, я думал, ты с базой общаешься из VBA... а в дельфи ты как базу используешь? через компоненты ado db? там тоже есть какие-то специальные функции создания индексов..
438
20 апреля 2004 года
nice
103 / / 13.10.2003
Цитата:
Originally posted by savosin_sergey
я думал, ты с базой общаешься из VBA... а в дельфи ты как базу используешь? через компоненты ado db? там тоже есть какие-то специальные функции создания индексов..


Я в дельфе только создаю базы данных (*.dbf) в Database Desktop и все я его там не использую.
Просто в Database Desktop очень удобная среда для создания баз данных.

6.2K
21 апреля 2004 года
savosin_sergey
28 / / 08.04.2004
ну чё, выполни комманду "create index <имя_идекса> on <имя_таблицы> (определение индекса..)" -- смотри справку по sql-ю (например, в помощи к access'у). а выполнить можешь, наприме, так: db.execute "create index...", где db - объект database из твоего примера.
438
22 апреля 2004 года
nice
103 / / 13.10.2003
Цитата:
Originally posted by savosin_sergey
ну чё, выполни комманду "create index <имя_идекса> on <имя_таблицы> (определение индекса..)" -- смотри справку по sql-ю (например, в помощи к access'у). а выполнить можешь, наприме, так: db.execute "create index...", где db - объект database из твоего примера.


Нет ни сделал. В ADO переделывать, слишком много уже сделано а для DAO я что то не нашел в Accese ничего и решил что обойдусь без сортировки. А потом буду версии долбить одну за одной. Сейчас попробую db.execute "create index..." а что значат точки

6.2K
22 апреля 2004 года
savosin_sergey
28 / / 08.04.2004
хы-хы, (привет, Иван), точки значат "смотри документацию". у тебя помошь в access'е есть? набери там в предметном указателе фразу "create index", и в теме с таким названием написано, как пользоваться 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

воооооот.
438
22 апреля 2004 года
nice
103 / / 13.10.2003
Цитата:
Originally posted by savosin_sergey
хы-хы,


Спасибо

6.2K
23 апреля 2004 года
savosin_sergey
28 / / 08.04.2004
не получится, Иван, пиши мне на мыло - обсудим!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог