Прямой запрос к SQL-базе: количество дней наличия товара на складе за период

27.10.07

Разработка - Запросы

tormozit в своей статье http://infostart.ru/articles/228/ приводил пример для "восьмерки", идея мне понравилась, поэтому решил из-за производственной необходимости переписать на прямой запрос к SQL-базе 7.7...
Чуть позже, если получится, перепишу для dbf-базы.
SELECT 
Подзапрос.ПодзапросНоменклатура [ПодзапросНоменклатура $Справочник.Номенклатура],
Подзапрос.ПодзапросСклад [ПодзапросСклад $Справочник.Склады],
SUM(
 CASE WHEN    Подзапрос.ПодзапросПериод  = $НачалоПериода.День(:ДатаКонца~)               THEN
   CASE WHEN Подзапрос.КоличествоКонечныйОстаток > 0 THEN
     CASE WHEN   Подзапрос. ПодзапросКоличествоКонечныйОстаток <= 0       THEN
        DATEDIFF(day, Подзапрос.ОстаткиТМЦОстаткиОбороты1Период,  Подзапрос.ПодзапросПериод)
     ELSE
        DATEDIFF(day, Подзапрос.ОстаткиТМЦОстаткиОбороты1Период,  :ДатаКонца~) + 1
     END
   ELSE
     CASE WHEN Подзапрос.ПодзапросКоличествоКонечныйОстаток > 0 THEN
        DATEDIFF(day, Подзапрос.ПодзапросПериод,  :ДатаКонца~) + 1
     ELSE 
        0 
     END
   END
 ELSE
   CASE WHEN Подзапрос.КоличествоКонечныйОстаток > 0 THEN
     DATEDIFF(day, Подзапрос.ОстаткиТМЦОстаткиОбороты1Период,  Подзапрос.ПодзапросПериод) 
   ELSE 
     0
   END
 END
) as КоличествоДнейВПродаже
FROM (
      SELECT Запрос2Уровня.ПодзапросНоменклатура ПодзапросНоменклатура
		, Запрос2Уровня.ПодзапросСклад ПодзапросСклад
		, Запрос2Уровня.ПодзапросКоличествоКонечныйОстаток
		, Запрос2Уровня.ПодзапросПериод
		, Запрос2Уровня.ОстаткиТМЦОстаткиОбороты1Период
		, Запрос2Уровня.КоличествоКонечныйОстаток
      FROM (
                SELECT Запрос1Уровня.Номенклатура ПодзапросНоменклатура
			, Запрос1Уровня.Склад ПодзапросСклад
			, Запрос1Уровня.КоличествоКонечныйОстаток ПодзапросКоличествоКонечныйОстаток
			, Запрос1Уровня.Период ПодзапросПериод
			, Запрос1Уровня.ОстаткиТМЦОстаткиОбороты1Период
			, ОстаткиТМЦОстаткиОбороты.КоличествоКонечныйОстаток
		FROM $РегистрОстаткиОбороты.ОстаткиТМЦ(:ДатаНачала,:ДатаКонца~,День,,,,(Номенклатура, Склад),) AS ОстаткиТМЦОстаткиОбороты
		INNER JOIN (
                        SELECT ОстаткиТМЦОстаткиОбороты.Номенклатура
				, ОстаткиТМЦОстаткиОбороты.Склад
				, ОстаткиТМЦОстаткиОбороты.КоличествоКонечныйОстаток
				, ОстаткиТМЦОстаткиОбороты.Период
				, MAX(ОстаткиТМЦОстаткиОбороты1.Период) ОстаткиТМЦОстаткиОбороты1Период
			FROM $РегистрОстаткиОбороты.ОстаткиТМЦ(:ДатаНачала,:ДатаКонца~,День,,,,(Номенклатура, Склад),) AS ОстаткиТМЦОстаткиОбороты
			LEFT JOIN $РегистрОстаткиОбороты.ОстаткиТМЦ(:ДатаНачала,:ДатаКонца~,День,,,,(Номенклатура, Склад),) AS ОстаткиТМЦОстаткиОбороты1 
			ON ОстаткиТМЦОстаткиОбороты.Номенклатура = ОстаткиТМЦОстаткиОбороты1.Номенклатура AND ОстаткиТМЦОстаткиОбороты.Склад = ОстаткиТМЦОстаткиОбороты1.Склад AND
			ОстаткиТМЦОстаткиОбороты.Период > ОстаткиТМЦОстаткиОбороты1.Период
			GROUP BY ОстаткиТМЦОстаткиОбороты.Номенклатура
				, ОстаткиТМЦОстаткиОбороты.Склад
				, ОстаткиТМЦОстаткиОбороты.КоличествоКонечныйОстаток
				, ОстаткиТМЦОстаткиОбороты.Период
                        ) AS Запрос1Уровня 
			ON ОстаткиТМЦОстаткиОбороты.Номенклатура = Запрос1Уровня.Номенклатура AND ОстаткиТМЦОстаткиОбороты.Склад = Запрос1Уровня.Склад AND 
			ОстаткиТМЦОстаткиОбороты.Период = Запрос1Уровня.ОстаткиТМЦОстаткиОбороты1Период
                ) AS Запрос2Уровня
      ) AS Подзапрос
GROUP BY Подзапрос.ПодзапросНоменклатура
	, Подзапрос.ПодзапросСклад
ORDER BY Подзапрос.ПодзапросНоменклатура
	, Подзапрос.ПодзапросСклад

См. также

Микро консоль для запросов к MySQL базе из 1С: Предприятие 7.7

Инструментарий разработчика Запросы Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Обработка, позволяющая выполнять запросы к базе, лежащей в MySQL, для 1С:Предприятие 7.7.

10.08.2022    2928    4    crocolo    0    

2

.Net в 1С. Асинхронные HTTP запросы, отправка Post нескольких файлов multipart/form-data, сжатие трафика с использованием gzip, deflate, удобный парсинг сайтов и т.д.

Запросы Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Очень часто нужно при работе с HTTP сервисами или сайтами использовать Асинхронные HTTP запросы, отправку на сервер нескольких файлов, использование сжатия трафика. Эта статья про то, как этого легко добиться.

09.03.2016    37593    Serginio    22    

44

Универсальный способ сравнения таблиц

Универсальные функции Запросы Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

На эту тему уже есть статьи, но этот способ нигде не описан. Хотя я его использую с тех пор, как занимаюсь программированием. Его преимущество в простоте и универсальности: можно применять на 1С, SQL, а также в любом другом языке программирования.

05.07.2015    21620    json    3    

22

Пример получения остатков по складу по запросу по почте из программы 1С 7.7.

Запросы Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Пример получения остатков по складу по запросу по почте из программы 1С 7.7. Для получения остатков необходимо пользователю с любого почтовика (с любого "мыла") отправить текст сообщения GiveMyStockBalance_ForAnalize на почтовый адрес определенный в Константа.СерверПолучения. Программа выдаст остатки (можно переписать функцию для выдачи любых данных) в формате xls на почту указанную в константе Константа.СерверОтправки. Программа может быть полезна в тех организациях где трудно или невозможно осуществить прямой доступ к 1С сотрудников для просмотра необходимых данных. Также можно организовать некий почтамт - запрос для клиентов - при посылке определенного логина клиентом на его почту будет автоматически выслана информация, например, акт сверки с клиентов, или процент выполнения его заказа и т.д.

3 стартмани

25.03.2014    25140    5    protexprotex    3    

5

Реализация условий в прямых запросах к журналу расчета.

Зарплата Запросы Расчет 7.7 1С:Зарплата и кадры 7.7 Абонемент ($m)

Обзор методов реализации условий и функций с условиями в обращениях к журналу расчетов при помощи прямого запроса.

1 стартмани

06.12.2012    14082    nicotin    5    

9

Универсальный отчет - Конструктор запросов для 1С 7.7

Запросы Платформа 1С v7.7 Оперативный учет 7.7 Бухгалтерский учет 7.7 Расчет 7.7 Конфигурации 1cv7 Абонемент ($m)

Универсальный отчет для конфигураций на платформе 1С 7.7. Умеет обращатся к справочникам, документам, регистрам и журналам расчетов. Удобен для быстрого получения каких либо данных, которые можно получить посредствам запроса. Предусмотренна возможность сохранения настроек.

1 стартмани

14.04.2012    33845    303    set2333    16    

11
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. coloboc 18.05.10 18:38 Сейчас в теме
Крутил этот вариант по всякому... Не сказал бы, что он у меня не заработал. Но данные давал не все, хотябы только потому, что отсутствует параметр "ДвиженияИГраницыПериода". При этом ничего лучшего в интернете не нашел. После продолжительного обдумывания, родился вот такой вариант, намного более простой и быстрый. Надеюсь он комунибудь окажется полезен.
Приведённый запрос целиком выдернут из рабочей обработки, получает количество дней товара на складе за указанный период (ТиС, 7.7, SQL 2000)

	SELECT
	|	ВлЗапрос.Фирма [Фирма $Справочник.Фирмы] 
	|	,ВлЗапрос.Номенклатура [ПодзапросНоменклатура $Справочник.Номенклатура]
	|	,SUM(
	|	CASE WHEN ВлЗапрос.НачОст>0 THEN  
	|		CASE WHEN ВлЗапрос.Период=convert(datetime,:НачДата,112) THEN
	|                             		CASE WHEN ВлЗапрос.КонОст<=0 THEN   
	|				1
	|			ELSE
	|				DATEDIFF(day, ВлЗапрос.Период,convert(datetime,:КонДата,112)) + 1
	|			END 
	|		ELSE 
	|               		CASE WHEN ВлЗапрос.КонОст<=0 THEN
	|				-DATEDIFF(day, ВлЗапрос.Период,convert(datetime,:КонДата,112))
	|			END
	|		END                
	|	ELSE
	|		CASE WHEN ВлЗапрос.КонОст>0 THEN 
	|			DATEDIFF(day, ВлЗапрос.Период,convert(datetime,:КонДата,112)) + 1 
	|		END
	|	END) as ДнейНаСкладе
	|FROM(
	|	SELECT ОстаткиТМЦОстаткиОбороты.Фирма
	|		, ОстаткиТМЦОстаткиОбороты.Номенклатура       
	|		, ОстаткиТМЦОстаткиОбороты.Период as Период
	|		, ОстаткиТМЦОстаткиОбороты.КоличествоКонечныйОстаток КонОст
	|		, ОстаткиТМЦОстаткиОбороты.КоличествоНачальныйОстаток НачОст 
	|	FROM  $РегистрОстаткиОбороты.ОстаткиТМЦ(:НачДата,:КонДата~,День,ДвиженияИГраницыПериода,
	|					,
	|					Номенклатура in (select val from #СписокТоваров) 
	|					,(Номенклатура, Фирма),) AS ОстаткиТМЦОстаткиОбороты 
	|	) AS ВлЗапрос           
	|	GROUP BY ВлЗапрос.Фирма
	|		, ВлЗапрос.Номенклатура 
	|	ORDER BY ВлЗапрос.Номенклатура";
Показать
andrvyst; Dartvader; Bor_ka; +3 Ответить
Оставьте свое сообщение