Имя: Пароль:
1C
1C 7.7
v7: 1SQLite: Как правильно посчитать общее количество документов?
,
0 Zhuravlik
 
30.04.13
11:35
Здравствуйте. Хочу в запросе получить общее количество документов одноо вида, и количество помеченных на удаление. Делаю так:

   ТекстЗапроса = "
   |SELECT
   |    COUNT(*) as [Всего],
   |
   |    (SELECT COUNT(*)
   |     FROM [Журнал] as _Жур
   |     Where _ЖУР.ISMARK = '*' AND _Жур.iddocdef = :ВидДокумента.!ВидДок!) as [Удалено]
   |
   |From [Журнал] as Жур
   |WHERE Жур.iddocdef = :ВидДокумента.!ВидДок!
   |";

Смущает селект в селекте, а как по-другому не пойму. Это ведь неправильно так делать? Или все верно?
1 toypaul
 
гуру
30.04.13
11:39
select count(), count(case when условие then 1 else 0 end) from t

так можно в 1SQLite?
2 Zhuravlik
 
30.04.13
11:40
(1) Не знаю, но думаю попробовать стоит :) Ушел копать функцию "Case"...
3 orefkov
 
30.04.13
11:42
(1)
Только наверное второй не count, а sum
4 toypaul
 
гуру
30.04.13
11:43
(3) ага
5 Zhuravlik
 
30.04.13
11:49
Спасибо! Все получилось:

   ТекстЗапроса = "
   |SELECT
   |    COUNT(*) as [Всего],
   |
   |    SUM(CASE WHEN Жур.ISMARK = '*' THEN 1 ELSE 0 END) as [Удалено]
   |
   |From [Журнал] as Жур
   |WHERE Жур.iddocdef = :ВидДокумента.!ВидДок!
   |";
6 Zhuravlik
 
30.04.13
12:15
А скажите, если у документа нет реквизитов табличной части, запрос будет ошибку выдавать на
INNER JOIN [ДокументСтроки.!ВидДок!] as ДокТЧ ?
И если будет, как ее обойти?
7 Ёпрст
 
30.04.13
12:19
не делать inner join с несуществующей таблицей не предлагать ?
8 Zhuravlik
 
30.04.13
12:20
(7) А как ее на существование проверить в запросе?
9 Zhuravlik
 
30.04.13
12:22
+ Или только из метаданных это узнавать, и по результату добавлять-не добавлять иннер джойн в текст запроса?
10 Ёпрст
 
30.04.13
12:26
проверить, что возвращает запрос
select name from sqlite_master where name='имятаблички'

а так, нафига скармливать изначально неверный текст запроса ?
11 Zhuravlik
 
30.04.13
12:36
(10) Плата за универсальность. И просто понять для развития...
А прикрутить с exists? т.е.

CASE WHEN
        exists(select name from sqlite_master where name='!ВидДок!')
    THEN
        INNER JOIN [ДокументСтроки.!ВидДок!] as ДокТЧ
    END

Так? А как тогда в селекте обращаться? Если я хочу узнать COUNT(ДокТЧ.LINENO)?
12 Ёпрст
 
30.04.13
12:38
(11) так не выйдет
13 Ёпрст
 
30.04.13
12:40
можно разве что создать табличку ежели её нет..будет просто пустая
14 Туц
 
30.04.13
14:38
Тоже мне проблема.

   ПустойДок = ПолучитьПустоеЗначение("Документ.ПоступлениеТМЦРозница");
   глБДЗапрос.УстановитьТекстовыйПараметр("ВыбТип", ПустойДок);
   Рез = глБДЗапрос.ВыполнитьИнструкцию("
   |SELECT COUNT(*) Всего
   |,SUM(CASE WHEN Журнал.ISMARK = 1 THEN 1 ELSE 0 END) Помечено
   |,(selecT count(*) FROM $ДокументСтроки."+ПустойДок.Вид()+") ВсегоСтрок
   |FROM _1SJOURN Журнал
   |WHERE Журнал.IDDOCDEF  = :ВыбТип~~~
   |");            
   Рез.ВыбратьСтроку();        
Но это 1с++
На sqlite похоже будет.
15 Zhuravlik
 
30.04.13
14:50
(14) Тут проблема в другом. 1С (в ДБФ) не создает таблицы для шапок (DH) если нет реквизитов шапки, и не создает таблиц для табличных частей (DT) если нет реквизитов табличной части. И если я в запросе к таблице строк обращусь (для документа у которого нет реквизитов табличной части), то запрос ругнется, что нет такой таблицы.
Сейчас через метаданные смотрю, есть ли реквизиты, если есть - опрашиваю таблицу.
Было-бы интересно узнать как это обойти именно в запросе.
Видимо только как в (10), и создавать временную пустую если не существует записей в "sqlite_master".
16 Туц
 
01.05.13
06:00
(15) да какие проблемы
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'["+ИмяТаблицы+"]') AND type in (N'U')) SELECT 1 ESLE SELECT 0