Имя: Пароль:
IT
 
Алгоритм двух таблиц
, ,
0 КошерныйТролль
 
29.10.12
13:24
Есть одна Таблица1 с колонками "Период, Сумма"
Есть Таблица2 с колонками "Период, Сумма"

Из Таблица1 надо вычесть суммы, содержащиеся в Таблица2, причем Сумма по Периоду Таблицы1 должна вычитаться из соображений максимальной приближенности Период из Таблицы2 к Период из Таблицы1. (<=)

Как оптимально это сделать?
1 МихаилМ
 
29.10.12
13:25
огласите критерии оптимальности
2 КошерныйТролль
 
29.10.12
13:26
(1) написать поменьше буков
3 Лефмихалыч
 
29.10.12
13:26
(0) запросом
4 КошерныйТролль
 
29.10.12
13:27
(3) по какому критерию стыковать период Таблица1 к Период Таблица2, чтобы потом можно было свернуть таблицу, не потеряв исконное значение в Период Таблица1?
5 МихаилМ
 
29.10.12
13:28
(2)
тогда
изложите все условия задачи.
и в разделе работа попросите написать за Вас.

и буков писать не придется.
6 miki
 
29.10.12
13:29
Насчет оптимальности не скажу, но я бы в цикле первый проход вычитал для условия равенства ТЗ1.Период=ТЗ2.Период, затем, у оставшихся, ТЗ1.Период=(ТЗ2.Период-k), k=0,1,2,...
7 Михаил Козлов
 
29.10.12
13:30
(0) Неоднозначно: если в таблица2 несколько сумм с совпадающим периодом, то как вычистать: одну, все, все, чтобы остаток был >=0 или чтобы остаток был как можно ближе к 0.
8 МихаилМ
 
29.10.12
13:32
(4)

а по какому критерию сопоставить записи


если в таблице1    5 записей
а в таблице2  10

и суммы столбца не совпадают.

и есть одинаковые даты

и есть одинаковые даты "максимальной приближенности"
9 McNamara
 
29.10.12
13:32
Выбрать * ИЗ
(
Выбрать Таблица1.Период
       Максимум(Таблица2.Период) КАК ПолеДляСоединения    
         ИЗ Таблица1
    ЛевоеСоединение Таблица2 ПО Таблица1.Период>=Таблица2.Период
Группировать ПО  Таблица1.Период
) КАК Влож
ЛевоеСоединение Таблица2 ПО Влож.ПолеДляСоединения=Таблица2.Период

Как то так.
10 Азазелло
 
29.10.12
13:33
По всей видимости таблица1 и таблица2 свернуты по периоду, соответсвенно, не м.б. задваивания записей максимальной приближенности
11 McNamara
 
29.10.12
13:33
Это задача вроде как аналог задачи получения среза последних на даты, находящиеся в колонке другой таблицы.
12 КошерныйТролль
 
29.10.12
13:34
(10) да, период Таблица1 и период Таблица2 не совпадает по значению
13 КошерныйТролль
 
29.10.12
13:34
(11) вроде того
14 dk
 
29.10.12
13:37
сделать 3-ю таблицу с данными из Т1 и привести в ней периоды к Т2 или наоборот
15 0xFFFFFF
 
29.10.12
13:43
"должна вычитаться из соображений максимальной приближенности"
Че за ерунда?
16 КошерныйТролль
 
29.10.12
13:54
Ну вот нужно оптимально написать, что-то такое:

Процедура ИсключитьИзОплатОтменыПлатежейПоПериоду(ТЗФактПлатежейВременная,ТЗОтменямыхПлатежейВременная)
   
   Для Каждого СтрокаТЗОтменямыхПлатежей ИЗ ТЗОтменямыхПлатежейВременная Цикл
       
       ПериодОтмены = СтрокаТЗОтменямыхПлатежей.ПериодОтменыОплаты;
       СуммаОтмены  = СтрокаТЗОтменямыхПлатежей.СуммаОтменыОплаты;
       
       МассивОбрабатываемыхСтрокПлатежей = Новый Массив;
       МассивУдаляемыхСтрокПлатежей = Новый Массив;
       
       Для Каждого СтрокаТЗФактПлатежей ИЗ ТЗФактПлатежейВременная Цикл
           Если СтрокаТЗФактПлатежей.ДатаПлатежа <= ПериодОтмены Тогда
               МассивОбрабатываемыхСтрокПлатежей.Добавить(СтрокаТЗФактПлатежей);
           КонецЕсли;
       КонецЦикла;
       
       СуммаОсталосьОтменить = СуммаОтмены;
       
       Для к = 0  По МассивОбрабатываемыхСтрокПлатежей.Количество() - 1 Цикл
           ОбрабатываемаяСтрока = МассивОбрабатываемыхСтрокПлатежей[к];
           
           Если ОбрабатываемаяСтрока.СуммаВыплаты <= СуммаОсталосьОтменить Тогда // отменяем всю строку
               МассивУдаляемыхСтрокПлатежей.Добавить(ОбрабатываемаяСтрока);
           Иначе //суммы не хватает, правим строку
               ОбрабатываемаяСтрока.СуммаВыплаты = ОбрабатываемаяСтрока.СуммаВыплаты - СуммаОсталосьОтменить;                
           КонецЕсли;
           
           СуммаОсталосьОтменить = СуммаОсталосьОтменить - ОбрабатываемаяСтрока.СуммаВыплаты;
           
           Если СуммаОсталосьОтменить <= 0 Тогда
               Прервать;
           КонецЕсли;
           
       КонецЦикла;
       
       Если НЕ СуммаОсталосьОтменить = 0 Тогда //не вся сумма отмены распределилась
           УправлениеНебольшойФирмойСервер.СообщитьОбОшибке("Сумма отменяемых платежей превышает сумму имеющихся платежей);
       КонецЕсли;
       
       Для к = 0 По МассивУдаляемыхСтрокПлатежей.Количество() Цикл
           ТЗФактПлатежейВременная.Удалить(МассивУдаляемыхСтрокПлатежей[к]);
       КонецЦикла;
       
   КонецЦикла;
   
КонецПроцедуры
17 Туц
 
30.10.12
01:43
Дописать вторую в первую, умножая сумму на -1, свернуть.
Ошибка? Это не ошибка, это системная функция.