Переключение на Главную Страницу Страницы: 1 ... 8 9 [10] 11 12 ... 51 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" - обсуждения. Часть № 2. (число прочтений - 245603 )
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #135 - 07. Апреля 2011 :: 21:07
Печать  
Версия = "1.7.22 11.01.2011";

Код
Выбрать все
глТекст = "
|SELECT
|	Подотчет.*
|FROM
|	$РегистрОбороты.Подотчет(,,Документ,(КредДокумент = :ТекКредДок),(Контрагент,Статья,КредДокумент),(Сумма)) AS Подотчет
|";

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

ТЗ = СоздатьОбъект("ТаблицаЗначений");
ПрямойЗапрос.РежимОтладки = 1;
ПрямойЗапрос.Текст = глТекст;
ПрямойЗапрос.Выполнить().Выгрузить(ТЗ);
ТЗ.ВыбратьСтроку();
 



Цитата:
SELECT
           Подотчет.*
FROM
           (
     SELECT
           ТекущийДокумент
           ,ВидДокумента
           ,ПозицияДокумента
           ,Контрагент
           ,Статья
           ,КредДокумент
           ,SUM(СуммаПриход) AS СуммаПриход
           ,SUM(СуммаРасход) AS СуммаРасход
           ,SUM(СуммаОборот) AS СуммаОборот
           
     FROM
           (SELECT
                 docjourn.IDDOC AS ТекущийДокумент
                 ,docjourn.IDDOCDEF AS ВидДокумента
                 ,docjourn.idx_DATE_TIME_IDDOC AS ПозицияДокумента
                 ,ra_8580.Контрагент AS Контрагент
                 ,ra_8580.Статья AS Статья
                 ,ra_8580.КредДокумент AS КредДокумент
                 ,CASE WHEN ra_8580.debkred = 0 THEN ra_8580.Сумма ELSE 0 END AS СуммаПриход
                 ,CASE WHEN ra_8580.debkred = 1 THEN ra_8580.Сумма ELSE 0 END AS СуммаРасход
                 ,CASE WHEN ra_8580.debkred = 0 THEN ra_8580.Сумма ELSE -ra_8580.Сумма END AS СуммаОборот
                 
           FROM
                 [Журнал] AS docjourn
           LEFT JOIN [Регистр.Подотчет] AS ra_8580
           ON ra_8580.IDDOC = docjourn.IDDOC
           WHERE docjourn.ПодотчетФр = 1
           WHERE
                 (ra_8580.КредДокумент = '  ET7T   ')
           ) AS vt_ra_8580
     GROUP BY
           ТекущийДокумент
           ,ВидДокумента
           ,ПозицияДокумента
           ,Контрагент
           ,Статья
           ,КредДокумент
     HAVING (SUM(СуммаПриход) <> 0)
     OR (SUM(СуммаРасход) <> 0)
     OR (SUM(СуммаОборот) <> 0)
     
) AS Подотчет
ПрямойЗапрос::Выполнить(Строка ТипОбъекта=ИндексированнаяТаблица, Строка ТекстВыполнения=, Число БезПодготовки=0) : near "WHERE": syntax error
ЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса,ПолучательЗапроса);
{F:\Bases\ВЕС\New\SystemData\Classes\ПрямыеЗапросы\ПрямойЗапрос.ert(13153) }

ПрямойЗапрос.Выполнить().Выгрузить(ТЗ);
{F:\BASES\ВЕС\NEW\EXTFORMS\ТОТЧЕТПОСТАТЬЯМ.ERT(542)}: ПрямойЗапрос::Выполнить(Строка ТипОбъекта=ИндексированнаяТаблица, Строка ТекстВыполнения=, Число БезПодготовки=0) : near "WHERE": syntax error
ЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса,ПолучательЗапроса);
{F:\Bases\ВЕС\New\SystemData\Classes\ПрямыеЗапросы\ПрямойЗапрос.ert(13153) }


