DAO обленился

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Went
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 103
Зарегистрирован: 01.09.2004 (Ср) 17:25
Откуда: Rostov-on-Don

DAO обленился

Сообщение Went » 26.07.2010 (Пн) 11:50

Вопрос такой, есть таблица типа:
Код: Выделить всё
Table (ID1 LONG NOT NULL PRIMARY KEY, ID2 LONG, Data TEXT)

где ID1 - просто внутренний номер, ID2 - идентификатор местоположения (что-то вроде складской базы). В одном местоположении могут лежать несколько предметов.
ID1 раздется случайно. Нужно отсортировать по местоположению, то есть по ID2. Запрос типа
Код: Выделить всё
SELECT * FROM Table ORDER BY ID2

выглядит абсолютно идентично запросу
Код: Выделить всё
SELECT * FROM Table

отсортированному по ID1, что явно ненормально. Вопрос, что нужно изменить в запросе/декларации таблицы или еще чем, чтобы сортировка по ID2 работала?
Система VB 6
DAO v3.6
База Access

Примечание:
Идентификаторы раздаются случайно (так положено). ID2 могут повторяться (по сути - ссылки на другую таблицу с перечнем местоположений). При использовании GROUP BY вместо ORDER BY ругается на выборку методом *.
Нужно сделать так, чтобы он отсортировал именно по ID2, то есть грубо говоря, весь список был разбит на части по местоположению. Надеюсь, понятно.
Не все ОПЕРАТОРЫ одинаково хороши

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: DAO обленился

Сообщение alibek » 26.07.2010 (Пн) 12:00

Сделай сжатие и восстановление базы данных.
При запросе без ORDER BY записи возвращаются в порядке физического размещения или сортируются по основному ключу, если он есть.
Lasciate ogni speranza, voi ch'entrate.

Went
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 103
Зарегистрирован: 01.09.2004 (Ср) 17:25
Откуда: Rostov-on-Don

Re: DAO обленился

Сообщение Went » 26.07.2010 (Пн) 12:16

При запросе без ORDER BY записи возвращаются в порядке физического размещения или сортируются по основному ключу, если он есть.

Я в курсе. У меня основной ключ (если приглядеться к декларации таблицы).

Сделай сжатие и восстановление базы данных.

Прошу прощения, а программно это как сделать?
А то попробовал это сделать аксессом принудительно - не помогло (((

А вообще странно, тот же самый запрос, слово-в-слово к той же базе, но открытой в Аксессе (через SQL) выдал мне нормальный, отсортированный результат. Такое ощущение, что неверно открываю рекордсет.
Какие нужны там опции, чтобы нормально работало?? А то у меня это выглядит просто:
Код: Выделить всё
Set rsHardWare = MainBase.OpenRecordset("SELECT * FROM Table ORDER BY ID2")
Не все ОПЕРАТОРЫ одинаково хороши

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: DAO обленился

Сообщение Денис » 26.07.2010 (Пн) 13:12

DAO обленился

DAO устарел. Морально. Году эдак в 1995. Извините за оффтоп.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: DAO обленился

Сообщение alibek » 26.07.2010 (Пн) 13:12

Зачем программно? Это разовая операция.
Но если так хочется, то можешь попробовать так:

Код: Выделить всё
Const Provider = "Microsoft.Jet.OLEDB.4.0"
Const PathMDB = "C:\WORK\VBProgs\Totalizator\PrepaidService\prepaiddb.mdb"

Dim jro, cnn, fso, file, sSource, sDestination, fSuccess, ErrMsg
Dim BasePath, BaseName, BaseTemp
Dim I
I = InstrRev(PathMDB, "\")
BasePath = Left(PathMDB, I)
BaseName = Mid(PathMDB, I+1)
BaseTemp = "~compact.mdb"
Set cnn = CreateObject("ADODB.Connection")
cnn.Provider = Provider
cnn.Properties("Data Source") = BasePath & BaseName
sSource = cnn.ConnectionString
cnn.Properties("Data Source") = BasePath & BaseTemp
sDestination = cnn.ConnectionString
Set cnn = Nothing
Set jro = CreateObject("JRO.JetEngine")
On Error Resume Next
jro.CompactDatabase sSource, sDestination
fSuccess = (Err.Number = 0)
ErrMsg = Err.Description
On Error GoTo 0
Set jro = Nothing
If fSuccess Then
  Set fso = CreateObject("Scripting.FileSystemObject")
  If fso.FileExists(BasePath & BaseName) Then fso.DeleteFile BasePath & BaseName
  Set file = fso.GetFile(BasePath & BaseTemp)
  file.Name = BaseName
  Set file = Nothing
  MsgBox "Сжатие базы данных завершено."
  Set fso = Nothing
Else
  MsgBox "Не удалось выполнить сжатие базы данных." & vbNewLine & ErrMsg
End If


Это через ADO, в DAO есть метод CompactDatabase.
Lasciate ogni speranza, voi ch'entrate.

Went
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 103
Зарегистрирован: 01.09.2004 (Ср) 17:25
Откуда: Rostov-on-Don

Re: DAO обленился

Сообщение Went » 26.07.2010 (Пн) 13:22

Денис писал(а):DAO устарел. Морально. Году эдак в 1995. Извините за оффтоп.

Работаю на проверенном и привычном.

alibek писал(а):Зачем программно? Это разовая операция.

Ясно. Я пропустил ее через Аксесс, сжал и восстановил - а толку ноль.

Вопрос в том, какие опции надо приписать при открытии рекордсета? А то Аксесс в ответ НА ТОТ ЖЕ SQL-запрос выдал нужный результат. Я рекордсет открываю самым тупым образом и, походу, это меня и подводит:
Код: Выделить всё
Set rsHardWare = MainBase.OpenRecordset("SELECT * FROM Table ORDER BY ID2")
Не все ОПЕРАТОРЫ одинаково хороши

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: DAO обленился

Сообщение alibek » 26.07.2010 (Пн) 13:32

Никаких опций не надо.
Если не сортирует, то значит глюки в базе или в DAO.
Строку подключения покажи.
Lasciate ogni speranza, voi ch'entrate.

Went
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 103
Зарегистрирован: 01.09.2004 (Ср) 17:25
Откуда: Rostov-on-Don

Re: DAO обленился

Сообщение Went » 26.07.2010 (Пн) 13:41

Код: Выделить всё
Set MainBase = DBEngine.OpenDatabase(AppPath + "\Base\BaseR.mdb", False, False, ";PWD=" + BaseKey)
Не все ОПЕРАТОРЫ одинаково хороши

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: DAO обленился

Сообщение alibek » 26.07.2010 (Пн) 13:46

Попробуй пересоздать индекс.
Или создать пустую базу и перенести в нее данные из текущей.
Lasciate ogni speranza, voi ch'entrate.

Went
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 103
Зарегистрирован: 01.09.2004 (Ср) 17:25
Откуда: Rostov-on-Don

Re: DAO обленился

Сообщение Went » 26.07.2010 (Пн) 14:35

Индекс? Сорри, не совсем понял. Объясните, пожалуйста
Не все ОПЕРАТОРЫ одинаково хороши

Went
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 103
Зарегистрирован: 01.09.2004 (Ср) 17:25
Откуда: Rostov-on-Don

Re: DAO обленился

Сообщение Went » 27.07.2010 (Вт) 9:47

Проблема решена. Я очень извиняюсь, там был реально мой косяк. Да, вначале он реально не сортировал. В рекордсете указал тип Dynaset - стал сортировать, а в таблице все равно выдавал несортированный. А причина была в том, что для получения ай-ди-шников по номеру записи временно открывал еще один рекордсет и без сортировки, он в итоге по нему и выдавал. Там когда указал - все нормально стало работать.
Не все ОПЕРАТОРЫ одинаково хороши


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 136

    TopList