|
Автоматическое упорядочивание элементов списка в MSHFlexGrid |
|
|
Достаточно часто в программах бывает необходимо вывести частичный список сотрудников - для премирования, поощрения или наказания. При этом желательно вывести их в соответствии с занимаемыми должностями (директор, 1зам, и т.д.). Проблема в том, что список может требовать правки, и, при добавлении главбуха, он может оказаться в списке после уборщицы. Если сотрудников немного, их состав не меняется, то проблем нет - сортировка по индивидуальному номеру в порядке возрастания. В большой фирме, где к тому же сами должности могут добавляться и удаляться такой подход не оправдан. Можно, конечно, зашифровать должность как код должности и ввести поле подстановки в соответствующую таблицу, но кто этим будет заниматься, тем более с готовой БД?
Пример заполнения судовой роли для нашего яхт-клуба гарантирует, что матрос не будет в судовой роли стоять выше боцмана, или пассажир выше кока.
Предположим, что имеется список сотрудников (в данном случае моряков), из которого переносятся данные в MSHFlexGrid1, после чего вызывается следующая процедура
Private Sub RankCrwes()
Dim intRows As Integer
Dim intTemp As Integer, intY As Integer
Dim stRank(7) As String, stTabl(40, 2) As String '40 строк в переменной я беру с запасом - параметр индивидуальный, а 3 столбца _
это ID, ФИО и должность, взятые из списка
With Me.MSHFlexGrid1
'узнаем, сколько всего в списке вместе с добавленным, и, если больше одного, то продолжаем далее:
intRows = .Rows
If intRows = 1 Then Exit Sub
'заполняем массив чинами, в соответствии с которым будет упорядочиваться список. Если должностей слишком _
много, то легче перечислить их в отдельной таблице и заполнить открытием соответствующего Recordseta.
stRank(0) = "капитан"
stRank(1) = "старпом"
stRank(2) = "вахтенный рулевой"
stRank(3) = "радист"
stRank(4) = "боцман"
stRank(5) = "матрос"
stRank(6) = "кок"
stRank(7) = "пассажир"
' Начиная с последней строки MSHFlexGrid1все данные последовательно считываются в двухмерный массив stTabl в строгом _ соответствии порядку заполнения массива stRank. В данном примере до кока, чтобы пассажир был всегда последним. _
Если последний не обязателен, тогда For intTemp= 0 To 7 и пропустить последний блок Do While ... Loop
For intTemp = 0 To 6
Do While intRows > 0
'проверяется на совпадение каждый 3 столбец MSHFlexGrid1 - должность. При совпадении проводится запись в массив stTabl
If .TextArray((intRows - 1) * 3 + 2) = stRank(intTemp) Then
stTabl(intY, 2) = .TextArray((intRows - 1) * 3 + 2)
stTabl(intY, 1) = .TextArray((intRows - 1) * 3 + 1)
stTabl(intY, 0) = .TextArray((intRows - 1) * 3)
'после записи переводится строка в переменной-массиве
intY = intY + 1
End If
'в MSHFlexGrid1перевод на строку вверх
intRows = intRows - 1
Loop
'восстанавливается первоначальное значение переменной для дальнейшего анализа MSHFlexGrid1
intRows = .Rows
Next
'в этом блоке выбираются должности, не вошедшие в основной список, т.е. неважно в каком они порядке, _
лишь бы были после основных
Do While intRows > 0
Select Case .TextArray((intRows - 1) * 3 + 2)
Case stRank(0), stRank(1), stRank(2), stRank(3), stRank(4), stRank(5), stRank(6), stRank(7)
Case Else
stTabl(intY, 2) = .TextArray((intRows - 1) * 3 + 2)
stTabl(intY, 1) = .TextArray((intRows - 1) * 3 + 1)
stTabl(intY, 0) = .TextArray((intRows - 1) * 3)
intY = intY + 1
End Select
intRows = intRows - 1
Loop
intRows = .Rows
'если нужен последний (в данном случае - пассажир), то находим и его
Do While intRows > 0
If .TextArray((intRows - 1) * 3 + 2)=stRank(7) Then
stTabl(intY, 2) = .TextArray((intRows - 1) * 3 + 2)
stTabl(intY, 1) = .TextArray((intRows - 1) * 3 + 1)
stTabl(intY, 0) = .TextArray((intRows - 1) * 3)
intY = intY + 1
End If
intRows = intRows - 1
Loop
'очищаем уже полностью переписанный в stTabl MSHFlexGrid1
.Clear
.Rows = 0
'заполняем его по новому уже упорядочено. intY - 1 потому, что ранее единица была добавлена, _
но запись в переменную по исчерпании списка не сделана
For intRows = 0 To intY - 1
.AddItem stTabl(intRows, 0) & vbTab & stTabl(intRows, 1) & vbTab & stTabl(intRows, 2)
Next
End With
End Sub
Игорь
|
|
|
|
|
|
|