Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Пакетный запрос,объединение  (Прочитано 20726 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
jonik_joker
Участник

ru
Offline Offline

« : 12-11-2013 09:43 » 

Всем привет. Помогите разобраться: в документе ЗаявкаНаПоставку есть ТабЧ, которая содержит инфу по счетам (Инвойсам).  Соответственно регистрируется это все в регистре накоплений ОборотыДенежныхСредств. Инвойс может быть оплачен (Приход,соот-но нужна СуммаПриход) и неоплачен (Расход,соот-но нужна СуммаРасход). В заявке может быть как оплаченные так и неоплаченные Инвойсы.

Код:

Код:
ВЫБРАТЬ
    ОборотыДенежныхСредствОстаткиИОбороты.СуммаПриход,
    ОборотыДенежныхСредствОстаткиИОбороты.СуммаРасход,
    ОборотыДенежныхСредствОстаткиИОбороты.Инвойс,
    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.ВнутреннийНомер КАК НомерЗаказ,
    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка КАК Заявка,
    ОборотыДенежныхСредствОстаткиИОбороты.Период
ИЗ
    Документ.ЗаявкаНаПоставку.УсловиеОплаты КАК ЗаявкаНаПоставкуУсловиеОплаты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОборотыДенежныхСредств.ОстаткиИОбороты(, , Регистратор, , ) КАК ОборотыДенежныхСредствОстаткиИОбороты
        ПО ЗаявкаНаПоставкуУсловиеОплаты.Ссылка = ОборотыДенежныхСредствОстаткиИОбороты.Заявка
ГДЕ
    (&Клиент = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
            ИЛИ ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Клиент = &Клиент)
    И (&Грузополучатель = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
            ИЛИ ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Грузополучатель = &Грузополучатель)
    И ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
    И ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.ПометкаУдаления = ЛОЖЬ
    И ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Проведен = ИСТИНА
    И ЗаявкаНаПоставкуУсловиеОплаты.ВариантОплаты = &ВариантОплаты
ИТОГИ ПО
    Заявка

в результате получаю таблицу СуммаРасход, а хотелось бы СуммаРасход(что хочется).

* СуммаРасход(что хочется).xlsx (8.14 Кб - загружено 1054 раз.)
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #1 : 12-11-2013 09:44 » 

сорри

* СуммаРасход.xlsx (5.94 Кб - загружено 1100 раз.)
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #2 : 12-11-2013 09:49 » 

пробовал ч\з объединить.

Код:
ВЫБРАТЬ
    ОборотыДенежныхСредствОстаткиИОбороты.СуммаПриход,
    ОборотыДенежныхСредствОстаткиИОбороты.Инвойс,
    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.ВнутреннийНомер КАК НомерЗаказ,
    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка КАК Заявка,
    ОборотыДенежныхСредствОстаткиИОбороты.Период
ИЗ
    Документ.ЗаявкаНаПоставку.УсловиеОплаты КАК ЗаявкаНаПоставкуУсловиеОплаты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОборотыДенежныхСредств.ОстаткиИОбороты(, , Регистратор, , ) КАК ОборотыДенежныхСредствОстаткиИОбороты
        ПО ЗаявкаНаПоставкуУсловиеОплаты.Ссылка = ОборотыДенежныхСредствОстаткиИОбороты.Заявка
ГДЕ
    (&Клиент = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
            ИЛИ ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Клиент = &Клиент)
    И (&Грузополучатель = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
            ИЛИ ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Грузополучатель = &Грузополучатель)
    И ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
    И ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.ПометкаУдаления = ЛОЖЬ
    И ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Проведен = ИСТИНА
    И ЗаявкаНаПоставкуУсловиеОплаты.ВариантОплаты = &ВариантОплаты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ОборотыДенежныхСредствОстаткиИОбороты.СуммаРасход,
    ОборотыДенежныхСредствОстаткиИОбороты.Инвойс,
    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.ВнутреннийНомер,
    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка,
    ОборотыДенежныхСредствОстаткиИОбороты.Период
ИЗ
    Документ.ЗаявкаНаПоставку.УсловиеОплаты КАК ЗаявкаНаПоставкуУсловиеОплаты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОборотыДенежныхСредств.ОстаткиИОбороты(, , Регистратор, , ) КАК ОборотыДенежныхСредствОстаткиИОбороты
        ПО ЗаявкаНаПоставкуУсловиеОплаты.Ссылка = ОборотыДенежныхСредствОстаткиИОбороты.Заявка
ГДЕ
    (&Клиент = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
            ИЛИ ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Клиент = &Клиент)
    И (&Грузополучатель = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
            ИЛИ ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Грузополучатель = &Грузополучатель)
    И ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
    И ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.ПометкаУдаления = ЛОЖЬ
    И ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Проведен = ИСТИНА
    И ЗаявкаНаПоставкуУсловиеОплаты.ВариантОплаты = &ВариантОплаты
ИТОГИ ПО
    Заявка

получил СуммаРасход(объединение)

* СуммаРасход(объединение).xlsx (5.89 Кб - загружено 1117 раз.)
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #3 : 12-11-2013 09:51 » 

ч\з пакетный

Код:
ВЫБРАТЬ
    ОборотыДенежныхСредствОстаткиИОбороты.СуммаПриход,
    ОборотыДенежныхСредствОстаткиИОбороты.Инвойс,
    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.ВнутреннийНомер КАК НомерЗаказ,
    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка КАК Заявка,
    ОборотыДенежныхСредствОстаткиИОбороты.Период
ПОМЕСТИТЬ Приход
ИЗ
    Документ.ЗаявкаНаПоставку.УсловиеОплаты КАК ЗаявкаНаПоставкуУсловиеОплаты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОборотыДенежныхСредств.ОстаткиИОбороты(, , Регистратор, , ) КАК ОборотыДенежныхСредствОстаткиИОбороты
        ПО ЗаявкаНаПоставкуУсловиеОплаты.Ссылка = ОборотыДенежныхСредствОстаткиИОбороты.Заявка
ГДЕ
    (&Клиент = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
            ИЛИ ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Клиент = &Клиент)
    И (&Грузополучатель = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
            ИЛИ ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Грузополучатель = &Грузополучатель)
    И ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
    И ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.ПометкаУдаления = ЛОЖЬ
    И ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Проведен = ИСТИНА
    И ЗаявкаНаПоставкуУсловиеОплаты.ВариантОплаты = &ВариантОплаты
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ОборотыДенежныхСредствОстаткиИОбороты.СуммаРасход,
    Приход.СуммаПриход,
    Приход.Заявка КАК Заявка,
    Приход.Инвойс КАК Инвойс,
    Приход.НомерЗаказ,
    Приход.Период
ИЗ
    РегистрНакопления.ОборотыДенежныхСредств.ОстаткиИОбороты(, , Регистратор, , ) КАК ОборотыДенежныхСредствОстаткиИОбороты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Приход КАК Приход
        ПО ОборотыДенежныхСредствОстаткиИОбороты.Заявка = Приход.Заявка
ИТОГИ ПО
    Заявка

результат

* СуммаРасход(пакетный запрос).xlsx (5.92 Кб - загружено 1134 раз.)
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 13-11-2013 08:41 » 

jonik_joker, нет желания выкачивать все варианты и разбираться что там отличчается.
Напиши конкретный вопрос: что ты не можешь получить (или что не так)
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #5 : 13-11-2013 20:36 » 

Kivals,  в результате выполнения запроса получается таблица вида

СуммПриход СуммРасход Инвойс
                     расх3
                     расх2
                     расх1
прих1                               инв1
прих2                               инв2

прих1=расх1,прих2=расх2

хотелось бы получить

СуммПриход СуммРасход Инвойс
                     расх3
прих1                               инв1
прих2                               инв2


Добавлено через 1 минуту и 2 секунды:
но сойдет и

СуммПриход СуммРасход Инвойс
                     расх3
прих1           расх1           инв1
прих2           расх2           инв2
                               
                             
« Последнее редактирование: 13-11-2013 20:37 от jonik_joker » Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 14-11-2013 18:36 » 

По какому признаку у теб связаны "прих1=расх1,прих2=расх2" ?
В регистре ОборотыДенежныхСредств есть измерение Инвойс ?
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #7 : 18-11-2013 09:58 » 

спасибо,сделал так:выгрузил результат запроса в 2 таблицы значений потом объединил.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 18-11-2013 11:23 » 

Вывод: свою задачу решил, с запросами так и не разобрался
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #9 : 18-11-2013 18:40 » 

к сожалению, проще не получается:

Цитата
В регистре ОборотыДенежныхСредств есть измерение Инвойс ?

измерение то есть, но оно заполняется только для регистра прихода.

Цитата
По какому признаку у теб связаны "прих1=расх1,прих2=расх2" ?
прих - кол-во поступивших ден.средств, расх - кол-во ден. средств на изготовление.

Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 19-11-2013 11:28 » 

jonik_joker, если ты каким-то образом объединил данные в таблицах - значит условие есть, нужно с ним правильно работать в запросах. Если запрос получается слишком сложным или тормозит, а получаемые данные это необходимый результат от ввода документов - значит нужно менять (дорабатывать) структуру данных.
Почему измерение Инвойс не заполняется для расхода? Если будет 2 инвойса с одинаковыми суммами - кк ты с ними разберешься?
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #11 : 25-11-2013 19:45 » 

Kivals, запрос и правда все в себя вобрал: 3 временные таблицы, вложенный и 4 пакетных запроса, в конце последнего - объединение 2 врем. таб. Короче развлекся как мог.

Цитата
Если запрос получается слишком сложным или тормозит, а получаемые данные это необходимый результат от ввода документов - значит нужно менять (дорабатывать) структуру данных.

Хотелось бы,но эта прерогатива для меня в перспективе.

Цитата
Почему измерение Инвойс не заполняется для расхода?


Так написан конструктор движений для расхода, туда детально не заглядывал, главное результат - измерение Инвойс не заполняется.

Цитата
Если будет 2 инвойса с одинаковыми суммами - кк ты с ними разберешься?

По номеру
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #12 : 25-11-2013 20:02 » 

Kivals,  не знаю в этой теме продолжать или новую начать...ладно, попробуем здесь начать: как писал выше я соединил 2 ТЗ в 3-ю посредством периода, т.е. отсортировал каждую таблицу по периоду и посредством циклов сравнивал строчку одной ТЗ с другой. Что такое период для каждой из таблиц : для таблицы прихода это дата прихода денежных средств, для таблицы расхода - соответственно дата производства. Сначала изготавливаем(ДатаРасхода), потом отгружаем(ДатаПрихода), отсюда, к примеру, для 1-го инвойса в заявке получаем приход-расход и т.д. И все чудесно, пока тестировал отчет мне попадались только заявки, где не оплачен был последний по дате производства (!) инвойс в заявке, но вот незадача...
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #13 : 25-11-2013 20:13 » 

а если не оплачен инвойс в середине? получается после сортировки по периоду строка инвойса без оплаты табрасхода присоединится к строке табприхода, но уже следующего оплаченного инвойса, что неверно...сделал сортировку в каждой ТЗ по номеруинвойса,что более-менее приблизило меня к решению,теперь вопрос:
как после нахождения нужного неоплаченного инвойса при сравнении строк этих таблиц сдвинуть строку с уже оплаченным инвойсом табприход вниз, чтобы восстановить порядок? пробовал метод Сдвинуть() , но выдается ошибка

Код:
Неправильное смещение внутри коллекции

скорее всего неправильно понимаю метод

Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #14 : 26-11-2013 03:53 » new

все, сам разобрался.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 27-11-2013 09:47 » 

jonik_joker, ты будешь постоянно натыкаться на какие-то проблемы в связи данных, пока не сделаешь конкретную связь между таблицами (в твоем случае напрашивается по инвойсу)
ИМХО инвойс должен заполнятся при расходе, если это не так - значит это баг. Если не можешь сам это сделать по причине политики разработки - сообщи ответственным за эти движения.
Если дело не в политике и ты сам полностью отвечаешь за конфигурацию - тогда пытайся разобраться почему не заполняется.

Главная суть: весь программный анализ должен идти при проведении документов (сохранении данных), в отчетах должны работать только запросы. Тогда все необходимые отчеты будут на раз-два строиться с помощью СКД.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines