Переключение на Главную Страницу Страницы: 1 ... 50 51 [52] 53 54 ... 60 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" (число прочтений - 303326 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #765 - 09. Июля 2010 :: 10:34
Печать  
leshik а про неправильно отработанный запрос что можешь сказать?
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #766 - 09. Июля 2010 :: 10:40
Печать  
JohnyDeath писал(а) 09. Июля 2010 :: 10:34:
leshik а про неправильно отработанный запрос что можешь сказать?

1) С виду запрос построен правильно
2) Приведи структуру счетов которые укладываешь в список (описание субконто и из типов - может там все таки у субконто не Справочник.ДоговораСтрахования а просто Справочник)
3) Версию класса
3) Вот аналогичный текст запроса который у меня отработал правильно
Код
Выбрать все
    ТекстЗапроса = "
    |ВЫБРАТЬ
    | Обороты.ТекущийДокумент КАК [ДокДвижения $Документ]
    |,Обороты.ВидДокумента КАК [ДокДвижения_вид $ВидДокумента]
    |,Обороты.Счет КАК [Счет $Счет.Основной]
    |,Обороты.КорСчет КАК [КорСчет $Счет.Основной]
    |,Обороты.КоличествоОборотКт КАК КолВоКО
    |,Обороты.СуммаОборотКт КАК СуммаКО";
    ТекстЗапроса = ТекстЗапроса+"
    |ИЗ
    тов,БЕЗСУБКОНТО,(Сумма,Количество),";
    флУсловий = 0;
    Если GoodsList.РазмерСписка()>0 Тогда
	  ТекстЗапроса = ТекстЗапроса+"
	  |(Субконто1 В (ВЫБРАТЬ Val ИЗ #СзНоменклатуры))";
	  флУсловий = 1;
	  ПрямойЗапрос.УложитьСписокЗначений(GoodsList,"#СзНоменклатуры","Номенклатура");
    КонецЕсли;
    Если ПустоеЗначение(Склад)=0 Тогда
	  ТекстЗапроса = ТекстЗапроса+?(флУсловий=1," and ","")+"
	  |(Субконто2 = :ВыбСклад)
	  |";
    КонецЕсли;
    ТекстЗапроса = ТекстЗапроса+"
    |,) КАК Обороты ";
 

  
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #767 - 09. Июля 2010 :: 10:59
Печать  
ПланСчетов.Основной:
Счет 77.5.1
-Субконто1 - Справочник.Агенты_Брокеры
-Субконто2 - Справочник.ДоговораСтрахования
-Субконто3 - Справочник.ВидыСтрахования
Код
Выбрать все
Процедура Сформировать()
	спСчетов = СоздатьОбъект("СписокЗначений");
	спСчетов.ДобавитьЗначение(СчетПоКоду("77.5.1"));

	ПрямойЗапрос = СоздатьОбъект("ПрямойЗапрос");
	ПрямойЗапрос.УложитьСписокЗначений(спСчетов,"#Счета77", "Основной");

	стрУсловие = "";
	Если Договор.Выбран()=1 Тогда
		стрУсловие = " (Субконто1 = :Договор) ";
	КонецЕсли;

	ТекстЗапроса = "
	|ВЫБРАТЬ
	|	ОборотыОсновной.*
	|ИЗ $БИОбороты.Основной(:НачДата
	|	,:КонДата~
	|	,Документ
	|	,#Счета77
	|	,(ДоговораСтрахования)
	|	,БЕЗКОРСЧЕТОВ
	|	,БЕЗСУБКОНТО
	|	,(Сумма)
	|	,"+стрУсловие+"
	|	,) КАК ОборотыОсновной
	|";
	ПрямойЗапрос.РежимОтладки = 1;
	ПрямойЗапрос.УстановитьТекстовыйПараметр("НачДата", НачГода(ТекущаяДата()));
	ПрямойЗапрос.УстановитьТекстовыйПараметр("КонДата", КонГода(ТекущаяДата()));
	ПрямойЗапрос.УстановитьТекстовыйПараметр("Договор", Договор);

	  итРезультат = ПрямойЗапрос.Выполнить("ИндексированнаяТаблица", ТекстЗапроса);
	итРезультат.Показать();

КонецПроцедуры 


Может тут проблема в том, что номер субконто в конфигураторе в плане счетов - второй? (просто не знаю на что думать)
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #768 - 09. Июля 2010 :: 11:06
Печать  
Код
Выбрать все
стрУсловие = " (Субконто2 = :Договор) "; 


Конечно же Подмигивание
  
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #769 - 09. Июля 2010 :: 11:15
Печать  
А можно я отвечу?
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #770 - 09. Июля 2010 :: 11:15
Печать  
Я так уже пробовал. Не катит.
Цитата:
near "AND": syntax error

(полное сообщение в прикрепленном файле)

Пробую указать в запросе и первое субконто:
Код
Выбрать все
ТекстЗапроса = "
	|ВЫБРАТЬ
	|	ОборотыОсновной.*
	|ИЗ $БИОбороты.Основной(:НачДата
	|	,:КонДата~
	|	,Документ
	|	,#Счета77
	|	,(Агенты_Брокеры, ДоговораСтрахования)
	|	,БЕЗКОРСЧЕТОВ
	|	,БЕЗСУБКОНТО
	|	,(Сумма)
	|	,"+стрУсловие+"
	|	,) КАК ОборотыОсновной
	|"; 


Так вываливает ошибку:
Цитата:
ПрямойЗапрос::ПолучитьСписокЗначенийСубконто(Строка УсловиеСубконто=(Агенты_Брокеры, ДоговораСтрахования), Число ПереопределятьСубконтоТаблицыПроводок=1) : В метод необходимо передавать непустые объекты типа метаданных
ИДОбъекта = МетаДата.ИДОбъекта(Метаданные.ВидСубконто(ЗначениеСубконто));
{e:\1C\Classes\Запросы\ПрямойЗапрос\ПрямойЗапрос.ert(733) }
  

bi_err2.txt ( 4 KB | Загрузки )
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #771 - 09. Июля 2010 :: 11:15
Печать  
vandalsvq писал(а) 09. Июля 2010 :: 11:15:
А можно я отвечу?

Смех Разрешаем! Улыбка)))
Конечно же будем только рады
  
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #772 - 09. Июля 2010 :: 12:24
Печать  
Еще вопрос. Хочу видеть табличку с колонками:
- Документ
- ДатаДокумента (ДатаОперации)
- Счет
- КоррСчет
- Сумма

По конкретному договору.
Если указываю периодичность "Документ", то Сумма группируется по текущему счету.
Например, у меня выписка делает две проводки по договору:
51 - 77.5.1 - 100 руб
77 - 77.5.1  - 10 руб. (Комиссия)
Хочу в итоговой таблице видеть обе эти строчки. А сейчас получаю сразу 110 по счету 77.5.1

Это вообще реально?
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #773 - 09. Июля 2010 :: 12:33
Печать  
JohnyDeath писал(а) 09. Июля 2010 :: 12:24:
Еще вопрос. Хочу видеть табличку с колонками:
- Документ
- ДатаДокумента (ДатаОперации)
- Счет
- КоррСчет
- Сумма

По конкретному договору.
Если указываю периодичность "Документ", то Сумма группируется по текущему счету.
Например, у меня выписка делает две проводки по договору:
51 - 77.5.1 - 100 руб
77 - 77.5.1  - 10 руб. (Комиссия)
Хочу в итоговой таблице видеть обе эти строчки. А сейчас получаю сразу 110 по счету 77.5.1

Это вообще реально?

Я думаю стоит убрать опцию БЕЗКОРРСЧЕТОВ и оставить просто пустую секцию?
  
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #774 - 09. Июля 2010 :: 12:33
Печать  
Так все таки получилось или нет?
  
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #775 - 09. Июля 2010 :: 12:44
Печать  
Получилось. Сейчас Сша должен залить новую версию класса и всё нам рассказать Подмигивание

Цитата:
Я думаю стоит убрать опцию БЕЗКОРРСЧЕТОВ и оставить просто пустую секцию?

Но в доке написано:
Цитата:
"      Счет - Тип: Строка. Условие по счету для наложения фильтра. Значением параметра может выступать только имя временной таблицы. Т.о. параметр может быть равен только #<ИмяТаблицы>.

Вот и смутился
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #776 - 09. Июля 2010 :: 13:31
Печать  
Ну я думаю что имелось в виду что нельзя 1 счет указать параметром :ВыбСчет а именно требуется временной таблицей.
  
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #777 - 09. Июля 2010 :: 13:39
Печать  
Спасибо JohnyDeath за помощь в обнаружении неприятного бага в ВТ "БИОбороты".

Что же касается ошибок, которые изначально были в запросе независимо от наличия ошибок в классе я чуть позже расскажу.

В общем:
1.07.013 от 09.07.10 г.
- Исправлена ошибка при подготовке ВТ БИОбороты, если указывать виды субконто по номерам начиная не с первого номера.
- ВАЖНО: Добавлено специальное ключевое слово «collate_1C» используемое в операторах условий. Об использовании «collate_1C» читайте в «Правила сравнения значений».
  

1Cv7_query_005.rar ( 213 KB | Загрузки )

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #778 - 09. Июля 2010 :: 14:50
Печать  
В общем начнем пожалуй с самого начала, с первого вопроса JohnyDeath.
В запросе в параметре субконто было указано "ДоговорыСтрахования". При этом во всех счетах субконто "ДоговорыСтрахования" были под номером 2. В запросе в качестве параметра можно указать было "Субконто2".
Дело в том что поименованное субконто приводит к следующему запросу
Код
Выбрать все
select
    case :ВидСубконто.<ИмяСубконто>
	  when ВидСубконто1 then Субконто1
	  when ВидСубконто2 then Субконто2
	  ....
	  when ВидСубконто<n> then Субконто<n>
    end as Субконто1
from ...
where :ВидСубконто.<ИмяСубконто> in (ВидСубконто1, ВидСубконто2,....ВидСубконто<n>) 


Т.е. мало того что чтобы получить значение субконто происходит проверка всех видов субконто по данной сроке, но и в условии на выборку накладывается условие отбора по виду.
При указании "Субконто2" данный запрос будет без секции условий и case в тексте выборки поля запроса.
Собственно на правильность это не влияло, но на оптимальность выполнения точно повлияло бы.
Далее. В самой первой версии с указанием имени параметра было использовано условие Субконто1. Тут ошибки нет. Действительно при указании вида субконто в условии он используются по тому номеру которому были в списке параметра субконто (корсубконто).
НО: условие в запросе к реальным таблицам 1С будет выглядеть как получение поля запроса (case) = ЗначениеСубконто. Согласитесь что это не самый оптимальный запрос. Поэтому можно было получить весьма неприятное время выполнения.
Достаточно было указать в параметре субконто - "Субконто2", и в условии "Субконто2 = :Договор". Таким образом выборка будет куда эффективнее.
Далее JohnyDeath не сказал формат БД. В DBF есть одна особенность использования сравнения. И данную особенность знают немногие. Она и была "исправлена" в новой версии. В общем суть в том, что SQLite сравнивает строки (!!!) с учетом правых пробелов и регистра символов. А поскольку поле "Субконто<n>" одно на таблицу итогов и движений, значение поле будет соответствовать максимальному значению вида субконто которое может быть под номером "n".
Т.е. если у вас есть два счета:
1. Счет А, Субконто1 - Справочник, Субконто2 - Строка.100, Субконто3 - Справочник.ВидСправочника
2. Счет Б, Субконто1 - Строка.100, Субконто2 - Справочник.ВидСправочника, Субконто3 - Справочник.ВидСправочника
Т.о. длина полей будет по максимальному значению: Субконто1 = 100, Субконто2 - 100Ю Субконто3 - 9 (справочник с указанием вида). И поэтому в DBF сравнение будет "недействительно". Поэтому Джонни и не получил желаемого результата.
Решается это следующим образом:
Код
Выбрать все
Субконто1 collate_1C = :ЗначениеСубконто 


Для SQL строка collate_1C будет проигнорировано, а для DBF проверка пройдет с учетом особенностей словаря 1С.
Так что имейте в виду.
Что касается дальнейших обсуждений, то там было по разному. leshik не знал что это DBF, думаю если бы знал то может быть сделал кое-какие предложения/предположения.
На будущее, для всех: обязательные условия для получения более точного ответа надо указать:
1. Оригинальный текст запроса
2. Текст запроса если РежимОтладки = 1
3. Версия класса (атрибут Версия)
4. Формат базы данных
Если вы используете 1.06.ххх рекламации рассматриваются только если переедете на 1.07. Если используете 1.07 то сначала попробуйте новую версию. Не помогает? welcome как говорится.

Ну и собственно по результатам обсуждения и моей попытке воспроизвести проблемы была найдена косвенная ошибка и исправлена.

Большое спасибо всем, кто принимал участие, в том числе и помогал ответить на вопросы до моего появления. Я действительно благодарен каждому активному пользователю.  Подмигивание
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #779 - 09. Июля 2010 :: 15:06
Печать  
leshik писал(а) 09. Июля 2010 :: 08:54:
Уважаемое сообщество.
Уже давно зреет мысль о создании учебника по классу практической направленности.
То есть глобально состоящего из 3 разделов
1. Написание запросов с использованием класса ПрямойЗапрос  - от простого к сложному.
2. Тонкая оптимизация прямых запросов.
3. Вывод и обработка результатов запроса с применением дополнительных классов 1С++ (ИндексированнаяТаблица, АссоциативныйВектор). Применение дополнительных компонент (TableDoc, Yoksel) при выводе информации на экран.
Хотелось бы услышать отзыв общественности насколько это интересно и будет ли это востребовано.
Заранее всем спасибо за отзывы.
Если требуется расшифровка разделов - пишите расскажу свое видение а так глядишь и перейдем к обсуждению подробного содержания  Очень довольный


leshik писал(а) 09. Июля 2010 :: 09:35:
Ну важно же не столько "кто против" а "кто за" - важно мнение людей по поводу содержания. В общем диалог важен так сказать Улыбка


При большом наплыве вопросов касаемых использования класса вопрос просто погрязнет и никто его не увидит. Я предлагаю, вынести обсуждение в курилку, в виде отдельной темы. Ты ее поднял, тебе и создавать тему.
Далее по мере продвижения когда будут реальные результаты, будем думать что далее.

В общем для начала надо отдельную тему там и будем обсуждать Подмигивание.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 50 51 [52] 53 54 ... 60
ОтправитьПечать