|
v7: 1с++ Срез последних | ☑ | ||
---|---|---|---|---|
0
palpetrovich
17.06.16
✎
17:50
|
Что-то типа:
select TOP 1 К.ИдентификаторСтрокиТаблицы from Константы К (nolock) where 1 = 1 AND Ид = 192 -- ЦенаПрих AND Дата < '20160101' Order by К.Дата Desc Только хотелось-бы для всех товаров... |
|||
1
Карупян
17.06.16
✎
17:52
|
делай этот запрос на месте поля
|
|||
2
palpetrovich
17.06.16
✎
17:53
|
(1) да я как-то так пробовал
select СП.Наименование ,К.ИдентификаторСтрокиТаблицы ,К.Дата ,(select TOP 1 КК.Значение from Константы КК (nolock) where 1 = 1 AND КК.Ид = 192 AND КК.Дата < '20160101' Order by КК.Дата Desc ) Значение from Константы К (nolock) inner join Справочник_Товары СП (nolock) on СП.ИдЭлемента = К.ИдОбъекта where 1 = 1 AND К.Ид = 192 но получаю не "срез", более одного значения получаю |
|||
3
palpetrovich
17.06.16
✎
17:59
|
поехал домойЮ может в дороге мысль стукнется ...но на Вас надежды больше :)
|
|||
4
Карупян
17.06.16
✎
18:06
|
конечно у тебя отбор по ид
|
|||
5
Rie
17.06.16
✎
18:14
|
Что-то было вроде$ПоследнееЗначение.Константа.Идентификатор(Объект,Дата)
|
|||
6
varelchik
17.06.16
✎
18:25
|
(5) В точку.
Учите матчасть (0) |
|||
7
palpetrovich
18.06.16
✎
15:27
|
(6) не, не в точку, мне собсвенно не само значение нужно, мне как результат нужна временная таблица "срез последних на дату"
|
|||
8
Mikeware
18.06.16
✎
16:11
|
(7) ты именно это и получишь...
|
|||
9
palpetrovich
18.06.16
✎
16:18
|
(8) да ладно
ТекстЗапроса = " |Select $ПоследнееЗначение.Товары.Цена(:Товар, :Дата)"; глЗапрос1срр.УстановитьТекстовыйПараметр("Товар", Тов); глЗапрос1срр.УстановитьТекстовыйПараметр("Дата", ВыбДата); Сообщить(""+ глЗапрос1срр.ВыполнитьСкалярный(ТекстЗапроса)); получил "14.00" а хотел, как минимум "ИдентификаторСтрокиТаблицы,Дата,Ид,ИдОбъекта" |
|||
10
palpetrovich
21.06.16
✎
09:44
|
в общем получилось впроде, но боюсь, через ж.пу :) ...покритикуйте если что
select СП.Наименование ,(select TOP 1 КК.ИдентификаторСтрокиТаблицы from Константы КК (nolock) where 1 = 1 AND КК.Ид = 192 AND КК.Дата < '20160101' AND КК.ИдОбъекта = СП.ИдЭлемента Order by КК.Дата Desc ) ИдентификаторСтрокиТаблицы from Справочник_Товары СП (nolock) where 1 = 1 AND (select TOP 1 КК.ИдентификаторСтрокиТаблицы from Константы КК (nolock) where 1 = 1 AND КК.Ид = 192 AND КК.Дата < '20160101' AND КК.ИдОбъекта = СП.ИдЭлемента Order by КК.Дата Desc ) IS NOT NULL |
|||
11
King-SD
21.06.16
✎
09:47
|
Прошу прощения, что пишу сюда (Ибо больше никуда не могу написать),, не могу создать тему, выскакивает ошибка - ОШИБКА: Ошибка Field 'last_modified' doesn't have a default value при добавлении новой темы!
Не можете подсказать в чём проблема? Пробовал не на одном компьютере |
|||
12
Ёпрст
21.06.16
✎
09:51
|
(9)
>>>а хотел, как минимум "ИдентификаторСтрокиТаблицы,Дата,Ид,ИдОбъекта" И зачем это ? Если ты всё это и так знаешь - ибо передаешь в коррелированный подзапрос ? |
|||
13
Ёпрст
21.06.16
✎
09:52
|
нуи rowid знать, вообще не понятно для чего
|
|||
14
palpetrovich
21.06.16
✎
09:59
|
(12) Мне нужно получить срезПоследних на дату и закинуть все это во временную таблицу.
Соственно для чего - удалить все до этого среза. Думаю в ВТ_ЗначенийКоторыеОтсаются должны быть "ИдентификаторСтрокиТаблицы,Дата,Ид,ИдОбъекта" |
|||
15
palpetrovich
21.06.16
✎
10:01
|
+(14) хотя, моэет достаточно ИдентификаторСтрокиТаблицы
Если далее удалять с условиями из (10) + условие на исключение из удаляемых по ИдентификаторСтрокиТаблицы ВТ |
|||
16
FN
21.06.16
✎
10:18
|
(14) нашел в закромах...
Удаляет все до указанной даты, оставляя только одно, самое свежее значение. Процедура ЗачиститьИсторию(Параметры) рс=СоздатьОбъект("ODBCREcordSet"); ДатаСвертки=ВыбДата; ДатаСвертки=СтрЗаменить(Формат(ВыбДата,"ДГГГГММДД"),".",""); ВсегоПодлежитУдалению=0; ЭлементыДляРегистрации=СоздатьОбъект("СписокЗначений"); АйдиРеквизита=Мета.ИДОбъекта(Параметры.реквизит); //Сообщить((АйдиРеквизита));; времТЗ=СоздатьОбъект("ТаблицаЗначений"); рс.ВыполнитьИнструкцию("Select count(*), objid [Объект], objid [ОбъектСсылка $Справочник."+Параметры.Справочник.Идентификатор+"] from _1SConst (nolock) where id="+АйдиРеквизита+" and date<'"+ДатаСвертки+"' group by objid having count(*)>1",времТЗ); времТЗ.ВыбратьСтроки(); сч=1;Всего=времТЗ.КоличествоСтрок(); Пока времТЗ.ПолучитьСтроку() = 1 Цикл Состояние(""+АйдиРеквизита+"-"+сч+"/"+Всего); сч=сч+1; ПоследнееСохраняемоеЗначение=рс.ВыполнитьСкалярный(" |Select top 1 date from _1SConst (nolock) |where |id="+АйдиРеквизита+" |and objID='"+времТЗ.Объект+"' |and date<'"+ДатаСвертки+"' |order by date desc |"); ПоследнееСохраняемоеЗначение=Формат(ПоследнееСохраняемоеЗначение,"ДГГГГММДД"); Если Удалять<>1 Тогда рез=рс.ВыполнитьСкалярный(" |Select count(*) from _1SConst (nolock) |where |id="+АйдиРеквизита+" |and objID='"+времТЗ.Объект+"' |and date<'"+ПоследнееСохраняемоеЗначение+"' | |"); ВсегоПодлежитУдалению=ВсегоПодлежитУдалению+Рез; Иначе рез= рс.ВыполнитьСкалярный("; |Delete from _1SConst |where |id="+АйдиРеквизита+" |and objID='"+времТЗ.Объект+"' |and date<'"+ПоследнееСохраняемоеЗначение+"' | |"); ВсегоПодлежитУдалению=ВсегоПодлежитУдалению+Рез; Если Рез<>0 Тогда ЭлементыДляРегистрации.ДобавитьЗначение(времТЗ.ОбъектСсылка); КонецЕсли; КонецЕсли; КонецЦикла; Если ЭлементыДляРегистрации.РазмерСписка()<>0 Тогда спр=СоздатьОбъект("Справочник."+Параметры.Справочник.Идентификатор); для гг=1 по ЭлементыДляРегистрации.РазмерСписка() Цикл Состояние("Регистрация изменений"); Если спр.найтиЭлемент(ЭлементыДляРегистрации.ПолучитьЗначение(гг))=1 Тогда Попытка спр.Записать(); ЗаписьЖурналаРегистрации("До даты "+ВыбДата,"Периодика","Очистка периодики",спр.ТекущийЭлемент()); Исключение КонецПопытки; КонецЕсли; КонецЦикла; КонецЕсли; Сообщить(Параметры.Реквизит.ПолныйИдентификатор()+": "+ВсегоПодлежитУдалению); КонецПроцедуры // ЗачиститьИсторию(Параметры) |
|||
17
FN
21.06.16
✎
10:20
|
Параметры - это ТЗ
... ТЗРеквизитов.НоваяКолонка("Справочник",,,,,24); - Метаданные ТЗРеквизитов.НоваяКолонка("Реквизит",,,,,24); - Строка ... |
|||
18
palpetrovich
21.06.16
✎
10:26
|
(16) Спасибо конечно, но запрос в цикле - как-то не комильфо :)
|
|||
19
Ёпрст
21.06.16
✎
10:31
|
(14) для этого
1) не нужна временная таблица 2)не нужна rowid 3) нужен просто запрос на delete по условию. Усё. |
|||
20
palpetrovich
21.06.16
✎
10:36
|
(19) просто запрос мне пока не под силу
вот что получилось и это работает ...но глаз режет :) if object_id(N'tempdb..#SrezNaDaty', N'U') is not null drop table #SrezNaDaty select top 100 (select TOP 1 КК.ИдентификаторСтрокиТаблицы from Константы КК (nolock) where 1 = 1 AND КК.Ид = 192 -- ЦенаПрих AND КК.Дата < '20160101' AND КК.ИдОбъекта = СП.ИдЭлемента Order by КК.Дата Desc ) ИдентификаторСтрокиТаблицы into #SrezNaDaty from Справочник_Товары СП (nolock) where 1 = 1 AND (select TOP 1 КК.ИдентификаторСтрокиТаблицы from Константы КК (nolock) where 1 = 1 AND КК.Ид = 192 AND КК.Дата < '20160101' AND КК.ИдОбъекта = СП.ИдЭлемента Order by КК.Дата Desc ) IS NOT NULL delete from Константы where ИдентификаторСтрокиТаблицы in (select КК.ИдентификаторСтрокиТаблицы from Константы КК (nolock) where 1 = 1 AND КК.Ид = 192 AND КК.Дата < '20160101' ) AND ИдентификаторСтрокиТаблицы not in (select Srez.ИдентификаторСтрокиТаблицы from #SrezNaDaty Srez) if object_id(N'tempdb..#SrezNaDaty', N'U') is not null drop table #SrezNaDaty |
|||
21
Ёпрст
21.06.16
✎
10:39
|
нахрена вот так писать ?
>>> КК.Ид = 192 ? да и выкини классы, пиши по-русски, используя обычный метапарсер. Намного читаемый текст запроса будет. + почему топ-100 ? остальное не надоть ? |
|||
22
FN
21.06.16
✎
10:45
|
(18) согласен.
Но тут все просто - время работы обработки в данном случае не критично, поскольку операция разовая. А вот время работы программиста стоит денег. |
|||
23
palpetrovich
21.06.16
✎
10:45
|
(21) КК.Ид = 192 - это для отладки, там будет передаваемый ы хранимую процедуру параметр КК.Ид = @ИдПериодики
топ-100 - тоже для отладки "выкини классы" - если речь про "ИдентификаторСтрокиТаблицы" и т.д., то это не классы, это представления (так называемые вьюхи). У нас в конторе все через них пишется |
|||
24
Ёпрст
21.06.16
✎
10:47
|
(23) и нафига вьюхи использовать ? Для каждой базы свои вьюхи лепите ?
|
|||
25
palpetrovich
21.06.16
✎
10:50
|
(24) ну да, так сложилось. СофтПоинт стотыщ лет назад их внедрял и оставил инструмент для создангия новых и обовления старых
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |