Имя: Пароль:
1C
1C 7.7
v7: Соединение в прямом запросе
0 pofigos
 
21.05.14
12:22
Добрый день! Прошу помощи в соединении в прямом запросе..

Есть изначальный запрос:

ТекстЗапроса = "
    |SELECT
    |    $РегЛист.КонтрагентТек [Контрагент $Справочник.Контрагенты]
    |    , РегЛист.IDDOC [Ссылка $Документ.РегЛист]
    |    , $ПоследнееЗначение.Контрагенты.Менеджер($РегЛист.КонтрагентТек, :ДатаАктуальности) [Менеджер $Справочник.Сотрудники]
    |FROM $Документ.РегЛист AS РегЛист With (NOLOCK)
    |";    

Есть дополнение по строкам:
ТекстЗапроса = "

    |            (SELECT TOP (1)  $РегЛистСтроки.Статус [Статус $Перечисление.СтатусРегЛиста]
    |            FROM $ДокументСтроки.РегЛист AS РегЛистСтроки With (NOLOCK)
    |            WHERE ($РегЛистСтроки.Статус <> $ПустойИд)
    |                    AND (РегЛистСтроки.IDDOC = РегЛист.IDDOC)
    |                    AND ($РегЛистСтроки.ДатаДокумента <= :ДатаАктуальности)
    |            ORDER BY $РегЛистСтроки.ДатаДокумента DESK)
    |";

По отдельности все отрабатывает корректно и верно, но при попытке соеденить эти 2 запроса в 1  - не получается (

Может конечно от жары уже мозг плавится, но примерно делал так:

    ТекстЗапроса = "
        |SELECT
        |    $РегЛист.КонтрагентТек [Контрагент $Справочник.Контрагенты]
        |    , РегЛист.IDDOC [Ссылка $Документ.РегЛист]
        |    , РегЛистСтрока.НомерСтроки
        |    , РегЛистСтрока.ДатаДокумента
        |    , РегЛистСтрока.Статус [Статус $Перечисление.СтатусРегЛиста]
        |    , $ПоследнееЗначение.Контрагенты.Менеджер($РегЛист.КонтрагентТек, :ДатаАктуальности) [Менеджер $Справочник.Сотрудники]
        |FROM $Документ.РегЛист AS РегЛист With (NOLOCK)
        |
        |LEFT JOIN (SELECT TOP (1)  РегЛистСтроки.IDDOC Ссылка
        |                    , РегЛистСтроки.LINENO_ НомерСтроки
        |                    , $РегЛистСтроки.Статус Статус        
        |                    , $РегЛистСтроки.ДатаДокумента ДатаДокумента
        |            FROM $ДокументСтроки.РегЛист AS РегЛистСтроки With (NOLOCK)
        |            WHERE ($РегЛистСтроки.Статус <> $ПустойИд)
        |                    AND ($РегЛистСтроки.ДатаДокумента <= :ДатаАктуальности)
        |            ORDER BY РегЛистСтроки.ДатаДокумента DESC
        |) as РегЛистСтрока on РегЛистСтрока.Ссылка = РегЛист.IDDOC
        |
        |
        |";
1 Попытка1С
 
21.05.14
12:33
Какую ошибку то хоть пишет?
2 pofigos
 
21.05.14
12:34
(0) Добавлю, что при левом соединении без "TOP (1)" выборка проходит отлично и выдает все строки по каждому документу. Но, необходима только одна строка удовлетворяющая условиям :(
3 pofigos
 
21.05.14
12:36
(1) Ошибку не пишет. Запрос отрабатывает. Для проверки вывел   РегЛистСтрока.НомерСтроки РегЛистСтрока.ДатаДокумента. Номер выдает 0 и соответственно дату пустую.
4 pofigos
 
21.05.14
13:00
(1) Ошибку понял. Не верно в принципе соединение.

Натолкните, как правильно выбирать только одну строку многострочной части для каждого документа?

Вариант конечно через CASE можно сделать, но как сделать отбор по конструкции CASE?
5 Ёпрст
 
21.05.14
13:04
(0) либо коррелированный подзапрос с топ-1 в селект листе, либо левое соедиенение с подзапросом, в котором max + group by заместо top1  и order by
6 pofigos
 
21.05.14
13:11
(5)Спасибо. Буду пробовать.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший