powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Наисложнейшая сортировка!!
25 сообщений из 44, страница 1 из 2
Наисложнейшая сортировка!!
    #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
Наисложнейшая сортировка!!
    #36950779
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lincoln,

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

гост 1123
гост 6523
гост 10123? последний вариант надо чтобы был.
...
Рейтинг: 0 / 0
Наисложнейшая сортировка!!
    #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
Наисложнейшая сортировка!!
    #36950813
SashaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
order by Val(Replace(mid(naim, InStr(naim, "ГОСТ")+4),"-",".")),naim
...
Рейтинг: 0 / 0
Наисложнейшая сортировка!!
    #36950822
SashaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или так с учётом ОСТ которые будут выкидываться в конец:
order by Val(Replace(Replace(mid(naim, InStr(naim, "ОСТ")+3),"-","."),".",vbNullString)),naim
...
Рейтинг: 0 / 0
Наисложнейшая сортировка!!
    #36950826
SashaM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или так:
Код: plaintext
order by Val(Replace(Replace(mid(naim, InStr(naim, "ОСТ")+ 3 ),".",vbNullString),"-",".")),naim
Лень проверять выберите в зависимости от корректности
...
Рейтинг: 0 / 0
Наисложнейшая сортировка!!
    #36950828
lincoln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Komil_,

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

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

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

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

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

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

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

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

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

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

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

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

Задача, на мой взгляд, сводится к правильному разбору строки на члены. И тогда сортировка станет тривиальной. Я думаю, надо сосредоточиться именно на этой задаче.
...
Рейтинг: 0 / 0
Наисложнейшая сортировка!!
    #36950942
lincoln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в бд НЕТ никаких таблиц с гостами, диаметрами и т.п. Там есть иерархическое дерево, в стандартных есть поле наименование, откуда и берется эта длинная строка с обозначением
...
Рейтинг: 0 / 0
Наисложнейшая сортировка!!
    #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
Наисложнейшая сортировка!!
    #36950948
lincoln
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

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

да надо писать парсер, но я чувствую мне навыка моего просто не хватит чтобы написать это..
Вон, Шаманус уже написал - изучайте
...
Рейтинг: 0 / 0
Наисложнейшая сортировка!!
    #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
Наисложнейшая сортировка!!
    #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
Наисложнейшая сортировка!!
    #36951015
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lincoln,

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

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

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

ок, щас попробую возможно что то выйдет
...
Рейтинг: 0 / 0
Наисложнейшая сортировка!!
    #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
Наисложнейшая сортировка!!
    #36951105
Фотография Shamanus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lincolnShamanus,

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


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