Имя: Пароль:
1C
1C 7.7
v7: Как правильно получить значение в запросе
, , ,
0 pofigos
 
26.11.13
10:34
Доброе утро. Помогите корректно привязать к запросу инструкцию. Честно - сдался почти, не понимаю к чему зацепить. Сама инструкция:

SELECT TOP(1) DATE ДатаОплаты FROM
    (SELECT TOP (25+2) CL.DATE ДатаКалендаря FROM CL
    WHERE ((cl.date >='19.09.09')AND(CL.ID = 13248)and(CL.DAYLEN>0))
    ORDER BY CL.DATE) AS Календарь
ORDER BY Календарь.Date DESC

в конструкции дата - дата накладной ТОР(25+2) - 25 это переменная. Для каждой накладной разная.

Основной текст запроса:

ТекстЗапроса = "
|SELECT ОсновнойОстатки.Субконто1 [Контрагент $Справочник.Контрагенты]
|, $Сотрудник.Филиал [Филиал $Справочник.Подразделение]
|, ДокТТН.IdDoc as [Докум $Документ.ТТННаОрганизациюТовары]
|, $ДокТТН.Менеджер [Сотрудник $Справочник.Сотрудники]
|, $ДокТТН.Всего as Сумма
|, $Договора.ВидДоговора [ВидДоговора $Перечисление.ВидДоговора]
|, ОсновнойОстатки.СуммаОстаток as СуммаДолга
|, ГруппировкаДок.Группировка [Группировка $Перечисление.УкрупненныеГруппировки]
|
|FROM $БИОстатки.Основной(:ВыбДата~
|            ,
|            ,(Счет = :ВыбСчет)
|            ,(Субконто1,Субконто2)
|            , Фильтр) AS ОсновнойОстатки
|
|LEFT JOIN $Справочник.Документы AS Документы (NOLOCK) on Документы.id = ОсновнойОстатки.Субконто2
|INNER JOIN $Документ.ТТННаОрганизациюТовары as ДокТТН (NOLOCK) on ДокТТН.IdDoc = RIGHT($Документы.СсылкаНаДокумент,9)
|LEFT JOIN _1SJOURN AS Журнал With (NOLOCK) ON  ДокТТН.IDDOC = Журнал.IDDOC
|LEFT JOIN $Справочник.Договора AS Договора (NOLOCK) on Договора.id = RIGHT($ДокТТН.ОснованиеОтпуска,9)        
|LEFT JOIN $Справочник.Сотрудники AS Сотрудник (NOLOCK) on Сотрудник.id = $ДокТТН.Менеджер
|LEFT JOIN (
|            SELECT DISTINCT $Группировки.УкрупненнаяГруппировка Группировка
|                    , ТТННаОрганизациюТоварыСтроки.IDDOC Ссылка
|            FROM $ДокументСтроки.ТТННаОрганизациюТовары AS ТТННаОрганизациюТоварыСтроки With (NOLOCK)    
|                LEFT JOIN $Справочник.ВидыТоваров AS ВидыТоваров (NOLOCK) on ВидыТоваров.id = $ТТННаОрганизациюТоварыСтроки.ВидТМЦ
|                LEFT JOIN $Справочник.Группировки AS Группировки (NOLOCK) on Группировки.id = $ВидыТоваров.Группировки
|            ) as ГруппировкаДок on ДокТТН.IdDoc = ГруппировкаДок.Ссылка
|
|WHERE    (ОсновнойОстатки.СуммаОстаток > 0)
|Условия
|";
1 pofigos
 
26.11.13
10:40
Теоретически должно получится что-то вроде:

SELECT TOP(1) DATE ДатаОплаты FROM
|(SELECT TOP ($ПоследнееЗначение.Договора.ДнейОтсрочки(Договора.id, LEFT(Журнал.DATE_TIME_IDDOC,8))+2) CL.DATE ДатаКалендаря FROM CL
|WHERE ((cl.date >= LEFT(Журнал.DATE_TIME_IDDOC,8))AND(CL.ID = 13248)and(CL.DAYLEN>0))
|ORDER BY CL.DATE) AS Календарь
|
|ORDER BY Календарь.Date DESC

Но куда и как правильно прицепить к запросу ума не приложу (
2 viktor_vv
 
26.11.13
10:47
Вот здесь лажа

LEFT(Журнал.DATE_TIME_IDDOC,8))+2

я так понял, тебе к дате надо два дня прибавить ?
3 viktor_vv
 
26.11.13
10:49
Тогда надо что-то типа

DateADD(Convert(DateTime,LEFT(Журнал.DATE_TIME_IDDOC,8),112),Day,2)
4 pofigos
 
26.11.13
10:50
(3) не пойдет, т.к. подсчет идет и банковских и календарных дней. Для календарных да. а вот для банковских надо условие (CL.DAYLEN>0)
5 viktor_vv
 
26.11.13
10:51
(3)+ То есть так

DateADD(Convert(d,2,DateTime,LEFT(Журнал.DATE_TIME_IDDOC,8),112))
6 pofigos
 
26.11.13
10:52
(2) Нет нужно первые ($ПоследнееЗначение.Договора.ДнейОтсрочки(Договора.id, LEFT(Журнал.DATE_TIME_IDDOC,8))+2) записей
7 viktor_vv
 
26.11.13
10:58
(6) А, понял примерно.

И что не получается ? Засунь (1) в Select да и все. Я правда не уверен насчет Top (Выражение).
8 viktor_vv
 
26.11.13
11:01
|SELECT ОсновнойОстатки.Субконто1 [Контрагент $Справочник.Контрагенты]
|
|,(SELECT TOP(1) DATE ДатаОплаты FROM
|(SELECT TOP ($ПоследнееЗначение.Договора.ДнейОтсрочки(Договора.id, LEFT(Журнал.DATE_TIME_IDDOC,8))+2) CL.DATE ДатаКалендаря FROM CL
|WHERE ((cl.date >= LEFT(Журнал.DATE_TIME_IDDOC,8))AND(CL.ID = 13248)and(CL.DAYLEN>0))
|ORDER BY CL.DATE) AS Календарь
|
|ORDER BY Календарь.Date DESC ) as ДатаОплаты
|
|, $Сотрудник.Филиал [Филиал $Справочник.Подразделение]
9 pofigos
 
26.11.13
11:04
(8) Попробую, но вроде вчера делал, не пошло. Вся эта инструкция возвращает табличное поле размерностью (1,1) Тут и нужно значение первой строки
10 viktor_vv
 
26.11.13
11:06
(9) В selecte эта конструкция вернет одно значение, это скалярный запрос получается.

$ПоследнееЗначение в нечто подобное разворачивается.
11 pofigos
 
26.11.13
11:07
(10) понял. но что-то не пошло (
AccountsRecordset::СформироватьОшибку(Строка Ошибка=State 42000, native 102, message [Microsoft][ODBC SQL Server Driver][SQL Server]Неправильный синтаксис около конструкции "ДатаОплаты".) : State 42000, native 102, message [Microsoft][ODBC SQL Server Driver][SQL Server]Неправильный синтаксис около конструкции "ДатаОплаты".
12 pofigos
 
26.11.13
11:09
(11) Нашел ошибку. сейчас попробую с переменными.

Спасибо
13 pofigos
 
26.11.13
11:16
(10) Спасибо за помощь. Взлетело:

|, (SELECT TOP(1) DATE ДатаОплаты FROM
|    (SELECT TOP (CONVERT(Int,$ПоследнееЗначение.Договора.ДнейОтсрочки(Договора.id, LEFT(Журнал.DATE_TIME_IDDOC,8)))+2)  Date FROM CL
|        WHERE ((cl.date >= LEFT(Журнал.DATE_TIME_IDDOC,8))AND(CL.ID = 13248)and(CL.DAYLEN>0))
|ORDER BY CL.DATE) AS Календарь        
|ORDER BY Календарь.Date DESC) as ДатаОплаты
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.