Строки №№3611,3977,4024.
Код в этих строках:
Цитата:
Если МетаРегистр.БыстраяОбработкаДвижений = 0 Тогда
     ТекстЗапроса = ТекстЗапроса + "AND docjourn."+ИдентификаторРегистра+"Фр = 1
     |            ";
КонецЕсли;

Кажется в конце оператора условия не хватает строчки:
Цитата:
КлючевоеСлово = "AND";


По крайней мере вставил эту строку в первый блок на адресу №3611 и мой запрос заработал!  Очень довольный
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #136 - 07. Апреля 2011 :: 21:23
Печать  
В предыдущем посте на регистр накладывается условие по колонке КредДокумент. Но условие (КредДокумент = :ТекКредДок) не срабатывает, т.к. поле КредДокумент неопределенного вида. Как правильно привести условие к одному типу?
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #137 - 07. Апреля 2011 :: 21:39
Печать  
Посмотри документацию раздел посвященный преобразованиям значений БД в значения 1С, и если я не ошибаюсь то ":ТекДокумент*". Но там все равно посмотри Улыбка)))

По исправлению подтверждаю... странно что ты первый нашел Улыбка))
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #138 - 08. Апреля 2011 :: 05:22
Печать  
Цитата:
Значение типа Документ
•      0: Строка длинной 9 - внутренний идентификатор значения
•      1: Строка длинной 13 - внутренний идентификатор значения с видом значения
•      2: Строка длинной 15 – внутренний идентификатор значения с типом и видом значения
•      3: Строка или число длиной 4 символа. Зависит от формата ИБ. SQL: int - идентификатор вида объекта; DBF: char(4) - 36-й идентификатор вида объекта.


Т.е. если не делать преобразования, то выдает правильно: '  ET7T   '.
У меня реквизит "КредДокумент" -  тип "Документ" неопределенного вида. Применяю преобразование в условии: (КредДокумент=:ТекКредДок*). В результате получаю поле: 'O1 1PT  ET7T           '. Итого 23 символа вместо 13-ти.  Печаль
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #139 - 08. Апреля 2011 :: 05:26
Печать  
Как временное решение сделал так. В переменную ТекКредДок внес связку: Вид+Ид из запроса:
Цитата:
|$Ж.ВидДокумента as Вид
|,Ж.IDDOC as Ид

Решение работает. Но хотелось бы разобраться и понять работу модификаторов (преобразователей).  Улыбка
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #140 - 08. Апреля 2011 :: 05:55
Печать  
А... ну блин, я то подумал что тип значения "Неопределенный" Улыбка)) поэтому и этот модификатор посоветовал. А так тебе надо модификатор "~", т.е. "1: Строка длинной 13 - внутренний идентификатор значения с видом значения".
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #141 - 08. Апреля 2011 :: 06:40
Печать  
Точно. Спасибо.  Улыбка
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #142 - 08. Апреля 2011 :: 20:05
Печать  
Как "уложить" выбранную группу справочника, чтобы включились и элементы и группы, вместе с выбранной?
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #143 - 09. Апреля 2011 :: 04:07
Печать  
УложитьСписокОбъектов (Значений)
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #144 - 09. Апреля 2011 :: 05:43
Печать  
К сожалению, всё, что в выбранной группе, попадает в результат, а сама, выбранная группа, нет.
Цитата:
Если задана иерархия (название справочника либо плана счетов), то вместо объектов-групп выгружаются все входящие в группу элементы/счета всех нижележащих уровней.


Про иерархический вид можно пока забыть?  Подмигивание
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #145 - 09. Апреля 2011 :: 07:10
Печать  
ReLock писал(а) 09. Апреля 2011 :: 05:43:
К сожалению, всё, что в выбранной группе, попадает в результат, а сама, выбранная группа, нет.
Цитата:
Если задана иерархия (название справочника либо плана счетов), то вместо объектов-групп выгружаются все входящие в группу элементы/счета всех нижележащих уровней.


Про иерархический вид можно пока забыть?  Подмигивание

А у тебя данные с привязкой к группе хранятся? Т.е. в регистре, например, записано "Товар А" - +50 шт. и одновременно "Группа товара А" - +50 шт.? А иначе зачем тебе во временной таблице еще и группы? Тем более информации о принадлежности товаров к группам там все равно не хранится.
Можешь создать свою временную таблицу на сервере с нужной структурой, (типа "Группа 0 уровня", "Группа 1 уровня" и т.д. и в конце "Товар А") и делать запрос к этой таблице.
Лично я делаю так: Выбираю данные по списку товаров, а затем результат в ИТЗ группирую по полю "Номенклатура" с учетом иерархии.
  
Наверх
ICQ  
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #146 - 09. Апреля 2011 :: 07:37
Печать  
Вот я сейчас примерно тоже самое и реализовываю.
  
Наверх
 
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #147 - 19. Апреля 2011 :: 08:11
Печать  
Всем привет. Ну так у меня и не получается уложить список значений во временную таблицу, чтобы там были группы.  Плачущий
У меня в списке значений выбранные группы номенклатуры. Делаю укладку: Цитата:
, а в итоге групп там нет!

Уже извращнулся так:
Цитата:
//*****************************************************************************
Процедура ЗаполнитьСписокТоваров()
     Спр = СоздатьОбъект("Справочник.Номенклатура");
     Спр.ВключатьПодчиненные(1);

     СписокТоваров = СоздатьОбъект("СписокЗначений");
     Если СписТоваров.РазмерСписка() = 0 Тогда
           Спр.ВыбратьЭлементы();
           Пока Спр.ПолучитьЭлемент() = 1 Цикл
                 СписокТоваров.ДобавитьЗначение(Спр.ТекущийЭлемент());
           КонецЦикла;
     Иначе
           СписТоваровРазмерСписка = СписТоваров.РазмерСписка();
           Для Поз = 1 По СписТоваровРазмерСписка Цикл
                 ТекЭлемент = СписТоваров.ПолучитьЗначение(Поз);
                 
                 СписокТоваров.ДобавитьЗначение(ТекЭлемент);
                 Если ТекЭлемент.ЭтоГруппа() = 1 Тогда
                       Спр.ИспользоватьРодителя(ТекЭлемент);
                       Спр.ВыбратьЭлементы();
                       Пока Спр.ПолучитьЭлемент() = 1 Цикл
                             СписокТоваров.ДобавитьЗначение(Спр.ТекущийЭлемент());
                       КонецЦикла;
                 КонецЕсли;
           КонецЦикла;
     КонецЕсли;
     ;
КонецПроцедуры //ЗаполнитьСписокТоваров()

Цитата:
ЗаполнитьСписокТоваров();
     
глТекст = "
|SELECT
|      $СпрНом.ТекущийЭлемент as [Номенклатура $Справочник.Номенклатура]
|,      $СпрНом.ЭтоГруппа as ЭтоГруппа
|FROM
|      Справочник.Номенклатура as СпрНом $NOLOCK
|WHERE
|      $СпрНом.ТекущийЭлемент IN (SELECT Val FROM #Номенклатура)";
     
ТЗ = СоздатьОбъект("ТаблицаЗначений");

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

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #148 - 19. Апреля 2011 :: 08:48
Печать  
Точно не помню, реализовывал ли я метод "УложитьСписокГрупп", может и да, если да то:
Код
Выбрать все
УложитьСписокОбъектов(,Таблица1);
УложитьСписокГрупп(,Таблица2); 



и далее искусственно создаешь таблицу 3
Код
Выбрать все
insert into Таблица3
select val from Таблица1
union all
select val from Таблица2 



Если же не реализовывал, то добавить можно и самому (код подсмотреть в AccountRecordset тов. berezdetsky (куда мы без него)).
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #149 - 19. Апреля 2011 :: 09:08
Печать  
Спасибо. Посмотрю. Попробую.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 8 9 [10] 11 12 ... 51
ОтправитьПечать