|
v7: Запрос в ТП | ☑ | ||
---|---|---|---|---|
0
monsterZE
13.12.12
✎
11:47
|
как просто запрос - выполняется без проблем.
по половинкам (до union all) выполняется в ТП полностью - жалуется на ошибку преобразования даты или времени из символьной строки.. коментирую ДатаДок - невозможно привести к числу НомерДок.. ТекстЗапроса = " |SELECT | Жур.IDDoc as УнкИД, | CAST(Жур.DocNo as Char(10)) as НомерДок, | Жур.IDDoc as [Документ $Документ.РасходнаяНал], | Жур.IDDocDef as [ДокВид $ВидДокумента], | (Жур.Closed & 1 - Жур.ISMARK) as Статус, | CAST(LEFT(Жур.Date_Time_IDDoc, 8) as DateTime) as ДатаДок, | CAST(ДокРн.$ОбщийРеквизит.Основание as Char(100)) as Основание, | CAST(ДокРн.$ОбщийРеквизит.Коммент as Char(50)) as Коммент, | $ДокРн.Клиент as [Клиент $Справочник.Клиенты], | $ДокРн.Сумма as Сумма, | $ДокРн.Склад as [Склад $Справочник.Склады], | $ДокРн.НомерДокЮзер as НомерДокЮзер, | '' as ВремяДок |FROM | _1SJourn as Жур (NOLOCK) |INNER JOIN | _1SCRDOC as Отбор (NOLOCK) ON Отбор.ChildID = Жур.IDDoc | AND Отбор.MDID = $ГрафаОтбора.Клиент | AND Отбор.ParentVal = :ВыбКлиент* | AND Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ |INNER JOIN | $Документ.РасходнаяНал as ДокРн (NOLOCK) ON ДокРн.IDDoc = Жур.IDDoc |WHERE | Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ |UNION ALL |SELECT | Жур.IDDoc as УнкИД, | CAST(Жур.DocNo as Char(10)) as НомерДок, | Жур.IDDoc as [Документ $Документ.Счет_фактура], | Жур.IDDocDef as [ДокВид $ВидДокумента], | (Жур.Closed & 1 - Жур.ISMARK) as Статус, | CAST(LEFT(Жур.Date_Time_IDDoc, 8) as DateTime) as ДатаДок, | CAST(ДокСчФ.$ОбщийРеквизит.Основание as Char(100)) as Основание, | CAST(ДокСчФ.$ОбщийРеквизит.Коммент as Char(50)) as Коммент, | $ДокСчФ.Клиент as [Клиент $Справочник.Клиенты], | $ДокСчФ.Сумма as Сумма, | '' as Склад, | '' as НомерДокЮзер, | '' as ВремяДок |FROM | _1SJourn as Жур (NOLOCK) |INNER JOIN | _1SCRDOC as Отбор (NOLOCK) ON Отбор.ChildID = Жур.IDDoc | AND Отбор.MDID = $ГрафаОтбора.Клиент | AND Отбор.ParentVal = :ВыбКлиент* | AND Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ |INNER JOIN | $Документ.Счет_фактура as ДокСчФ (NOLOCK) ON ДокСчФ.IDDoc = Жур.IDDoc |WHERE | Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~"; |
|||
1
dk
13.12.12
✎
11:52
|
'' as Склад, => $ПустойИД as Склад,
---- НомерДокЮзер какой тип? Строка / Число / ... ? |
|||
2
dk
13.12.12
✎
11:56
|
видимо скуль делает типизацию колонок по первой половине выборки и когда во второй половине ты в число пихаешь строку - скуль возмущается
|
|||
3
Ёпрст
13.12.12
✎
11:57
|
(0) выкини псевдонимы у запроса после юнион
|
|||
4
Ёпрст
13.12.12
✎
11:58
|
ну и типизацию
|
|||
5
Ёпрст
13.12.12
✎
11:58
|
тоже
|
|||
6
ADirks
13.12.12
✎
12:02
|
да там с типизацией документа вообще что-то не то
и типизацию для даты надо явно указывать, причём достаточно такого: LEFT(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата] |
|||
7
Ёпрст
13.12.12
✎
12:04
|
да, с типизацией косяк..
нужно к [Док $Документ] + iddocdef Док_вид |
|||
8
monsterZE
13.12.12
✎
13:14
|
оставил минимум полей - работает
добавляю Основание - конфликт типов text не совместим с numeric основание - общий реквизит - строка, неогр. длинны общий реквизит коммент - строка 50 ошибка при преобразовании типа данных варчар к нум... |
|||
9
monsterZE
13.12.12
✎
13:17
|
колонки добавляю так:
ИмяКолонки="Основание"; Колонка = ТП.Колонки.Добавить(ИмяКолонки); Колонка.Заголовок = ИмяКолонки; Колонка.Данные = ИмяКолонки; может тут чего-то еще не хватает? |
|||
10
Ganiev
13.12.12
✎
13:23
|
Если не ошибаюсь запрос не может получить строку с количеством символов более 250 и много строчную тоже! пробуй биться к реквизиту через "ID"
|
|||
11
monsterZE
13.12.12
✎
13:24
|
поле IDDoc
такая-же херня :: ошибка варчар к нумб |
|||
12
Mikeware
13.12.12
✎
13:25
|
(11) расставь скобки по-нормальному...
|
|||
13
monsterZE
13.12.12
✎
13:25
|
(10) пробывал обрезать ее - тоже самое
думаю не в этом дело.. |
|||
14
monsterZE
13.12.12
✎
13:30
|
(12) где у меня не по нормальному?
ТекстЗапроса = " |SELECT | Жур.IDDoc as УнкИД, | Жур.DocNo as НомерДок, | (Жур.Closed & 1 - Жур.ISMARK) as Статус, | LEFT(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата], | $ДокРн.Клиент as [Клиент $Справочник.Клиенты], | $ДокРн.Сумма as Сумма |FROM | _1SJourn as Жур (NOLOCK) |INNER JOIN | _1SCRDOC as Отбор (NOLOCK) ON Отбор.ChildID = Жур.IDDoc | AND Отбор.MDID = $ГрафаОтбора.Клиент | AND Отбор.ParentVal = :ВыбКлиент* | AND Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ |INNER JOIN | $Документ.РасходнаяНал as ДокРн (NOLOCK) ON ДокРн.IDDoc = Жур.IDDoc |WHERE | Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ |UNION ALL |SELECT | Жур.IDDoc, | Жур.DocNo, | (Жур.Closed & 1 - Жур.ISMARK), | LEFT(Жур.Date_Time_IDDoc, 8), | $ДокСчФ.Клиент, | $ДокСчФ.Сумма |FROM | _1SJourn as Жур (NOLOCK) |INNER JOIN | _1SCRDOC as Отбор (NOLOCK) ON Отбор.ChildID = Жур.IDDoc | AND Отбор.MDID = $ГрафаОтбора.Клиент | AND Отбор.ParentVal = :ВыбКлиент* | AND Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ |INNER JOIN | $Документ.Счет_фактура as ДокСчФ (NOLOCK) ON ДокСчФ.IDDoc = Жур.IDDoc |WHERE | Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~"; |
|||
15
monsterZE
13.12.12
✎
15:20
|
...
вобщем - как это должно было выглядеть ТекстЗапроса = " |SELECT | Жур.IDDoc as [Док $Документ] | ,Жур.IDDocDef as Док_вид | ,Жур.IDDocDef as [ДокВидСтр $ВидДокумента] | ,Жур.DocNo as НомерДок | ,(Жур.Closed & 1 - Жур.ISMARK) as Статус | ,left(Жур.Date_Time_IDDoc, 8) as [ДатаДок $Дата] | ,ВыбДок.Клиент as [Клиент $Справочник.Клиенты] | ,ВыбДок.Сумма as Сумма | ,CAST(ВыбДок.Основание as Char(100)) as Основание | ,ВыбДок.Коммент as Коммент |FROM _1SJourn as Жур (NOLOCK) |INNER JOIN | _1SCRDOC as Отбор (NOLOCK) ON Отбор.ChildID = Жур.IDDoc | AND Отбор.MDID = $ГрафаОтбора.Клиент | AND Отбор.ParentVal = :ВыбКлиент* | AND Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ |LEFT JOIN |( | SELECT | ДокРн.IDDoc as IdDoc | ,$ДокРн.Клиент as Клиент | ,$ДокРн.Сумма as Сумма | ,ДокРн.$ОбщийРеквизит.Основание as Основание | ,ДокРн.$ОбщийРеквизит.Коммент as Коммент | FROM $Документ.РасходнаяНал as ДокРн (NOLOCK) | UNION ALL | SELECT | ДокСчф.IDDoc | ,$ДокСчф.Клиент | ,$ДокСчф.Сумма | ,ДокСчф.$ОбщийРеквизит.Основание | ,ДокСчф.$ОбщийРеквизит.Коммент | FROM $Документ.Счет_фактура as ДокСчф (NOLOCK) | UNION ALL | SELECT | ДокРнОф.IDDoc | ,$ДокРнОф.Клиент | ,$ДокРнОф.Сумма | ,ДокРнОф.$ОбщийРеквизит.Основание | ,ДокРнОф.$ОбщийРеквизит.Коммент | FROM $Документ.РасходнаяНОФ as ДокРнОф (NOLOCK) | UNION ALL | SELECT | ДокСчет.IDDoc | ,$ДокСчет.Клиент | ,$ДокСчет.Сумма | ,ДокСчет.$ОбщийРеквизит.Основание | ,ДокСчет.$ОбщийРеквизит.Коммент | FROM $Документ.Счет as ДокСчет (NOLOCK) | UNION ALL | SELECT | ДокПрих.IDDoc | ,$ДокПрих.Клиент | ,$ДокПрих.Сумма | ,ДокПрих.$ОбщийРеквизит.Основание | ,ДокПрих.$ОбщийРеквизит.Коммент | FROM $Документ.ПриходнаяНал as ДокПрих (NOLOCK) |) as ВыбДок ON ВыбДок.IDDoc = Жур.IDDoc |WHERE | Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~"; |
|||
16
Mikeware
13.12.12
✎
15:22
|
(15) не самый лучший запрос
|
|||
17
Ёпрст
13.12.12
✎
15:26
|
ВыбДок.Коммент тоже бы надо обрезать
|
|||
18
monsterZE
13.12.12
✎
15:28
|
(16) =) твоя краткость иногда просто радует
(17) оно ограниченной длинны 50 |
|||
19
Ёпрст
13.12.12
✎
15:29
|
без ТП, твой запрос отрабатывает ?
|
|||
20
Mikeware
13.12.12
✎
15:31
|
(18) а посмотри на план запроса...
имхается мне, что он выберет и объединит _все_ записи из 5 видов, и лишь потом сджойнит... я б присоединет внутренним, и получал существующие данные через coalesce() |
|||
21
monsterZE
13.12.12
✎
15:31
|
(19) и без ТП и с ТП
|
|||
22
monsterZE
13.12.12
✎
15:34
|
(20) ну если так, то выполняется он подозрительно быстро..
..хотя всегда можно можно попробывать ограничить эти пять выборок периодом и клиентом |
|||
23
Ёпрст
13.12.12
✎
16:42
|
(21) т.е не выполняется ?
|
|||
24
Ёпрст
13.12.12
✎
16:45
|
на счет вот этого, тоже не уверен, что будет работать
AND Отбор.ParentVal = :ВыбКлиент* |
|||
25
ADirks
13.12.12
✎
16:53
|
(20) Неа, кучкой джойнов не лучше, я проверял.
Иногда оптимизиатор строит идентичные планы, но чаще у него лучше получается с таким вот юнион-подзапросом. |
|||
26
monsterZE
13.12.12
✎
17:26
|
(23) все _работает_
юзер-функцию в скл положить - просто выполнив запрос? (конвертер времени) |
|||
27
monsterZE
13.12.12
✎
17:27
|
зы. функцию нашел, руками положил, прицепил - работает
|
|||
28
monsterZE
13.12.12
✎
17:30
|
попутно - окно тп за формой растягивается?
или, если к таблице его прицепить - разтягивается =) |
|||
29
Ёпрст
13.12.12
✎
17:35
|
(28) либо ручонками в ПриИзминенииРазмеровОкна, или
классами привязок, или вк от trad |
|||
30
Ёпрст
13.12.12
✎
17:37
|
А для ТП, можно взять готовый класс
http://www.1cpp.ru/forum/YaBB.pl?num=1273512019 |
|||
31
monsterZE
13.12.12
✎
17:39
|
(30) спасибо, будем посмотреть
и еще - а где смотреть пресловутый "план запроса" =) |
|||
32
ADirks
13.12.12
✎
18:22
|
(31) либо в Query Analyzer если SQL2000, либо в Management Studio если старше
|
|||
33
Mikeware
13.12.12
✎
18:28
|
(32) ну, 1CQA тоже показывает. Только падает иногда
|
|||
34
monsterZE
14.12.12
✎
14:16
|
у меня 2008, занчит в менеджмент студио
там есть монитор активности.. я в принципе вижу эти запросы.. но что там в какой последовательности происходит не вижу. |
|||
35
Ёпрст
14.12.12
✎
14:25
|
(34) создай запрос , в панели инструментов выбери предварительный план и действительный, выполни запрос - наслаждайся
|
|||
36
Ёпрст
14.12.12
✎
14:26
|
скулевый запрос получи из 1с-ного выполнив ОбрМетаСКЛ объекта метадатаворк или тупо скопировав запрос с профайлера
|
|||
37
monsterZE
14.12.12
✎
14:36
|
(35) (36) спс! =)
|
|||
38
monsterZE
14.12.12
✎
14:42
|
...нашел =)
если в мониторе кликнуть правой кнопкой по запросу - есть меню отображение плана выполнения |
|||
39
monsterZE
14.12.12
✎
15:00
|
вот как-то так.. вроде нормально склеил =)
[URL=http://imageshack.us/photo/my-images/502/70313914.jpg/][IMG]http://img502.imageshack.us/img502/5180/70313914.jpg[/IMG][/URL] |
|||
40
monsterZE
14.12.12
✎
15:00
|
||||
41
Ёпрст
14.12.12
✎
15:01
|
(39) слишком большая картинка, сделай меньше, много меньше, а то ничерта не видно - слишком всё огромное и крупное
|
|||
42
monsterZE
14.12.12
✎
15:05
|
(41) да это похож имадж порезал ее.. ща без изменения размера перезалью..
http://img109.imageshack.us/img109/1943/30231983.jpg |
|||
43
Ёпрст
14.12.12
✎
15:24
|
можно улучшить - бегать по табличке отбора и делать левое соедиение с журнальчиком + условие на виды документов через
in (...) даже твой запрос быстрее будет, если воткнешь: where Жур.iddocdef in ($ВидДокумента.РасходнаяНал,$ВидДокумента.РасходнаяНОФ, ...) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |