Переключение на Главную Страницу Страницы: 1 ... 53 54 [55] 56 57 ... 60 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" (число прочтений - 303410 )
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #810 - 19. Августа 2010 :: 11:43
Печать  
Добрый день. Есть запрос по остаткам:
Код
Выбрать все
ПрямойЗапрос = СоздатьОбъект("ПрямойЗапрос");
ПрямойЗапрос.РежимОтладки = 1;
ПрямойЗапрос.БухгалтерскийУчет = 0;

ПрямойЗапрос.УстановитьТекстовыйПараметр("КонПериода",КонПериода);

глТекст = "
|ВЫБРАТЬ
|	РегОст.Товар КАК [Товар $Справочник.Номенклатура]
|,	РегОст.Склад КАК [Склад $Справочник.МестаХранения]
|,	РегОст.ОстатокТовараОстаток КАК КонОст
|ИЗ
|	$РегистрОстатки.ОстаткиТоваров(
|		:КонПериода
|	,	"+УсловиеПоРег+"
|	,	(Товар,Склад)
|	,	(ОстатокТовара)
|	,) КАК РегОст
|";

ПрямойЗапрос.Текст = глТекст;
ПрямойЗапрос.Выполнить().Выгрузить(ТЗ);
ТЗ.ВыбратьСтроку();
 



В результате получаю ошибку:

SELECT
           РегОст.Товар AS [Товар $Справочник.Номенклатура]
,      РегОст.Склад AS [Склад $Справочник.МестаХранения]
,      РегОст.ОстатокТовараОстаток AS КонОст
FROM
           (
     SELECT
           Товар
           ,Склад
           ,SUM(ОстатокТовараОстаток) AS ОстатокТовараОстаток
           
     FROM
           (SELECT
                 rg_99.Товар AS Товар
                 ,rg_99.Склад AS Склад
                 ,rg_99.ОстатокТовара AS ОстатокТовараОстаток
                 
           FROM
                 [РегистрИтоги.ОстаткиТоваров] AS rg_99
           WHERE
                 rg_99.PERIOD = '20100801'
           AND
                 (РегОст.Склад IN (SELECT Val FROM vt_ВыбСклад))
           
           UNION ALL
           
           SELECT
                 ra_99.Товар
                 ,ra_99.Склад
                 ,CASE WHEN ra_99.debkred = 0 THEN -ra_99.ОстатокТовара ELSE ra_99.ОстатокТовара END
                 
           FROM
                 [Журнал] AS docjourn
           LEFT JOIN [Регистр.ОстаткиТоваров] AS ra_99
           ON ra_99.IDDOC = docjourn.IDDOC
           WHERE (docjourn.idx_DATE_TIME_IDDOC >= '20100815     0     0   ')
           AND (docjourn.idx_DATE_TIME_IDDOC < '201008153KLMO0     M  0')
           AND
                 (РегОст.Склад IN (SELECT Val FROM vt_ВыбСклад))
           ) AS vt_ra_99
     GROUP BY
           Товар
           ,Склад
     HAVING (SUM(ОстатокТовараОстаток) <> 0)
     
) AS РегОст
ПрямойЗапрос::Выполнить(Строка ТипОбъекта=ИндексированнаяТаблица, Строка ТекстВыполнения=, Число БезПодготовки=0) : no such column: РегОст.Склад
ЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса,ПолучательЗапроса);
{E:\Bases\Алексей\SystemData\Classes\ПрямыеЗапросы\ПрямойЗапрос.ert(12639) }

ПрямойЗапрос.Выполнить().Выгрузить(ТЗ);
{E:\BASES\АЛЕКСЕЙ\EXTFORMS\ПРОДАЖИТОВАРОВ4.ERT(3412)}: ПрямойЗапрос::Выполнить(Строка ТипОбъекта=ИндексированнаяТаблица, Строка ТекстВыполнения=, Число БезПодготовки=0) : no such column: РегОст.Склад
ЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса,ПолучательЗапроса);
{E:\Bases\Алексей\SystemData\Classes\ПрямыеЗапросы\ПрямойЗапрос.ert(12639) }


Что ему надо? Если убрать условие, то все работает. Условие строится по списку значений: ПрямойЗапрос.УложитьСписокЗначений(ВыбСклад,"#ВыбСклад","МестаХранения");
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #811 - 19. Августа 2010 :: 11:53
Печать  
Отбой! В условии к измерению был добавлен префикс регистра!
Убрал - заработало!  Смех
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #812 - 19. Августа 2010 :: 11:56
Печать  
ReLock писал(а) 19. Августа 2010 :: 11:53:
Отбой! В условии к измерению был добавлен префикс регистра!
Убрал - заработало!  Смех

1. Не привел текста твоего условия в коде
2. Судя по ошибке - не сработал метапарсер (из РегОст - не получил rg99), значит не поставил знак $
3. Твое решение не универсально, если встретится в соединении другая таблица с таким же полем - будет ошибка
  
Наверх
ICQ  
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #813 - 19. Августа 2010 :: 12:00
Печать  
Условие было таковым:
УсловиеПоРег = ДобавитьУсловие(УсловиеПоРег,"(РегОст.Склад В (ВЫБРАТЬ Val ИЗ #ВыбСклад))");
Исправил на:
УсловиеПоРег = ДобавитьУсловие(УсловиеПоРег,"(Склад В (ВЫБРАТЬ Val ИЗ #ВыбСклад))");
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #814 - 19. Августа 2010 :: 12:02
Печать  
Salimbek писал(а) 19. Августа 2010 :: 11:56:
3. Твое решение не универсально, если встретится в соединении другая таблица с таким же полем - будет ошибка

О каком поле идет речь?
Если о поле "Склад", то оно выведено только! для проверки. На самом деле в запросе только условие по складу. Как таковое поле не нужно.
  
Наверх
 
IP записан
 
Alex_Bob
Full Member
***
Отсутствует



Сообщений: 136
Местоположение: Липецк
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #815 - 20. Августа 2010 :: 06:01
Печать  
При изучении кода класса от 12.08.2010 замечены пара мелких моментов:
Код
Выбрать все
Функция ВыделитьПеременную(Параметр) Экспорт
	Переменная = СтрЗаменить(Параметр,РазделительСтрок,"");
	Переменная = СтрЗаменить(Параметр,СимволТабуляции,"");  // Наверное должно быть Переменная
	Переменная = СокрЛП(Переменная); 



стр.7466:
Код
Выбрать все
Если ((ДатаНачалаРасчетов <> БлижайшееНачалоМесяцаНачалоПериода) ИЛИ (ТипЗначенияСтр(ЗначениеГраницыНачалаРасчета) = 12))
		ИЛИ ((ОбратныйРасчетНачалоПериода = ОбратныйРасчетКонецПериода) И (ДатаОкончРасчетов <> БлижайшееКонецМесяцаКонецПериода)) Тогда

			СтрУсловиеПериод = "";
			Если (ДатаНачалаРасчетов <> БлижайшееНачалоМесяцаНачалоПериода) ИЛИ (ТипЗначенияСтр(ЗначениеГраницыНачалаРасчета) = 12) Тогда 


Стр.8389:
Код
Выбрать все
Если ((ДатаНачалаРасчетов <> БлижайшееНачалоМесяцаНачалоПериода) ИЛИ (ТипЗначенияСтр(ЗначениеГраницыНачалаРасчета) = 12))
		ИЛИ ((ОбратныйРасчетНачалоПериода = ОбратныйРасчетКонецПериода) И (ДатаОкончРасчетов <> БлижайшееКонецМесяцаКонецПериода)) Тогда

			СтрУсловиеПериод = "";
			Если (ДатаНачалаРасчетов <> БлижайшееНачалоМесяцаНачалоПериода) ИЛИ (ТипЗначенияСтр(ЗначениеГраницыНачалаРасчета) = 12) Тогда 


Стр.11218:  По смыслу должно быть УсловиеКорСубконто
Код
Выбрать все
ИначеЕсли Врег(УсловиеКорСубконто) <> "БЕЗСУБКОНТО" Тогда
			СписокЗначенийСубконто = СоздатьОбъект("СписокЗначений");
			ОбработанноеУсловиеСубконто = ?(Лев(УсловиеСубконто,1) = "(",Сред(УсловиеСубконто,2,СтрДлина(УсловиеСубконто)-2),СокрЛП(УсловиеСубконто)); 


« Последняя редакция: 20. Августа 2010 :: 09:22 - Alex_Bob »  

Необходимо время, чтобы восстановить хаос. (с) Дж. Буш (младший)
Наверх
 
IP записан
 
fly7
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 16. Ноября 2009
Re: Класс "ПрямойЗапрос"
Ответ #816 - 20. Августа 2010 :: 06:46
Печать  
JohnyDeath писал(а) 18. Августа 2010 :: 10:12:
так попробуй:
Код
Выбрать все
И $Док.Абонент В ($ВидСправочника36.Контрагенты || Val ИЗ #СписокКонтр) 




так не прокатывает... ошибка возле FROM...

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



выдает пустую выборку...
напомню что $Док.Абонент это произвольный Справочник
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #817 - 20. Августа 2010 :: 06:50
Печать  
fly7 писал(а) 20. Августа 2010 :: 06:46:
JohnyDeath писал(а) 18. Августа 2010 :: 10:12:
так попробуй:
Код
Выбрать все
И $Док.Абонент В ($ВидСправочника36.Контрагенты || Val ИЗ #СписокКонтр) 




так не прокатывает... ошибка возле FROM...

напомню что $Док.Абонент это произвольный Справочник

novichek постом ниже поправил меня:
Код
Выбрать все
$Док.Абонент В (ВЫБРАТЬ $ВидСправочника36.Контрагенты||Val ИЗ #СписокКонтр) 


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


1C++ rocks!

Сообщений: 15
Зарегистрирован: 16. Ноября 2009
Re: Класс "ПрямойЗапрос"
Ответ #818 - 20. Августа 2010 :: 07:07
Печать  
Цитата:
Код
Выбрать все
$Док.Абонент В (ВЫБРАТЬ $ВидСправочника36.Контрагенты||Val ИЗ #СписокКонтр) 




так тоже не хочет
пишет что нет такой колонки ВидСправочника36.Контрагенты
  
Наверх
 
IP записан
 
novichek
Экс-Участник


Re: Класс "ПрямойЗапрос"
Ответ #819 - 20. Августа 2010 :: 07:44
Печать  
Незнаю зачем так сделано (наверно Саше так проще было), но в классе "ПрямойЗапрос", некоторые макроимена типа "ВидСправочника36" или "ПустойИд" должны предваряться символом ":" а не "$". Тоже частенько путаюсь Улыбка
  
Наверх
 
IP записан
 
fly7
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 15
Зарегистрирован: 16. Ноября 2009
Re: Класс "ПрямойЗапрос"
Ответ #820 - 20. Августа 2010 :: 07:53
Печать  
Цитата:
Незнаю зачем так сделано (наверно Саше так проще было), но в классе "ПрямойЗапрос", некоторые макроимена типа "ВидСправочника36" или "ПустойИд" должны предваряться символом ":" а не "$". Тоже частенько путаюсь Улыбка


когда пишу
Код
Выбрать все
И $Док.Абонент В ВЫБРАТЬ (:ВидСправочника36.Контрагенты||Val ИЗ #СписокКонтр) 



ругается что
Код
Выбрать все
Ошибка подстановки текстового параметра ВидСправочника36.Контрагенты - Неизвестный параметр 

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


I Love YaBB 2!

Сообщений: 35
Зарегистрирован: 22. Мая 2006
Re: Класс "ПрямойЗапрос"
Ответ #821 - 20. Августа 2010 :: 10:04
Печать  
Есть запрос
Код
Выбрать все
ВЫБРАТЬ О.ФИРМА [ФИРМА $Справочник.Фирмы]
		,О.ТОВАР [Товар $Справочник.ТМЦ]
		,О.Покупатель
		,О.Поставщик
ИЗ
$РегистрОбороты.Обороты(:НачОст, :КонОст~ ,Документ,,
	 ,,) AS О
ГДЕ
(О.Фирма = :ВыбФирма) AND
(О.Поставщик = :ВыбПоставщик)
 



Устанавливаю параметры
ппЗапросОбороты.УстановитьТекстовыйПараметр("НачОст",Дата1);
ппЗапросОбороты.УстановитьТекстовыйПараметр("КонОст",Дата2);

Смотрю пропарсеный текст:
Код
Выбрать все
SELECT О.ФИРМА [ФИРМА $Справочник.Фирмы]
		,О.ТОВАР [Товар $Справочник.ТМЦ]
		,О.Покупатель
		,О.Поставщик
FROM
(
	SELECT
		ТекущийДокумент
		,ВидДокумента
		,ПозицияДокумента
		,Фирма
		,Товар
		,Статус
		,Покупатель
		,Поставщик
		,ДопИзмерение1
		,ДопИзмерение2
		,SUM(ПриходСумОборот) AS ПриходСумОборот
		,SUM(ПриходКвоОборот) AS ПриходКвоОборот
		,SUM(РасходСумОборот) AS РасходСумОборот
		,SUM(РасходКвоОборот) AS РасходКвоОборот
		,SUM(ДоходОборот) AS ДоходОборот

	FROM
		(SELECT
			docjourn.IDDOC AS ТекущийДокумент
			,docjourn.IDDOCDEF AS ВидДокумента
			,docjourn.DATE_TIME_IDDOC AS ПозицияДокумента
			,ra_15901.sp15902 AS Фирма
			,ra_15901.sp15903 AS Товар
			,ra_15901.sp15904 AS Статус
			,ra_15901.sp15905 AS Покупатель
			,ra_15901.sp15906 AS Поставщик
			,ra_15901.sp15907 AS ДопИзмерение1
			,ra_15901.sp15908 AS ДопИзмерение2
			,CASE WHEN ra_15901.debkred = 0 THEN ra_15901.sp15909 ELSE -ra_15901.sp15909 END AS ПриходСумОборот
			,CASE WHEN ra_15901.debkred = 0 THEN ra_15901.sp15910 ELSE -ra_15901.sp15910 END AS ПриходКвоОборот
			,CASE WHEN ra_15901.debkred = 0 THEN ra_15901.sp15911 ELSE -ra_15901.sp15911 END AS РасходСумОборот
			,CASE WHEN ra_15901.debkred = 0 THEN ra_15901.sp15912 ELSE -ra_15901.sp15912 END AS РасходКвоОборот
			,CASE WHEN ra_15901.debkred = 0 THEN ra_15901.sp15913 ELSE -ra_15901.sp15913 END AS ДоходОборот

		FROM
			RA15901 AS ra_15901 (nolock)
		INNER JOIN _1SJOURN AS docjourn (nolock)
		ON ra_15901.IDDOC = docjourn.IDDOC
		WHERE (docjourn.DATE_TIME_IDDOC >= '20100801     0     0   ')
		AND (docjourn.DATE_TIME_IDDOC < '')
		) AS vt_ra_15901
	GROUP BY
		ТекущийДокумент
		,ВидДокумента
		,ПозицияДокумента
		,Фирма
		,Товар
		,Статус
		,Покупатель
		,Поставщик
		,ДопИзмерение1
		,ДопИзмерение2
	HAVING (SUM(ПриходСумОборот) <> 0)
	OR (SUM(ПриходКвоОборот) <> 0)
	OR (SUM(РасходСумОборот) <> 0)
	OR (SUM(РасходКвоОборот) <> 0)
	OR (SUM(ДоходОборот) <> 0)

) AS О
WHERE
(О.Фирма = '     1   ') AND
(О.Поставщик = '    3Q   ')
 


И вижу что из-за модификатора у параметра КонДата, в окончательном тексте запроса отсутсвует параметр даты вобще
AND (docjourn.DATE_TIME_IDDOC < ''), убираю модификатор - подставляется дата (но типа "дата  0 0" ), т.е. начало дня - запрос работает, с модифкатором - нет. Первый раз с такой проблемой. Вроде на других виртуальных таблицах модификатор по дате работал.
Версии 1с++ 3.2.1.10, формекс 2.0.5.99, класс ПрямойЗапрос 1.07.015 12.08.2010.


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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #822 - 20. Августа 2010 :: 12:34
Печать  
Цитата:
Незнаю зачем так сделано (наверно Саше так проще было), но в классе "ПрямойЗапрос", некоторые макроимена типа "ВидСправочника36" или "ПустойИд" должны предваряться символом ":" а не "$". Тоже частенько путаюсь Улыбка


Я когда писал класс не ставил во главу обратную связь с ODBC и в принципе позиционирую синтаксис класса как самостоятельный (пусть и похожий), а иначе бы не тратил время на написание такой документации.

Что касается ВидСправочника36. Такого параметра нет. Посмотрите внимательно. Что касается значения в виде строки или числа регулируется это модификатором ~. Советую уделить внимание особенностям подставления модификатора. Ибо там у вида документа (если я не ошибаюсь) методика работы отличается от всех остальных предопределенных параметров.
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #823 - 20. Августа 2010 :: 12:40
Печать  
Jarad писал(а) 20. Августа 2010 :: 10:04:
И вижу что из-за модификатора у параметра КонДата, в окончательном тексте запроса отсутсвует параметр даты вобще
AND (docjourn.DATE_TIME_IDDOC < ''), убираю модификатор - подставляется дата (но типа "дата  0 0" ), т.е. начало дня - запрос работает, с модифкатором - нет. Первый раз с такой проблемой. Вроде на других виртуальных таблицах модификатор по дате работал.
Версии 1с++ 3.2.1.10, формекс 2.0.5.99, класс ПрямойЗапрос 1.07.015 12.08.2010.

Нужен пример. Странно что дата пустая. Значение даты скажи, а также ТА. Я посмотрю конечно причина возможная, но нужны детали для уточнения. Если не сложно постучись в аську.
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос"
Ответ #824 - 20. Августа 2010 :: 22:16
Печать  
Хотел спросить не стоит ли разделить тему про "ПрямойЗапрос" аналогично классу "ПоставщикДанных" на две части?
  

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