Имя: Пароль:
1C
 
Не выполняется прямой запрос
0 DCKiller
 
26.04.10
09:28
База ДБФ

Нужно выполнить, собственно, вот такой прямой запрос:

SELECT
   Док1.IDDoc As ID,
   "Авансовый отчет" As Descr,
   "АвансовыйОтчет" As Name
FROM
   DH13053 As Док1
UNION ALL
SELECT
   Док2.IDDoc As ID,
   "Бухгалтерская справка" As Descr,
   "БухгалтерскаяСправка" As Name
FROM
   DH40597 As Док2
UNION ALL

<...>

SELECT
   Док86.IDDoc As ID,
   "Передача заявлений ДСВ-1 в ПФР" As Descr,
   "ПередачаЗаявленийДСВ1" As Name
FROM
   DH56050 As Док86

Ругается
Результат = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
{C:\ОБЩАЯ\ОТЧЕТЫ\ЖУРНАЛДОК.ERT(170)}: FAILED! ICommandText::Execute(): Compiled code for this line is too long.

Что делать?
1 SnarkHunter
 
26.04.10
09:31
Замени " на '
2 DCKiller
 
26.04.10
09:33
(1) Не помогает :(
Если что, еще раз повторю: база ДБФ :)
3 SnarkHunter
 
26.04.10
09:36
Да какая разница...

У тебя 86 юнионов что ли?
4 1Сергей
 
26.04.10
09:36
('Авансовый отчет') As Descr,
   ('АвансовыйОтчет') As Name
5 DCKiller
 
26.04.10
09:36
(3) так точно
6 1Сергей
 
26.04.10
09:37
(5) Compiled code for this line is too long
7 DCKiller
 
26.04.10
09:37
(4) тоже не катит
8 DCKiller
 
26.04.10
09:38
(6) Я знаю, но мне надо выполнить именно такой запрос
9 ДенисЧ
 
26.04.10
09:38
(8) А в Австралию на поезде съездить не надо?
10 1Сергей
 
26.04.10
09:39
(8) я сам сталкивался с таким. Так и не смог обойти ограничение. Проще разбить на несколько запросов
11 DCKiller
 
26.04.10
09:39
(9) Не надо. Альтернатива?
12 ДенисЧ
 
26.04.10
09:39
(11) Альтернатива - утки
13 SnarkHunter
 
26.04.10
09:40
(5)Ну тогда тебе сюда

http://support.microsoft.com/kb/111991

Вкратце: скомпилированная строка кода в VFP не может превышать 1024 символа... Твои 86 юнионов драйвер просто не переваривает...
14 Ёпрст
 
гуру
26.04.10
09:49
(0)
А нафига столько юнионов ?
Не проще 1 табличку 1sjourn посмотреть ? И вытащить с неё IDDOC и IDDOCDEF ?

Нафига все шапки доков цеплять?
15 DCKiller
 
26.04.10
09:49
(10) Если что, результаты этого запроса потом планируется соединить с другой таблицей, т.е. он планируется как вложенный
16 DCKiller
 
26.04.10
09:52
(14) С этой таблицей и планируется соединить результаты вложенного запроса. По IDDoc. Чтобы в окончательном запросе из вложенного подцепить представление и вид документа
17 SnarkHunter
 
26.04.10
09:52
(15)Ну тем более не взлетит...
18 Ёпрст
 
гуру
26.04.10
09:59
(16) Для этой цели достаточно посмотреть 1 табличку 1sjourn - в ней и так всё это есть.
19 DCKiller
 
26.04.10
10:00
(18) Там есть вид документа в 36-ричном виде. А мне нужно получить в результат запроса представление вида данного документа. Может, ты скажешь, где оно там?
20 SnarkHunter
 
26.04.10
10:02
Его там нет... Сделай временную таблицу и сохрани в нее представления, потом используй в запросах...
21 DCKiller
 
26.04.10
10:05
(20) Итак мы снова возвращаемся к тому, что было поднято пару дней назад :)
Я уже думал над этим, вот только тогда мне никто не смог внятно описать, как создать в базе ДБФ временную таблицу и потом подключиться к ней в другом запросе.
22 Ёпрст
 
гуру
26.04.10
10:09
(19)
Ну так сделай

Select
 ICASE(Жур.IDDOCDEF = $ВидДокумента.Реализация,'Реализация',
       Жур.IDDOCDEF = $ВидДокумента.ПоступлениеТМЦ,'ПоступлениеТМЦ','хз что за документ')
From 1sjourn Жур
23 Ёпрст
 
гуру
26.04.10
10:09
(21) да запросто..
24 Ёпрст
 
гуру
26.04.10
10:11
25 SnarkHunter
 
26.04.10
10:11
(21)Злобный Йожег? Я не узнаю вас в гриме...
26 Boroda
 
26.04.10
10:15
Может что-то типа этого попробовать...
Для й = 1 По  Метаданные.Документ() Цикл
  Идентификатор = Метаданные.Документ(й).Идентификатор;  
  Запрос.Выполнить("
  |DELETE FROM $Документ."+Идентификатор+"
  |WHERE  IDDOC NOT IN (SELECT IDDOC FROM _1SJOURN )
  |");
27 Ёпрст
 
гуру
26.04.10
10:17
(26) ну и чем это поможет автору ?
28 Salimbek
 
26.04.10
10:19
Х.З. Я бы делал через SQLite, а там легко выполняется create table
29 DCKiller
 
26.04.10
10:21
(28) Можно образец кода, как бы это выглядело на 1sqlite? Только со всеми подробностями, пож-ста...
30 DCKiller
 
26.04.10
10:28
(24) По примеру в ссылке: создать временную таблицу удалось. А вот подключиться к ней после создания - пока нет. Но, в любом случае, прогресс налицо :) Хотелось бы все-таки суметь подключиться к ней.
31 Ёпрст
 
гуру
26.04.10
10:31
(30) а что там именно  не получилось то ?
Могу пример кинуть, если надо.
32 DCKiller
 
26.04.10
10:35
(30) Короче, переменная ТекстЗапроса содержит текст запроса, помещаемого во врем. таб.:

ТекстЗапроса = "SELECT
   |    Док1.IDDoc As ID,
   |    ""Авансовый отчет"" As Descr,
   |    ""АвансовыйОтчет"" As Name
   |INTO CURSOR TmpTable READWRITE
   |FROM
   |    DH13053 As Док1";
Результат = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
//до этого места все без проблем
//а вот на эту строчку ругается:
Результат = Запрос.ВыполнитьИнструкцию("SELECT * FROM TmpTable");

Результат = Запрос.ВыполнитьИнструкцию("SELECT * FROM TmpTable");
{C:\ОБЩАЯ\ОТЧЕТЫ\ЖУРНАЛДОК.ERT(177)}: FAILED! ICommandText::Execute(): File 'tmptable.dbf' does not exist.
33 DCKiller
 
26.04.10
10:45
ап
34 Ёпрст
 
гуру
26.04.10
10:49
(32) да блин .. читай (1)
35 DCKiller
 
26.04.10
10:51
(34) НУ НЕ РАБОТАЕТ!!!
36 Ёпрст
 
гуру
26.04.10
10:52
И это.. Нафига ты упорно пытаешься обратиться к табличке Шапки документа ?????????????

Для вытаскивания вида, достаточно (22)..
Если уж лень делать icase - делается временная табличка, в которую руками заталкивается видДокумента.. её потом и пользуешь в другом запросе.
37 Ёпрст
 
гуру
26.04.10
10:53
(35) ПИШИ БЕЗ ОШИБОК!
38 DCKiller
 
26.04.10
10:53
(36) ты читать умеешь? Я тебе объясняю, что ВТ создается, но потом Я НЕ МОГУ К НЕЙ ПОДКЛЮЧИТЬСЯ. Запрос ее НЕ ВИДИТ. Вот в чем сейчас проблема!
39 DCKiller
 
26.04.10
11:01
еще раз ап
40 Ёпрст
 
гуру
26.04.10
11:04
На вот, пример
http://webfile.ru/4450487
41 Кириллка
 
26.04.10
11:13
(32)я конечно уже не помню, но, вроде, бы в "INTO CURSOR TmpTable READWRITE" лишнее про курсор. Вроде, достаточно "INTO TmpTable", но такую таблицу временной можно назвать только в кавычках :)
42 Salimbek
 
26.04.10
11:15
(29)
ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
база = СоздатьОбъект("SQLiteBase");
база.Открыть(":memory:");
запрос = база.НовыйЗапрос();
запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF");
запрос.ВыполнитьЗапрос("create table tmpTable(...)");
запрос.ВыполнитьЗапрос("insert ... into tmpTable");
запрос.ВыполнитьЗапрос("create virtual table Остатки using dbeng(Регистр.ОстаткиТоваров)");
запрос.ВыполнитьЗапрос("select ... from Остатки left join tmpTable");
-----------
P.S. ИМХО, ты либо что-то не договариваешь, либо просто не понимаешь, что делаешь.
Например я бы написал при помощи OLEDB вместо (0) так:
select top 10 iddoc as ID, iddocdef as [Вид $ВидДокумента], iddocdef as [РасширенныйВид $ВидДокументаПредставление]from 1sjourn
43 Salimbek
 
26.04.10
11:18
+42, точнее так:
select top 10 iddoc as ID, iddocdef as [Name $ВидДокумента], iddocdef as [Descr$ВидДокументаПредставление] from 1sjourn
хотя смысла в таком запросе - я все равно не вижу... ведь выбрать все документы, лишь для того, чтобы получить затем мелкую выборку и найти виды документов, по моему это бесполезная трата ресурсов.
44 Кириллка
 
26.04.10
11:20
(43)судя по названию обработки в (0), человек делает свой журнал доков.
45 Salimbek
 
26.04.10
11:24
(44) Если так, то ему стоит посмотреть на эту ветку: http://www.1cpp.ru/forum/YaBB.pl?num=1248941896 там, фактически, готовый журнал лежит, да и не только журнал
46 Кириллка
 
26.04.10
11:28
(0)а покажи самую длиную строку кода, так чиста поржать :)
47 DCKiller
 
26.04.10
11:38
(42) ВидДокументаПредставление дает в результате две точки в колонке...
48 Salimbek
 
26.04.10
12:04
(47) х. з. у меня скульная база и запрос выдал такое:
ID          Name          Descr
  2HG      ПереносОстатков    Перенос остатков
  2HH      ПереносОстатков    Перенос остатков
49 Ёпрст
 
гуру
26.04.10
12:08
(48) для дбф можно только руками писать.. как в (22)
50 SnarkHunter
 
26.04.10
12:09
(46)Тебе комп выдали что ли? :-)
51 DCKiller
 
26.04.10
12:12
(42) По поводу
запрос.ВыполнитьЗапрос("insert ... into tmpTable");

Можно точнее? У меня ВТ с 2-мя полями, как именно туда установить значения?
52 Кириллка
 
26.04.10
12:26
(50)ага, ажно 14 числа.
53 kiruha
 
26.04.10
12:27
(0)

Если Вы получаете сообщения об ошибках  Недостаточный размер стэка (Error 1308) или SQL: Compiled code for this line is too long(Error 1812), Вы можете увеличить "уровень значимости" для конструкций  FOR и WHERE .

Если Вы используете  SYS(3055)...

Максимум SYS(3055,2040)
или в терминологиии 1С

ОлеКоманда.Выполнить("SYS(3055,2040)");

Также промежуточные результаты можно класть во временные таблицы
54 kiruha
 
26.04.10
12:30
55 Salimbek
 
26.04.10
12:32
(51) ну вот, например, у меня такой код есть:
   склЗапрос.Подготовить("insert into items
   |(id, name, type, dim_kind_id, unit_id, description, dcd)
   | values (@id,@name,@type,@dim_kind_id,@unit_id,@description,@dcd)");
   Пока тзТовары.ПолучитьСтроку() = 1 Цикл  
       
       Товар = тзТовары.Товар;
       //АраИ
       Попытка
           ТипТовара = ?(Товар.ТипТовара = Перечисление.ТипыТоваров.Весовой,0,1); //0 - весовой, 1 - штучный                  
       Исключение
           ТипТовара = 1;
       КонецПопытки;    
       
       склЗапрос.УстановитьПараметр("@id",Товар.Код);    
       склЗапрос.УстановитьПараметр("@name",Товар.Наименование);
       склЗапрос.УстановитьПараметр("@type",ТипТовара);
       склЗапрос.УстановитьПараметр("@dim_kind_id","");
       склЗапрос.УстановитьПараметр("@unit_id",тзТовары.КодБазовойЕдиницы);
       склЗапрос.УстановитьПараметр("@description",Товар);
       склЗапрос.УстановитьПараметр("@dcd",0);
       склЗапрос.Выполнить();
   КонецЦикла;
56 DCKiller
 
26.04.10
12:53
(55) разобрался уже, спс
57 DCKiller
 
26.04.10
12:56
Кстати, а какой в 1sqlite аналог ICASE?
58 Salimbek
 
26.04.10
13:36
CASE (DATE_OF_BIRTH / 100) % 100
       WHEN 1 THEN 'January'
       WHEN 2 THEN 'February'
...
END
2 + 2 = 3.9999999999999999999999999999999...