Имя: Пароль:
1C
1C 7.7
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
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 ($ВидДокумента.РасходнаяНал,$ВидДокумента.РасходнаяНОФ, ...)