Имя: Пароль:
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 много чего написано и ошибки какие-то исправляли и проч. Но на такое никто не жаловался, попробуй автору вопрос задать. Только ему обязательно нужны будут подробности.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший