Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) 1sqlite: периодика и не только (число прочтений - 4677 )
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
1sqlite: периодика и не только
23. Июля 2010 :: 17:39
Печать  
начал ковырять (это такое лирическое вступительное извинение).

вопрос с периодикой. примерчик бы, голову сломал.
Справочник.Спр1 имеет периодический реквизит РеквП1 типа Справочник.(неважно) Как построить запрос с фильтром на последнее установленное значение реквизита РеквП1 (Ид нужного элемента для ObjID я знаю). причем сильно желательно как-нито получить ID (я правильно понимаю?) реквизита РеквП1 без 1с++ (вопрос не идеологический но меркантильный - 1с++ стохастически валит у меня 1с-ину).

вопрос наверное по Т-СКЛ, даже не знаю. Справочник содержит реквизиты Дата_ (тип=Дата), флаг сортировки стоит, возможно по нескольку элементов с одинаковым значением этого реквизита. Как построить запрос, чтобы он вернул в обратном порядке следования элементы этого справочника с условием на Дата_ (до сих пор мне понятно) причем чтобы этот список был не более чем в N датах не в смысле диапазона, а в смысле количества значений реквизита Дата_ (а вот тут мне, простите лоха, нифига не понятно).
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite: периодика и не только
Ответ #1 - 26. Июля 2010 :: 05:01
Печать  
Ну, например, у клиентосов есть периодический реквизит Менеджер, тогда тип того (условие на вхождение в список на дату)

 
Код
Выбрать все
                | Select
                            |  Спр.id [Контрагент $Справочник.Контрагенты]
                 	    |From [Справочник.Контрагенты] Спр
                 	    |
   		            |Where Спр.isfolder =2 and
			    |
			    |(select
			    |    Substr(Периодика.value,1,9)
			    | from __1S_Const Периодика
			    | where Периодика.objid = Спр.id
			    | and Периодика.id = :ИсторияРеквизита.Контрагенты.Менеджер
			    | and ((Периодика.date < :ВыбДата) OR (Периодика.date = :ВыбДата))
				| order by Периодика.date desc limit 1
			    |) "+?(ТаблицаМФ.ПолучитьЗначение(НомСтроки,"ТипМФ")=1,""," NOT")+" IN (SELECT val FROM ВыбМенеджер)"; 

  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite: периодика и не только
Ответ #2 - 26. Июля 2010 :: 12:15
Печать  
Eprst писал(а) 26. Июля 2010 :: 05:01:
Ну, например ...

что есть ВыбМенеджер?..
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite: периодика и не только
Ответ #3 - 26. Июля 2010 :: 12:19
Печать  
Код
Выбрать все
				СписокМенеджеров = СоздатьОбъект("СписокЗначений");
				ов);
				база.УложитьОбъекты(СписокМенеджеров,"ВыбМенеджер",0,"ФизЛица"); 



Это просто уложенный список значений.. Просто пример взял с использованием типового МФ.
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite: периодика и не только
Ответ #4 - 26. Июля 2010 :: 12:28
Печать  
вопчем чота все равно ##па.
тест составлен для выбора ТМЦ, у которых есть хотя бы одна цена, у которой последнее значение валюты (периодический реквизит!) равно фВалюта (реквизит диалога):
Код
Выбрать все
//===
Функция ЭлСпрИдБД(тЭл)
	Перем тЗнач,тСЗ;
	тЗнач=ЗначениеВСтрокуВнутр(тЭл); тСЗ=СоздатьОбъект("СписокЗначений");
тСЗ.ИзСтрокиСРазделителями(Сред(Лев(тЗнач,СтрДлина(тЗнач)-1),2)); тЗнач=тСЗ.ПолучитьЗначение(тСЗ.РазмерСписка());
	Если СтрДлина(тЗнач)>13 Тогда тЗнач=Прав(тЗнач,13) КонецЕсли; тЗнач=_IdToStr(Число(Лев(тЗнач,10)))+Прав(тЗнач,3);
	Возврат(тЗнач);
КонецФункции //ЭлСпрИдБД
//===
Процедура Заполнить()
	Перем тТхт,тВалИдСЗ;
	Если фл1склайт=0 Тогда
		тТхт="["+тКаталог+"1sqlite.dll"+"] не подрублена на старте - нихрена не получится!..";
		Сообщить(тТхт,"!!!"); Предупреждение(тТхт,11); Возврат;
	КонецЕсли;
	тВалИдСЗ=СоздатьОбъект("СписокЗначений");
	тВалИдСЗ.ДобавитьЗначение(ЭлСпрИдБД(фВалюта));
	тТхт="
    |SELECT тСпрВладелец.id [тТМЦ :Справочник.ТМЦ]
	|FROM [Справочник.ТМЦ] as СпрТМЦ
	|WHERE тСпрВладелец.ismark <> '*'
	|AND тСпрВладелец.isfolder = 2
	|AND
	|(
	|	SELECT Substr(Периодика.value,1,9)
	|	FROM [1S_Const :Периодика]
    |	WHERE Периодика.objid = тСпрВладелец.id
	|	АND Периодика.id = :ИсторияРеквизита.Цены.Валюта
	|	ORDER BY Периодика.date DESC LIMIT 1
    |) IN тВалИдСЗ";
	тЗапрос=_1склБаза.НовыйЗапрос(); тЗапрос.Отладка(1);
	Попытка тЗапрос.ВыполнитьЗапрос(тТхт).Выгрузить(фТЗ);
	Исключение Сообщить(ОписаниеОшибки(),"!!!") КонецПопытки;
	Если фТЗ.КоличествоСтрок()>0 Тогда фТЗ.ТекущаяСтрока(1) КонецЕсли;
КонецПроцедуры //Заполнить
 


а вот:
Цитата:
SELECT тСпрВладелец.id [тТМЦ :Справочник.ТМЦ]
FROM [Справочник.ТМЦ] as СпрТМЦ
WHERE тСпрВладелец.ismark <> '*'
AND тСпрВладелец.isfolder = 2
AND
(
     SELECT Substr(Периодика.value,1,9)
     FROM [1S_Const :Периодика]
     WHERE Периодика.objid = тСпрВладелец.id
     АND Периодика.id = '  F1'
     ORDER BY Периодика.date DESC LIMIT 1
) IN тВалИдСЗ
near "АND": syntax error
!!! near "ÀND": syntax error

Нерешительный
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite: периодика и не только
Ответ #5 - 26. Июля 2010 :: 12:34
Печать  
>>>FROM [1S_Const :Периодика]

вот тут ошибка..
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite: периодика и не только
Ответ #6 - 26. Июля 2010 :: 12:39
Печать  
Код
Выбрать все
SELECT СпрТМЦ.id [тТМЦ :Справочник.ТМЦ]
FROM [Справочник.ТМЦ]  СпрТМЦ
WHERE СпрТМЦ.ismark <> '*'
AND СпрТМЦ.isfolder = 2
AND
(
     SELECT Substr(Периодика.value,1,9)
     FROM __1SConst  Периодика
     WHERE Периодика.objid = СпрТМЦ.id
     АND Периодика.id = '  F1'
     ORDER BY Периодика.date DESC LIMIT 1
) IN :СписокВалюты 



  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite: периодика и не только
Ответ #7 - 26. Июля 2010 :: 13:29
Печать  
!!! Ошибка подстановки текстового параметра тВалИдСЗ - Неизвестный параметр
(или что имеется ввиду под СписокВалюты?)

ЗЫ: и про "__1SConst". Это для СКЛ только так? (у меня ДБФ)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite: периодика и не только
Ответ #8 - 26. Июля 2010 :: 13:38
Печать  
Это для дбф..

база.УложитьОбъекты(фВалюта,"СписокВалюты
",0,"Валюты");

//Это если фВалюта - группа элементов или СЗ

если просто элемент, до достаточно
Запрос.Подставлять("СписокВалюты",фВалюта);
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite: периодика и не только
Ответ #9 - 26. Июля 2010 :: 13:45
Печать  
Блин, только заметил. Дались мне эти ТМЦ. По владельцу вытащу.
Но все равно, вот:
Код
Выбрать все
тТхт="
|SELECT СпрЦены.id [тЦена :Справочник.Цены]
|FROM [Справочник.Цены]  СпрЦены
|WHERE СпрЦены.ismark <> '*'
|AND СпрЦены.isfolder = 2
|AND
|(
|	SELECT Substr(Периодика.value,1,9)
|	FROM __1SConst  Периодика
|	WHERE Периодика.objid = СпрЦены.id
|	АND Периодика.id = :ИсторияРеквизита.Цены.Валюта
|	ORDER BY Периодика.date DESC LIMIT 1
|) IN :СписокВалют";
тЗапрос=_1склБаза.НовыйЗапрос(); тЗапрос.Подставлять("СписокВалют",фВалюта);
тЗапрос.Отладка(1);
Попытка тЗапрос.ВыполнитьЗапрос(тТхт).Выгрузить(фТЗ);
Исключение Сообщить(ОписаниеОшибки(),"!!!") КонецПопытки; 


результат:
Цитата:
SELECT СпрЦены.id [тЦена :Справочник.Цены]
FROM [Справочник.Цены]  СпрЦены
WHERE СпрЦены.ismark <> '*'
AND СпрЦены.isfolder = 2
AND
(
     SELECT Substr(Периодика.value,1,9)
     FROM __1SConst  Периодика
     WHERE Периодика.objid = СпрЦены.id
     АND Периодика.id = '  F1'
     ORDER BY Периодика.date DESC LIMIT 1
) IN '     3   '
!!! near "АND": syntax error
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite: периодика и не только
Ответ #10 - 26. Июля 2010 :: 13:48
Печать  
заместо in воткни =
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite: периодика и не только
Ответ #11 - 26. Июля 2010 :: 13:50
Печать  
Eprst писал(а) 26. Июля 2010 :: 13:48:
заместо in воткни =


Цитата:
SELECT СпрЦены.id [тЦена :Справочник.Цены]
FROM [Справочник.Цены]  СпрЦены
WHERE СпрЦены.ismark <> '*'
AND СпрЦены.isfolder = 2
AND
(
     SELECT Substr(Периодика.value,1,9)
     FROM __1SConst  Периодика
     WHERE Периодика.objid = СпрЦены.id
     АND Периодика.id = '  F1'
     ORDER BY Периодика.date DESC LIMIT 1
) = '     3   '
!!! near "АND": syntax error

Плачущий
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite: периодика и не только
Ответ #12 - 26. Июля 2010 :: 13:59
Печать  
У тебя А русская в условии на периодику

и табличка должна быть __1S_Const

ну и проверка на группу (isfolder) тоже видать не нужна, или в ценах есть группы ?
  
Наверх
 
IP записан
 
Cthulhu
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 04. Апреля 2010
Re: 1sqlite: периодика и не только
Ответ #13 - 26. Июля 2010 :: 14:37
Печать  
упс.
спасибо, в таком виде заработало!
и все-таки.
"FROM __1S_Const  Периодика"
"FROM [Справочник.Цены]  СпрЦены"
-- я так понимаю просто разные способы синтаксиса?.. если "да" - то как в более "новом" синтаксисе периодику указать?.. или все-таки "нет"?..
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite: периодика и не только
Ответ #14 - 26. Июля 2010 :: 14:43
Печать  
Вроде нет, это нужно у А.Орефкова поспрошать, в доке вроде тоже не было ничего нового по-поводу нового синтаксиса для подключения системных таблиц.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать