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