Вопрос по сортировке элементов в списке

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Вопрос по сортировке элементов в списке

Сообщение gjghjc » 24.06.2003 (Вт) 9:27

Люди помогите советом!!!!!
У меня есть некий список в котором нужно сортировать элементы.
Формат элемента следующий:
Number, FIO, Telephone.
При установке свойства List1.Sorted в True получается что число 12 стоит перед 2 т.е. как я понимаю сортировка происходит по первому знаку а мне нужно чтбы сортировка происходила по Number.

Я пробовал сортировать используя промежуточные ListBox'ы т.е. сначала все кидаем в один List(невидимый), а затем по минимальному номеру добавлять в основной ListBox, но это долго может есть какой быстрый алгоритм.

Заранее спасибо
Утро добрым не бывает!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.06.2003 (Вт) 9:31

В данном случае 2 и 12 - это строки. При их сортировке так всё и будет. Чтобы строкочисла сортировались правильно, они должны иметь одинаковую длину, т.е. 12 и 02.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 24.06.2003 (Вт) 14:58

Все дело в том что в моем случае в переменной Number хранится номер квартиры и как бы не совсем удобно пользователю смотреть на лишние нули.
Утро добрым не бывает!

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 24.06.2003 (Вт) 15:03

а данные откуда берутся? надеюсь из базы данных...
догда в SQL-запросе добавь ORDER BY <поле_с_номером_квартиры>
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 24.06.2003 (Вт) 17:15

2Cyrax Да данные берутся из базы данных, но все дело в том что я не умею пользоваться SQL запросами.
Буду большое спасибо если обьяснишь.
Т. е. я видел в книжках что это что -то типа "Select тра ля ля from My_base ", но вот куда это все считывается я так и недогнал Одна надежда на форум так как книжек у меня нет, а те что есть мне не нравятся.
Утро добрым не бывает!

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 24.06.2003 (Вт) 17:36

так по порядку... пример для ADODB (я к нему больше привык)

итак, для начала идем в Project -> References и подключаем Microsoft Activex Data Objects 2.x library

дальше идет примерно такая процедура.
Код: Выделить всё
Private Sub GetData()
    Dim CN As ADODB.Connection ' объект Connection является ссылкой на базу данных
    Dim RS As ADODB.Recordset ' а это объект Recordset. в нем будет набор записей из таблице в базе
    ' инициализируем объекты
    Set CN = New ADODB.Connection
    With CN
        .Provider = "Microsoft.Jet.OLEDB.3.51" ' провайдер данных для Access'овских баз данных. если база версии Access 2000, то 3.51 нужно заменить на 4.0
        .ConnectionString = "путь до файла бызы данных"
        .Open ' открыли бызу
    End With
    ' теперь рекордсет. самое интересное
    Set RS = New ADODB.Recordset
    With RS
        .ActiveConnection = CN ' используемое подключение, следовательно база
        .Source = "SELECT * FROM tbl ORDER BY <поле_с_номером_квартиры>" ' это и есть наш запрос. он значит получить все записи из таблицы с именем "tbl" и отсортировать их по указанному полю
        .Open , , adKeySet, adReadOnly ' открываем набор записей. так как мы считываем данные, то нам достаточно открыть его только для чтения
        ' теперь пробегаемся по всем записям и добавляем их в ListBox
        Do Until .EOF ' пока не достигним конца
            ListBox.AddItem .Fields("<поле_с_номером_квартиры>") & " - " & .Fields("Фамили") & " " & .Fields("Имя")
            ' если в таблице есть ключевое поле, то можно сделать так
            ListBox.ItemData(LisyBox.NewIndex) = .Fields("ID")
            ' потом можно будет выбирать из таблицы данные щелкая по списку
            ' следующая запись
            .MoveNext
        Loop
        ' все закрываем Recordset и Connection
        .Close
    End With
    Set RS = Nothing
    CN.Close
    Set CN = Nothing
End Sub

если что не понятно, в приват

да и еще. поищи в библиотеках или книжных магазинах эти книжки
"Руководство разработчика баз данных на Visual Basic 6.0" Роджера Дженнингса
и
"Обработка баз данных на Visual Basic 6.0" Джеффри П. Мак-Мануса
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 25.06.2003 (Ср) 16:35

2Cyrax За пример огромное спасибо сейчас пойду домой ковырять. Только вот вчера посидел, пораскинул мозгами получилось у меня составить SQL запрос где была сортировка квартир по возрастанию и эта зараза отсортировала точно так же т.е 12, 2, 21, 3 и т.д. :shock: :shock: :shock: :shock:
А мне нужно 2, 3, 12, 21 без лидирующих нолей поэтому кроме как отрезать номер квартиры затем сравнить и обратно приклеить. и забить все это в List попорядку номеров.
А вот еще возник вопрос а можно ли в SQL запрос добавить праметр который бы принудительно говорил запросу что сравнивать эти данные нужно как числа, а не как строки.
Утро добрым не бывает!

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 25.06.2003 (Ср) 16:35

2Cyrax За пример огромное спасибо сейчас пойду домой ковырять. Только вот вчера посидел, пораскинул мозгами получилось у меня составить SQL запрос где была сортировка квартир по возрастанию и эта зараза отсортировала точно так же т.е 12, 2, 21, 3 и т.д. :shock: :shock: :shock: :shock:
А мне нужно 2, 3, 12, 21 без лидирующих нолей поэтому кроме как отрезать номер квартиры затем сравнить и обратно приклеить. и забить все это в List попорядку номеров.
А вот еще возник вопрос а можно ли в SQL запрос добавить праметр который бы принудительно говорил запросу что сравнивать эти данные нужно как числа, а не как строки.
Утро добрым не бывает!

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 25.06.2003 (Ср) 16:51

gjghjc писал(а):эта зараза отсортировала точно так же т.е 12, 2, 21, 3 и т.д. :shock: :shock: :shock: :shock:

Видимо в БД номера квартир хранятся как строки, почемучто могет быть квартира с номером 25а, а енто уже никак не нумбер.

gjghjc писал(а):А вот еще возник вопрос а можно ли в SQL запрос добавить праметр который бы принудительно говорил запросу что сравнивать эти данные нужно как числа, а не как строки.

Скорее всего нет. В разных БД свои приколы. Какой пользуешься? Может чего наковыряется.

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 26.06.2003 (Чт) 12:48

Я понял если написать ORDER BY Val(flat) то список будет сортироваться по номерам квартир.
2skiperski Спасибо за новую идею. Тот факт что у номера квартиры или дома может быть еще и буква как то выпал из моего внимания.
Утро добрым не бывает!

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 26.06.2003 (Чт) 13:18

gjghjc писал(а):Я понял если написать ORDER BY Val(flat) то список будет сортироваться по номерам квартир.

Если это Access, то всё правильно.

gjghjc писал(а):Тот факт что у номера квартиры или дома может быть еще и буква как то выпал из моего внимания.

Такое редко, но бывает. Кстати, конструкция с Val() и в этом случае отсортирует правильно.

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 26.06.2003 (Чт) 13:42

gjghjc писал(а):Я понял если написать ORDER BY Val(flat) то список будет сортироваться по номерам квартир.

для Access, то что нужно
а вот в SQL Server и других СУРБД такой функции нет, но есть ее аналог. посмотреть можно в спецификации ANSI SQL
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 27.06.2003 (Пт) 9:23

Да БД в Access, и все работает если применять один параметр сортировки, а если например сортировать по дому и квартире
ORDER BY Val(House) and Val(Flat) (причем дом может быть и с буквой), то возникает ошибка что - то типа несоответствия типов.
Что нужно поставить вместо "AND" чтобы сортировка происходила и по номеру дома и по номеру квартиры независимо от типов этих переменных?????
Утро добрым не бывает!

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 27.06.2003 (Пт) 9:40

вместо
Код: Выделить всё
ORDER BY Val(House) and Val(Flat)

нужно
Код: Выделить всё
ORDER BY Val(House), Val(Flat)
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 27.06.2003 (Пт) 15:24

Дело в том что запятую я тоже ставил. В этом случае ругань идет на отсутсвие оператора в запросе
Утро добрым не бывает!

Лёха_Virus
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 24.03.2003 (Пн) 17:13
Откуда: Анграск

Сообщение Лёха_Virus » 28.06.2003 (Сб) 17:54

на счёт нулей: а не проще в базе хранить номра с нулями, а когда в лист будешь записывать обрежешь их и всё... ну лист unsorted канечна...

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 30.06.2003 (Пн) 12:35

Когда сортировка выполняется не по полю, а по функции от него, то все поля участвующие в функции сортировки, а может даже полностью функция, должны присутствовать в выборке.

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 661
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 01.07.2003 (Вт) 10:06

2skiperski Прошу прощения :oops: :oops: произошла ошибка, матюки были не ORDER BY, а в WHERE. В ORDER запятая работает на ура.
Утро добрым не бывает!

PSV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 29.01.2002 (Вт) 12:30
Откуда: Россия

Сообщение PSV » 21.07.2003 (Пн) 7:54

А у меня данные выбираются через ADO из MS SQL и что такое ORDER BY я знаю :lol:, но ... столбцов много, пользователь может изменить не только столбец но и порядок сортировки и, чтобы не дергать лишний раз БД, когда в столбце номера - я добиваю строку с номером пробелами до длины самого длинного номера который может встретиться или имеется в списке. Получается:
Код: Выделить всё
<  1>
<  2>
...
< 10>
< 11>
...
<999>


P.S.
У меня часто используется блокировка таблиц, поэтому просьба не поносить за подобные подходы


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот, PetalBot и гости: 3

    TopList