|
Алгоритм двух таблиц | ☑ | ||
---|---|---|---|---|
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, свернуть.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |