Имя: Пароль:
1C
1C 7.7
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) ну да, так сложилось. СофтПоинт стотыщ лет назад их внедрял и оставил инструмент для создангия новых и обовления старых