Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Как в 1С++ закрывать временные таблицы?

v7: Как в 1С++ закрывать временные таблицы?
Я
   DES
 
29.05.18 - 18:01
Select * into #VT from PT;
Select * from #VT;


delete #VT; ???
И сколько хранится #VT ?
можно ли в другом запросе получить из #VT данные?
 
 
   Вафель
 
1 - 29.05.18 - 18:10
делай
into ##VT
   DES
 
2 - 29.05.18 - 18:19
в чем смысл?
ругается
][SQL Server]В базе данных уже существует объект с именем "##VT".
   Вафель
 
3 - 29.05.18 - 18:20
(2) глобальные временные таблицы
   Franchiser
 
4 - 29.05.18 - 18:22
(0) пока соединение не закрыто можешь использовать #VT.
Если же ##VT то можно и в других сеансах использовать, пока первый сеанс не завершит соединение.
Но если SQL 2008 юзай WITH
   DES
 
5 - 29.05.18 - 18:28
а как ее дропнуть то?
   Sserj
 
6 - 29.05.18 - 18:30
drop table #VT
   Franchiser
 
7 - 29.05.18 - 18:30
Drop
   Franchiser
 
8 - 29.05.18 - 18:32
Дарю:
Функция ПолучитьТекстУдаленияВТSQL(ИмяВТ, Отладка)
ТекстУд = "
    |IF EXISTS (SELECT *
    |       FROM   tempdb..sysobjects
    |       WHERE  id = object_id('tempdb..#"+ИмяВТ+"'))
    |    DROP TABLE #"+ИмяВТ+"
    |";
    
    Если Отладка Тогда
    ТекстУд = стрзаменить(ТекстУд,"#","##");    
    КОнецЕсли;
    Возврат ТекстУд;
    
КонецФункции
   DES
 
9 - 29.05.18 - 18:43
не понял куда подарок притулить
У меня 
SELECT * into #vt from ...;

SELECT * from #vt;

DROP TABLE  #vt;

что не так?
точку с запятой тулить нада?
   Franchiser
 
10 - 29.05.18 - 18:45
Да точку с запятой не нужно, убери.
Я делаю 3 Execute(), но можно и в одном EXECUTE()
 
 Рекламное место пустует
   Franchiser
 
11 - 29.05.18 - 18:46
Вообще я дроп делаю в начале, а не в конце
   Franchiser
 
12 - 29.05.18 - 18:47
См. этот пример тут http://www.script-coding.com/Direct_queries.html:
лЗапрос = СоздатьОбъект("ODBCRecordSet"); 
лЗапрос.Выполнить("
|IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE 
|ID=OBJECT_ID('tempdb..#TempTab') AND sysstat & 0xf = 3 )
|DROP TABLE #TempTab");

лЗапрос.Выполнить("
|CREATE TABLE #TempTab (ID INT, PRIMARY KEY CLUSTERED (ID) )");
лЗапрос.Подготовить("Insert into #TempTab Values (?)");
лЗапрос.ВыполнитьSQL_ИзТЗ(СписокМета);
   Franchiser
 
13 - 29.05.18 - 18:49
Если дропа не будет, то при повторном выполнении твоего кода "SELECT * into #vt from" при активном соединении будет ошибка. А так можно ВТ и не чистить.
   МихаилМ
 
14 - 29.05.18 - 18:51
if object_id('tempd..#table') is not null drop table #table
   DES
 
15 - 29.05.18 - 18:53
не пойму где помещение результата в ВТ ?
|IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
|ID=OBJECT_ID('tempdb..#TempTab') AND sysstat & 0xf = 3 )
   Franchiser
 
16 - 29.05.18 - 18:56
(15) это код удаления существующей временно таблицы.
Помещение возьми свое: SELECT * into #vt from ...;
   DES
 
17 - 29.05.18 - 19:03
а вот еще не работает
SELECT * into #vt from ...;

SELECT * from #vt;


без помещения в vt - селект работает, 

а помещаю в ВТ и достаю след селектом 
открываю ТЗ.Выбратьстроку()
пишет что 
Значение не представляет агрегатный объект (ВыбратьСтроку)
   Franchiser
 
18 - 29.05.18 - 19:31
Помещение делай методом Выполнить()
А select через Выполнитьинструкцию()
   Franchiser
 
19 - 29.05.18 - 19:32
Покажи весь код
   Franchiser
 
20 - 29.05.18 - 19:36
Возможно у тебя 2 recordset на выходе, поэтому в одной инструкции не работает. Можно использовать ещё Set nocount on и метод nextrecordset()
   DES
 
21 - 29.05.18 - 19:55
рс = СоздатьОбъект("ODBCRecordset");
рс.ВыполнитьИнструкцию("IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE ID=OBJECT_ID('tempdb..#VT') AND sysstat & 0xf = 3 )

        | DROP TABLE #VT");
//Данный фрагмент построен конструктором.

//При повторном использовании конструктора внесенные вручную изменения будут потеряны!!!
ТекстЗапроса = "-- qryMaker:Отчет1.2018.05.29.08.54.19
|SELECT ЛицевыеСчета.ID [Ссылка $Справочник.ЛицевыеСчета]
и т.д.
тз = рс.ВыполнитьИнструкцию(ТекстЗапроса)
   DES
 
22 - 29.05.18 - 20:14
Этот селект рабочий
а если делаю

SELECT * into #vt from ...;


SELECT * from #vt;


ВыполнитьИструкцию - тогда ошибка.
   DES
 
23 - 29.05.18 - 20:19
Все, заработало.
А еще как можно выполнить селект из ТЗ полученной селектом?
   Franchiser
 
24 - 29.05.18 - 22:19
Ну, говорю же.
Рс.выполнить(текстзапросапомещениввт);
Из = РС.выполнитьинструкцию(тексзапросаселектаизвт);
   Franchiser
 
25 - 29.05.18 - 22:21
Если ты рекордсет не получаешь или он не нужен не пиши выполнить инструкцию(), пиши выполнить(), в т.ч. в первом случае
   Franchiser
 
26 - 29.05.18 - 22:25
текстзапросапомещениввт = "SELECT * into #vt from ...";


тексзапросаселектаизвт ="SELECT * from #vt";
   DES
 
27 - 29.05.18 - 22:52
(26) нет, не в/из ВТ
а  в\из внешней ТаблицыЗначений.
   Franchiser
 
28 - 29.05.18 - 23:21
(27) Ну так используй выполнитьsql_изтз() тогда
   DES
 
29 - 29.05.18 - 23:43
(28) это понятно, а как будет выглядеть текст запроса из ТЗ ?
   DES
 
30 - 29.05.18 - 23:50
и еще , я выбрал в #VT записи, одно поле которых есть ссылка на справочник, теперь в селекте из #VT на это поле ругается в WHERE
Meta name parser error: неизвестное метаимя или алиас "Льгота", а в результатах ТЗ.ВыбратьСтроку() есть колонка "Льгота"
Как правильно ссылаться?
   Franchiser
 
31 - 29.05.18 - 23:53
Как-то так:
лСКЛ = СоздатьОбъект("ODBCRecordSet");
лСКЛ.Выполнить("CREATE TABLE #test_table (А Char(23), Б Char(23), В Char(23))");

лСКЛ.Подготовить("INSERT INTO test_table (А,Б,В) VALUES (?,?,?)");
лСКЛ.ВыполнитьSQL_ИзТЗ(тз);
Тз = Лскл.выполнитьинструкцию("select * from #testtable");
   Franchiser
 
32 - 29.05.18 - 23:54
(30) ну значит нету Льготы в ВТ
   Franchiser
 
33 - 30.05.18 - 00:06
(30) убери типизацию в запросе который помешаешь в #vt, иначе колонки будут иметь длинное название с этой типизацией, типизацию перенеси в select из #vt
 
 
   DES
 
34 - 30.05.18 - 22:05
(33) получилось.
А работает такое?
select * from (select * from #vt)
   Franchiser
 
35 - 30.05.18 - 22:09
Да, но это плохой тон
   DES
 
36 - 31.05.18 - 09:36
Что то не хочет делать селест изселекта, ругается на синтаксис
   ADirks
 
37 - 31.05.18 - 10:45
патамушта алиас для вложенного запроса указывать надо
у каждой таблички д.б. имя
   DES
 
38 - 31.05.18 - 13:53
СПС,
а как сделать типа
SELECT Счет,
IIF(Счет=:ВыбрСчет1, Оборот, 0) AS Оплата,
IIF(Счет=:ВыбрСчет2, 0, Оборот) AS Начет
WHERE (Счет=:ВыбрСчет1) or (Счет=:ВыбрСчет2)
Если ВыбрСчет1/2 = это группа счетов, а счет в запросе это субсчет ?
   DES
 
39 - 31.05.18 - 14:00
понимаю что можно через union
но это же будет медленнее чем 1 селест с условиями ?-
   Salimbek
 
40 - 31.05.18 - 15:09
(39) Если так считаешь, то напиши функцию-условиесоздатель, куда скармливай свои группы,
типа

SELECT Счет,
"+УсловиеПоГруппеСчетов(ГруппаСчета,0)+" AS Оплата,
"+УсловиеПоГруппеСчетов(ГруппаСчета,1)+" AS Начет,

и

Функция УсловиеПоГруппеСчетов(ГруппаСчетов, положение)
мета=СоздатьОбъект("MetaDataWork");
ТекстУсловия = "№Замена№";
Если Положение=0 Тогда
 ТекстЗамены="IIF(Счет=:ВыбрСчет1, №Замена№, 0)";
Иначе
 ТекстЗамены="IIF(Счет=:ВыбрСчет1, 0, №Замена№)";
КонецЕсли
Для Счет из ГруппаСчетов
 СтрЗаменить(ТекстУсловия,"№Замена",ТекстЗамены);
 мета.УстановитьТекстовыйПараметр("ВыбрСчет1",Счет);
 ТекстУсловия=мета.ОбрМетаСКЛ(ТекстУсловия);
КонецЦикла
СтрЗаменить(ТекстУсловия,"№Замена","Оборот");
Возврат ТекстУсловия;

Хотя я бы сделал два union-а чем городить этакое
   Salimbek
 
41 - 31.05.18 - 15:10
СтрЗаменить(ТекстУсловия,"№Замена№", - конечно же
   DES
 
42 - 31.05.18 - 15:16
Фигасе!
А можно в 
select Счет.КодСубсчета() AS субсчет

получить субсчет счета в виде строки ?
   Salimbek
 
43 - 31.05.18 - 15:23
(42) Нет, конечно же, но можно 
УложитьСписокОбъектов с обязательным указанием параметра ВидЭлементов
http://www.1cpp.ru/docum/icpp/html/ODBC.html#putobjectlist
и в результате во временной таблице будут все субсчета
   DES
 
44 - 31.05.18 - 15:39
Не то?
Мне нужно задать в отборе группу счета 66 и 64 
а select отберет записи с субсчетами, так мне нужно в колонке получить кодсубсчета этих субсчетов
типа результитрующая тз
66.1 1 555
66.1 1 444
66.2 2 888
64.1 1 999

а  потом суммировать по 2-й колонке
   Salimbek
 
45 - 01.06.18 - 10:29
(44) Можно пойти и другим путем:
1) Перебираем все субсчета, переданных групп и формируем ТЗ
Счет Код
66.1 1
66.2 2
64.1 1

2) Укладываешь собранную ТЗ во временную таблицу
3) Формируешь запрос к базе с join-ом по этой таблице

Укладывать ТЗ можно этой процедурой:
http://www.1cpp.ru/forum/YaBB.pl?num=1170322440/7#7
   DES
 
46 - 01.06.18 - 22:31
а как тут получить сам документ, а не его внутренний код ?

 "SELECT Документ
    |FROM $БИДвиженияССубконто.Основной(,,
    |INNER JOIN $БИ.Субконто БИС ON (ПозицияДокумента = БИС.ПозицияДокумента)
    |AND (НомерПроводки = БИС.НомерПроводки)
    |AND (НомерКорреспонденции = БИС.НомерКорреспонденции)
    |AND (БИС.ПозицияДокумента Between :НачДата AND :КонДата ~)
    |AND (Активность = '')
    |AND (СубконтоДт1_вид = $ВидСубконто.ЛицевыеСчета)
    |AND (СубконтоДт1 = :ВыбрСубк)
    |) БИ
    |ORDER BY ПозицияДокумента";
   Попытка1С
 
47 - 01.06.18 - 22:36
поле iddoc
типизация [ссылка $Документ.ТвойДокумент]
   DES
 
48 - 01.06.18 - 22:42
А я не знаю какой мой документ, знаю что документ
   DES
 
49 - 01.06.18 - 22:46
(45)
там в примере потеря данных
    Для Тек=1 По ТЗ.КоличествоКолонок() Цикл
>>>>>> тут        ка);
        Если (ПустаяСтрока(Колонки)=0)И(Найти(Колонки,Идентификатор)=0) Тогда
 
 Рекламное место пустует
   DES
 
50 - 01.06.18 - 23:16
а как из позицияДокумента выдернуть сам документ ?
   youalex
 
51 - 01.06.18 - 23:26
(48) В журнале посмотри, номер/дата/проведен/общий рек - все там.
   Franchiser
 
52 - 02.06.18 - 09:12
(48) тогда 2 поля
Док и Вид_док
   Franchiser
 
53 - 02.06.18 - 09:15
Точнее Док и Док_вид
   Salimbek
 
54 - 02.06.18 - 09:20
(52) Я уточню, надо поле Док (которое Char(9)) и поле с видом документа (Char(4)), с именем, как у первого поля и с допиской _вид - чувствительно к регистру! Т.е. Док_вид. Если написать Док_Вид - не сработает.
   Salimbek
 
55 - 02.06.18 - 09:23
Т.е. в выборке должно это выглядеть так:
Select iddoc [Док $Документ], iddocdef Док_вид, ... from ...
   Franchiser
 
56 - 02.06.18 - 09:24
(50) проще связаться с _1sjourn и взять iddoc
   Salimbek
 
57 - 02.06.18 - 09:24
(49) Форум как-то ломался, видимо при восстановлении текст повредился...
   Franchiser
 
58 - 02.06.18 - 09:25
(54) см (55)
   DES
 
59 - 02.06.18 - 19:39
(55) к  сожалению у меня в #VT есть колонки только
ПозицияДокумента и ВидДокумента.

(Это из FROM $БИОстаткиОбороты.Основной(:НачДата, :КонДата ~)
   Franchiser
 
60 - 02.06.18 - 19:57
(59) join _1sjourn j on j.date_time_iddoc = vt.date_time_iddoc
   Franchiser
 
61 - 02.06.18 - 19:58
Ну или используй substring
   Franchiser
 
62 - 02.06.18 - 20:01
Substring(позиция,9,9)
   Franchiser
 
63 - 02.06.18 - 20:02
Накинь на время ещё, поэкспериментируй
   DES
 
64 - 03.06.18 - 18:49
Спс, все взлетело.
   DES
 
65 - 03.06.18 - 18:54
"SELECT Счет
        |, ВидДокумента
        |, ПозицияДокумента
        |, СуммаНачальныйОстаток
        |, СуммаОборот
        |, СуммаКонечныйОстаток
        |    INTO #VTB
        |    FROM $БИОстаткиОбороты.Основной(:НачДата, :КонДата ~
        |            , Документ
        |            , ДвиженияИГраницыПериода
        |            ,
        |            , (Счет = :ВыбрСч641) OR (Счет = :ВыбрСч643) OR (Счет = :ВыбрСч661) OR (Счет = :ВыбрСч663)
        |            , 
        |            , Субконто1 = :ВыбрСубк
        |    ) БИ1     
        |    INNER JOIN $Справочник.ЛицевыеСчета AS ЛС (NOLOCK) ON Субконто1 = ЛС.ID
        |";

"SELECT RIGHT(ПозицияДокумента, 9) [Док $Документ]
        |,        1 AS СубСч
        |,        СуммаНачальныйОстаток AS НачСальдо
        |,        СуммаОборот AS Оборот
        |,        СуммаКонечныйОстаток AS КонСальдо
        |,        0 AS АвансНачСальдо
        |,        0 AS АвансОборот
        |,        0 AS АвансКонСальдо
        |,        ВидДокумента Док_вид
        |    FROM #VTB 
        |    WHERE Счет = :ВыбрСч661";
   DES
 
66 - 05.06.18 - 15:48
только вот беда не сходится сальдо входящее
при стандартном и $БИОстаткиОбороты.Основной(:НачДата, :КонДата ~)
методе?
При $БИОстаткиОбороты.Основной(:НачДата, :КонДата ~) вообще непонятно что за число получается.
   Salimbek
 
67 - 06.06.18 - 11:39
(66) Там: http://www.1cpp.ru/forum/YaBB.pl?num=1181817217/all много чего написано и ошибки какие-то исправляли и проч. Но на такое никто не жаловался, попробуй автору вопрос задать. Только ему обязательно нужны будут подробности.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует