Имя: Пароль:
1C
1C 7.7
v7: Как в 1С++ закрывать временные таблицы?
,
0 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
2 DES
 
29.05.18
18:19
в чем смысл?
ругается
][SQL Server]В базе данных уже существует объект с именем "##VT".
3 Вафель
 
29.05.18
18:20
(2) глобальные временные таблицы
4 Franchiser
 
гуру
29.05.18
18:22
(0) пока соединение не закрыто можешь использовать #VT.
Если же ##VT то можно и в других сеансах использовать, пока первый сеанс не завершит соединение.
Но если SQL 2008 юзай WITH
5 DES
 
29.05.18
18:28
а как ее дропнуть то?
6 Sserj
 
29.05.18
18:30
drop table #VT
7 Franchiser
 
гуру
29.05.18
18:30
Drop
8 Franchiser
 
гуру
29.05.18
18:32
Дарю:
Функция ПолучитьТекстУдаленияВТSQL(ИмяВТ, Отладка)
ТекстУд = "
    |IF EXISTS (SELECT *
    |       FROM   tempdb..sysobjects
    |       WHERE  id = object_id('tempdb..#"+ИмяВТ+"'))
    |    DROP TABLE #"+ИмяВТ+"
    |";
    
    Если Отладка Тогда
    ТекстУд = стрзаменить(ТекстУд,"#","##");    
    КОнецЕсли;
    Возврат ТекстУд;
    
КонецФункции
9 DES
 
29.05.18
18:43
не понял куда подарок притулить
У меня
SELECT * into #vt from ...;
SELECT * from #vt;
DROP TABLE  #vt;
что не так?
точку с запятой тулить нада?
10 Franchiser
 
гуру
29.05.18
18:45
Да точку с запятой не нужно, убери.
Я делаю 3 Execute(), но можно и в одном EXECUTE()
11 Franchiser
 
гуру
29.05.18
18:46
Вообще я дроп делаю в начале, а не в конце
12 Franchiser
 
гуру
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_ИзТЗ(СписокМета);
13 Franchiser
 
гуру
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
15 DES
 
29.05.18
18:53
не пойму где помещение результата в ВТ ?
|IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
|ID=OBJECT_ID('tempdb..#TempTab') AND sysstat & 0xf = 3 )
16 Franchiser
 
гуру
29.05.18
18:56
(15) это код удаления существующей временно таблицы.
Помещение возьми свое: SELECT * into #vt from ...;
17 DES
 
29.05.18
19:03
а вот еще не работает
SELECT * into #vt from ...;
SELECT * from #vt;

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

а помещаю в ВТ и достаю след селектом
открываю ТЗ.Выбратьстроку()
пишет что
Значение не представляет агрегатный объект (ВыбратьСтроку)
18 Franchiser
 
гуру
29.05.18
19:31
Помещение делай методом Выполнить()
А select через Выполнитьинструкцию()
19 Franchiser
 
гуру
29.05.18
19:32
Покажи весь код
20 Franchiser
 
гуру
29.05.18
19:36
Возможно у тебя 2 recordset на выходе, поэтому в одной инструкции не работает. Можно использовать ещё Set nocount on и метод nextrecordset()
21 DES
 
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 [Ссылка $Справочник.ЛицевыеСчета]
и т.д.
тз = рс.ВыполнитьИнструкцию(ТекстЗапроса)
22 DES
 
29.05.18
20:14
Этот селект рабочий
а если делаю

SELECT * into #vt from ...;

SELECT * from #vt;

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

тексзапросаселектаизвт ="SELECT * from #vt";
27 DES
 
29.05.18
22:52
(26) нет, не в/из ВТ
а  в\из внешней ТаблицыЗначений.
28 Franchiser
 
гуру
29.05.18
23:21
(27) Ну так используй выполнитьsql_изтз() тогда
29 DES
 
29.05.18
23:43
(28) это понятно, а как будет выглядеть текст запроса из ТЗ ?
30 DES
 
29.05.18
23:50
и еще , я выбрал в #VT записи, одно поле которых есть ссылка на справочник, теперь в селекте из #VT на это поле ругается в WHERE
Meta name parser error: неизвестное метаимя или алиас "Льгота", а в результатах ТЗ.ВыбратьСтроку() есть колонка "Льгота"
Как правильно ссылаться?
31 Franchiser
 
гуру
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");
32 Franchiser
 
гуру
29.05.18
23:54
(30) ну значит нету Льготы в ВТ
33 Franchiser
 
гуру
30.05.18
00:06
(30) убери типизацию в запросе который помешаешь в #vt, иначе колонки будут иметь длинное название с этой типизацией, типизацию перенеси в select из #vt
34 DES
 
30.05.18
22:05
(33) получилось.
А работает такое?
select * from (select * from #vt)
35 Franchiser
 
гуру
30.05.18
22:09
Да, но это плохой тон
36 DES
 
31.05.18
09:36
Что то не хочет делать селест изселекта, ругается на синтаксис
37 ADirks
 
31.05.18
10:45
патамушта алиас для вложенного запроса указывать надо
у каждой таблички д.б. имя
38 DES
 
31.05.18
13:53
СПС,
а как сделать типа
SELECT Счет,
IIF(Счет=:ВыбрСчет1, Оборот, 0) AS Оплата,
IIF(Счет=:ВыбрСчет2, 0, Оборот) AS Начет
WHERE (Счет=:ВыбрСчет1) or (Счет=:ВыбрСчет2)
Если ВыбрСчет1/2 = это группа счетов, а счет в запросе это субсчет ?
39 DES
 
31.05.18
14:00
понимаю что можно через union
но это же будет медленнее чем 1 селест с условиями ?-
40 Salimbek
 
31.05.18
15:09
(39) Если так считаешь, то напиши функцию-условиесоздатель, куда скармливай свои группы,
типа

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

и

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

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

получить субсчет счета в виде строки ?
43 Salimbek
 
31.05.18
15:23
(42) Нет, конечно же, но можно
УложитьСписокОбъектов с обязательным указанием параметра ВидЭлементов
http://www.1cpp.ru/docum/icpp/html/ODBC.html#putobjectlist
и в результате во временной таблице будут все субсчета
44 DES
 
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-й колонке
45 Salimbek
 
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
46 DES
 
01.06.18
22:31
а как тут получить сам документ, а не его внутренний код ?

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

(Это из FROM $БИОстаткиОбороты.Основной(:НачДата, :КонДата ~)
60 Franchiser
 
гуру
02.06.18
19:57
(59) join _1sjourn j on j.date_time_iddoc = vt.date_time_iddoc
61 Franchiser
 
гуру
02.06.18
19:58
Ну или используй substring
62 Franchiser
 
гуру
02.06.18
20:01
Substring(позиция,9,9)
63 Franchiser
 
гуру
02.06.18
20:02
Накинь на время ещё, поэкспериментируй
64 DES
 
03.06.18
18:49
Спс, все взлетело.
65 DES
 
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";
66 DES
 
05.06.18
15:48
только вот беда не сходится сальдо входящее
при стандартном и $БИОстаткиОбороты.Основной(:НачДата, :КонДата ~)
методе?
При $БИОстаткиОбороты.Основной(:НачДата, :КонДата ~) вообще непонятно что за число получается.
67 Salimbek
 
06.06.18
11:39
(66) Там: http://www.1cpp.ru/forum/YaBB.pl?num=1181817217/all много чего написано и ошибки какие-то исправляли и проч. Но на такое никто не жаловался, попробуй автору вопрос задать. Только ему обязательно нужны будут подробности.