|
v7: ПЗ - Запрос нетипизированных доков с отбором по товару в ТЧ | ☑ | ||
---|---|---|---|---|
0
monsterZE
11.07.12
✎
16:53
|
продолжим тему ПЗ =)
есть запрос выбирающий все доки с отбором по клиенту.. как бы еще наложить на него условие проверки ТЧ доков, на присутствие в них выбранного товара?.. покурив мануал нарисовал: [основной запрос] INNER JOIN $ДокументСтроки.РасходнаяНал as Док ON Док.IDDoc = Жур.IDDoc AND $Док.Товар = :ВыбТовар"; работает.. но как написать, если доки в выборке не типизированы? точнее присутствую несколько видов документов. |
|||
1
monsterZE
12.07.12
✎
14:42
|
так что, если в выборке содержатся документы разных типов, нельзя в самом запросе накладывать дополнительные условия по содержанию тч или общим реквизитам (если для них не стоит галка отбор)?
|
|||
2
Mikeware
12.07.12
✎
14:44
|
(1) джойнить со всеми таблицами строк
|
|||
3
monsterZE
12.07.12
✎
14:54
|
вобщем что возвращает первый запрос - сортировать по док_вид и делать еще запросы, подставляя в отбор иддок-и из первого..
хотелось типа универсальной выборки документов по реквизитам сделать.. =) |
|||
4
Ёпрст
12.07.12
✎
14:57
|
(2) зачем из первого ?
Там union all нужно между запросами к документам |
|||
5
Mikeware
12.07.12
✎
15:03
|
(4) можно union all, можно coalesce
|
|||
6
Ёпрст
12.07.12
✎
15:08
|
(5) дык юнион в разы быстрее будет
:) |
|||
7
monsterZE
12.07.12
✎
15:09
|
(4) запрос вот такой, с отбором по клиенту (клиент - графа отбора)
|SELECT | Жур.DocNo НомерД, | Жур.IDDoc as [Док $Документ], | Жур.IDDocDef as Док_вид |FROM | _1SJourn as Жур (NOLOCK) [..] + возможные условия по периоду, видам дока, состоянию (проведен/удален) есть общие реквизиты (без отбора) и табличная часть.. если я не знаю какого вида документы попали в выборку, делать джойн по всем возможным типам? или как-то можно по результирующей табличке? =) |
|||
8
monsterZE
12.07.12
✎
15:10
|
если выбраны конкретные виды доков, то понятно.. вопрос. если они не выбраны =)
|
|||
9
Ёпрст
12.07.12
✎
15:11
|
(7) если клиент графа отбора, то вообще ничего не надо - лефт джоин с 1скрдок и привет.
|
|||
10
monsterZE
12.07.12
✎
15:12
|
смысл "зачем" я думаю понятен - чтобы быстро найти доки, отвечающие заданным условиям
|
|||
11
Ёпрст
12.07.12
✎
15:12
|
И это, мот всю задачу целиком озвучишь ?
|
|||
12
monsterZE
12.07.12
✎
15:12
|
(9) да ее то я джойню и это как-бы первая часть марлезонского балета =)
|
|||
13
monsterZE
12.07.12
✎
15:14
|
хочу чтобы чел (например я), мог найти все документы соответствующие заданным условиям.. такая выборка.
по товару в тч, по автору, за период, удален, проведен, непроведен |
|||
14
Ёпрст
12.07.12
✎
15:14
|
(12) если условие на табличную часть и нет графы отбора - то через обход метаданных выгребаешь нужные виды доков, имя реквизита ТЧ и лепишь свой запрос.
|
|||
15
Mikeware
12.07.12
✎
15:14
|
(6) не всегла
|
|||
16
Ёпрст
12.07.12
✎
15:15
|
если есть условие по товару - присоединяешь ТЧ доков, если нет - не присоединяешь.
Остальное, удален, проведен, непроведен - всё есть в 1sjourn |
|||
17
Ёпрст
12.07.12
✎
15:16
|
(15) ээ.. например ?
|
|||
18
monsterZE
12.07.12
✎
15:18
|
(16) ну я к тому и веду, что надо присединять таблички доков, виды которых попали в первую выборку.. а если я не знаю (конкретно не выбрано), то, значит два запроса
|
|||
19
Ёпрст
12.07.12
✎
15:19
|
(18) ? всегда один запрос. Откуда два то ?
Сам текст запроса строится в зависимости от условий. |
|||
20
Mikeware
12.07.12
✎
15:19
|
(17) проджойнить таблицы к журналу, а реквизиты собрать в коаелске 0 быстрее, чем несколько селектов через юнион олл
|
|||
21
Ёпрст
12.07.12
✎
15:19
|
И че за "первая" выборка у тебя ?
|
|||
22
monsterZE
12.07.12
✎
15:19
|
в любом случае надо обращаться к табличке конкретного документа. если на реквизитах нет галки отбор.
|
|||
23
Ёпрст
12.07.12
✎
15:20
|
(20) да ну ?.. не верю.. замеры есть ?
:) |
|||
24
monsterZE
12.07.12
✎
15:22
|
(21) "первая выборка", это то, что получается если не подтягивать выбранные конкретно виды документов. т.е. содержащая отбор только по клиенту, период, закрытый док, удален..
|
|||
25
Mikeware
12.07.12
✎
15:23
|
(23) Повспоминать надо...
|
|||
26
Mikeware
12.07.12
✎
15:23
|
(24) строй запрос динамически
|
|||
27
monsterZE
12.07.12
✎
15:32
|
(26) =) я и строю
но, если не знаю, какие виды доков попадут в запрос, подтягивать все возможные таблички? т.е. по всем видам? --- ТекстЗапроса = " |SELECT | Жур.DocNo НомерД, | Жур.IDDoc as [Док $Документ], | Жур.IDDocDef as Док_вид |FROM | _1SJourn as Жур (NOLOCK) |INNER JOIN | _1SCRDOC Отбор ON Отбор.ChildID = Жур.IDDoc"; // клиент Если ОтборКлиент=1 Тогда ТекстЗапроса = ТекстЗапроса+" | AND Отбор. MDID = $ГрафаОтбора.Клиент"; Если ВыбКлиент.ЭтоГруппа()=1 Тогда ТекстЗапроса = ТекстЗапроса+" |AND Отбор.ParentVal IN (Select 'B1'+$ВидСправочника36.Клиенты+Val from #Группа)"; Запрос.УложитьСписокОбъектов(ВыбКлиент, "#Группа","Клиенты"); Иначе ТекстЗапроса = ТекстЗапроса+" |AND Отбор.ParentVal = :ВыбКлиент*"; Запрос.УстановитьТекстовыйПараметр("ВыбКлиент", ВыбКлиент); КонецЕсли; Иначе ТекстЗапроса = ТекстЗапроса+" | AND Отбор. MDID = 0"; КонецЕсли; // период Если ФлгЗаВесьПериод=0 Тогда ТекстЗапроса = ТекстЗапроса + " |AND Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~"; Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата); Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата); КонецЕсли; // статы-документа Если СтатУдален=0 Тогда ТекстЗапроса = ТекстЗапроса + " |AND Жур.ISMARK = 0"; Иначе ТекстЗапроса = ТекстЗапроса + " |AND Жур.ISMARK = 1"; КонецЕсли; Если (СтатПроведен=1) и (СтатНепроведен=0) Тогда ТекстЗапроса = ТекстЗапроса + " |AND Жур.Closed & 1 = 1"; ИначеЕсли (СтатПроведен=0) и (СтатНепроведен=1) Тогда ТекстЗапроса = ТекстЗапроса + " |AND Жур.Closed & 1 = 0"; КонецЕсли; // по всем типам документов Если ФлгДокВсе=0 Тогда // выбран конкретный тип документа Если ВыбТипДок.Выбран()=1 Тогда ТекстЗапроса = ТекстЗапроса + " |AND Жур.IDDocDef = $ВидДокумента."+ВыбТипДок.Идентификатор(); Иначе Операнд = " |AND ("; Если ТипРасхНал=1 Тогда ТекстЗапроса = ТекстЗапроса+Операнд+"Жур.IDDocDef = $ВидДокумента.РасходнаяНал"; Операнд = " OR "; КонецЕсли; Если ТипРасхНОФ=1 Тогда ТекстЗапроса = ТекстЗапроса+Операнд+"Жур.IDDocDef = $ВидДокумента.РасходнаяНОФ"; Операнд = " OR "; КонецЕсли; Если ТипПрихНал=1 Тогда ТекстЗапроса = ТекстЗапроса+Операнд+"Жур.IDDocDef = $ВидДокумента.ПриходнаяНал"; Операнд = " OR "; КонецЕсли; Если ТипСчет=1 Тогда ТекстЗапроса = ТекстЗапроса+Операнд+"Жур.IDDocDef = $ВидДокумента.Счет"; Операнд = " OR "; КонецЕсли; Если ТипСчетФакт=1 Тогда ТекстЗапроса = ТекстЗапроса+Операнд+"Жур.IDDocDef = $ВидДокумента.Счет_фактура"; Операнд = " OR "; КонецЕсли; ТекстЗапроса = ТекстЗапроса+")"; КонецЕсли; КонецЕсли; |
|||
28
Ёпрст
12.07.12
✎
15:38
|
(27) OR надо избегать в условии
заместо этого, пиши так Жур.IDDocDef in ($ВидДокумента.РасходнаяНал,$ВидДокумента.Счет_фактура,.....) |
|||
29
monsterZE
12.07.12
✎
15:40
|
(28) хорошо
|
|||
30
Ёпрст
12.07.12
✎
15:43
|
(25) ща в 1sqa накидал простецкий запрос для 2-х видов документов.. чет-то coalesce проигрывает юниону.. намного
:) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |