|
как получить случайный элемент справочника? | ☑ | ||
---|---|---|---|---|
0
Балоун
10.03.12
✎
09:02
|
собссно, делаю запрос всего, потом
Результат[ГСЧ.СлучайноеЧисло(0, Результат.Количество()-1)].Ссылка меня смущает то, что приходится читать всю таблицу ради одного значения. есть ли более правильные методы? |
|||
1
MRAK
10.03.12
✎
09:04
|
(0) можно по коду искать
|
|||
2
Балоун
10.03.12
✎
09:05
|
(1) думал. есть (возможны) разрывы из-за удалённых/помеченных
|
|||
3
Птица
10.03.12
✎
09:13
|
(0) ну если справочник очень большой, то можно сначала запросом выяснить количество, потом получить случайное число N, ну а потом уже - выбрать первые N в подзапросе, упорядочив покоду по возрастанию
а в запросе - выбрать первые 1, упорядочив по коду по убыванию. но в принципе из-за сотни другой элементов можно так не заморачиваться |
|||
4
Балоун
10.03.12
✎
09:19
|
(3) сейчас там где-то 2.7 КЭлементов. тормозов не ощущаю, всё работает. вопрос скорее познавательного характера.. выбрать первые N - это ж тоже в наихудшем случае чтение всей таблицы плюс запрос на выяснение количества ;)
|
|||
5
MRAK
10.03.12
✎
09:36
|
(2) если только в этом проблема, то можно вызывать функцию рекурсивно, проверяя, существует ли данный элемент и не помечен ли он на удаление
|
|||
6
Балоун
10.03.12
✎
09:40
|
(5) при чём тут рекурсия? да, можно генерить случайный код, до тех пор, пока не попадётся "правильный" элемент. наверное, даже быстрее будет..
|
|||
7
Ненавижу 1С
гуру
10.03.12
✎
09:43
|
если нужны данные 1244-го элемента, то достаточно получить ТОЛЬКО 1244 ссылки и взять максимальную, а у нее уже получить все ЕЕ данные
|
|||
8
andrewks
10.03.12
✎
09:44
|
можно генерить два случайных кода с некоторым разбегом, обеспечивающим вероятностью наличия в этом диапазоне эл-та близкой к 1, и потом
select top 1 from... where Code between &LeftBound and &RightBound |
|||
9
Балоун
10.03.12
✎
09:45
|
(7) выбрать первые ГСЧ? опять в худшем случае буду читать всё ;)
|
|||
10
Балоун
10.03.12
✎
09:46
|
(8) интересно, спасибо. но в самом общем случае непригодно ж
|
|||
11
Балоун
10.03.12
✎
09:47
|
повторюсь: вопрос носит познавательный характер. я так люблю бороться за миллисекунды и количество строк кода ;)
|
|||
12
andrewks
10.03.12
✎
09:48
|
(10) это почему? имеешь в виду, если нет кода? ну, можно и через наименование, и т.п. сделать
|
|||
13
Балоун
10.03.12
✎
09:57
|
(12) если у нас в коде всякая белиберда типа 001 280 300, то между 500 и 600 ничего не найдёт
|
|||
14
experimentator76
10.03.12
✎
10:01
|
ориентироваться на код нельзя ни в коем случае
|
|||
15
experimentator76
10.03.12
✎
10:06
|
придется запросом выбрать непомеченные на удаление и не группы
и потом уже из ТЗ забирать случайные ссылки элементов |
|||
16
Мигрень
10.03.12
✎
10:07
|
(11) Просишь пользователя загадать случайное слово. Далее - полнотекстовый поиск в справочнике по этому слову. Рекурсивно ищем, пока не найдем самое близкое по смыслу.
Мне кажется это будет оптимально, с точки зрения борьбы за миллилитры. |
|||
17
Балоун
10.03.12
✎
10:07
|
(15) дык так и есть, обрати внимание на (0). интересуюсь, можно ли сделать красивше
|
|||
18
experimentator76
10.03.12
✎
10:08
|
(17) аха - увидел :)
|
|||
19
experimentator76
10.03.12
✎
10:12
|
(0)
нужно оптимизировать сам справочник то есть источник данных добавить реквизит Порядок 1,2,3,..,n и константу в которой будет содержаться n далее все элементарно |
|||
20
Балоун
10.03.12
✎
10:14
|
(19) код оракл? это уже было ;)
v8: Автонумерация строки справочника |
|||
21
experimentator76
10.03.12
✎
10:15
|
(20) я еще маленький :) всю мисту не читал
само родилось щас еще мысль есть... |
|||
22
experimentator76
10.03.12
✎
10:26
|
платформа 8.2 предоставила возможность делать запросы штатными средствами к таблицам баз данных
значит мы можем подцепить "свою" же таблицу для работы с ней вот я вытащил первые 10 из С.Номенклатура IDRRef 6094a609-008e-11e1-be70-00151762fcc8 c2434ae5-0102-11e0-b989-00151762fcc8 c2434ae7-0102-11e0-b989-00151762fcc8 c2434ae9-0102-11e0-b989-00151762fcc8 34bb54e0-0108-11e0-b989-00151762fcc8 d680fe2a-011e-11e0-b989-00151762fcc8 e97a2cfa-0391-11e1-9433-00151762fcc8 e536dd37-0412-11de-b72b-00151762fcc8 e536dd39-0412-11de-b72b-00151762fcc8 e536dd3b-0412-11de-b72b-00151762fcc8 отсортировано по IDRRef то есть по ссылке элементов видно что наблюдается закономерность формирования ссылок изучив эту закономерность и переведя случайное число в шестнадцатиричное можно спозиционироваться на нужную ссылку запросом к примеру ГДЕ IDRRef = "e536dd3b-0412-11de-b72b-00151762fcc8" |
|||
23
experimentator76
10.03.12
✎
10:28
|
IDRRef по умолчанию подтягивается в ВИД как тип УникальныйИдентификатор
но можно перевыбрать тип на Строка для своего источника данных и сравнивать с ним строку |
|||
24
Балоун
10.03.12
✎
10:31
|
(22) прикольно, спасибо, с первого прочтения не дошло, вернусь ещё
|
|||
25
experimentator76
10.03.12
✎
10:33
|
(24) забыл добавить что курить надо Внешние источники данных
|
|||
26
Ns33
10.03.12
✎
10:44
|
ИМХО:
Если такое делать часто, то как в (19), если редко, то в (0). А если как в (22), то нужно помнить, что элемент может быть удален и сгенерированная ссылка будет несуществующей. |
|||
27
experimentator76
10.03.12
✎
10:50
|
(26) эти три варианта наверное окончательные
(0) просто и не требует доработок (19) быстро, требует доработок конфы (22) быстро, требует доработок конфы в случае обращения через ВИД не требует если обращаться напрямую не через 1С ну и требуется разобраться как формируется IDRRef когда то читал по 1С7.7 а вот по восьмере не помню вижу что у элементов последние две части похожи на последние две части родителя |
|||
28
andrewks
10.03.12
✎
10:54
|
(22) это примерно то же самое, что и ориентироваться на код. ибо могут быть как "пришлые" УИД, так и сгенерированные 1С-кодом
|
|||
29
experimentator76
10.03.12
✎
11:01
|
вот ребята с IDRRef разбирались
v8: Как получить ссылка на объект по внутреннему ID объекта? |
|||
30
experimentator76
10.03.12
✎
11:02
|
(28) пришлые это как? вроде как адинэсина гуиды формирует
|
|||
31
andrewks
10.03.12
✎
11:03
|
(13) нужно в начале "проинициализировать" алгоритм, узнать общее кол-во элементов, самый маленький и самый большой код. далее можно поступать так: генерить случайны код из диапазона и брать за левую границу, за правую границу всегда брать самый большой код.
|
|||
32
experimentator76
10.03.12
✎
11:03
|
(20) слушай так может вот зачем это надо было :))))
|
|||
33
andrewks
10.03.12
✎
11:03
|
(30) обмены, "ручная" генерация УИД в коде, и т.п.
|
|||
34
МихаилМ
10.03.12
✎
11:04
|
если генерировать случайное число из
из диапозона min max IDRRef то нужно учитываить распределение элементов. например если приначале работы был загружен большой справочник то будут созданы элементы с случайным IDRRef с +1 до n и сответственно в дальнейшем учитывать плотность создания элементов за сессию. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |