Имя: Пароль:
1C
1C 7.7
v7: Простой запрос на SQLite напишите, плиз
0 Злопчинский
 
18.04.13
20:28
Простой запрос (сам слаб по регистрам)
Подсчет количества раз упоминаний номенклатурыв в документах продажи
хочется получить плоскую ТЗ
Артикул-Наименование-Количество упоминаний
.
7.7 ТиС
чорный запрос
   ТекстЗапроса = "
   |Период с ДатаН по ДатаК;
   |Артикул        = Регистр.Продажи.Номенклатура.Артикул;
   |Номенклатура    = Регистр.Продажи.Номенклатура;
   |Количество    = Регистр.Продажи.Количество;
   |Функция КоличествоСумма = Сумма(Количество);
   |Функция Сколько = Счётчик();
   |Группировка Номенклатура упорядочить по Номенклатура.Артикул без групп;
   |Группировка Документ;
   |";
//Регистр.Продажи - оборотный
//именно продажи, т.е. где КоличестивоСумма >0
//в итоговой таблице колво штук продаж - не нужно.
.
   Запрос = СоздатьОбъект("Запрос");
   Если Запрос.Выполнить(ТекстЗапроса) <> 1
   Тогда
       Возврат;
   КонецЕсли;
   
   ТЗ = СоздатьОбъект("ТаблицаЗначений");
   Запрос.Выгрузить(ТЗ,1,1);
//
безвозмездно или возмездно за небольшую денежку на мобильный или WebMoney
.
Спсб
1 МихаилМ
 
18.04.13
21:50
а потом на инфостарте появится статейка
некоего чебуратора, в которой интелекта чебуратора - 1%
а остальное 99% копипаст с мисты.
2 mistеr
 
18.04.13
22:02
Один я не понял, причем здесь SQLite?
3 wladimir90
 
18.04.13
22:07
(2) Я тоже задался этим вопросом. Может все таки - обычный SQL запрос к серверной БД?
4 Злопчинский
 
18.04.13
22:23
(1) Обязательно! с упоминанием учителей!
5 Desna
 
18.04.13
22:25
1 запрос выбрать все документы по регистру
2 запрос, руцями документы в поле номенклатура указать
3 выгрузить в тз, в тз добавить колонку "Количество", установить 1, свернуть тз.
6 viktor_vv
 
18.04.13
22:28
(4) А разрез документ нужен, че-то непонятно, че ты там считать собрался.
7 viktor_vv
 
18.04.13
22:34
Ну как заготовка, проверить не могу, нету ТиС

   ТекстЗапроса = "
   |Select
   |    СпрНом.Артикул as Артикул,
   |    Продажи.Номенклатура as [Номенклатура $Справочник.Номенклатура],
   |    Count(СпрНом.ID) as КолПозиций
   |From
   |    [Регистр.Продажи] as Продажи
   |    Left join [Журнал] as Ж
   |        on Ж.IDDOC = Продажи.IDDOC
   |    Left join [Справочник.Номенклатура] as СпрНом
   |        on СпрНом.ID = Продажи.Номенклатура
   |Where
   |    Ж.date between :НачДата and :КонДата
   |Group by Продажи.Номенклатура , СпрНом.Артикул
   |";
   
   Запрос = база.НовыйЗапрос();

   Запрос.Подставлять("Начдата",НачГода(РабочаяДата()));
   Запрос.Подставлять("КонДата",РабочаяДата());
   
   ТЗ = Запрос.ВыполнитьЗапрос(ТекстЗапроса) ;
   
   ТЗ.ВыбратьСтроку();
8 viktor_vv
 
18.04.13
22:36
Если стоит быстрая обработка движений, то можно соединение с журналом убрать.
Ну и я там точно не помню насчет, какой-то из них, то ли left, то ли inner сильно тормозит на SQLite.
9 viktor_vv
 
18.04.13
22:43
И если я правильно понял насчет количества, то

   |Where
   |    Ж.date between :НачДата and :КонДата
   |    and Продажи.Количество > 0
10 Злопчинский
 
19.04.13
01:45
(6) сами документы не нужны, док "привлекается" чтобы разделить количество продаж товара.
т.е. тупо отвечаем на вопрос: сколько раз продавался ТоварN? (где "раз" = упоминание номенклатуры в документе продажи).
11 Злопчинский
 
19.04.13
01:46
(7) спсб, посмотрю.
12 Dolly_EV
 
19.04.13
07:05
(8) inner тормозит.
(0) А если взять класс "ПрямойЗапрос" от Vandalsvq, то можно писать практически на 8-рошном языке запросы и не зависеть (почти) от платформы - sql или dbf
13 Dolly_EV
 
19.04.13
07:22
ТекстЗапроса = "
   |ВЫБРАТЬ
   |    $СпрНом.Артикул КАК Артикул
   |    ,$Продажи.Номенклатура КАК [Номенклатура $Справочник.Номенклатура]
   |    ,КОЛИЧЕСТВО($СпрНом.ТекущийЭлемент) КАК КолПозиций
   |ИЗ
   |    Регистр.Продажи КАК Продажи $nolock
   |    ЛЕВОЕ СОЕДИНЕНИЕ ЖурналДокументов КАК Ж $nolock
   |    ПО $Ж.ТекущийДокумент = $Продажи.ТекущийДокумент
   |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНом $nolock
   |   ПО $СпрНом.ТекущийЭлемент = $Продажи.Номенклатура
   |ГДЕ
   |    $Ж.ДатаДокумента МЕЖДУ :НачДата И :КонДата
   |    И $Продажи.Количество>0
   |ГРУППИРОВАТЬ $Продажи.Номенклатура, $СпрНом.Артикул
   |";
   
   Запрос.УстановитьТекстовыйПараметр("Начдата",НачГода(РабочаяДата()));
   Запрос.УстановитьТекстовыйПараметр("КонДата",РабочаяДата());
   
   ТЗ = Запрос.ВыполнитьЗапрос(,ТекстЗапроса);
   ТЗ.ВыбратьСтроку();


красота! :-)) все по-русски
14 Злопчинский
 
19.04.13
18:22
(13) спсб. посмотрю.
.
меня смущает для чего левое соединение к журналу документов..?
15 Sereja
 
19.04.13
18:48
(14) Что б отбор по датам делать
16 Злопчинский
 
19.04.13
20:11
(15)А, точно! спсб!
17 Dolly_EV
 
20.04.13
14:01
см (8) еще. "Если стоит быстрая обработка движений", то вот так тогда можно:

|ИЗ
   |    Регистр.Продажи КАК Продажи $nolock
   |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНом $nolock
   |   ПО $СпрНом.ТекущийЭлемент = $Продажи.Номенклатура
   |ГДЕ
   |    $Продажи.Дата МЕЖДУ :НачДата И :КонДата
   |    И $Продажи.Количество>0
18 Туц
 
22.04.13
06:28
(10) коли так, то регистр тут причем? Нужно строки обрабатывать, т.к. не известно сворачивается ли табличка при записи в регистр.
19 Туц
 
22.04.13
06:34
Но если об (18) забыть, то как-то так
   SELECT Рег.Номенклатура Номенклатура,Спр.Артикул Артикул,sum(1) Упоминаний
   FROM Регистр_Продажи Рег    
   LEFT JOIN Справочник_Номенклатура Спр ON Спр.ID = Рег.Номенклатура
   GROUP BY Рег.Номенклатура,Спр.Артикул
   ORDER BY Спр.Артикул
20 Злопчинский
 
22.04.13
16:47
(18) на такое загрубление иду сознательно. количество дублирующихся строк в документах реализации пренебрежимо мало и на конеынй результат не влияет.