Переключение на Главную Страницу Страницы: 1 ... 44 45 [46] 47 48 ... 51 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" - обсуждения. Часть № 2. (число прочтений - 258742 )
rom35
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 21
Зарегистрирован: 12. Ноября 2012
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #675 - 28. Апреля 2015 :: 17:31
Печать  
Спасибо! буду рыть. направление понял.
  
Наверх
 
IP записан
 
kenzzzooo
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 26
Местоположение: Минеральные Воды
Зарегистрирован: 06. Января 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #676 - 04. Мая 2015 :: 19:01
Печать  
rom35 писал(а) 28. Апреля 2015 :: 16:24:
вот весь запрос
Код
Выбрать все
ВЫБРАТЬ
   $Документ.ТоргТочка КАК [ТТ $Справочник.ТорговыеТочки],
   $ДокСтроки.ТорговыйАгент.Супервайзер КАК [СВ $Справочник.Сотрудники],
   $ДокСтроки.Товар КАК [Товар $Справочник.Номенклатура],
   $ДокСтроки.Количество КАК [Кол $Число]
ИЗ
   ЖурналДокументов КАК Жур $nolock
ЛЕВОЕ СОЕДИНЕНИЕ
   Документ.РасходнаяНакладная КАК Документ $nolock ПО $Документ.ТекущийДокумент = $Жур.ТекущийДокумент
ЛЕВОЕ СОЕДИНЕНИЕ
   ДокументСтроки.РасходнаяНакладная КАК ДокСтроки $nolock ПО $ДокСтроки.ТекущийДокумент = $Жур.ТекущийДокумент
ГДЕ
   $Жур.Проведен = 1
   И $Документ.ДокОбмен = :ПустойИД13
   И $ДокСтроки.Товар IN (SELECT Val FROM #СписТовара)
   И $Документ.МестоХранения IN (SELECT Val FROM #ВыбМХы)
   И ($Жур.ДатаДокумента МЕЖДУ :ДатаНач И :ДатаКон)
УПОРЯДОЧИТЬ
   $ДокСтроки.Товар,
   $Документ.ТоргТочка
 



А так:

Код
Выбрать все
ВЫБРАТЬ
   $Документ.ТоргТочка КАК [ТТ $Справочник.ТорговыеТочки],
   ISNULL($Сотр.Супервайзер,:ПустойИД)  КАК [СВ $Справочник.Сотрудники],
   $ДокСтроки.Товар КАК [Товар $Справочник.Номенклатура],
   $ДокСтроки.Количество КАК [Кол $Число]
ИЗ
   ДокументСтроки.РасходнаяНакладная КАК ДокСтроки $nolock
   ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотр $nolock ПО $ДокСтроки.ТорговыйАгент = $Сотр.ТекущийЭлемент
   СОЕДИНЕНИЕ Документ.РасходнаяНакладная КАК Документ $nolock ПО $ДокСтроки.ТекущийДокумент = $Документ.ТекущийДокумент
   СОЕДИНЕНИЕ ЖурналДокументов КАК Жур $nolock ПО $Документ.ТекущийДокумент = $Жур.ТекущийДокумент
ГДЕ
   $Жур.Проведен = 1 И ($Жур.ДатаДокумента МЕЖДУ :ДатаНач И :ДатаКон)
   И $Документ.ДокОбмен = :ПустойИД13
   И $ДокСтроки.Товар IN (SELECT Val FROM #СписТовара)
   И $Документ.МестоХранения IN (SELECT Val FROM #ВыбМХы)
УПОРЯДОЧИТЬ
   $ДокСтроки.Товар,
   $Документ.ТоргТочка 


не пробовали?
  
Наверх
 
IP записан
 
AntiBuh
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 26
Зарегистрирован: 28. Июля 2009
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #677 - 07. Мая 2015 :: 04:22
Печать  
А можно-ли в запросе вида

ВЫБРАТЬ ОстаткиОсновной.Субконто1
            ,ОстаткиОсновной.Субконто1_вид
ИЗ $БИОстатки.Основной(:КонПериода
,#Счета
,(Субконто1,...)
,(Сумма)
,(РазделительУчета = :НашаФирма)) КАК ОстаткиОсновной

отфильтровать оборотное/не оборотное Субконто1?
если можно - как это сделать правильно?
  
Наверх
 
IP записан
 
Asakra
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 83
Местоположение: Иркутск
Зарегистрирован: 28. Августа 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #678 - 11. Мая 2015 :: 16:55
Печать  
помогите разобраться почему не корректно работаю БИОстатки
Код
Выбрать все
"ВЫБРАТЬ
|	ЛЕВО(БухИтоги.Субконто1, 9)	КАК [ТМЦ		:Справочник.Номенклатура],
|	БухИтоги.КоличествоОстаток	КАК [Количество	:Число.15.3],
|	БухИтоги.СуммаОстаток		КАК [Сумма		:Число.15.2]
|ИЗ
|	$БИОстатки.Основной(:Дата~, #Счет41_1, (Субконто1,Субконто2), (Количество,Сумма), Субконто2 = :Склад) КАК БухИтоги" 



Возвращает остатки на начала месяца не учитывая оборотов.
В моем случае, есть остаток по дебиту 41.1 на 01.01.15, на эту же дату бухгалтер сделал ручную операцию скорректировав сальдо до нуля. Открываем карточку счета по 41.1 видим, что конечное сальдо на 02.01.15 равно нулю, а прямой запрос считает, что сальдо нулю не равно, а точнее равно сальду по дебиту на 01.01.15 . Если перенести операцию на 31.12.14 или выполнить запрос на 01.02.15, то запрос возвращает все правильно.
Если поставить отбор по конкретному товару, то получаем остаток в виде последнего движения по кредиту, естественно со знаком минус.
Вообщем ересь какая-то...
  
Наверх
 
IP записан
 
kenzzzooo
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 26
Местоположение: Минеральные Воды
Зарегистрирован: 06. Января 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #679 - 11. Мая 2015 :: 19:40
Печать  
Asakra писал(а) 11. Мая 2015 :: 16:55:
Код
Выбрать все
"ВЫБРАТЬ
|	ЛЕВО(БухИтоги.Субконто1, 9)	КАК [ТМЦ		:Справочник.Номенклатура]" 



...Вообщем ересь какая-то...


Отладку у запроса не пробовали включать? Мне помогает. А! Точно

Код
Выбрать все
ЛЕВО(БухИтоги.Субконто1, 9)	КАК [ТМЦ :Справочник.Номенклатура] 



а не

Код
Выбрать все
СРЕД(БухИтоги.Субконто1, 5, 9) КАК [ТМЦ :Справочник.Номенклатура] 

?
  
Наверх
 
IP записан
 
Asakra
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 83
Местоположение: Иркутск
Зарегистрирован: 28. Августа 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #680 - 11. Мая 2015 :: 23:38
Печать  
зачем мне отладка? ошибок ни каких не возникает - те цифры, которые возвращает запрос не правильные.
  
Наверх
 
IP записан
 
Asakra
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 83
Местоположение: Иркутск
Зарегистрирован: 28. Августа 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #681 - 12. Мая 2015 :: 02:20
Печать  
мать перемать... наколбасил с ВТ Счет_41_1
я в класс добавил метод, что бы постоянно не писать создания ВТ и вот там не правильно приводился счет в строку БД, но результат вышел весьма непредсказуемый. Улыбка)
  
Наверх
 
IP записан
 
rom35
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 21
Зарегистрирован: 12. Ноября 2012
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #682 - 13. Мая 2015 :: 13:56
Печать  
чегойто никак немогу постич логику "group by" как только уже непробовал фантазия иссякла. может кто подскажет в куда рыть.
Код
Выбрать все
ВЫБРАТЬ
   $ДокСтроки.Товар КАК [Товар $Справочник.Номенклатура],
   $ДокСтроки.Количество КАК [Кол $Число]
ИЗ
   ЖурналДокументов КАК Жур $nolock
ЛЕВОЕ СОЕДИНЕНИЕ
   Документ.РасходнаяНакладная КАК Документ $nolock ПО $Документ.ТекущийДокумент = $Жур.ТекущийДокумент
ЛЕВОЕ СОЕДИНЕНИЕ
   ДокументСтроки.РасходнаяНакладная КАК ДокСтроки $nolock ПО $ДокСтроки.ТекущийДокумент = $Жур.ТекущийДокумент
ЛЕВОЕ СОЕДИНЕНИЕ
   Справочник.Номенклатура КАК Справочник $nolock ПО $Справочник.ТекущийЭлемент = $ДокСтроки.Товар
ГДЕ
   $Жур.Проведен = 1
   И $Документ.ДокОбмен = :ПустойИД13
   И $Справочник.Запрет = 0
   И $ДокСтроки.Товар IN (SELECT Val FROM #СписТовара)
   И $Документ.МестоХранения IN (SELECT Val FROM #ВыбМХы)
   И ($Жур.ДатаДокумента МЕЖДУ :ДатаНач И :ДатаКон)
СГРУППИРОВАТЬ
   $ДокСтроки.Товар 



вываливает ошибку: Column 'ДокСтроки.SP2994' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

группировка по Справочник.Номенклатура также не прокатывает...

ДокСтроки.SP2994' это какраз товар табличная часть документа расх.накладная

Еще мучает вопрос возможно ли через один запрос на пример за 1 месяц, сделать несколько функций с интервалом например в 10 дней, в обычном 1Сном запросе выглядит както так:
Код
Выбрать все
Функция Кол1 = Сумма(Кол) когда ((Док.ДатаДок>=ДатаНач1) и (Док.ДатаДок<=ДатаКон1));
Функция Кол2 = Сумма(Кол) когда ((Док.ДатаДок>=ДатаНач2) и (Док.ДатаДок<=ДатаКон2)); 



можно конечно сделать несколько запросов за эти интервалы. но это сильно проигрывает по скорости..
  
Наверх
 
IP записан
 
Igor Nikolaenko
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 47
Зарегистрирован: 01. Апреля 2010
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #683 - 13. Мая 2015 :: 19:57
Печать  
Добавьте агрегатную функцию:
ВЫБРАТЬ
  $ДокСтроки.Товар КАК [Товар $Справочник.Номенклатура],
  СУММА($ДокСтроки.Количество) КАК [Кол $Число]
ИЗ
  ...

а для попадания в индекс вместо $Жур.ДатаДокумента используйте $Жур.ПозицияДокумента, только для правой границы добавьте символ "~"
  
Наверх
 
IP записан
 
rom35
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 21
Зарегистрирован: 12. Ноября 2012
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #684 - 14. Мая 2015 :: 08:30
Печать  
1. Спасибо с группировкой все заработало.
единственно не понял зачем:
Igor Nikolaenko писал(а) 13. Мая 2015 :: 19:57:
а для попадания в индекс вместо $Жур.ДатаДокумента используйте $Жур.ПозицияДокумента, только для правой границы добавьте символ "~"

у меня:
Код
Выбрать все
|   И ($Жур.ДатаДокумента МЕЖДУ :ДатаНач И :ДатаКон) 


и так вроде работатет нормально?

2. по второй части
я немножко о другом писал в предыдущем сообщении....
Код
Выбрать все
ВЫБРАТЬ
   $ДокСтроки.Товар КАК [Товар $Справочник.Номенклатура],
   $ДокСтроки.Количество КАК [Кол $Число] 


я хотел добавить условие для $ДокСтроки.Количество КАК [Кол $Число]
т.е. чтото типа
Код
Выбрать все
Сумма($ДокСтроки.Количество) КАК [Кол1 $Число] ИМЕЮЩИЕ $Жур.ДатаДокумента МЕЖДУ :ДатаНач1 И :ДатаКон1 


вываливает ошибку Incorrect syntax near the keyword 'FROM'.

но это походу невозможно Печаль
или я ошибаюсь
выписка из инструкции
Условия на значения агрегатных функций
Предложение ИМЕЮЩИЕ <Условие отбора> позволяет накладывать условия на значения агрегатных функций. В других конструкциях языка запросов, например в предложении ГДЕ, указывать в условиях агрегатные функции нельзя.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #685 - 14. Мая 2015 :: 13:24
Печать  
Рекомендую посмотреть в таблицах SQL-я - как лежат данные. Потом подумать - как из них получить то, что хочется, и уж затем, обладая знаниями, действовать.
Например, на таблице _1sjourn есть Индекс date_time_iddoc - что есть "позиция" документа + ИД-шник документа, и фильтр с использованием этого поля будет быстрее, чем вытаскивать для каждого документа Дату (из того же date_time, только потом еще и отрезать) и проверять ее на вхождение в интервал.
То же самое про втыкание "имеющие" в список полей, не делается так, оно только для наложения условий на сгруппированные элементы.
В вашем же случае можно посмотреть в сторону:
Код
Выбрать все
СУММА(Выбор Когда $Жур.ПозицияДокумента МЕЖДУ :ДатаНач1 И :ДатаКон1~ Тогда $ДокСтроки.Количество
Иначе 0
Конец) Как [Кол1 $Число] 


Хотя я бы делал объединением (через ОБЪЕДИНИТЬ ВСЕ) нескольких простых запросов, но это тестить надо разные варианты по скорости...
  
Наверх
ICQ  
IP записан
 
rom35
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 21
Зарегистрирован: 12. Ноября 2012
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #686 - 15. Мая 2015 :: 09:15
Печать  
СПАСИБО!!!!
  
Наверх
 
IP записан
 
Asakra
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 83
Местоположение: Иркутск
Зарегистрирован: 28. Августа 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #687 - 31. Августа 2015 :: 05:12
Печать  
почему-то в классе не работает RegExp
ТекстЗапроса = "INNER JOIN vt_ПараметрыРасчетовAS ПараметрыРасчетов ON ПараметрыРасчетов.Операция = :Операция AND ПараметрыРасчетов.ВидДолга = ВидДолга"
Паттерн = "'[^']*'|"[^"]*"|(?:^|\s|[^\wа-яё\.]+)(Фирма|Договор|ВидДолга|КредДокумент)[^\wа-яё'"]+"

после того как RegExp выловит измерения регистра из строки, ТекстЗапроса должен приобразоваться в "INNER JOIN vt_ПараметрыРасчетовAS ПараметрыРасчетов ON ПараметрыРасчетов.Операция = :Операция AND ПараметрыРасчетов.ВидДолга = totalreg.ВидДолга".

по факту текст остается не изменным и падает в ошибку. приходиться менять "ПараметрыРасчетов.ВидДолга", например, на "ПараметрыРасчетов.ВидДолгаОстатки". по истечению времени опять наступаешь на теже грабли, но про баг уже не помнишь и опять тратится время на выеснение проблемы.

может кто подскажет, каким должен быть паттерн, что бы избавиться от этого бага. такое ощущение, что не обрабатывается ":", т.к. если убрать "ПараметрыРасчетов.Операция = :Операция AND", то все отрабатывает на ура.
  
Наверх
 
IP записан
 
Asakra
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 83
Местоположение: Иркутск
Зарегистрирован: 28. Августа 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #688 - 31. Августа 2015 :: 05:35
Печать  
Asakra писал(а) 31. Августа 2015 :: 05:12:
почему-то в классе не работает RegExp
ТекстЗапроса = "INNER JOIN vt_ПараметрыРасчетовAS ПараметрыРасчетов ON ПараметрыРасчетов.Операция = :Операция AND ПараметрыРасчетов.ВидДолга = ВидДолга"
Паттерн = "'[^']*'|"[^"]*"|(?:^|\s|[^\wа-яё\.]+)(Фирма|Договор|ВидДолга|КредДокумент)[^\wа-яё'"]+"

после того как RegExp выловит измерения регистра из строки, ТекстЗапроса должен приобразоваться в "INNER JOIN vt_ПараметрыРасчетовAS ПараметрыРасчетов ON ПараметрыРасчетов.Операция = :Операция AND ПараметрыРасчетов.ВидДолга = totalreg.ВидДолга".

по факту текст остается не изменным и падает в ошибку. приходиться менять "ПараметрыРасчетов.ВидДолга", например, на "ПараметрыРасчетов.ВидДолгаОстатки". по истечению времени опять наступаешь на теже грабли, но про баг уже не помнишь и опять тратится время на выеснение проблемы.

может кто подскажет, каким должен быть паттерн, что бы избавиться от этого бага. такое ощущение, что не обрабатывается ":", т.к. если убрать "ПараметрыРасчетов.Операция = :Операция AND", то все отрабатывает на ура.


если строку сделать "(ПараметрыРасчетов.Операция = :Операция AND ПараметрыРасчетов.ВидДолга = ВидДолга)", то все работает, хотя в справке про скобочки в соединении не написано (есть рекомендации только про измерения, ресурсыи условия)...
  
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #689 - 10. Сентября 2015 :: 16:30
Печать  
Интересную проблему замечаю в классе и четко отловить не могу из-за чего, НО в $БИОстаткиОбороты при комбинации каких то параметров, запрос запускается (скорее парсинг классом начинается), никаких ошибок нет, но в итоге 1С ломается в корень. В статусе стоит выполняется обработка, мышкой ничего не жмется, но если нажать ESC то отчет закрывается, тоесть он уже не работает, но и пользоваться 1С уже нельзя. Приходится ее рубить.
В итоге и ошибки нет и результата нет и 1С помирает Улыбка
P.S. без "МЕСЯЦ ДОПОЛНЕНИЕ" все отлично работает, но нужно мне именно с ними
P.P.S. Если ДЕНЬ поставить то работает Печаль
P.P.P.S. Такое ощущение, что у DBF версии есть ограниченя на количество вложенных запросов, она его разваливает на кучу вложенных и если из 3 по остаткам (по разным субконто, зачем то) собрать один то пашет, но смущает в последнем такой же запрос как и первые два по остаткам, но дата одна, а не 2 как у выше. А так перестает слетать Печаль

Код
Выбрать все
	ТекстЗапроса = "
	|ВЫБРАТЬ БИ.НачалоПериода КАК Период,
	|	СУММА(БИ.КоличествоНачальныйОстаток) КАК ОстатокН,
	|	СУММА(БИ.КоличествоКонечныйОстаток) КАК ОстатокК
	|ИЗ $БИОстаткиОбороты.Основной(:ДатаНачала, :ДатаКонца~, МЕСЯЦ ДОПОЛНЕНИЕ,, ,, , Счет = :Счет43) КАК БИ
	  |СГРУППИРОВАТЬ БИ.НачалоПериода
	|";
	рс.УстановитьТекстовыйПараметр("ДатаНачала", ДатаНачала);
	рс.УстановитьТекстовыйПараметр("ДатаКонца", ДатаКонца);
	рс.УстановитьТекстовыйПараметр("Счет43", СчетПоКоду("43"));
	тз2 = рс.Выполнить(,ТекстЗапроса);

 

« Последняя редакция: 11. Сентября 2015 :: 19:48 - pavlo »  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 44 45 [46] 47 48 ... 51
ОтправитьПечать