Имя: Пароль:
1C
1С v8
Как проверить результат соединения в запросе?
0 extrim-style
 
17.10.12
22:08
Есть запрос в цикле, который пересчитывает колонку с суммой. В запросе - левое соединение исходной таблицы к таблице коэффициентов. В результате запроса - пересчитанная по коэффициентам исходная таблица. Необходимо завершить цикл, если соединение не произошло. Первое, что пришло - выбирать дополнительно поле с коэффициентом через ЕСТЬNULL(Коэффициент, 0) и смотреть в итог поля. Может можно проще?
1 alexei366
 
17.10.12
22:10
Мож пример скинешь, а то как-то неочень представляю что ты хочешь
2 extrim-style
 
17.10.12
22:22
Что-то вроде:

Для Сч=1 по Макс Цикл
...
     "ВЫБРАТЬ
    |    ТЗ.Наименование,
    |    ТЗ.Сумма * ТЗ1.Коэффициент КАК Сумма
    |ИЗ
    |    ТЗ КАК ТЗ
    |        ЛЕВОЕ СОЕДИНЕНИЕ ТЗ1 КАК ТЗ1
    |        ПО ТЗ.Наименование = ТЗ1.Наименование"
...
КонецЦикла

Необходимо завершить цикл, когда левое соединение не произошло.
3 acsent
 
17.10.12
22:23
делаешь левое соединение Макс раз, умножаешь на первый не NULL
4 Лоботряс
 
17.10.12
22:31
добавь в выводимые поля поле из левой таблицы и проверяй его на NULL
5 Лефмихалыч
 
17.10.12
22:32
(0) гори в аду за запросы в цикле, еретик!
6 extrim-style
 
17.10.12
22:32
(3) не понял, это ты к тому, как сделать в одном запросе, сформировав текст запроса в цикле? поясни, пжл. не понял насчет "умножаешь на первый не NULL".

"делаешь левое соединение Макс раз" - так речь как раз о том, как оптимизировать запрос, и не делать его Макс раз.

(4) ну я так и писал в (0)
7 extrim-style
 
17.10.12
22:33
(5) это не баг, это фича! =)
8 Лефмихалыч
 
17.10.12
22:38
Если надо узнать, есть ли записи в ТЗ, для которых нет соответствия в ТЗ, то можно пакетным запросом выбрать первую строку из исключения:

     Запрос.Текст ="ВЫБРАТЬ ПЕРВЫЕ 1 ТЗ.Наименование
    | ИЗ ТЗ ЛЕВОЕ СОЕДИНЕНИЕ ТЗ  
    |    ПО ТЗ.Наименование = ТЗ1.Наименование
    | ГДЕ ТЗ1.Наименование ЕСТЬ NULL  
    |;    
    |    ВЫБРАТЬ
    |    ТЗ.Наименование,
    |    ТЗ.Сумма * ТЗ1.Коэффициент КАК Сумма
    |ИЗ
    |    ТЗ КАК ТЗ
    |        ЛЕВОЕ СОЕДИНЕНИЕ ТЗ1 КАК ТЗ1
    |        ПО ТЗ.Наименование = ТЗ1.Наименование");
    Результат = Запрос.ВыполнитьПакет();
    Если не Результат[0].Пустой() Тогда
         // туши свет

но лучше отказаться от глубоконеправильной идеи выполнять запросы в цикле - козлёночком станешь
9 extrim-style
 
17.10.12
22:47
(8) понял. спасибо.
только в таком случае получается соединение выполняется Макс*2 раз, между тем как изначально планировалось уменшить количество соединений по сравнению с Макс.
10 extrim-style
 
17.10.12
22:48
(9) нет. не так. соединение выполняется Норм*2 раз, где Норм<Макс, но скорее всего Норм*2>Макс
11 Лефмихалыч
 
17.10.12
22:51
(9)(10) писец ты логичный. Куячит запросы в цикле и при этом задумывается, а сколько там у него раз будет соединение выполняться? Да какая похер разница? ЭТо все равно ручник и быдлокодинг
12 extrim-style
 
17.10.12
22:54
(11) не знаю, что тут можно сделать. Разве что формировать текст запроса в цикле, а выполнять единожды. Так лучше будет?
13 Лефмихалыч
 
17.10.12
22:55
(12) откуда навязчивая идея про циклы вообще?
14 ASU_Diamond
 
17.10.12
22:57
(12) как будет правильно сделать без постановки задачи тебе никто не скажет. Бывают задачи в которых и в цикле допускаются запросы.
15 extrim-style
 
17.10.12
22:59
(13) работаю с графами, вычисляю маршруты, какбэ заранее ничего не известно.
16 Лефмихалыч
 
17.10.12
23:00
(15) ну ты прям пролил свет, всем всё сразу стало понятно
17 extrim-style
 
17.10.12
23:05
(16) конечно понятно. Тот, кто знаком с теорией графов, понимает, что это - тёмный лес. =)
Спасибо за помощь. Я подумаю, что тут можно предпринять)