Преобразование в прямой запрос SQL

1. Rois 21.06.18 13:12 Сейчас в теме
Доброго дня всем! Знатоки, как корректно выглядит такой запрос SQL из 1С? А то что-то не получается никак(

ВЫБРАТЬ
	ОстаткиНом.Номенклатура КАК Номенклатура,
	ОстаткиНом.КоличествоОстаток КАК Остаток
ПОМЕСТИТЬ ВТостатки
ИЗ
	РегистрНакопления.ОстаткиНоменклатуры.Остатки(&ДатаОстатка, Склад = &Склад) КАК ОстаткиНом
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТостатки.Номенклатура КАК Номенклатура,
	ВТостатки.Остаток КАК Остаток
ИЗ
	ВТостатки КАК ВТостатки
Показать
По теме из базы знаний
Найденные решения
13. ADirks 187 22.06.18 19:35 Сейчас в теме
Например так

Запрос = СоздатьОбъект("ODBCRecordSet");

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

ТекстЗапроса = "Set NoCount ON
|CRE ATE TABLE #t (Номенклатура char(9), Остаток Numeric(19, 2))
|
|INS ERT IN TO #t (Номенклатура, Остаток)
|SELECT
| рег.Номенклатура,
| рег.КоличествоОстаток
|FROM
| $РегистрОстатки.ОстаткиНоменклатуры(:ДатаОстатка,, Склад = :Склад, (Номенклатура), (Количество)) рег
|
|SELECT
| t.Номенклатура [Номенклатура $Справочник.Номенклатура],
| t.Остаток
|FROM
| #t t
|";
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. spacecraft 21.06.18 13:49 Сейчас в теме
(1) берем стандартную консоль запросов от 1С. Идет вместе с БСП. Включаем показ плана выполнения запроса.
Будет что-то вроде этого:
SEL ECT
T1._Period,
T1._UseTotals,
T1._ActualPeriod,
T1._UseSplitter,
T1._MinPeriod,
T1._MinCalculatedPeriod
FR OM _AccumRgOpt38853 T1
WHERE ((T1._Fld1551 = 0)) AND (T1._RegID = 0xBB0C44807BF920468ECAB89F9A033F08 AND T1._Fld1551 = 0

SEL ECT
T1.Fld38239RRef AS _Q_001_F_000RRef,
T1.Fld38245Balance_ AS _Q_001_F_001 INTO #T47190f70f3cc46a5bea0ca744f7bb7f5 
FR OM (SEL ECT
T2.Fld38239RRef AS Fld38239RRef,
SUM(T2.Fld38245Balance_) AS Fld38245Balance_
FR OM (SELECT
T3._Fld38239RRef AS Fld38239RRef,
SUM(T3._Fld38245) AS Fld38245Balance_
FR OM _AccumRgT38248 T3
WH ERE ((T3._Fld1551 = 0)) AND (T3._Period = {ts '3999-11-01 00:00:00'} AND ((T3._Fld38242RRef = 0xB3380011955CBA6B11DF730308305ACC)) AND (T3._Fld38245 <> 0) AND (T3._Fld38245 <> 0))
GROUP BY T3._Fld38239RRef
HAVING (SUM(T3._Fld38245)) <> 0
UNI ON ALL SEL ECT
T4._Fld38239RRef AS Fld38239RRef,
CAST(SUM(CASE WHEN T4._RecordKind = 0 THEN -T4._Fld38245 ELSE T4._Fld38245 END) AS NUMERIC(27, 3)) AS Fld38245Balance_
FR OM _AccumRg38238 T4
WH ERE ((T4._Fld1551 = 0)) AND (T4._Period >= {ts '2018-06-21 00:00:00'} AND T4._Period < {ts '3999-11-01 00:00:00'} AND T4._Active = TRUE AND ((T4._Fld38242RRef = 0xB3380011955CBA6B11DF730308305ACC)))
GROUP BY T4._Fld38239RRef
HAVING (CAST(SUM(CASE WHEN T4._RecordKind = 0 THEN -T4._Fld38245 ELSE T4._Fld38245 END) AS NUMERIC(27, 3))) <> 0) T2
GROUP BY T2.Fld38239RRef
HAVING (SUM(T2.Fld38245Balance_)) <> 0) T1
Показать


Тут использованы несколько другие таблицы.
Rois; корум; ImHunter; +3 Ответить
2. Timur.V 80 21.06.18 13:17 Сейчас в теме
Особенностью использования этой виртуальной таблицы является получение остатков на дату с использованием таблицы итогов.
Поэтому, если использование итогов отключено для регистра, работа с этой таблицей станет невозможной.
3. Rois 21.06.18 13:22 Сейчас в теме
(2) Так в 1С запрос то работает, мне надо его перегнать в TSQL)
4. Timur.V 80 21.06.18 13:24 Сейчас в теме
(3) так в яндексе посмотри (ссылки на форуме запрещены):
Анатомия регистра накопления. Виртуальная таблица «Остатки»
5. МихаилМ 21.06.18 13:28 Сейчас в теме
в 1с++ есть метод , который выводит текст запроса tsql
7. kudlach 13 21.06.18 13:57 Сейчас в теме
У тебя в 7.7 есть таблица остатков на начало интервалов учета (в ТиС обычно месяц) и таблица движений.
Работает так : берешь запросом из таблицы остатков на начало месяца даты, Объединяешь с движениями (+ / -) из таблицы движений за период с начала месяца до даты+Время на которую нужны остатки.

Как называются таблицы - смотри инструменты какие у тебя есть, или пользуйся tSQL / 1c++

P.S.: 13 лет на 1c++ не писал, но помню )
8. ImHunter 327 22.06.18 06:26 Сейчас в теме
(7) Судя по запросу (по наличию времянки), это 8.2/8.3
корум; +1 Ответить
9. ADirks 187 22.06.18 12:19 Сейчас в теме
Запрос = СоздатьОбъект("ODBCRecordSet");
	
Запрос.УстановитьТекстовыйПараметр("ДатаОстатка", ДатаОстатка);
Запрос.УстановитьТекстовыйПараметр("Склад", Склад);

ТекстЗапроса = "Set NoCount ON
|SELECT
|	рег.Номенклатура [Номенклатура $Справочник.Номенклатура],
|	рег.КоличествоОстаток Остаток
|FROM
|	$РегистрОстатки.ОстаткиНоменклатуры(:ДатаОстатка,, Склад = :Склад, (Номенклатура), (Количество)) рег
|";
Показать
10. Rois 22.06.18 14:42 Сейчас в теме
(9) Так и делал. Осталось только понять как с временными таблицами в этом примере)
13. ADirks 187 22.06.18 19:35 Сейчас в теме
Например так

Запрос = СоздатьОбъект("ODBCRecordSet");

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

ТекстЗапроса = "Set NoCount ON
|CRE ATE TABLE #t (Номенклатура char(9), Остаток Numeric(19, 2))
|
|INS ERT IN TO #t (Номенклатура, Остаток)
|SELECT
| рег.Номенклатура,
| рег.КоличествоОстаток
|FROM
| $РегистрОстатки.ОстаткиНоменклатуры(:ДатаОстатка,, Склад = :Склад, (Номенклатура), (Количество)) рег
|
|SELECT
| t.Номенклатура [Номенклатура $Справочник.Номенклатура],
| t.Остаток
|FROM
| #t t
|";
14. Rois 23.06.18 09:23 Сейчас в теме
(13) Спасибо большое! Было сообщение: Не удалось привязать составной идентификатор t.Номенклатура, поэтому подправил:

|SELECT 
| ost.Номенклатура [Номенклатура $Справочник.Номенклатура], 
| ost.Остаток 
|FROM 
|	#t  AS ost
11. ADirks 187 22.06.18 14:54 Сейчас в теме
да нафиг они не нужны, временные таблицы

но если уж оч.хочется, то кури CRE ATE TABLE да INSERT
12. Rois 22.06.18 15:16 Сейчас в теме
(11) Согласен, конкретно в этом примере они не нужны абсолютно) Мне просто нужно прямой SQL запрос составить с 4-мя или 5тью временными таблицами для последующих соединений, поэтому и интересовался для наглядности примера. Читал про Create, Insert, Ins ert in to - но не получилось что-то. Потому и код правильный нужен чтобы от него отталкиваться.
15. kudlach 13 26.06.18 14:04 Сейчас в теме
(12) можно же запрос без всяких временных.
сделай вложенными подзапросами
16. SlavaKron 26.06.18 14:46 Сейчас в теме
(15) Для этого идеально подходит CTE (Common table expression) - обобщенное табличное выражение.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот