|   |   | 
| 
 | Запрос - как правильней сделать? | ☑ | ||
|---|---|---|---|---|
| 0
    
        Gangar 27.03.15✎ 12:43 | 
        Доброго дня, уважаемые.
 Есть задачка такая: два оборотных регистра План и Факт, измерения у них идентичные. Надо получить на выходе таблицу с Дата1 по Дата2 таким образом, что б в ней, при отсутствии движений по регистрам, поля заполнялись 0. Пробовал вложенный запрос, с соединениями, с виртуальной таблицей - в таблицу попадают только периоды, по которым есть движения. Подскажите, как быть? | |||
| 1
    
        alex_shkut 27.03.15✎ 12:48 | 
        Угадай с одного раза - почему тебя игнорят?
 Книга знаний: Срез последних на каждую дату в запросе | |||
| 2
    
        Gangar 27.03.15✎ 12:52 | 
        (1) казалось бы - при чем тут СрезПоследних() и Регистр сведений?     | |||
| 3
    
        smitru 27.03.15✎ 12:52 | 
        (0)" что б в ней, при отсутствии движений по регистрам, поля заполнялись 0. "
 IsNull(Сумма,0) - тебе в помощь | |||
| 4
    
        Gangar 27.03.15✎ 12:54 | 
        (3) как это поможет, когда за период не было никаких движений?     | |||
| 5
    
        palpetrovich 27.03.15✎ 12:57 | 
        че тут думать, выборка по дням из периода, в ней запрос :)     | |||
| 6
    
        Gangar 27.03.15✎ 12:58 | 
        (5) Запрос в цикле?!     | |||
| 7
    
        Ненавижу 1С гуру 27.03.15✎ 12:58 | 
        я бы предложил объединение во временной таблице, а потом ее сгруппировать
 работает быстрее чем полное соединение | |||
| 8
    
        palpetrovich 27.03.15✎ 12:59 | 
        (6) канешн :)     | |||
| 9
    
        Gangar 27.03.15✎ 13:00 | 
        (7) Во временной таблице беда с ИТОГИ ПО .. ПЕРИОДАМИ 
 (8) А вы знаете толк :) | |||
| 10
    
        palpetrovich 27.03.15✎ 13:04 | 
        (9) пятницо :)     | |||
| 11
    
        palpetrovich 27.03.15✎ 13:07 | 
        (9) скачай отсюда http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=602811  - ОстаткиПоДням.erf  
 там можно подсмотреть как в запросе организовать таллицу дат, к которой потом прикрутить остатки | |||
| 12
    
        smitru 27.03.15✎ 13:09 | 
        (4) "как это поможет, когда за период не было никаких движений?"
 Только это и спасает. Так как движений нет, то результат - NULL, а чтобы преобразовать NULL в "ноль" и используется функция ISNULL(Поле1,0) ПыСы.. Только нужно при этом регистр остатков в соединении с другой таблицей с "левым соединением" (или с правым, в зависимости от написания запроса) | |||
| 13
    
        anaed 27.03.15✎ 13:09 | 
        (0)
 1) строишь таблицу дат 2) объединяешь полным соединением или как в (7) указано свои план и факт 3) соединяешь таблицу дат с объединенной таблицей план/факта 4) не забываешь естьnull'ить | |||
| 14
    
        smitru 27.03.15✎ 13:20 | 
        (13) "объединяешь полным соединением "
 С дуба рухнул такие советы давать? | |||
| 15
    
        Gangar 27.03.15✎ 15:06 | 
        что-то не выходит каменный цветок...
 смотрю в конфигураторе и консоли - отдельно периоды и отдельно данные | |||
| 16
    
        smitru 27.03.15✎ 15:27 | 
        (15) Тебе уже сказали.
 1. Получи отдельно таблицу с датами и запихни её во временную таблицу (но это не тривиальная задачка, нужны навыка проганья на сиквеле) 2. Вяжешь левым соединением эту таблицу с датами с оборотным регистром, где сумму регистра запихиваешь в функцию isnull 3. Группируешь полученный запрос по датам, а поле сумм - суммируешь. ПыСы.. Только не забудь, чтобы "приход" у тебя был с плюсом, а "расход" с минусом перед суммированием | |||
| 17
    
        Gangar 27.03.15✎ 17:39 | 
        Всем спасибо, все получилось.
 Для упрощения получения даты взял РАЗЛИЧНЫЕ ПЕРИОД из оборотного регистра, в котором движения есть каждый день. | |||
| 18
    
        palpetrovich 27.03.15✎ 17:56 | 
        (17) хе, а вдруг завтра не будтет там движения? 
 и че, код из (11) такой уж трудный? :) ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) КАК Период {ВЫБРАТЬ Период} ИЗ (ВЫБРАТЬ 0 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК aa ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК b ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК bb ПО (ИСТИНА) ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК c ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК cc ПО (ИСТИНА) ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК d ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК dd ПО (ИСТИНА) ГДЕ aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) | |||
| 19
    
        fisher 27.03.15✎ 18:03 | 
        (18) Без временной таблицы - да. Гораздо внушительней выглядит.     | |||
| 20
    
        Drac0 27.03.15✎ 18:06 | 
        (0) Используй:
 |ИТОГИ | МАКСИМУМ(Сумма) |ПО | Дата ПЕРИОДАМИ(ДЕНЬ, &Начало, &Конец), | Валюта Обходи правильно: пВыборкаДень= Запрос.Выполнить.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Дата", "Все") | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |