![]() |
![]() |
![]() |
|
v7: Как определить структуру групп | ☑ | ||
---|---|---|---|---|
0
Злопчинский
26.04.14
✎
16:47
|
Грузим инфу из файла обмена.
есть инфа по структуре групп, например: ЧЕХОЛ/ALCATEL/Alcatel OT-4007D Pixi/СИЛИКОН . как быстро и ПРАВИЛЬНО определить - имеется ли такая структура групп? как вообще кузявее подойти к решению такой задачи? |
|||
1
Злопчинский
26.04.14
✎
16:47
|
От, елы палы...
"Как я не люлюня" читать "Как я не люблю обмены" |
|||
2
Злопчинский
26.04.14
✎
16:50
|
тупо: отобрать запросом группы: в обходе результатов построить ПолноеНаименвание группы и искать группу из файла в этом множестве?
|
|||
3
Torquader
26.04.14
✎
16:59
|
(2) Ну, проще всего найти символы / (которые, кстати, в имени тоже быть могут) и проверить всё по каталогу.
P.S. проще было выгружать не полный путь, а имена всех родителей, разделённые запятыми, чтобы потом не заниматься "гаданием на кофейной гуще". |
|||
4
Wobland
26.04.14
✎
17:11
|
(3) ээ.. а потом раздумывать, где у меня в файле элемент, где группа, а где другие данные?
|
|||
5
Злопчинский
26.04.14
✎
17:15
|
(3) ЧЕХОЛ/ALCATEL/Alcatel OT-4007D Pixi/СИЛИКОН
- это и есть имена всех родителей, разделенные слэшем. в именах групп слешей нет. . вот как раз и интересует что есть в вашем понятии "...и проверить всё по каталогу..." - каким образом? (например группа СИЛИКОН может быть дочкой группы IPHONE 5S (т.е. в общем случае имя группы - не уникально, уникальна иерархия групп) |
|||
6
Wobland
26.04.14
✎
17:17
|
а есть же что-то в этих ваших семёрках, которое полный путь возвращается?
|
|||
7
Wobland
26.04.14
✎
17:17
|
(6) *возвращает
|
|||
8
Злопчинский
26.04.14
✎
17:24
|
Че вы уперлись в этот полный путь? - ЕСТЬ!
вот этот полный путь: ЧЕХОЛ/ALCATEL/Alcatel OT-4007D Pixi/СИЛИКОН это имена четырех групп, каждая последующая (слева направо) вложена в предыдущую... |
|||
9
Злопчинский
26.04.14
✎
17:54
|
хм.. получил чорным запросом с пробегом по результату - перечень всех иерархий групп...
. однакож.. если в группе нету элементов - такую группу не видно... . как в запрос включить все группы справочника..? |
|||
10
ifso
26.04.14
✎
17:55
|
ЭтоГруппа для элемента, не?
|
|||
11
Злопчинский
26.04.14
✎
17:58
|
(10) угу, только что делать если в группе нет элементов?
|
|||
12
Злопчинский
26.04.14
✎
17:59
|
елы-палы, КонецЦикла или Ёпрст как-то вроде показывали хитрый финт (иля путаю)
|
|||
13
ifso
26.04.14
✎
18:06
|
(11) выбираешь все элементы, у которых ЭтоГруппа=1
есть в группе элементы или нет фиолетово |
|||
14
Torquader
26.04.14
✎
18:06
|
(9) Где не видно ?
Если вы выбираете элементы и указываете полный путь, то почему потом нельзя проверить наличие этого полного пути ? То есть мы выбираем из базы все элементы (у которых ЭтоГруппа()=1) и выводим для них полный путь (а не для их родителей) - получаем ТЗ, в которую можно засунуть читаемый полный путь. |
|||
15
Злопчинский
26.04.14
✎
18:10
|
(13) (14) тупой выборкой - проблем нет.
а вот запросом - хрен вам с редиской. |
|||
16
ifso
26.04.14
✎
18:13
|
(15) типа и функция запросная не спасет?
|
|||
17
Злопчинский
26.04.14
✎
18:13
|
прямым запросом все группы выбрать - не вопрос, только блин и для скуля писать, и для дбфа... да еще когда слаб в этих прямых запросах (надо уже сеть как-нить повтыкать) (а потом пробежаться по ним с получкением полного пути ибо в запросе всякими транзитивными замфканиями и прочеими штуками - чтобы сразу из зхапроса получить все иерархии - я не умею...)
. плюнул нафиг тупой выборокой выбрал, все равно на ожидаемых объемах задержка минимальная будет |
|||
18
Злопчинский
26.04.14
✎
18:14
|
(16) может и спасет, ноя пока не дотумкиваю как... весь вопрос - как в запрос впихнуть группу, в которой нет элементов...
|
|||
19
ifso
26.04.14
✎
18:18
|
(18) Забудь про группы. Нет групп. Т.е. совсем. Есть элементы с признаком ЭтоГруппа=1
|
|||
20
Torquader
26.04.14
✎
18:19
|
(17) Прямой запрос данную выборку не ускорит, так как мы просто перебираем весь справочник, выбирая только группы.
Вопрос в другом - использовать ли функцию для получения полного наименования или получать его потом, когда мы загрузим все данные в таблицу значений. |
|||
21
Злопчинский
26.04.14
✎
18:20
|
(19) во ты блин какой умный... ;-) попробуй чорным запросом получить в результатах запроса элемент (=группу), в которой нет элементов-записей.
. текст запроса в студию. . а то я реально может туплю |
|||
22
Злопчинский
26.04.14
✎
18:21
|
(20) полное наименование - пофиг, потом получим. хоть прямым перебором результатов запроса - так как групп существенно меньше чем элементов.
|
|||
23
Torquader
26.04.14
✎
18:22
|
(21) Ну, join из двух одинаковых таблиц, где выбирается элемент с пометкой это группа и соединение с той же таблицей по полям Id=Parent, но с условием, что Parent=Null или, если использовать Count(), то =0
|
|||
24
ДенисЧ
26.04.14
✎
18:23
|
Суббота?
Описание для НайтиПоНаименованию() украли? |
|||
25
ifso
26.04.14
✎
18:25
|
(21) может не стОит пытаться взглянуть на гланды через "черный ход" ?)
|
|||
26
Torquader
26.04.14
✎
18:26
|
(24) Так ему нужно проверить существование группы - а если это окажется элемент, который по имени совпадает с группой ?
|
|||
27
ifso
26.04.14
✎
18:27
|
(26) Смирно! ЭтоГруппа к осмотру! )
|
|||
28
Torquader
26.04.14
✎
18:30
|
(27) Если у нас есть Группа1/Товар1, где товар - это элемент и запись Группа1/Товар1/ТочноТовар1, то при поиске по наименованию "Группа1/Товар1", что нам вернут ?
|
|||
29
ДенисЧ
26.04.14
✎
18:32
|
(28) А вот тут на сцену вылезает транзакция и удалить(1) !
|
|||
30
Torquader
26.04.14
✎
18:33
|
(29) И группа недовольных пользователей, которые замаялись ждать отката транзакции.
|
|||
31
Злопчинский
26.04.14
✎
18:33
|
(24) не нравится мне такая идея (пока).. параноик я... в общем случае (вот блин эти общие случаи) - что мешает сущестовавать элементу с таким же наименованием как группа...?
|
|||
32
ДенисЧ
26.04.14
✎
18:34
|
(30) Группа пользователей организованной группой идёт....
В аптеку! |
|||
33
Torquader
26.04.14
✎
18:37
|
(32) За вазелином для программиста, который это придумал.
|
|||
34
Torquader
26.04.14
✎
18:37
|
В общем, если справочник не очень большой, то что мешает его весь один раз выбрать в таблицу и уже в этой таблице сортировать, искать и создавать ?
|
|||
35
Злопчинский
26.04.14
✎
18:37
|
не, программно-то всегда извернуться можно, не вопрос... но вот хотелось бы получить чорным запросом перечень всех иерархий + эдлемент соответсвующий последней группе в иерархии...
тогда прочитав из файла структуру групп типа ЧЕХОЛ/ALCATEL/Alcatel OT-4007D Pixi/СИЛИКОН ищем ее в таблице/результате запроса... если не нашли - делаем усекновение и ищем ЧЕХОЛ/ALCATEL/Alcatel OT-4007D Pixi - нашли, создаем в найденной группе подгруппу СИЛИКОН |
|||
36
Злопчинский
26.04.14
✎
18:38
|
(34) ээээ блин.... так я тоже умею.. а потом начнется распятие.. быдлокод.. не думаешь о будущих поколениях
|
|||
37
ifso
26.04.14
✎
18:41
|
(28) по "Товар1" найдет группу
|
|||
38
Torquader
26.04.14
✎
18:42
|
(36) Зато минимальное время обращения к базе - а то, что код делает потом - это уже не важно.
Просто в 1С нет InStrRev - вот из-за этого г.внокод и получается. |
|||
39
Torquader
26.04.14
✎
18:43
|
(37) Просто, если в Группа1 Существует элемент Товар1 и вложенная группа Товар1, то найдётся та, которая в dbf-файле встретится первой.
|
|||
40
КонецЦикла
26.04.14
✎
18:43
|
Тебе нужно запихать во вспомогательную таблицу в удобном виде эту инфу и все. Один раз. И пересоздавать записи при переносах групп в группу или при создании/удалении групп. Можно чтобы не париться перед процессом просто генерить ее и все, это быстро.
|
|||
41
Злопчинский
26.04.14
✎
18:48
|
(40) это понятно. объемы небольшие, можно даже хоть при каждом запуске перевыполнять заново.
ладно, как и ожидалось фиг кт о чем помог ;-) . но все равно всем спасибо! |
|||
42
КонецЦикла
26.04.14
✎
18:56
|
(41) Готовое решение редко кто дает :)
|
|||
43
Torquader
26.04.14
✎
19:04
|
Процедура мпСоздатьСтруктуруПапок(пстрПолныйПуть,пстрИмяСправочника,пспрНашаПапка)
Если ПустаяСтрока(пстрПолныйПуть)=1 Тогда пспрНашаПапка=ПолучитьПустоеЗначение("Справочник."+пстрИмяСправочника); Возврат; КонецЕсли; лспр=СоздатьОбъект("Справочник."+пстрИмяСправочника); лспрРодитель=ПолучитьПустоеЗначение("Справочник."+пстрИмяСправочника); лстрПутьДальше=пстрПолныйПуть; Пока 1=1 Цикл лч=Найти(лстрПутьДальше,"/"); Если лч=0 Тогда Прервать;КонецЕсли; лстрИмя=Лев(лстрПутьДальше,лч-1); лспр.ИспользоватьРодителя(лспрРодитель); Если лспр.НайтиПоНаименованию(лстрИмя,1,1)=0 Тогда лспр.НоваяГруппа(); лспр.Родитель=лспрРодитель; лспр.Наименование=лстрИмя; лспр.Записать(); КонецЕсли; лспрРодитель=лспр.ТекущийЭлемент(); лстрПутьДальше=Сред(лстрПутьДальше,лч+1); КонецЦикла; лспр.ИспользоватьРодителя(лспрРодитель); Если лспр.НайтиПоНаименованию(лстрПутьДальше,1,1)=0 Тогда лспр.НоваяГруппа(); лспр.Родитель=лспрРодитель; лспр.Наименование=лстрПутьДальше; лспр.Записать(); КонецЕсли; пспрНашаПапка=лспр.ТекущийЭлемент(); КонецПроцедуры |
|||
44
Злопчинский
26.04.14
✎
19:48
|
(43) спсб, но я примерно то же самое написал с обратной стороны - собрал иерархию папок в таблицу и ищу в ней. если не нашел - то создаю в "обратном" направлении...
|
|||
45
mszsuz
26.04.14
✎
21:02
|
как-то так:
Функция НайтиГруппу(Стр) СтрСР = СтрЗаменить(Стр, "/", РазделительСтрок); СН.ИспользоватьРодителя(""); Для нс = 1 по СтрКоличествоСтрок(СтрСР) Цикл Если (СН.НайтиПоНаименованию(СтрПолучитьСтроку(СтрСР, нс), 1, 1) = 0) ИЛИ (СН.ЭтоГруппа() = 0) Тогда Возврат ""; КонецЕсли; СН.ИспользоватьРодителя(СН.ТекущийЭлемент()); КонецЦикла; Возврат СН.ТекущийЭлемент(); КонецФункции |
|||
46
Злопчинский
26.04.14
✎
22:28
|
(45) ловко
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |