Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Наисложнейшая сортировка!! / 25 сообщений из 44, страница 1 из 2
12.11.2010, 05:44
    #36950777
lincoln
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
Есть массив в котором все параметры стрингового типа. этот массив представляет собой нечто подобное..

Болт М24-9gх55.109.40Х.019 ГОСТ 7796-70
Болт М30х2.0-6gх75.109.40Х.019 ГОСТ 7798-70
Болт М30-6gх160.109.40Х.019 ГОСТ 7798-70
Болт М6x25.46.019 ГОСТ 7802-81
Болт М6x60.66.019 ГОСТ 7795-70
Болт М6х16.46 ГОСТ 7802-81
Болт М6х16.46.019 ГОСТ 7802-81
Болт М6х16.58.00 ОСТ 23.1.434-75
Болт М6х16.66.019 ГОСТ 7802-81
Болт М6х20.46 ГОСТ 7802-81
Болт М14x50.66.019 ГОСТ 7796-70
Болт М14х100.66 ГОСТ 7795-70
Болт М14х100.66.019 ГОСТ 7795-70
Болт М14х1,5-6gх35.109.40Х ГОСТ 7798-70
Болт М14х1,5-6gх35.109.40Х.019 ГОСТ 7798-70

необходимо сортировать список так чтобы в начало списка попадали элементы с меньшим номером госта, и потом еще сортировались от меньшего к большему.. т.е сначала М6, М8, М10 одного госта, потом М6, М8, М10 другого госта! КААААК??!
...
Рейтинг: 0 / 0
12.11.2010, 05:53
    #36950779
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
lincoln,

Код: plaintext
order by mid(naim,instr(naim,"гост")+ 1 ),naim
...
Рейтинг: 0 / 0
12.11.2010, 06:36
    #36950800
lincoln
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
этот order by сортирует по символьно? т.е. если есть ГОСТ 1123 , ГОСТ 10123 и ГОСТ 6523 эта функция мне отсортирует так:
гост 10123
гост 1123
гост 6523 или так:

гост 1123
гост 6523
гост 10123? последний вариант надо чтобы был.
...
Рейтинг: 0 / 0
12.11.2010, 07:00
    #36950811
Komil_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
lincolnэтот order by сортирует по символьно? т.е. если есть ГОСТ 1123 , ГОСТ 10123 и ГОСТ 6523 эта функция мне отсортирует так:
гост 10123
гост 1123
гост 6523 или так:

гост 1123
гост 6523
гост 10123? последний вариант надо чтобы был.

Мне кажется в виде массива очень сложно программно анализировать и сортировать данные. ИМХО лучше передать данные в СУБД (например, SQL Server, MS Access и т.д.) и там разбить на отдельные поля и только потом сортировать.
А если данные ни как не перевести в СУБД и необходимо только в VB, ну тогда создайте несколько массивов, где каждый массив как бы отдельное поле таблицы и только потом сортируйте.
Ваши ГОСТы 7796-70, 23.1.434-75 они в чистом виде как то не очень похожи на числа. Так что их с помощью REPLACE придётся привести в "нормальный" вид, если хотите сортировать как числа.

Может быть кто-то подкинет идею по лучше, но на ум мне пришло только это.
...
Рейтинг: 0 / 0
12.11.2010, 07:04
    #36950813
SashaM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
order by Val(Replace(mid(naim, InStr(naim, "ГОСТ")+4),"-",".")),naim
...
Рейтинг: 0 / 0
12.11.2010, 07:24
    #36950822
SashaM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
Или так с учётом ОСТ которые будут выкидываться в конец:
order by Val(Replace(Replace(mid(naim, InStr(naim, "ОСТ")+3),"-","."),".",vbNullString)),naim
...
Рейтинг: 0 / 0
12.11.2010, 07:34
    #36950826
SashaM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
Или так:
Код: plaintext
order by Val(Replace(Replace(mid(naim, InStr(naim, "ОСТ")+ 3 ),".",vbNullString),"-",".")),naim
Лень проверять выберите в зависимости от корректности
...
Рейтинг: 0 / 0
12.11.2010, 07:38
    #36950828
lincoln
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
Komil_,

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

По хорошему надо чтобы болты были одельно, затем сортировка болтов по госту, далее сортировка по параметрам болта.
и так каждый раз для разных видов (винты, шплинты шпильки)
...
Рейтинг: 0 / 0
12.11.2010, 07:41
    #36950830
SashaM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
lincoln,

Не пробовали сделать нормолизацию данных?
...
Рейтинг: 0 / 0
12.11.2010, 07:47
    #36950832
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
lincolnЕсть массив в котором все параметры стрингового типа. этот массив представляет собой нечто подобное..

Болт М24-9gх55.109.40Х.019 ГОСТ 7796-70

Правильно, как я думаю, хранить таблицу с информацией о диаметре, длине, госте и.т.д.
Тогда можно будет нормально отсортировать.
А текст: <Болт М24-9gх55.109.40Х.019 ГОСТ 7796-70> просто формируется из разных полей.
Если есть возможность так сделать, то лучше ввести доп. поля и все проблемы решатся.
А иначе придется парсить текст и заниматся прочими странными вещами.
...
Рейтинг: 0 / 0
12.11.2010, 07:50
    #36950834
lincoln
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
SashaM,

не получиться нормализовать т.к. придется много что переделывать, и не уверен что мне по силам..
овчинка выделки не стоит как говорится))
...
Рейтинг: 0 / 0
12.11.2010, 08:25
    #36950855
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
lincoln,

в чем идея задания

-произвольный поиск
-поиск по спискам
-отчет с сортировкой болт-гост-размер-покрытие (или покрытие-размер)
-прайс на те же условиях

в задачах состав изделия и материалы использовала произвольный поиск по принципу набираю что знаю

*болт*7696* все болты госта 7696
*болт*12*гост* все госты болта 12
*болт*30*019* покрытие болта 30
*болт*019* болты с покрытием

затем в поле поиска уточняла условие и выполняла требуемый отчет
-куда входит данный болт
-его трудоемкость
-поступление болтов на склад...........аксесс 97\2007
...
Рейтинг: 0 / 0
12.11.2010, 09:35
    #36950932
lincoln
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
ПЕНСИОНЕРКА,

идея в том что в бд есть некая сборка, которая состоит из подсборок,деталей, стандартных изделий (болты винты и т.п), по этой сборке формируется отчет в виде конструкторской специффикации. через dll моя прога берет данные из программы и переносит в excel. сортировка по алфавиту работает, т.е я получаю нормальный список для деталей и сборок, а для стандартных нет! т.к. стандартные заносятся в спецификацию сначала по алфавиту(сначала идут болты, винты, гайки и т.п) далее если несколько болтов, в верх списка заносятся болты с меньшим гостом. Если болтов с одним гостом несколько, то из них выбирается тот у которого размер меньше..
после сотрировки болтов идет сортировка винтов и т.д..
...
Рейтинг: 0 / 0
12.11.2010, 09:43
    #36950940
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
lincoln,

Задача, на мой взгляд, сводится к правильному разбору строки на члены. И тогда сортировка станет тривиальной. Я думаю, надо сосредоточиться именно на этой задаче.
...
Рейтинг: 0 / 0
12.11.2010, 09:43
    #36950942
lincoln
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
в бд НЕТ никаких таблиц с гостами, диаметрами и т.п. Там есть иерархическое дерево, в стандартных есть поле наименование, откуда и берется эта длинная строка с обозначением
...
Рейтинг: 0 / 0
12.11.2010, 09:44
    #36950946
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
lincoln,

тю напугали епт
25 строк кода, если не считать заполнение массива

код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Sub SortingDouble()
Dim x() As String
ReDim x( 1  To  15 ) As String
                x( 1 ) = "Болт М24-9gх55.109.40Х.019 ГОСТ 7796-70"
                x( 2 ) = "Болт М30х2.0-6gх75.109.40Х.019 ГОСТ 7798-70"
                x( 3 ) = "Болт М30-6gх160.109.40Х.019 ГОСТ 7798-70"
                x( 4 ) = "Болт М6x25.46.019 ГОСТ 7802-81"
                x( 5 ) = "Болт М6x60.66.019 ГОСТ 7795-70"
                x( 6 ) = "Болт М6х16.46 ГОСТ 7802-81"
                x( 7 ) = "Болт М6х16.46.019 ГОСТ 7802-81"
                x( 8 ) = "Болт М6х16.58.00 ОСТ 23.1.434-75"
                x( 9 ) = "Болт М6х16.66.019 ГОСТ 7802-81"
                x( 10 ) = "Болт М6х20.46 ГОСТ 7802-81"
                x( 11 ) = "Болт М14x50.66.019 ГОСТ 7796-70"
                x( 12 ) = "Болт М14х100.66 ГОСТ 7795-70"
                x( 13 ) = "Болт М14х100.66.019 ГОСТ 7795-70"
                x( 14 ) = "Болт М14х1,5-6gх35.109.40Х ГОСТ 7798-70"
                x( 15 ) = "Болт М14х1,5-6gх35.109.40Х.019 ГОСТ 7798-70"

Dim y( 1  To  15 ,  1  To  5 ) As Variant
Set rs = New ADOR.Recordset
rs.Fields.Append "fulln", adVariant: rs.Fields.Append "M", adInteger: rs.Fields.Append "gost", adInteger
rs.Open
For i =  1  To UBound(x)
    y(i,  1 ) = x(i)
    y(i,  2 ) = Left(y(i,  1 ),  5 )
    y(i,  3 ) = CLng(Replace(Replace(Replace(Left(Right(y(i,  1 ), Len(y(i,  1 )) -  5 ),  3 ), "x", ""), "х", ""), "М", ""))
    y(i,  4 ) = Replace(Right(y(i,  1 ), Len(y(i,  1 )) -  3  - InStr( 1 , y(i,  1 ), "ОСТ", vbTextCompare)), ".", "")
    y(i,  5 ) = CLng(Left(y(i,  4 ), InStr( 1 , y(i,  4 ), "-", vbTextCompare) -  1 ))
    rs.AddNew:  rs!fulln = y(i,  1 ): rs!gost = y(i,  5 ): rs!m = y(i,  3 ): rs.Update
Next i
rs.Sort = "gost ASC, m ASC "
Erase x: ReDim x( 1  To  15 ) As String
rs.MoveFirst
   For i =  1  To UBound(x)
   x(i) = rs!fulln
   Debug.Print x(i): rs.MoveNext
   Next i
rs.Close
End Sub
...
Рейтинг: 0 / 0
12.11.2010, 09:45
    #36950948
lincoln
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
Shocker.Pro,

да надо писать парсер, но я чувствую мне навыка моего просто не хватит чтобы написать это..
...
Рейтинг: 0 / 0
12.11.2010, 09:49
    #36950956
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
Забыл добавить, что надо в референции MS ADO recordset
...
Рейтинг: 0 / 0
12.11.2010, 09:55
    #36950964
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
lincolnShocker.Pro,

да надо писать парсер, но я чувствую мне навыка моего просто не хватит чтобы написать это..
Вон, Шаманус уже написал - изучайте
...
Рейтинг: 0 / 0
12.11.2010, 09:59
    #36950974
lincoln
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
Shamanus,

список изделий заносится динамически (их любое количество может быть)
dim naim as recordlist ' список с наименованиями
dim count as integer ' их число



Sub SortingDouble()
Dim x(naim.RecordCount - 1) As String
dim i as integer
for i= 0 to naim.RecordCount - 1
x(i)= naim(i)
next
....

что дальше?
...
Рейтинг: 0 / 0
12.11.2010, 10:09
    #36951006
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
lincoln,

тогда лучше так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Dim x() As String  
ReDim x(naim.RecordCount -  1 ) As String ' если так не сделать массив нельзя будет переобъявлять
Dim y( 0  to naim.RecordCount -  1 ,  1  To  5 ) As Variant
...
Erase x: ReDim x( 0  to naim.RecordCount -  1  To  15 ) As String ' тут надо поменять
....
' все циклы перевести с нуля или с Lbound
...
но вообще это все неправильно, лучше изучите код и напишите сразу правильно. У меня некоторые куски просто для наглядности проделываемого. Массив Y тут вообще не нужен.
...
Рейтинг: 0 / 0
12.11.2010, 10:11
    #36951015
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
lincoln,

из опыта работы
-есть ГОСТ и просто Г
-или гост\г
-или ОСТ\ост
-или ТУ\ту

для радиоэлементов, конденсаторов ......
-ожо ......

уж всех и не помню
...
Рейтинг: 0 / 0
12.11.2010, 10:17
    #36951048
lincoln
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
Shamanus,

ок, щас попробую возможно что то выйдет
...
Рейтинг: 0 / 0
12.11.2010, 10:24
    #36951073
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
lincolnт.е сначала М6, М8, М10 одного госта, потом М6, М8, М10 другого госта! КААААК??!
Ну если уж очен нужно, то может так сделать:

Если нужно по госту/диаметр. Может так сделать:
1 Символ - 0 гост/1 - ост
Строка 9 символов гост + 2 символа диаметр:
PXXXXXXXXYY
Болт М24-9gх55.109.40Х.019 ГОСТ 7796-70
=
000000779624

Болт М6х16.58.00 ОСТ 23.1.434-75

=
102300143406

И тогда будут сортироватся по госту/осту, потом по диаметру.
Нужно написать функцию которая вытаскивает гост и добавляет справа нулями до 9 знаков.
Затем вытаскиваем диаметр, добавляем до двух знаков нулями справа.
Это делается для правильности алфавитной сортировки.
Получаем строку, по которой уже будет сортировка (по одной строке! А не по нескольким полям).
Если нужно еще сортировать по другим параметрам, то дорабатывается по такому же принципу.
...
Рейтинг: 0 / 0
12.11.2010, 10:33
    #36951105
Shamanus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наисложнейшая сортировка!!
lincolnShamanus,

ок, щас попробую возможно что то выйдет
если не получится, задавайте вопросы, желающему научиться поможем.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Наисложнейшая сортировка!! / 25 сообщений из 44, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]