Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Простая задачка на объединение двух запросов, dbf (число прочтений - 1560 )
Den@
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 23
Зарегистрирован: 24. Октября 2008
Простая задачка на объединение двух запросов, dbf
24. Октября 2008 :: 12:18
Печать  
Добрый день!

С прямыми запросами только начал разбираться, информации слишком много, кое с чем разобрался, но вот возникла такая задача:

Создана форма справочника номенклатуры с использованием "дерево+группа" для отображения групп и ТП+ИТ для отображения элементов открытой группы. При заходе в узел дерева в ТП отображается список элементов, с текущим значением в колонке "Остаток". Для этого выполняется следующий код:

           Запрос = мБаза.СоздатьКоманду();
           
           ТекстЗапроса = "
           |SELECT
           |            Спр.ID AS [Номенклатура $Справочник.Номенклатура]
           |FROM
           |            $Справочник.Номенклатура AS Спр
           |WHERE
           |            Спр.ParentID = :ГлавнаяГруппа AND
           |            Спр.IsFolder = 2";
           
           Запрос.УстановитьТекстовыйПараметр("ГлавнаяГруппа", Номен.ТекущийЭлемент());
           
           лИТ = СоздатьОбъект("ИндексированнаяТаблица");
           
           Запрос.ВыполнитьИнструкцию(ТекстЗапроса, лИТ);                  

           Ном = 1;
           
           //заполним таблицу элементов
           лИТ.ВыбратьСтроки();
           
           Пока лИТ.ПолучитьСтроку() = 1 Цикл

                 Если (Ном / 50) = Цел(Ном/50) Тогда
                       Состояние(Ном);
                 КонецЕсли;                  
                 
                 мТабл.НоваяСтрока();
                 мТабл.Номер = Ном;
                 мТабл.Номен = лИТ.Номенклатура;
                 
                 Ном = Ном + 1;                  

           КонецЦикла;
           
           //запрос к остаткам
           ТекстЗапроса = "
           |SELECT
           |            $Рег.Номенклатура AS [Номенклатура $Справочник.Номенклатура],
           |            SUM($Рег.Количество) AS Остаток
           |FROM
           |            $РегистрИтоги.Остатки AS Рег
           |WHERE
           |            (PERIOD = :ДатаТА~~)
           |            AND
           |            ($Рег.Номенклатура IN (SELECT VAL FROM :ГлавнаяГруппа))
           |GROUP BY
           |            $Рег.Номенклатура";

           ИмяТаблицы = ":ГлавнаяГруппа";
           Запрос.УложитьСписокОбъектов(Номен.ТекущийЭлемент(), ИмяТаблицы, Номен.Вид());
           Запрос.УстановитьТекстовыйПараметр ("ГлавнаяГруппа", ИмяТаблицы);
           Запрос.УстановитьТекстовыйПараметр("ДатаТА", НачМесяца(ПолучитьДатуТА()));
           
           Запрос.ВыполнитьИнструкцию(ТекстЗапроса, лИТ);
           
           лИТ.ДобавитьИндекс("Номенклатура", "Номенклатура");
           
           мТабл.ЛевоеСоединение("Номен", лИТ, "Номенклатура", "Остаток:Остаток");


В итоге в ТП для элементов содержится все что нужно. Вопрос - как правильно объединить данные два запроса в один запрос, чтобы на выходе иметь таблицу со всеми необходимыми данными. Спасибо!
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Простая задачка на объединение двух запросов, dbf
Ответ #1 - 24. Октября 2008 :: 15:42
Печать  
select Спр.ID AS [Номенклатура $Справочник.Номенклатура]
, isnull(Запрос.Остаток,0)
from $Справочник.Номенклатура AS Спр
left join
(
select ... from регистр итоги (только условие на список элементов тот подзапросом)
) as Запрос on Спр.ID = Запрос.Номенклатура
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Простая задачка на объединение двух запросов, dbf
Ответ #2 - 24. Октября 2008 :: 15:45
Печать  
А... это дбф, надо посмотреть что там вместо isnull, что-то не вспоминается
Какой-то кривоватый запрос получился... ну ладно
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Den@
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 23
Зарегистрирован: 24. Октября 2008
Re: Простая задачка на объединение двух запросов, dbf
Ответ #3 - 25. Октября 2008 :: 14:17
Печать  
Спасибо, за день осилил  Смех

           Запрос = мБаза.СоздатьКоманду();
           
           ТекстЗапроса = "
           |SELECT
           |            Спр.ID AS [Номенклатура $Справочник.Номенклатура],
           |            Запрос.Остаток AS Остаток
           |FROM
           |            $Справочник.Номенклатура AS Спр
           |
           |            LEFT JOIN
           |            (
           |            SELECT
           |                        $Рег.Номенклатура AS Спр,
           |                        SUM($Рег.Количество) AS Остаток
           |            FROM
           |                        $РегистрИтоги.Остатки AS Рег
           |            WHERE
           |                        (Рег.PERIOD = :ДатаТА~~)
           |                        AND
           |                        ($Рег.Номенклатура IN (SELECT VAL FROM :ТаблицаЭлементов))
           |            GROUP BY
           |                        Спр
           |            ) AS Запрос ON Спр.ID = Запрос.Спр
           |WHERE
           |            Спр.ParentID = :ГлавнаяГруппа
           |            AND
           |            Спр.IsFolder = 2
           |ORDER BY
           |            Спр.Descr";
           
           //для выборки элементов
           Запрос.УстановитьТекстовыйПараметр("ГлавнаяГруппа", Номен.ТекущийЭлемент());
           //для подзапроса по регистру
           ИмяТаблицы = ":ТаблицаЭлементов";
           Запрос.УложитьСписокОбъектов(Номен.ТекущийЭлемент(), ИмяТаблицы, Номен.Вид());
           Запрос.УстановитьТекстовыйПараметр ("ТаблицаЭлементов", ИмяТаблицы);
           Запрос.УстановитьТекстовыйПараметр("ДатаТА", НачМесяца(ПолучитьДатуТА()));
                       
           лИТ = СоздатьОбъект("ИндексированнаяТаблица");
           
           Запрос.ВыполнитьИнструкцию(ТекстЗапроса, лИТ);
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать