Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Помогите новичку во вложенном запросе через OLE DB (число прочтений - 10820 )
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Помогите новичку во вложенном запросе через OLE DB
18. Апреля 2013 :: 11:15
Печать  
Если использовать параметры в запросе то вложенный запрос работает:            
     ТекстЗапроса = "SELECT
     |Док.IDDoc as [Док $Документ.НакладнаяТоварыОпт]
     |,$Док.Валюта As [Валюта $Справочник.Валюты]
     |,(select TOP 1 cast(value as numeric(18,4))    FROM  1SConst   where id = $ИсторияРеквизита.Валюты.Курс  and date <= :НачДата~~ and objid = [i][color=#00ff00]:ф_Валюта[/color][/i] ORDER BY date desc,time desc,docid desc) As Курс
     |FROM $Документ.НакладнаяТоварыОпт AS Док";      
Если поменять параметр [i][color=#00ff00]:ф_Валюта[/color][/i] на значение [i]$Док.Валюта[/i] то все хана:
     ТекстЗапроса = "SELECT
     |Док.IDDoc as [Док $Документ.НакладнаяТоварыОпт]
     |,$Док.Валюта As [Валюта $Справочник.Валюты]
     |,(select TOP 1 cast(value as numeric(18,4))    FROM  1SConst   where id = $ИсторияРеквизита.Валюты.Курс  and date <= :НачДата~~ and objid = [i][color=#00ff00]$Док.Валюта[/color][/i] ORDER BY date desc,time desc,docid desc) As Курс
     |FROM $Документ.НакладнаяТоварыОпт AS Док";      
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #1 - 18. Апреля 2013 :: 11:24
Печать  
Если запрос выполнять через SQLite то все ОК, а через OLE DB не хочет и все! Как вообще использовать переменные основного запроса  во вложенных запросах?????В ДБФ базах! И еще проблема если вложенный запрос (с параметрами - первый код) выполнять отдельно то он выдает одну строку, если как вложенный то выдает ошибку "Subquery returned more than one record" - что больше чем одна запись! Такое впечатление что оператор TOP  в вложенном запросе  не отрабатывает!)(((Вот такие две проблемы не знаю даже как дальше жить!!!!!!!! Плачущий
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #2 - 18. Апреля 2013 :: 11:40
Печать  
бери не топ, а max(date)
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #3 - 18. Апреля 2013 :: 11:48
Печать  
спасибо!!! попробую, а по поводу 1-го вопроса ни кто не подскажет?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #4 - 18. Апреля 2013 :: 11:55
Печать  
Ну, ты еще и неверно свой курс вычисляешь - надо на дату документа, а не на начДата
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #5 - 18. Апреля 2013 :: 12:06
Печать  
Это я для примера просто поставил параметр :НачДата что бы запрос проще выглядел для примера(без доп привязки к таблице журнала, меньше строк), а так у меня привязка к дате документа! Суть заключается что  подставить значение основного запроса в вложенный ни как не получается!Хотя в SQLite такой проблемы не возникает!
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #6 - 18. Апреля 2013 :: 12:32
Печать  
чет не пойму как мне поменять TOP на MAX куда  вставить MAX в этой строке (select TOP 1 cast(value as numeric(18,4))    FROM  1SConst   where id = $ИсторияРеквизита.Валюты.Курс  and date <= :НачДата~~ and objid = :ф_Валюта ORDER BY date desc,time desc,docid desc)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #7 - 18. Апреля 2013 :: 13:14
Печать  
грубо, нужно взять max(t.value)
при условии, что t.date = (select max(t2.date) from 1sconst as t2 where
t2.id = t.id and t2.objid-t.objid)
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #8 - 18. Апреля 2013 :: 16:13
Печать  
Порылся на форуме нашел не много другое решении, но как подставить дату текущего документа???, если параметр подставлять то все ОК:
     ТекстЗапроса = "SELECT
     |Док.IDDoc as [Док $Документ.НакладнаяТоварыОпт]
     |,$Док.Валюта As [Валюта $Справочник.Валюты]
     |,Журнал.Date as Дата
   |,Курс.Value as Курс
     |FROM $Документ.НакладнаяТоварыОпт AS Док
     |LEFT JOIN 1SJOURN AS Журнал ON Док.IDDoc = Журнал.IDDOC
     |LEFT JOIN (
     |          SELECT  
   |          c_dt.objid as objid
   |         ,c_dt.value as value
   |          FROM 1sconst as c_dt
     |          WHERE
     |               c_dt.date IN (SELECT MAX(c.date)  
     |               FROM 1sconst as c
     |               WHERE
     |               (c.date <= :НачДата~~) AND (c.id = $ИсторияРеквизита.Валюты.Курс) AND (c.objid = c_dt.objid)
     |          )AND c_dt.id = $ИсторияРеквизита.Валюты.Курс
     |) as Курс ON Курс.objid = $Док.Валюта  
     |";      
КАК ВМЕСТО :НачДата~~ подставить Журнал.Date???? когда подставляешь то пишет не найдена колонка!!!!!!!!! Не ужели ни кто не сталкивался! Заранее благодарен если кто подскажет!!!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #9 - 19. Апреля 2013 :: 05:30
Печать  
Дык, это нафик ни кому не нужно - сама валюта и курс, как правило, валяется в шапке самого документа.
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #10 - 19. Апреля 2013 :: 11:01
Печать  
Кароче запросом 1С++ эту праблемку не решить только SQLite поможет жаль, 1С++ быстрей раза в 3 работает, чем SQLite
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #11 - 19. Апреля 2013 :: 11:48
Печать  
Да всё решаемо.
Если в лоб нельзя - всегда можно создать временную табличку, потом с ней соединяться в запросе.
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #12 - 19. Апреля 2013 :: 12:43
Печать  
Это понятно! Но думаю если с временной таблицей, то эффект от скорости уйдет, поэтому целесообразней в данном случаи SQLite - текст запроса намного проще.Интересно как автор класса  ПрямогоЗапроса, от этого ушел! Я так понимаю у него если запущенно монопольно, то запрос выполняется через SQLite иначе чере OLE DB! Он же как то реализовал Срезпоследних! попробую я на досуге написать  через ПрямойЗапрос!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #13 - 23. Апреля 2013 :: 05:01
Печать  
Там всё тоже самое. Там "срез последних" на дату, а не на дату из самого запроса(дату документа, к примеру).
  
Наверх
 
IP записан
 
Alex2013
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Апреля 2013
Re: Помогите новичку во вложенном запросе через OLE DB
Ответ #14 - 23. Апреля 2013 :: 16:10
Печать  
Спасибо! Тогда и пробовать не буду!
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать