|
v7: 1sqlite - Отбор родителя справочника по списку групп | ☑ | ||
---|---|---|---|---|
0
ildary
23.04.14
✎
17:32
|
Уважаемые специалисты, посоветуйте пожалуйста как правильно осуществить SUBJ? На форуме упоминалось, что "select val from" возвращает только id элементов, и упоминалось, что можно применить Запрос.Подставлять, но это работает только если мы отбираем по одной группе, а как быть со списком групп?
|
|||
1
Vinianel
23.04.14
✎
17:45
|
(0) Если я ничего не путаю, то
УложитьОбъекты(ТвойСписок, "Список", 0). Ну и потом "SELECT Val FROM Список". |
|||
2
Ёпрст
23.04.14
✎
17:47
|
Как обычно, уложитьОбъекты и привет
|
|||
3
Ёпрст
23.04.14
✎
17:48
|
(1) путаешь, не указана типизация.
|
|||
4
Vinianel
23.04.14
✎
17:49
|
(3) Если указать типизацию, то в список будут уложены элементы, входящие в группы из Списка.
|
|||
5
Ёпрст
23.04.14
✎
17:49
|
+3 * иерархия, не указана..
(0) на вот, ознакомься Синтаксис: УложитьОбъекты(Объект, ИмяТаблицы, [КакПостоянную], [Иерархия]) Параметры: Объект - тип: СписокЗначений, Справочник, Счет. Выгружаемые объекты. ИмяТаблицы - тип: Строка. Имя созаваемой в базе данных таблицы. КакПостоянную - тип: Число. 1 - создать обычную таблицу, 0 - создать временную таблицу. Необязательный параметр. По умолчанию 0. Иерархия - тип: Строка. Название справочника или плана счетов для разворота групп справочника или групп счетов. Необязательный параметр. По умолчанию - пустая строка. Возвращает: нет Описание: Загружает значение либо список значений в базу данных, как таблицу базы данных. В базе данных создается таблица с заданным именем с одним полем val. Если таблица с таким именем существует, она уничтожается. В данную таблицу выгружаются внутренние идентификаторы объектов в формате char(9). Если первым параметром передан список значений, в таблицу укладываются значения из переданного списка. Если задана иерархия (название справочника либо плана счетов), то вместо объектов-групп выгружаются все входящие в группу элементы/счета всех нижележащих уровней. Сами группы при этом не выгружаются. Работа с иеерархией выполняется только в дбф-базах, в sql-версии 1С будет генерироваться исключение. Перед выполнением метода проверяется только то, что первый параметр либо список значений, либо справочник, либо счет. Проверка выгружаемых значений на то, что они действительно являются справочниками/счетами нужного вида - не производится, и вся отвественность за это возлагается на пользователя. При использовании иерархии метод гарантирует, что каждый из входящих в список объектов выгрузится не более одного раза, те дубли не выгружаются. Если иерархия не используется, список объектов выгружается как есть. |
|||
6
Ёпрст
23.04.14
✎
17:50
|
(4) ему это и надо
|
|||
7
Ёпрст
23.04.14
✎
17:50
|
Хотя.. хз чего ему надо :)
|
|||
8
Vinianel
23.04.14
✎
17:51
|
(6) Да я не ради спора :)
Значит, неправильно поняла фразу ТС "как быть со списком групп" :) |
|||
9
Ёпрст
23.04.14
✎
17:54
|
(8) ага, мот он в списке групп хочет найти нужную ? Тогда да, иерархию не надо указывать..
|
|||
10
monsterZE
23.04.14
✎
17:55
|
по аналогии
|SELECT | СпрРС.ID as [Сотр $Справочник.РаботникиСклада] |FROM | $Справочник.РаботникиСклада as СпрРС (NOLOCK) |WHERE | $СпрРС.Склад IN (:СписСкладов) либо | $СпрРС.Склад IN (SELECT Val FROM #Группа) Запрос.УложитьСписокОбъектов(СписокЭлементовВЗапрос, "#Группа","Клиенты"); |
|||
11
monsterZE
23.04.14
✎
18:00
|
(0) вопрос нормально сформулируй
|
|||
12
ildary
23.04.14
✎
18:11
|
Формулирую:
Грп = СоздатьОбъект( "Справочник.Номенклатура" ); Грп.НайтиПоКоду( "000046" ); Грп = Грп.ТекущийЭлемент(); СпсГрупп = СоздатьОбъект( "СписокЗначений" ); СпсГрупп.ДобавитьЗначение( Грп ); ТекстЗапроса = "SELECT | id [Элемент :Справочник.Номенклатура], | Спр.PARENTID [Родитель $Справочник.Номенклатура], |FROM | [Справочник.Номенклатура] Спр |WHERE | ( isfolder = 2 ) AND ( ismark <> '*' ) | AND ( Спр.PARENTID IN (select val from СпсГрупп ) )"; база.УложитьОбъекты( СпсГрупп, "СпсГрупп", 0, "Номенклатура" ); Таблица возвращается пустая. Вот здесь: 1sqlite: Условие по группам подчиненного справочника в прямом запросе. сказано: "у тебя группа, в SELECT Val From ВыбТовар всегда id элементов" Вопрос: как наложить фильтр по родителю элементов справочника по списку групп этого српавочника? |
|||
13
Ёпрст
23.04.14
✎
18:16
|
(12) в этом случае, никак. Нужно в список пихать еще и сами группы.
|
|||
14
Ёпрст
23.04.14
✎
18:17
|
как например, это в классе Ивана сделано в аккаундсрекордсет.. там есть уложить с группами.
|
|||
15
ildary
23.04.14
✎
18:22
|
(13) но ведь я и пихал группу Грп в СпсГрупп? этого недостаточно?
|
|||
16
ildary
23.04.14
✎
18:27
|
(14) речь идет о классе "ПрямойЗапрос" и процедуре УложитьСписокГрупп()?
|
|||
17
Попытка1С
23.04.14
✎
18:32
|
(16) Класс "ПрямойЗапрос" написал Александр Анисков.
|
|||
18
Ёпрст
23.04.14
✎
18:32
|
(15) там разворачивается всегда до всех элементов, входящих в эту группу, сами группы не пихаются
(16) не, речь про УложитьСписокГрупп в классе аккаунтрекордсет, хотя думаю, автор класса ПрямойЗапрос реализовал тоже самое и там.. вот еще можешь почитать Альтернатива УложитьСписокОбъектов с группами |
|||
19
Ёпрст
23.04.14
✎
18:34
|
если не заморачиваться, то список с только группами, можешь создать сам, примитивной выборкой с использованием параметров в методе ВыбратьЭлементы и ПолучитьЭлемент() ..
|
|||
20
Ёпрст
23.04.14
✎
18:35
|
ну и тупой рекурсией..
А можешь и прямым запросом с кучей лефтджоинов поиметь иерархию групп справочника для фильтра. |
|||
21
ildary
23.04.14
✎
18:56
|
(20) я прошу объяснить - что я в итоге должен положить в список отбора? Сейчас у меня в списке отбора одна группа, я должен получить все её подгруппы и в итоге фильтровать по ним? Но если это так, почему тогда не возвращаются элементы, которые подчинены непосредственно этой группе?
|
|||
22
orefkov
23.04.14
✎
20:27
|
Надо не parentid сравнивать, а сам id.
Уложить до элементов раскручивает. Если надо одну группу уложить, в СЗ её не обязательно класть, можно передать в метод сразу группу. |
|||
23
Salimbek
23.04.14
✎
20:59
|
(12)
1. Если нужны Элементы, входящие в группу (без вложенных подгрупп), то можно сделать: "Спр.PARENTID = &ВыбГруппа" запрос.УстановитьПараметр("ВыбГруппа",Грп); 2. Если нужны Элементы, входящие в список групп (без вложенных подгрупп), то можно уложить без раскрытия иерархии: "Спр.PARENTID IN (select val from СпсГрупп )" база.УложитьОбъекты(СпсГрупп, "СпсГрупп"); 3. Если нужны все вложенные элементы и из подгрупп, то надо раскрывать иерархию: "Спр.ID IN (select val from СпсЭлементов )" база.УложитьОбъекты(СпсГрупп, "СпсЭлементов",0,"Номенклатура"); P.S. Тестовый пример с поставщиком - "Справочник" не получилось сделать? |
|||
24
ildary
24.04.14
✎
11:41
|
(24) Прошу прощения, пример сделал, куда выслать?
|
|||
25
ildary
24.04.14
✎
11:44
|
(23) еще хотел уточнить - мне надо выполнить вариант 3, что должно быть в спсГрупп - все группы, которые я хочу получить вместе их подгруппами?
|
|||
26
Ёпрст
24.04.14
✎
11:44
|
а вопрос то в чем ?
Тебе нужно фильровать как хоть ? По родителю справочника ? Что если родитель есть в списке груп с учетом вложенности? Или что ? |
|||
27
ildary
24.04.14
✎
11:56
|
Многоуровневый справочник (Номенклатура в ТиС), мне надо получить список товаров, содержащихся в нескольких группах с кучей всяких условий. В (23) есть пункт 3, который описывает мою задачу, хочу узнать, что надо положить в СпсГрупп?
|
|||
28
Salimbek
24.04.14
✎
12:02
|
(27) Список нужных тебе групп
|
|||
29
Salimbek
24.04.14
✎
12:04
|
+(28) После Уложить - во временной таблице будут только Элементы из этих и подчиненных групп. Причем в таблице будут только уникальные элементы. Дубли не выгрузятся.
|
|||
30
Salimbek
24.04.14
✎
12:05
|
(24) На 1cpp в теме выложи, если что - там же, если разберусь, и отвечу. Здесь тему для этого создавать не очень удобно.
|
|||
31
Ёпрст
24.04.14
✎
12:05
|
(27) ну дык и делай как ы (23.3) + выкинь условие на parentid
делай просто where id in (select val from Список) база.УложитьОбъекты(СпсГрупп, "Список",0,"Номенклатура"); |
|||
32
КонецЦикла
24.04.14
✎
12:06
|
Вот примерно разворот уложить список объектов, можно модифицировать по своему усмотрению
ТекстЗапроса = " |if exists (select * from tempdb..sysobjects where id = object_id('tempdb..#temptovpr')) |drop table #temptovpr |create table #temptovpr (id char(9), isfolder tinyint, flag tinyint primary key clustered (id)) | |insert #temptovpr values (:ВыбТовар, 1, 1) | |while 1 = 1 begin | |insert into #temptovpr |select id, isfolder, $Прайс.ВклВФСервис |from $Справочник.Прайс_лист as Прайс (nolock) |where parentid in (select id from #temptovpr where isfolder = 1 and flag = 1) |and id not in (select id from #temptovpr) |and ismark = 0 | |if @@rowcount = 0 break |end | |delete from #temptovpr where isfolder = 1 |"; RecordSet.УстановитьТекстовыйПараметр("ВыбТовар", ВыбТовар); RecordSet.ВыполнитьИнструкцию(ТекстЗапроса); |
|||
33
Salimbek
24.04.14
✎
12:08
|
(32) Там sqlite так что твой текст - он хорош только для понимания сути происходящего.
|
|||
34
КонецЦикла
24.04.14
✎
12:09
|
(33) Ну для этого и писал, для понимания
|
|||
35
ildary
24.04.14
✎
12:20
|
Простите пожалуйста, все прекрасно работает, просто я перед вызовом запроса забыл убрать строку Условия = ""; (баловался при отладке и добаловался) - и удивлялся, почему выводятся все.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |