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