Вход | Регистрация
 
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 человек.
Рекламное место пустует