Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Бух. запрос в другую базу с отбором субконто по группе справочника (число прочтений - 4436 )
strady
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 23. Сентября 2013
Бух. запрос в другую базу с отбором субконто по группе справочника
23. Сентября 2013 :: 19:43
Печать  
Добрый день! Задача получить данные по остаткам и движениям по бух. счетам из другой базы на SQL. Вот начинаю изучать механизмы прямых запросов. Вроде все получается, но затык в таком месте. Не получается установить отбор по группе справочника другой базы.

Получаю ID группы через функцию "ПолучитьИдСпр", но процедура "УложитьСписокОбъектов" ругается на 1-й параметр (логично, она же хочет Объект, а не строку)

Цитата:
Запрос = СоздатьОбъект("AccountsRecordSet");
.........................
|FROM $БИОстаткиОбороты.Основной(:НАчалоПериода, :КонецПериода,
           |,
           |,,
           |Счет = :Счет41,(Номенклатура,МестаХранения,Контрагенты),Субконто1 IN (SELECT Val FROM #Группа)) БИОстаткиОборотыОсновнойУсловиеСубконто ="";

     клатура",1), "#Группа", "Номенклатура");


Пытаюсь получать иерархию элементов из другой базы и запихнуть в #Группа IDшники, но в запросе получается в отборе нужно  указывать объекты.

Гуру запросов, укажите хоть путь куда лучше копать, а может это уже где-то готово и не нужно придумывать велосипед.
ПС: вроде как есть вариант просмотреть в SQL Profiler запрос процедуры "УложитьСписокОбъектов" и вставить его вместо #Группа, но пока SQL Profiler мне недоступен, только QA.

Спасибо!
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Бух. запрос в другую базу с отбором субконто по группе справочника
Ответ #1 - 24. Сентября 2013 :: 02:46
Печать  
Собери таблицу фильтра сам:

Код
Выбрать все
тзпФильтр = "
|SELECT '" + РадугаСервис.ЗначениеВСтрокуБД(ЗначениеФильтра) + "' ID Into " + ИмяВремТаблицы + "
|
|While @@RowCount > 0
|INSERT INTO " + ИмяВремТаблицы + "
|SELECT
|	Спр.ID
|FROM
|	$Справочник." + ЗначениеФильтра.Вид() + " Спр (NoLock)
|WHERE
|	ParentID != $ПустойИД
|	And ParentID In (SELECT ID FROM " + ИмяВремТаблицы + " (NoLock))
|	And ID Not In (SELECT ID FROM " + ИмяВремТаблицы + " (NoLock))
|
|If (SELECT Count(*) From " + ИмяВремТаблицы + " (NoLock)) > 100
|	Create Clustered Index " + СтрЗаменить(ИмяВремТаблицы, "[#", "[#IX_") + " on " + ИмяВремТаблицы + " (ID)
|"; 



Индекс - по желанию.
Если честно, полноценных иследований на тему "эффективен ли такой индекс (или же затраты на его построение больше выгоды от использования) и на каких объемах выборки он эффективен" не проводил и не встречал. Но у себя, почему-то, имею  Смех
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Бух. запрос в другую базу с отбором субконто по группе справочника
Ответ #2 - 24. Сентября 2013 :: 05:40
Печать  
В AccountsRecordSet есть метод УложитьСписокГрупп. Там есть примеры запросов и для справочников и для групп счетов.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
strady
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 23. Сентября 2013
Re: Бух. запрос в другую базу с отбором субконто по группе справочника
Ответ #3 - 24. Сентября 2013 :: 08:58
Печать  
вроде получилось так:
Цитата:
Процедура Сформировать()  
         
     //получим ИД элемента из чужой базы по наименованию
     IDсубк1 = ПолучитьИдСпр(СокрЛП(Субконто1.Наименование),"Номенклатура",1);
     
     //получим временную таблицу с подчиненными элементам. Спасибо Satans Claws
     ЗапросФильтр = СоздатьОбъект("AccountsRecordSet");
     ИмяВремТаблицы = "#Группа";
     ЗапросФильтр.УстБД(БД);
     тзпФильтр = "
           |SELECT '" + IDсубк1 + "' ID  Into " + ИмяВремТаблицы + "
           |
           |While @@RowCount > 0
           |INSERT INTO " + ИмяВремТаблицы + "
           |SELECT
           |      Спр.ID
           |FROM
           |      $Справочник.Номенклатура Спр (NoLock)
           |WHERE
           |      ParentID != $ПустойИД
           |      And ParentID In (SELECT ID FROM " + ИмяВремТаблицы + " (NoLock))
           |      And ID Not In (SELECT ID FROM " + ИмяВремТаблицы + " (NoLock))
           |
           |If (SELECT Count(*) From " + ИмяВремТаблицы + " (NoLock)) > 100
           |      Create Clustered Index " + СтрЗаменить(ИмяВремТаблицы, "[#", "[#IX_") + " on " + ИмяВремТаблицы + " (ID)
           |";        
     Результат = ЗапросФильтр.ВыполнитьИнструкцию(тзпФильтр);
   ЗапросФильтр.Закрыть();
         
     //получим данные по бух. счету
     Запрос = СоздатьОбъект("AccountsRecordSet");
     Запрос.УстановитьТекстовыйПараметр("НАчалоПериода", Дата("01.09.2013"));
     Запрос.УстановитьТекстовыйПараметр("КонецПериода", Дата("01.09.2013"));
     Запрос.УстановитьТекстовыйПараметр("Счет41",ПолучитьИдСчета("%41. 2.%"));
     Запрос.отладка();
     Запрос.УстБД(БД);
     ТекстЗапроса = "
           |SELECT
           |Субконто1 [Субконто1 $Субконто]
           |, Субконто1_вид
           |, СпрНом.code as Код
           |, СпрНом.descr as Наименование
           |, $СпрНом.Артикул as Артикул
           |, $СпрНом.Размер as Размер
           |, Субконто2 [Субконто2 $Субконто]
           |, Субконто2_вид
           |, Субконто3 [Субконто3 $Субконто]
           |, Субконто3_вид
           |, КоличествоНачальныйОстатокДТ as СНД3
           |, КоличествоОборотДт as ДО3
           |, КоличествоОборотКт as КО3
           |, КоличествоКонечныйОстатокДТ as СКД3
           |FROM $БИОстаткиОбороты.Основной(:НАчалоПериода, :КонецПериода,
           |,
           |,,
           |Счет = :Счет41,(Номенклатура,МестаХранения,Контрагенты),!УсловиеСубконто!) БИОстаткиОборотыОсновной
           ";
                     
     //добавим условие у запрос, если выбраны элементы на форме
     УсловиеСубконто ="";
     Если ПустоеЗначение(Субконто1) = 0 Тогда  
           УсловиеСубконто = УсловиеСубконто+"Субконто1 IN (SELECT ID FROM #Группа)";
     КонецЕСли;
     Если ПустоеЗначение(Субконто2) = 0 Тогда
           УсловиеСубконто = УсловиеСубконто+?(УсловиеСубконто="",""," AND ")+"Субконто2=:Субконто2";
     КонецЕСли;  
     УсловиеСубконто = ?(УсловиеСубконто="","","("+УсловиеСубконто+")");
   ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"!УсловиеСубконто!",УсловиеСубконто);
     Результат = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
     //запустим на форму результат
     ТабЗн.Загрузить(Результат);
     //удалим времнную таблицу
     Запрос.Выполнить("drop table #Группа");
   Запрос.Закрыть();
КонецПроцедуры


berezdetsky, в AccountsRecordSet пробовал Запрос.УложитьСписокГрупп(СЗ, "#Группа", "");, где СЗ список ID, но все сводится к тому же  УложитьСписокОбъектов и к тому же у меня ругалось, что не установлена БД, пришлось параметром еще и БД передавать.
Цитата:
Процедура УложитьСписокГрупп(СписокОбъектов, ИмяТаблицы, ВидОбъектов = "",БД="") Экспорт
     рс = СоздатьОбъект("ODBCRecordSet");
     Если БД <> "" Тогда
           рс.УстБД(БД);
     КонецЕСли;
     рс.Отладка(ОтладкаВключена % 2);
     Если СтрДлина(ВидОбъектов) = 0 Then
           рс.УложитьСписокОбъектов(СписокОбъектов, ИмяТаблицы);
     Иначе
.........................

В СЗ у меня получилось примерно 250 000 записей и УложитьСписокОбъектов отрабатывал неприлично долго. В любом случае спасибо за $БИОстаткиОбороты

Может можно что-то оптимизировать? Хотя запрос и так достаточно быстро выполняется.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Бух. запрос в другую базу с отбором субконто по группе справочника
Ответ #4 - 24. Сентября 2013 :: 12:57
Печать  
Цитата:
но все сводится к тому же  УложитьСписокОбъектов

В смысле? УложитьСписокОбъектов там используется только если не передать вид объектов. Т.е., когда не нужно разворачивать иерархию.

И да, AccountsRecordSet не работает с подключенными базами.

А оптимизировать - хз. Попробуй ПрямойЗапрос, там немного другая реализация этой ВТ.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
strady
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 23. Сентября 2013
Re: Бух. запрос в другую базу с отбором субконто по группе справочника
Ответ #5 - 24. Сентября 2013 :: 15:27
Печать  
berezdetsky писал(а) 24. Сентября 2013 :: 12:57:
Цитата:
но все сводится к тому же  УложитьСписокОбъектов

В смысле? УложитьСписокОбъектов там используется только если не передать вид объектов. Т.е., когда не нужно разворачивать иерархию.

И да, AccountsRecordSet не работает с подключенными базами.

А оптимизировать - хз. Попробуй ПрямойЗапрос, там немного другая реализация этой ВТ.

Не передаю вид объектов, т.к. если передать "Номенклатура", то потом ругается на "тип первого параметра".
Мне как раз и нужно УложитьСписок из "чужой" базы.
Оптимизировать пока не буду, т.к. этот кусок кода работает достаточно быстро, по сравнению с остальными.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать