|
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к развозок Что тут оптимизировать то? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |