Имя: Пароль:
1C
1C 7.7
v7: Выборка прямым запросом за текущий период
0 pilot 560
 
17.07.13
10:32
Вот такой запрос делаю посредством 1С++:
   |    (SELECT
   |        CASE WHEN
   |            РегСН.debkred = 0
   |        THEN
   |            $РегСН.Товар
   |        ELSE
   |            $ПустойИД
   |        END as ТоварВх,
   |        CASE WHEN
   |            РегСН.debkred = 1
   |        THEN
   |            $РегСН.Товар
   |        ELSE
   |            $ПустойИД
   |        END as ТоварИсх,
   |        CASE WHEN
   |            РегСН.debkred = 0
   |        THEN
   |            $РегСН.СерийныйНомер
   |        ELSE
   |            $ПустойИД
   |        END as СерийныйНомерВх,
   |        CASE WHEN
   |            РегСН.debkred = 1
   |        THEN
   |            $РегСН.СерийныйНомер
   |        ELSE
   |            $ПустойИД
   |        END as СерийныйНомерИсх,
   |        РегСН.iddoc as ИДДокумента,
   |        РегСН.iddocdef as ВидДокумента,
   |        $РасходнаяНакладная.Клиент AS Покупатель,
   |        $ПриходнаяНакладная.Клиент AS Поставщик,
   |        sum(case when РегСН.debkred = 0 then $РегСН.Количество else 0 end) as КоличествоПриход,
   |        sum(case when РегСН.debkred = 1 then $РегСН.Количество else 0 end) as КоличествоРасход
   |    FROM $Регистр.СерийныеНомера as РегСН (nolock)
   |        LEFT JOIN $Документ.РасходнаяНакладная AS РасходнаяНакладная With (NOLOCK) ON (РасходнаяНакладная.IDDOC = РегСН.iddoc)
   |        LEFT JOIN $Документ.ПриходнаяНакладная AS ПриходнаяНакладная With (NOLOCK) ON (ПриходнаяНакладная.IDDOC = РегСН.iddoc)
   |        LEFT JOIN $Документ.АктТехКонтроля AS АктТехКонтроля With (NOLOCK) ON $АктТехКонтроля.Товар = $РегСН.Товар
   |            INNER JOIN $ДокументСтроки.АктТехКонтроля AS АктТехКонтроляСтроки With (NOLOCK) ON АктТехКонтроля.IDDOC = АктТехКонтроляСтроки.IDDOC
   |    where
   |        LEFT(РегСН.date_time_iddoc, 8) >= :НачДата and
   |        LEFT(РегСН.date_time_iddoc, 8) <= :КонДата"+СтрокаФильтров+"
   |    group by
   |        CASE WHEN
   |            РегСН.debkred = 0
   |        THEN
   |            $РегСН.Товар
   |        ELSE
   |            $ПустойИД
   |        END,
   |        CASE WHEN
   |            РегСН.debkred = 1
   |        THEN
   |            $РегСН.Товар
   |        ELSE
   |            $ПустойИД
   |        END,
   |        CASE WHEN
   |            РегСН.debkred = 0
   |        THEN
   |            $РегСН.СерийныйНомер
   |        ELSE
   |            $ПустойИД
   |        END,
   |        CASE WHEN
   |            РегСН.debkred = 1
   |        THEN
   |            $РегСН.СерийныйНомер
   |        ELSE
   |            $ПустойИД
   |        END,
   |        РегСН.iddocdef,
   |        РегСН.iddoc,
   |        $РасходнаяНакладная.Клиент,
   |        $ПриходнаяНакладная.Клиент
   |    having
   |        sum(case when РегСН.debkred = 0 then $РегСН.Количество else 0 end) <> 0 or
   |        sum(case when РегСН.debkred = 1 then $РегСН.Количество else 0 end) <> 0
   |    ) as СерийныеНомераОбороты

На сервер уходит вот это:
   (SELECT
       CASE WHEN
           РегСН.debkred = 0
       THEN
           РегСН.sp5308
       ELSE
           '     0   '
       END as ТоварВх,
       CASE WHEN
           РегСН.debkred = 1
       THEN
           РегСН.sp5308
       ELSE
           '     0   '
       END as ТоварИсх,
       CASE WHEN
           РегСН.debkred = 0
       THEN
           РегСН.sp5310
       ELSE
           '     0   '
       END as СерийныйНомерВх,
       CASE WHEN
           РегСН.debkred = 1
       THEN
           РегСН.sp5310
       ELSE
           '     0   '
       END as СерийныйНомерИсх,
       РегСН.iddoc as ИДДокумента,
       РегСН.iddocdef as ВидДокумента,
       РасходнаяНакладная.sp413 AS Покупатель,
       ПриходнаяНакладная.sp437 AS Поставщик,
       sum(case when РегСН.debkred = 0 then РегСН.sp5311 else 0 end) as КоличествоПриход,
       sum(case when РегСН.debkred = 1 then РегСН.sp5311 else 0 end) as КоличествоРасход
   FROM ra5312 as РегСН (nolock)
       LEFT JOIN dh410 AS РасходнаяНакладная With (NOLOCK) ON (РасходнаяНакладная.IDDOC = РегСН.iddoc)
       LEFT JOIN dh434 AS ПриходнаяНакладная With (NOLOCK) ON (ПриходнаяНакладная.IDDOC = РегСН.iddoc)
       LEFT JOIN dh4876 AS АктТехКонтроля With (NOLOCK) ON АктТехКонтроля.sp4880 = РегСН.sp5308
           INNER JOIN dt4876 AS АктТехКонтроляСтроки With (NOLOCK) ON АктТехКонтроля.IDDOC = АктТехКонтроляСтроки.IDDOC
   where
       LEFT(РегСН.date_time_iddoc, 8) >= '20130601' and
       LEFT(РегСН.date_time_iddoc, 8) <= '20130730'
   group by
       CASE WHEN
           РегСН.debkred = 0
       THEN
           РегСН.sp5308
       ELSE
           '     0   '
       END,
       CASE WHEN
           РегСН.debkred = 1
       THEN
           РегСН.sp5308
       ELSE
           '     0   '
       END,
       CASE WHEN
           РегСН.debkred = 0
       THEN
           РегСН.sp5310
       ELSE
           '     0   '
       END,
       CASE WHEN
           РегСН.debkred = 1
       THEN
           РегСН.sp5310
       ELSE
           '     0   '
       END,
       РегСН.iddocdef,
       РегСН.iddoc,
       РасходнаяНакладная.sp413,
       ПриходнаяНакладная.sp437
   having
       sum(case when РегСН.debkred = 0 then РегСН.sp5311 else 0 end) <> 0 or
       sum(case when РегСН.debkred = 1 then РегСН.sp5311 else 0 end) <> 0
   ) as СерийныеНомераОбороты

в выборке данные есть только за предыдущие периоды. Т.е. движения, сделанные текущим месяцем в выборку не попадают, но в таблице они точно есть. Регистр выставлен в остатки + галка на быструю обработку движений.
1 nicxxx
 
17.07.13
10:49
может это влияет: INNER JOIN dt4876 AS АктТехКонтроляСтроки?
возможно, нет таких записей в регистре
2 Mikeware
 
17.07.13
10:52
(1) ну дык! если нет ножек - нет и мультиков
3 pilot 560
 
17.07.13
10:55
блин, а и правда! Но мне это объединение нужно для последующих условий... Значит придется изыскать другие фонды
4 nicxxx
 
17.07.13
10:55
LEFT JOIN спасет отца русской демократии
5 nicxxx
 
17.07.13
10:56
и вобще, перед INNER стоит три LEFT джойна, чего тебя понесло на внутреннее соединение в четвертом случае?
6 Mikeware
 
17.07.13
10:57
(3) это не ОБЪединение, а СОединение....
называй вещи своими именами
7 pilot 560
 
17.07.13
11:03
(6) ну извините! )
(4), (5) да, что-то меня переклинило, что последний джойн должен идти к предыдущему LEFT. Понял, что был не прав
8 Ёпрст
 
17.07.13
11:18
вот это выкини из селекта и из хавинга
case when РегСН.debkred = 0 then $РегСН.Количество else 0 end

будь проще, используй операцию умножения.
9 Mikeware
 
17.07.13
11:27
(8) ну это ж математику вспоминать надо. 2-й класс... кому это надо?
2 + 2 = 3.9999999999999999999999999999999...