Dim rs As New ADODB.Recordset
rs.Fields.Append "FIO", adVarChar, 1000
rs.Fields.Append "Address", adVarChar, 1000
.....
rs.Open
'заполняем рекордсет
rs.Sort = "FIO, Address"
Select SuperField from SuperTable order by mid(SuperField, 53, 5), mid(SuperField, 1, 5)
XPAHuTEJIb писал(а):2Nicky:
смотря что считать базой данных....я считаю, что некая повторяющаюся последовательность данных с определёнными чётко границами полей является базой данны, не важно в каком виде она представлена...
XPAHuTEJIb писал(а):2GB826:
я в курсе, я ж в теме написал, что вкурсе способов сортировки...и кстати там же написано, что это не совсем пузырёк, а модифицированый пузырь
но для целей сортировки это не так важно....когда у тебя десяток другой массивов, и в каждом по 2-3 тыщи записей, хоть как сортируй - разницы большой не будет, поэтому я и спрашиваю, возможно ли загрузить данные не в массивы(распихать), а как-то по другому, чтобы ускорить сортировку
Option Explicit
Public a() As String
Public P() As Long
Public lRowNum As Long
Public lRowCnt As Long
Public lColNum As Long
Public lColCnt As Long
Public Sub Main()
Dim r As Long
Dim c As Long
Dim i As Long
Dim j As Long
Dim n As Long
Dim s As String
lRowNum = 0
lColNum = 0
lRowCnt = 30
lColCnt = 3
' создаём массив с тестовыми данными
ReDim a(lRowNum To lRowCnt, lColNum To lColCnt) As String
ReDim P(lRowNum To lRowCnt) As Long
For r = lRowNum To lRowCnt
For c = lColNum To lColCnt
'j = (8 * Rnd) + 1 ' тест длинных строк
j = 1
' n = 31 ' весь алфавит
n = 4
s = vbNullString
For i = 1 To j: s = s & Chr$((n * Rnd) + 192): Next
a(r, c) = s
Next
P(r) = r
Next
Debug.Print "массив до сортировки"
For r = lRowNum To lRowCnt
s = P(r) & ":"
For c = lColNum To lColCnt
s = s & vbTab & a(P(r), c)
Next
Debug.Print s
Next
' сортировка
For i = 3 To 0 Step -1
pInsertStr lRowNum, lRowCnt, a, P, i, True
Next
Debug.Print "массив после сортировки"
For r = lRowNum To lRowCnt
s = P(r) & ":"
For c = lColNum To lColCnt
s = s & vbTab & a(P(r), c)
Next
Debug.Print s
Next
End Sub
Private Sub pInsertStr(l As Long, r As Long, a() As String, P() As Long, c As Long, fAsc As Boolean) '
Dim LP As Long
Dim RP As Long
Dim TMP As Long
Dim T As String
For RP = l + 1 To r
TMP = P(RP)
T = a(TMP, c)
For LP = RP To l + 1 Step -1
If T < a(P(LP - 1), c) Then P(LP) = P(LP - 1) Else Exit For
Next LP
P(LP) = TMP
Next RP
End Sub
If T < a(P(LP - 1), c) Then P(LP) = P(LP - 1) Else Exit For
If (T < a(P(LP - 1), c)) Xor fAsc Then P(LP) = P(LP - 1) Else Exit For
сортировка 2-х мерного массива с (3000,30) элементов заняла меньше минуты.
Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 21