|
v7: Помогите разобрать прямой запрос... | ☑ | ||
---|---|---|---|---|
0
Zhuravlik
18.09.12
✎
13:14
|
Есть справочник, у него всего 6 периодических реквизитов. Хочу получить запросом таблицу, с группировками - ИмяРевизита, ДатаУстановкиЗначения, ВремяУстановкиЗначения, ДокументУстановивший значение, СтрокаДокумента, Значение.
Брал за основу это: |SELECT | СпрН.Descr AS Наименование, | Цены.Цена as [Цена $Число] |FROM | $Справочник.Номенклатура СпрН |LEFT JOIN | $Справочник.Цены СпрЦ ON СпрЦ.ParentExt = СпрН.ID AND | $СпрЦ.ТипЦен = :ТипЦен"; |LEFT JOIN ( | SELECT | Период.objid as objid, | Период.value as Цена | FROM 1sconst as Период | WHERE | Период.date IN | (SELECT | MAX(Константа.date) | FROM 1sconst as Константа | WHERE | (Константа.date <= :ВыбДата ~~) | AND (Константа.id = $ИсторияРеквизита.Цены.Цена) | AND (Константа.objid = Период.objid) | ) | AND Период.id = $ИсторияРеквизита.Цены.Цена | ) as Цены ON Цены.objid = СпрЦ.id Я примерно понимаю, что здесь происходит. Но не могу переделать под себя( Зачем здесь "Константа", "Период" и "$ИсторияРеквизита"? "$ИсторияРеквизита" - это объект метаданных? Какой? |
|||
1
Zhuravlik
18.09.12
✎
13:18
|
+ Период - это алиас для таблицы? 1sconst?
|
|||
2
Ёпрст
18.09.12
✎
13:23
|
(1) яя натюрлих
|
|||
3
Ёпрст
18.09.12
✎
13:24
|
код то какой знакомый..
|
|||
4
Zhuravlik
18.09.12
✎
13:26
|
Выполнил запросом вот такой кусочек кода
| SELECT | Период.objid as objid, | Период.value as Цена | FROM 1sconst as Период Получил ТЗ, с двумя полями: objid и Цена. Суть в общем-то ясна, только в поле objid - представления объектов, а как мне объекты получить? |
|||
5
Zhuravlik
18.09.12
✎
13:28
|
(3) Брал отсюда http://www.1cpp.ru/forum/YaBB.pl?num=1148874473
|
|||
6
Zhuravlik
18.09.12
✎
13:42
|
Захотел ограничить выборку по конкретному реквизиту, сделал так:
Мета=СоздатьОбъект("MetaDataWork"); ИД = Мета.ИДРеквизитаСправочника("Автомобили", "Загружен"); Запрос.УстановитьТекстовыйПараметр("ИД", ИД); ТекстЗапроса = " | SELECT | Период.objid as objid, | Период.value as Цена | FROM 1sconst as Период | Where objid = :ИД |" ; Выдает ошибку "FAILED! ICommandText::Execute(): Operator/operand type mismatch." И как из objid получить сам объект тоже не пойму. |
|||
7
Ёпрст
18.09.12
✎
13:57
|
(6) ид - это ид периодического реквизита, обжид - это ид элемента справочника, у которого смотрим периодику.
|
|||
8
Zhuravlik
18.09.12
✎
14:02
|
(7) А как получить ИД элемента справочника?
|
|||
9
Zhuravlik
18.09.12
✎
14:03
|
ох, кажется понял...
|
|||
10
Zhuravlik
18.09.12
✎
14:12
|
| Select Spr.ObjID as Object_ID
| FROM $Справочник.Автомобили Spr | Left Join ( | | SELECT | Период.objid as objid, | Период.value as Цена, | Период.ID as ID, | Период.DATE as DATE, | Период.VALUE as VALUE, | Период.DOCID as DOCID, | Период.TIME as TIME, | Период.ACTNO as ACTNO, | Период.LINENO as LINENO, | Период.TVALUE as TVALUE | FROM 1sconst as Период | WHERE objid = Object_ID | ) Опять ошибка "FAILED! ICommandText::Execute(): Operator/operand type mismatch." |
|||
11
1Сергей
18.09.12
✎
14:18
|
| WHERE objid = Spr.ObjID
|
|||
12
Zhuravlik
18.09.12
✎
14:18
|
Мета=СоздатьОбъект("MetaDataWork");
ИД = Мета.ИДРеквизитаСправочника("Автомобили", "Загружен"); Запрос.УстановитьТекстовыйПараметр("ИД", ИД); ТекстЗапроса = " | SELECT | Период.objid as objid, | Период.value as Цена, | Период.ID as ID, | Период.DATE as DATE, | Период.VALUE as VALUE, | Период.DOCID as DOCID, | Период.TIME as TIME, | Период.ACTNO as ACTNO, | Период.LINENO as LINENO, | Период.TVALUE as TVALUE | FROM 1sconst as Период | Where ID = :ИД |" ; Или так?? Тоже ругается FAILED! ICommandText::Execute(): Operator/operand type mismatch. |
|||
13
Ёпрст
18.09.12
✎
14:21
|
(12)
Where --ID = :ИД id = $ИсторияРеквизита.Автомобили.Загружен |
|||
14
Zhuravlik
18.09.12
✎
14:21
|
в (10) я делаю выборку по всем реквизитам, а в (12) пытаюсь ограничить ее одним. Как мне ограничить выборку по нужному реквизиту? Или по списку? Подскажите, куда посмотреть, что почитать, я ж нулевый в этом. Доков понакачал, но чем больше читаю, тем меньше понимаю(
|
|||
15
Ёпрст
18.09.12
✎
14:27
|
select Спр.id as [Элементик $Справочник.Автомобили],
Период.objid as objid, Период.value as Цена, Период.ID as ID, Период.DATE as DATE, Период.VALUE as VALUE, Период.DOCID as DOCID, Период.TIME as TIME, Период.ACTNO as ACTNO, Период.LINENO as LINENO, Период.TVALUE as TVALUE from $Справочник.Автомобили as Спр left join 1sconst as Период on период.objid = Спр.id and период.id = $ИсторияРеквизита.Автомобили.Загружен |
|||
16
Zhuravlik
18.09.12
✎
14:34
|
(15) Вкусно, спасибо. Только как готовить?..
|
|||
17
Zhuravlik
18.09.12
✎
14:38
|
(15) Я догадываюсь, что чтобы мне получить вместо ID, название реквизита в группировке, надо сделать некую замену
|Период.ID as ID, аналогично |select Спр.id as [Элементик $Справочник.Автомобили] Только какую? Если все реквизиты имеют тип число? Период.ID as [Реквизит $Число] - это сработает? |
|||
18
Zhuravlik
18.09.12
✎
14:40
|
Период.ID as [Реквизит $Число] - запрос прошел, но на выходе нули...
|
|||
19
Ёпрст
18.09.12
✎
14:46
|
(18) и.. нафига надо id типизировать ?!
и тем более, к числу его приводить ?! |
|||
20
Zhuravlik
18.09.12
✎
14:52
|
(19) Я хотел получить название реквизита, я подумал, что в квадратных скобках указывается "откуда его надо брать". Но теперь я знаю, как типизировать переменные в запросе.
|
|||
21
Mikeware
18.09.12
✎
14:56
|
(20) прежде чем делать то, что ты называешь "думать" - почитай документацию...
|
|||
22
Ёпрст
18.09.12
✎
14:59
|
(20) название периодического реквизита тоже можно получить, для этого нужно всего лишь создать временную табличку соответствий - имя реквизита и ид этого реквизита, потом уже делать лефт джоин к этой табличке в запросе.
|
|||
23
Zhuravlik
18.09.12
✎
15:41
|
(22) Спасибо, бум пробовать...
|
|||
24
Zhuravlik
18.09.12
✎
18:32
|
А откуда там берутся пустые поля, не подскажете? В полученной тз из (15) первые 244 строки - элементы есть, а значения полей 1sconst - пустые. Откуда они там вообще?
|
|||
25
Ёпрст
18.09.12
✎
18:43
|
(24) :)
Это те элементы справочника Автомобили, у которых не заполнен периодический реквизит Загружен |
|||
26
Zhuravlik
21.09.12
✎
14:16
|
Здравствуйте. Сегодня снова начал ломать голову, вот что получилось:
база = СоздатьОбъект("SQLiteBase"); база.Открыть(":memory:"); Запрос = база.НовыйЗапрос(); запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF"); спрАвтомобили = СоздатьОбъект("Справочник.Автомобили"); спрАвтомобили.ВыбратьЭлементы(); Пока спрАвтомобили.ПолучитьЭлемент() = 1 Цикл Прервать; КонецЦикла; стр = Мета.ЗначениеВСтрокуБД(спрАвтомобили.ТекущийЭлемент()); Запрос.Подставлять("ВыбАвто", стр); ТекстЗапроса = " |select | Период.objid as [Элементик $Справочник.Автомобили], | Период.DATE as DATE, | Период.DOCID as Док, | Период.TIME as TIME, | Период.ACTNO as ACTNO, | Период.LINENO as LINENO |from [_1S.Const] as Период |Where Период.id = :ИсторияРеквизита.Автомобили.Загружен and Период.objid = :ВыбАвто |"; ТЗ = Запрос.ВыполнитьЗапрос(ТекстЗапроса); Сделал почти все, что хотел. Осталось получить Ссылку на объект, в поле документа. Проблема в том, что значение может быть установлено разным видом документов, и если я делаю так: Период.DOCID as [Док $Документ] - то ничего не выходит. Как мне это сделать? Еще лучше было бы понять как при-лефт-джойнить табличку с атрибутами тч документа, по строке... |
|||
27
Zhuravlik
21.09.12
✎
14:20
|
+ Пробовал так, не прокатило:
тз.НоваяКолонка("Док_О"); ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл тз.док_О = Мета.ЗначениеИзСтрокиБД(,,тз.Док); КонецЦикла; |
|||
28
Zhuravlik
21.09.12
✎
14:20
|
+ забыл
Мета=СоздатьОбъект("MetaDataWork"); |
|||
29
Zhuravlik
21.09.12
✎
14:34
|
|Left join (
| Select | ДокументСтроки." Где мне взять вид документа? " | | ) |
|||
30
Mikeware
21.09.12
✎
15:13
|
(26) чтобы протипизировать документ, джойнь журнал, и в колонки запроса добавь колонку с иддокдефом из журнала, и идентификатором Док_вид.
|
|||
31
Zhuravlik
21.09.12
✎
15:36
|
(30) Спасибо за совет, кажется сделал
ТекстЗапроса = " |Select | Период.objid as [Элементик $Справочник.Автомобили], | Период.DATE as DATE, | Период.DOCID as Doc, | Период.TIME as TIME, | Период.LINENO as LINENO |From [_1S.Const] as Период |Left join ( | Select | Journal.iddoc as iddoc | From Journal //| Where Journal.iddocdef = DOC | ) |Where Период.id = :ИсторияРеквизита.Автомобили.Загружен and Период.objid = :ВыбАвто |"; А почему он ругался на закомментированную строчку, что нет переменной "DOC"? Теперь есть еще одна колонка в тз, а как мне протипизировать? |
|||
32
Mikeware
21.09.12
✎
15:39
|
а что такое "переменной "DOC"" где она есть?
|
|||
33
Zhuravlik
21.09.12
✎
15:39
|
+ох, нет, недосмотрел, нет ее в тз. Вернее "DOC" Есть, а iddoc - нет
|
|||
34
Zhuravlik
21.09.12
✎
15:40
|
(32) | Период.DOCID as Doc,
- это я так понял ссылка на идентификатор объекта, строка длиной 9 символов |
|||
35
Mikeware
21.09.12
✎
15:43
|
(34) это не "ссылка на идентификатор", а собственно сам идентификатор и есть
|
|||
36
Mikeware
21.09.12
✎
15:44
|
а переменной "doc" - ytn
|
|||
37
Zhuravlik
21.09.12
✎
15:51
|
Вот так по идее должно сработать, но не работает, я так понимаю потому что DOC - это строка 9 символов, а journ.iddocdef - больше, а как им словиться?
ТекстЗапроса = " |Select | Период.objid as [Элементик $Справочник.Автомобили], | Период.DATE as DATE, | Период.DOCID as Doc, | Период.TIME as TIME, | Период.LINENO as LINENO, | jour.iddoc as iddoc |From [_1S.Const] as Период |Left join Journal as jour on Jour.IDDocDef = Doc |Where Период.id = :ИсторияРеквизита.Автомобили.Загружен and Период.objid = :ВыбАвто |"; |
|||
38
Zhuravlik
21.09.12
✎
15:51
|
+Запрос проходит, но поле - пустое
|
|||
39
Zhuravlik
21.09.12
✎
16:05
|
Подскажите, как сделать?
|Left join Journal as jour on Jour.IDDocDef = Doc~ - ругается на синтаксис |
|||
40
Zhuravlik
21.09.12
✎
16:07
|
Е) Прокатило!
ТекстЗапроса = " |Select | Период.objid as [Элементик $Справочник.Автомобили], | Период.DATE as DATE, | Период.DOCID as Doc, | Период.TIME as TIME, | Период.LINENO as LINENO, | jour.iddocDef as iddocdef |From [_1S.Const] as Период |Left join Journal as jour on Jour.IDDoc = Doc |Where Период.id = :ИсторияРеквизита.Автомобили.Загружен and Период.objid = :ВыбАвто |"; перепутал вид с объектом |
|||
41
Zhuravlik
21.09.12
✎
16:08
|
+ Только что с этим теперь делать??
|
|||
42
Ёпрст
21.09.12
✎
16:16
|
>>> on Jour.IDDoc = Doc
это че за бред ? |
|||
43
Zhuravlik
21.09.12
✎
16:17
|
(42) Уже исправил
|Left join Journal as jour on Jour.IDDoc = Период.DOCID |
|||
44
Zhuravlik
21.09.12
✎
16:18
|
как протипизировать?
|
|||
45
Zhuravlik
21.09.12
✎
16:19
|
"Типизация Документ
Задается как: $|:Документ|Document[.ИмяВидаДокумента] При указании вида документа результат должен быть строкой 9 символов - внутренний идентификатор документа. Если вид документа не указан, результат должен быть строкой 13 символов - внутренний идентификатор документа с идентификаторм вида документа. Либо результат может быть строкой 9 символов - внутренний идентификатор документа, и в составе полей запроса существует колонка с именем, как у этой колонки + "_вид", или "_kind", в которой лежит вид документа." | Период.DOCID as [Doc $Документ], | Период.TIME as TIME, | Период.LINENO as LINENO, | jour.iddocDef as _kind На выходе - пустое поле |
|||
46
Zhuravlik
21.09.12
✎
16:21
|
а-а-а-а-а!! Я сделал!
ТекстЗапроса = " |Select | Период.objid as [Элементик $Справочник.Автомобили], | Период.DATE as DATE, | Период.DOCID as [Doc $Документ], | Период.TIME as TIME, | Период.LINENO as LINENO, | jour.iddocDef as Doc_kind |From [_1S.Const] as Период |Left join Journal as jour on Jour.IDDoc = Период.DOCID |Where Период.id = :ИсторияРеквизита.Автомобили.Загружен and Период.objid = :ВыбАвто |"; |
|||
47
Zhuravlik
21.09.12
✎
16:23
|
А несколько лефт-джойнов могут быть в запросе?
|
|||
48
antoneus
21.09.12
✎
16:24
|
(47) ещё как.
|
|||
49
Zhuravlik
21.09.12
✎
16:59
|
А как пробежаться по табличной части документа? В этом же запросе?
From ДокументСтроки.*Вид* - а вида-то нет? |
|||
50
Ёпрст
21.09.12
✎
17:10
|
(49) соединятся только с нужными тч или со всеми, через юнион вестимо
|
|||
51
Ёпрст
21.09.12
✎
17:10
|
можно и через лефт джоин +coalesce
|
|||
52
Zhuravlik
21.09.12
✎
17:30
|
(50) А как?? Я тут уже кружу сам не пойму что
база = СоздатьОбъект("SQLiteBase"); база.Открыть(":memory:"); Запрос = база.НовыйЗапрос(); запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF"); спАвто = СоздатьОбъект("СписокЗначений"); спрАвтомобили = СоздатьОбъект("Справочник.Автомобили"); спрАвтомобили.ВыбратьЭлементы(); Пока спрАвтомобили.ПолучитьЭлемент() = 1 Цикл спАвто.ДобавитьЗначение(спрАвтомобили.ТекущийЭлемент()); Если спАвто.РазмерСписка() = 10 Тогда Прервать; КонецЕсли; КонецЦикла; база.УложитьОбъекты(спАвто, "spAvto"); стр = Мета.ЗначениеВСтрокуБД(спрАвтомобили.ТекущийЭлемент()); Запрос.Подставлять("ВыбАвто", стр); ТекстЗапроса = " |Select | spAvto.val as [Элементик $Справочник.Автомобили], | Период.DATE as DATE, | Период.DOCID as [Doc $Документ], | Период.TIME as TIME, | Период.LINENO as LINENO, | jour.iddocDef as Doc_kind |From [_1S.Const] as Период, | spAvto |Left join Journal as jour on Jour.IDDoc = Период.DOCID |"; стр = ""; Для сч=1 По Метаданные.Документ() Цикл ИД = Метаданные.Документ(сч).Идентификатор; Если Найти(Нрег(ИД), "данныевбазу") = 0 Тогда Продолжить; КонецЕсли; стр = стр + "Left join [ДокументСтроки."+ ИД +"] As Doc"+сч+" on Doc"+сч+".Автомобиль = spAvto.val"+ РазделительСтрок; КонецЦикла; ТекстЗапроса = ТекстЗапроса + стр + "Where Период.id = :ИсторияРеквизита.Автомобили.Загружен and Период.objid = spAvto.val"; Сделал фильтр по списку автомобилей, теперь нужно найти строку в документе, и сделать группировки по всем атрибутам этой строки... Проблема в том, что видов документов - несколько, но они одинаковые, т.е. ДанныеВБазу_2011, ДанныеВБазу_2012, ДанныеВБазу_2013 |
|||
53
Zhuravlik
21.09.12
✎
17:31
|
юнион...
|
|||
54
Zhuravlik
21.09.12
✎
17:32
|
+(52) *одинаковые по структуре
|
|||
55
Zhuravlik
21.09.12
✎
17:49
|
А так можно? В смысле как типизировать? Ругается
ТекстЗапроса = " |Select | spAvto.val as [Элементик $Справочник.Автомобили], | Период.DATE as DATE, | Период.DOCID as [Doc $Документ], | Период.TIME as TIME, | Период.LINENO as LINENO, | jour.iddocDef as Doc_kind, | TAB.Модель as Модель | |From [_1S.Const] as Период, | spAvto, | $ДокументСтроки. + Doc_Kind as TAB |Left join Journal as jour on Jour.IDDoc = Период.DOCID |Where Период.id = :ИсторияРеквизита.Автомобили.Загружен and Период.objid = spAvto.val |"; |
|||
56
Mikeware
21.09.12
✎
18:03
|
left join $ДокументСтроки.ДанныеВБазу_2011 ДокВБазу2011 on ДокВБазу2011.iddoc=Период.docid and right(spAvto.val,9)=СпрАвтомобили.id
left join $ДокументСтроки.ДанныеВБазу_2011 ДокВБазу2011 on ДокВБазу2012.iddoc=Период.docid and right(spAvto.val,9)=СпрАвтомобили.id |
|||
57
Zhuravlik
21.09.12
✎
18:08
|
(56) А нескольким лефт джойнам можно дать одинаковые идентификаторы? Тогда все становится проще...
|
|||
58
Mikeware
21.09.12
✎
18:11
|
(57) что, по твоемуу, значит слово идентификатор? :-))
|
|||
59
Zhuravlik
21.09.12
✎
18:19
|
(58) left join $ДокументСтроки.ДанныеВБазу_2011 *ДокВБазу2011* on ДокВБазу2012.iddoc=Период.docid and right(spAvto.val,9)=СпрАвтомобили.id
То, что выделено звездочками, у вас в обоих строчках одинаковый. Или правильно называть "Представление"? |
|||
60
Zhuravlik
21.09.12
✎
18:27
|
(56) А может подскажите, как использовать Union ALL? Не могу догнать...
|
|||
61
Mikeware
21.09.12
✎
18:35
|
(60) "памагите, сами мы не мэстные, BOL украли, в яндексе забанили - киньте кода кто сколько может...."©
---------------- UNION Operator Combines the results of two or more queries into a single result set consisting of all the rows belonging to all queries in the union. This is different from using joins that combine columns from two tables. Two basic rules for combining the result sets of two queries with UNION are: The number and the order of the columns must be identical in all queries. The data types must be compatible. |
|||
62
Mikeware
21.09.12
✎
18:36
|
(59) да, облажался я с копипастом. читать как
left join $ДокументСтроки.ДанныеВБазу_2011 ДокВБазу2011 on ДокВБазу2011.iddoc=Период.docid and right(spAvto.val,9)=СпрАвтомобили.id left join $ДокументСтроки.ДанныеВБазу_2012 ДокВБазу2012 on ДокВБазу2012.iddoc=Период.docid and right(spAvto.val,9)=СпрАвтомобили.id left join $ДокументСтроки.ДанныеВБазу_2013 ДокВБазу2013 on ДокВБазу2013.iddoc=Период.docid and right(spAvto.val,9)=СпрАвтомобили.id left join $ДокументСтроки.ДанныеВБазу_2014 ДокВБазу2014 on ДокВБазу2014.iddoc=Период.docid and right(spAvto.val,9)=СпрАвтомобили.id ... |
|||
63
Zhuravlik
21.09.12
✎
18:55
|
(61)
Самый простой способ отмахнуться от дергающего за рукав падавана - это дать почитать мануал на аглицком))) Я читал о нем вот здесь - wiki:Union_(SQL). У меня не в том проблема, что я не понимаю, что такое юнион, а в том, что не знаю как его использовать, и не могу для себя визуализировать как должен выглядеть результат. Мне бы пару простых и понятных примеров на 1SQlite? То, что я в нете налазил - это портянки по 100500 строк с полупонятным содержимым. Оператор "Связка" Комбинация результатов выполнения двух и более запросов помещается во все строки, принадлежащие связке, как одиночный результат. Сочетает в себе результаты двух или более запросов в один результирующий набор, состоящий из всех строк, принадлежащих ко всем запросам в "Связке". Это могут быть как различные для использованных соединений так и скомбинированные колонки из двух таблиц. Два основных правила объединения результирующих наборов двух запросов с UNION являются: Количество и порядок столбцов должны быть одинаковыми во всех запросах. Типы данных должны быть совместимы. |
|||
64
Mikeware
21.09.12
✎
19:02
|
(63) объединяет выборки из нескольких таблиц (по сути, результирующие таблицы запросов) в одну. Из которой уже можешь выбирать что надо...
|
|||
65
Ёпрст
21.09.12
✎
19:14
|
>>>база.УложитьОбъекты(спАвто, "spAvto");
это не будет работатть, точнее будет, но не так , как ты хочешь :) |
|||
66
Zhuravlik
21.09.12
✎
20:44
|
(64) Это понятно... Буду доходить своей головушкой, с синдромом 86 г.р =) Был бы еще простой примерчик.
(65) Дык уже работает? Я хотел сделать фильтр по списку значений, или по таблице значений. Это неправильный способ? |
|||
67
Zhuravlik
26.09.12
✎
14:32
|
Добрый день) Поясните пожалуйста про (65)?
|
|||
68
Ёпрст
26.09.12
✎
14:34
|
(67) а чего, не работает ?
;) |
|||
69
Zhuravlik
26.09.12
✎
15:30
|
(68) Работает, как ни странно))) Просто хотел разобраться, что вы имели в виду?
|
|||
70
Ёпрст
26.09.12
✎
15:36
|
(69) группы если б были бы в списке твоём.. не смотрел, че ты там в список кидаешь
ЗЫ: у метода есть 4 параметр |
|||
71
Zhuravlik
26.09.12
✎
15:43
|
(70) А, ну тогда все в порядке) Я же выгружал именно элементы справочника, не группы, и не использовал режим иерархии. Я думал, что как-то неправильно задаю фильтр. Спасибо за науку)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |