Имя: Пароль:
1C
1C 7.7
v7: помогите с запросом 1c++
0 patapum
 
15.06.15
12:18
Всем доброго утра!
Продолжаю разбираться с 1с++.
Написал вот такой запрос (под комментами то, что хочется в идеале). Ругается. Подскажите, что не так?

RS=СоздатьОбъект("ODBCRecordset");
RS.УстБД1С();
СкриптSQL = "SELECT
//|$ЖурналЗаявки.Авто as [Автомобиль $Справочник.Автомобили],
|Max(ЖурналЗаявки.Date_Time_IDDoc) as [Заявка $Документ.Заявка]
|FROM $ЖурналДокументов.Заявки as ЖурналЗаявки
//|GROUP BY $ЖурналЗаявки.Авто
|";
ТЗЗапрос=СоздатьОбъект("ТаблицаЗначений");
RS.ВыполнитьИнструкцию(СкриптSQL, ТЗЗапрос);

Ругается:
RS.ВыполнитьИнструкцию(СкриптSQL, ТЗЗапрос);
... State 42000, native 102, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '787'.
1 torgm
 
15.06.15
12:19
МАХ убери
2 patapum
 
15.06.15
12:22
(1) убрал, то же самое. но max нужен по смыслу, мне нужен по каждому автомобилю последний документ
3 Z1
 
15.06.15
12:23
(0) тип Date_Time_IDDoc это char(23)  он не может быть преобразован в ДокументЗаявка (char(9) )
4 Herby
 
15.06.15
12:24
журнал заявки это что?  Date_Time_IDDoc нужно брать из 1сЖурн
5 patapum
 
15.06.15
12:29
(4) это журнал документов. называется "заявки".
можно так нарисовать
FROM $Документ.Заявка As Заявка
|INNER JOIN _1Sjourn as Жур ON Заявка.IDDoc = Жур.IDDoc
но в нем нет графы "автомобиль", а мне нужно по ней получать максимум
6 patapum
 
15.06.15
12:30
+(5) впрочем, автомобиль я из документа вытащу. просто думал, элегантней из одной таблицы существующего журнала выбрать
7 VladZ
 
15.06.15
12:30
Max(ЖурналЗаявки.IDDoc) as [Заявка $Документ.Заявка]
8 VladZ
 
15.06.15
12:33
+7 Типизировать значение можно по идентификатору (iddoc). Date_Time_IDDoc - это "солянка" в виде дата/время/ид.
9 patapum
 
15.06.15
12:35
(7) а это все равно будет последний по времени документ?
10 patapum
 
15.06.15
12:39
Вот так получилось, но не хочется весь полный журнал тащить...

СкриптSQL = "SELECT
|$Заявка.Автомобиль as [Автомобиль $Справочник.Автомобили],
|Max(Журнал.IDDoc) as [Заявка $Документ.Заявка]
|FROM $Документ.Заявка As Заявка
|INNER JOIN _1Sjourn as Журнал ON Заявка.IDDoc = Журнал.IDDoc
|GROUP BY $Заявка.Автомобиль
|";
11 Salimbek
 
15.06.15
12:40
(9) Конечно нет, если нужен последний по времени, то можешь Right(Max(Date_Time_IDDoc),9)
12 patapum
 
15.06.15
12:43
А даже вот такой запрос (обрезал лишнее) матерится. Что-то не так с журналом? Но вроде пишу все правильно...

СкриптSQL = "SELECT
|ЖурналЗаявки.IDDoc as [Заявка $Документ.Заявка]
|FROM $ЖурналДокументов.Заявки as ЖурналЗаявки
|";

State 42000, native 102, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near '787'.
13 ЧеловекДуши
 
15.06.15
12:58
(0) Запрос лучше отлаживать на сервере SQL.

Запусти в 1С отладку "RS.Отладка(1);"
14 Ёпрст
 
15.06.15
12:59
>>>FROM $ЖурналДокументов.Заявки

это пять!
15 ЧеловекДуши
 
15.06.15
13:00
(12) Для 7.7 лучше использовать связь с Общим журналом.
Может быть так, что в таблице документов "Заявки" будет находится битый документ, без Табличной части или без записи в общем журнале
16 ЧеловекДуши
 
15.06.15
13:00
(14) ... $Документ.Заявки .... :)
17 trad
 
15.06.15
13:09
(0) $ЖурналДокументов - это метаимя для получения идентификатора журнала документов

пользоваться им нужно в общем так:
FROM _1sjourn as Журнал
where Журнал.IDJOURNAL = $ЖурналДокументов.Заявки
18 trad
 
15.06.15
13:12
один из оптимальных способ решения задачи это наличие графы отбора для поля Документ.Заявки.Авто
19 VladZ
 
15.06.15
13:12
(9) Это будет последний созданный документ. Если нужно по дате/времени, то нужен подзапрос. Сначала находишь последний по Max(ЖурналЗаявки.Date_Time_IDDoc). А потом уже  находишь сам документ и типизируешь.
20 VladZ
 
15.06.15
13:14
+19 ну или как в (11).  Только тут читабельность страдает.
21 patapum
 
15.06.15
13:29
(20) да ладно с ней, с читабельностью. запрос без подзапросов лучше.

(17) спасибо, тогда в условие соединения запихну.
and Журнал.IdJournal = $ЖурналДокументов.Заявки

все работает! всем спасибо за помощь!
22 Z1
 
15.06.15
21:34
(10) Лучше добавиьт условие на вид документа
ведь в Журнале заявок не обязательно может быть только документ Заявка

СкриптSQL = "SELECT
|$Заявка.Автомобиль as [Автомобиль $Справочник.Автомобили],
|Max(Журнал.IDDoc) as [Заявка $Документ.Заявка]
|FROM $Документ.Заявка As Заявка
|INNER JOIN _1Sjourn as Журнал ON Заявка.IDDoc =Журнал.IDDoc
|and Журнал.iddocdef = $ВидДокумента.Заявка
|GROUP BY $Заявка.Автомобиль
|";


Ну и также желательно исходя из условия задачи поставить минимальную дату с которой начинается поиск Заявок
23 Djelf
 
15.06.15
23:04
(22) Это "and Журнал.iddocdef = $ВидДокумента.Заявка" ты зачем придумал?
iddoc уникален в пределах базы.
24 Z1
 
16.06.15
20:43
(23) ну да если не использовать интервал дат то условие
не нужно, но само использование запроса без интервала дат
как бы бред о чем мягко сказано в 22.

Если поставить интервал дат или начальную дату
то я прав и индекс DOCTYPE лучше чем индекс ACDATETIME
25 Djelf
 
16.06.15
21:58
(24) Это то понятно, что если будут граничные даты в запросе то лучше поискать другой индекс. Но ему же без дат нужно было:
> но в нем нет графы "автомобиль", а мне нужно по ней получать максимум
В этом случае лучше не нагружать оптимизатор лишними граничными условиями.
С другой стороны, скорость выборки зависит от конкретной базы, а не от наших предположений т.е. хрен его знает как быстрее будет ;)
26 Z1
 
16.06.15
22:43
(25) не знаю оптимизатор легко разбереться с таким
"лишним" ограничением

>>>С другой стороны, скорость выборки зависит от конкретной базы,
>>>а не от наших предположений т.е. хрен его знает как быстрее будет ;)

Да нет эти рассуждения полезны для понимания логики работы оптимизитора запросов.

Ну а точки зрения скорости надо стараться писать правильные запросы, ну в данном примере если предположить что была
какая то машина всего один раз и 5 лет назад то зачем она
автору cейчас ?
27 Djelf
 
16.06.15
23:55
(26) может и разберется, а зачем ему давать шанс планировщику все испортить? Было 1 условие iddoc = быстрый индекс iddoc, стало iddoc + IDDOCDEF, значит оптимизатор МОЖЕТ выбрать (медленный в этом случае) индекс DOCTYPE
Ну и это... 60мс подобный запрос на 9к развозок
Что тут оптимизировать то?
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс