powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Пркобразование массива
18 сообщений из 18, страница 1 из 1
Пркобразование массива
    #32913595
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
Есть массив строк:

Номер 	ID	Date
строки
 1 	 1 	[данные]
 2 	 1 	[данные]
 3 	 2 	[данные]
 4 	 3 	[данные]
 5 	 4 	[данные]
 6 	 3 	[данные]
 7 	 2 	[данные]
 8 	 1 	[данные]
...
Изменение ID означает, что данные строки явлются дополняющими к данным ближайшей предыдущей строки 
с ID меньшим на единицу текущего.
Данные  3 -ей строки дополняют данные  2 -ой строки.
Данные  4 -ой строки дополняют данные  3 -ей строки.
Данные  5 -ой строки дополняют данные  4 -ой строки.
Данные  6 -ой строки дополняют данные  3 -ей строки.
Данные  7 -ой строки дополняют данные  2 -ой строки.
Требуется преобразовать массив к виду:

Номер 	ID	Date	Уровень  2 	Уровень  3 	Уровень  4 
строки
 1 	 1 	[данные]			
 2 	 1 	[данные]			
			 2  [данные]		
				 3  [данные]	
					 4  [данные]
				 3  [данные]	
			 2  [данные]		
 3 	 1 	[данные]			
Число уровней и строк м.б. неограниченным.
Если возможно, подскажите решение, чтобы выбрав нужную строку, прочитать все относящиеся к ней данные.
...
Рейтинг: 0 / 0
Пркобразование массива
    #32913879
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну примерно так хотя и не буду утверждать ;-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
dim iLevel as integer
dim i as integer
dim arr1( 1 .. 100 ) as date

iLevel =  1 
'бежим по массиву
for i =  1  to ucase(arr)
  ' если поле  ID = заданной строке
  if arr(i, 2 ) = заданнаяСтрока then
    'делаем то, что надо
    arr1(iLevel) = arr(i, 3 )
    'увеличиваем уровень вложенности (дополнения)
    iLevel = iLevel +  1 
  endif
next i
...
Рейтинг: 0 / 0
Пркобразование массива
    #32913890
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создать вспомогательный (индексный) массив номеров строк, отсортированный по ID aInd(). Назовём исходный массив aVal().
результат = Сборка_строки(Num)
Sub Сборка_строки(Num) as String
ID = aVal(Num).ID
n = двоичным поиском в индексном массиве находим первый ID
Сборка_строки = Сборка_строки & aVal(Num).Str
Do While aInd(n).ID = ID
'перечисляем все позиции с тем же ID и рекурсивно собираем подстроки
Сборка_строки = Сборка_строки & Сборка_строки(aInd(n).Num)
n = n+1
Loop
End Sub

В общем как то так.
...
Рейтинг: 0 / 0
Пркобразование массива
    #32914231
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To marvan
Не совсем разобрался в предложенном решении, но в нем нет привязки подстроки к "родителю".
...
Рейтинг: 0 / 0
Пркобразование массива
    #32914453
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет привязки подстроки к "родителю".
предложенный мой способ собирает строку начиная с указанного номера.
этот номер по сути и является предком.
Вполне может быть, что что то упущено, но суть неизменна - лучше использовать рекурсивный алгоритм.
...
Рейтинг: 0 / 0
Пркобразование массива
    #32914581
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То marvan
В подстроке может быть несколько вложенных предков.
В первом посте они показаны.
Как их определить?
...
Рейтинг: 0 / 0
Пркобразование массива
    #32914768
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может закрыть топик, чтобы в почту всякая пакость не падала?
...
Рейтинг: 0 / 0
Пркобразование массива
    #32914774
Гео
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вру, это уже не у нас на форуме. Придется Магнуса просить :))
...
Рейтинг: 0 / 0
Пркобразование массива
    #32914781
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
for i=1 to ubound(arr)
if i=1 then
arr(i).level=0
else
arr(i).level=arr(arr(i).ID).level+1
endif
next

где arr(i).level - еще одно поле структуры, из объектов которой состоит массив. И потом:

for i=1 to ubound(arr)
print string(arr(i).level, chr(9)) & ...
next
...
Рейтинг: 0 / 0
Пркобразование массива
    #32914784
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeoМожет закрыть топик, чтобы в почту всякая пакость не падала?
Закрытие топика не спасает от сообщений модератору.
...
Рейтинг: 0 / 0
Пркобразование массива
    #32914977
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч, спасибо! Буду пробовать.

То Geo, гео:
Злые вы, уйду я от вас! :)
...
Рейтинг: 0 / 0
Пркобразование массива
    #32915126
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От меня можешь не уходить, я уже фильтр настроил
Так что продолжай стучать.
...
Рейтинг: 0 / 0
Пркобразование массива
    #32915245
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже у вас древовидная структура.
И поле ID выполняет функцию Prent_ID.
Если так, то работают с такими данными используя рекурсивные алгоритмы.
Уточняющий вопрос:

Как надо представить полученные (в случае успешного ответа на вопрос) данные?
В виде массива - "веточки"?
...
Рейтинг: 0 / 0
Пркобразование массива
    #32915261
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То Worobjoff
Вы правильно предположили про Parent_ID.
И данные нужно получить в виде вложенных массивов.

То Владимир Саныч
Мне кажется, что предложенное решение не учитывает уменьшение ID (строка 7 примера).

То Лох Позорный
Чем не угодил?
...
Рейтинг: 0 / 0
Пркобразование массива
    #32915271
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Реализовал вашу задачу с помощью синтетического рекордсета (может подойдет)
Код: 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.
40.
41.
42.
43.
44.
Dim rs As ADODB.Recordset ' Массив данных
Dim rs2 As ADODB.Recordset 'Возвращает ветвь
Private Sub Command1_Click()
   Dim i As Long, j As Long
   For i =  0  To  9  'Наполним массив "случайными данными"
      rs.AddNew Array("id", "Parent_id", "Text"), Array(i, j, " Число " & i)
      rs.Update
      If (i Mod  2 ) =  0  Then j = j +  1 
   Next
   Dim s As String
   Call Ветвь( 2 ) 'Найдем всех потомков узла 2
   If rs2.RecordCount >  0  Then rs2.MoveFirst
   Do Until rs2.EOF ' и покажем что нашли
      s = s & rs2.Fields( 0 ).Value & " " & rs2.Fields( 1 ).Value & rs2.Fields( 2 ).Value & vbCrLf
      rs2.MoveNext
   Loop
   MsgBox s
End Sub
Sub Ветвь(ByVal Ключ As Long)
   Dim k As Long
   If Not rs.EOF Then rs.MoveFirst
   rs.Find "Parent_id = " & Ключ
   Do Until rs.EOF
      k = rs.AbsolutePosition 'Запоминаем текущую позицию
      rs2.AddNew Array("id", "Parent_id", "Text"), Array(rs.Fields( 0 ), rs.Fields( 1 ), rs.Fields( 2 ))
      Call Ветвь(rs.Fields("id"))
      rs.MoveFirst
      rs.Move k +  1   'Восстанавливаем позицию (+1)
      rs.Find "Parent_id = " & Ключ
   Loop
End Sub
Private Sub Form_Load() 'инициализация
   'Основной массив
   Set rs = New ADODB.Recordset
   rs.Fields.Append "id", adInteger, , adFldKeyColumn
   rs.Fields.Append "Parent_id", adInteger
   rs.Fields.Append "Text", adVarChar,  20 
   rs.Open , , adOpenStatic, adLockBatchOptimistic
   'Для возвращаемых значений
   Set rs2 = New ADODB.Recordset
   rs2.Fields.Append "id", adInteger, , adFldKeyColumn
   rs2.Fields.Append "Parent_id", adInteger
   rs2.Fields.Append "Text", adVarChar,  20 
   rs2.Open , , adOpenStatic, adLockBatchOptimistic
End Sub
Пример рекурсии понять по примеру можно.
Хотя доработать придется. Например надо "сбрасывать" rs2 перед вызвом и т.п.
...
Рейтинг: 0 / 0
Пркобразование массива
    #32915296
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_NewТо Владимир Саныч
Мне кажется, что предложенное решение не учитывает уменьшение ID (строка 7 примера).
Не могу сообразить, надо попробовать.

Sergey_NewТо Лох Позорный
Чем не угодил?
Рассылкой спама. Кстати, и мне тоже.
...
Рейтинг: 0 / 0
Пркобразование массива
    #32915446
Sergey_New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч:
авторРассылкой спама. Кстати, и мне тоже.
А как попал спам?
Я только прибег к помощи "Сообщить модератору" на форуме.
Это что, запрещено?
В любом случае, прошу прощения за доставленное неудобство!

То Worobjoff
Спасибо! Буду пробовать.
...
Рейтинг: 0 / 0
Пркобразование массива
    #32915913
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_NewА как попал спам?
Я только прибег к помощи "Сообщить модератору" на форуме.
Это что, запрещено?
Это сообщение модератору разослало всем модераторам Аксесса жалобу на меня. Оно для этого предназначено.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Пркобразование массива
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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